杨为民
发表于 2024-4-11 22:53:21
tzz1983 发表于 2024-4-11 22:48
杨总, 我是不是又说错了什么话, 让您老不高兴了,
不过我现在也要学会淡漠了, 什么害羞, 第一, 不服, 那 ...
看到你指鹿为马,自说自语,独自跟风车打架,担心你已经走火入魔了.
说正事:明天计划进行新的排名,你要不要拿出你自己作品的被测程序?
tzz1983
发表于 2024-4-11 22:55:20
杨为民 发表于 2024-4-11 22:53
看到你指鹿为马,自说自语,独自跟风车打架,担心你已经走火入魔了.
我没有代码, 您老的测试方法就是我中意的
CosyOS
发表于 2024-4-13 13:26:30
本帖最后由 CosyOS 于 2024-4-13 13:41 编辑
杨老师的最新排行榜我已查看,正如杨老师所述,无论如何,“软中断替代法”切换任务的效率都不可能赶上“直接切换法”。
CosyOS在设计上固定采用“软中断替代法”。
最初采用此方案只是单纯为了实现“零中断延迟”,由SysTick、PendSV、任务临界区,三者构建“服务层临界区”,
中断中调用的服务都挂起到PendSV中执行,PendSV还负责任务调度/切换,以实现“零中断延迟”。
1、“软中断替代法”还有另外一个好处,就是不用考虑“中断嵌套时不能切换任务”的问题,因为PendSV为最低优先级中断,不可能在中断嵌套中。
2、“软中断替代法”切换任务的效率偏低,不仅是因为额外的入栈、出栈,对于CosyOS来说,中断挂起服务的装载(加入到FIFO、触发PendSV)、
执行(从FIFO中取出,而后调用函数指针)都需花费额外的时间。
总之,两种方法都各有优势,平分秋色!
未来,CosyOS-II还将继续优化,在保证可靠性的前提下,争取进一步提高任务切换效率。
杨为民
发表于 2024-4-13 14:56:49
本帖最后由 杨为民 于 2024-4-13 15:00 编辑
CosyOS 发表于 2024-4-13 13:26
杨老师的最新排行榜我已查看,正如杨老师所述,无论如何,“软中断替代法”切换任务的效率都不可能赶上“直 ...
逐句回复:
(1)杨老师的最新排行榜我已查看,正如杨老师所述,无论如何,“软中断替代法”切换任务的效率都不可能赶上“直接切换法”。
排行榜是客观的,承认它就行。每个作品都有自己的目的和特色,粤菜为什么要与川菜比“辣”呢?
“软中断替代法”切换任务的效率都不可能赶上“直接切换法”,这个结论未必成立,万一哪天谁驾着七彩祥云或者踩着风火轮来的时候,这个结论就破了。
没准哪天你参透了,那个谁就是你。
(2)CosyOS在设计上固定采用“软中断替代法”。
最初采用此方案只是单纯为了实现“零中断延迟”,由SysTick、PendSV、任务临界区,三者构建“服务层临界区”,
中断中调用的服务都挂起到PendSV中执行,PendSV还负责任务调度/切换,以实现“零中断延迟”。
你的设计目标是“零中断延迟”,你的目标达到了,并且你还借鉴其他RTOS的先进技术,你这就是“好作品”呀。
况且比响应时间 9.375微秒/8.500微秒=110%,差了10%。但是比关中断时间 1~2微秒 / 0微秒=无穷大,天和地的差别。
(3)1、“软中断替代法”还有另外一个好处,就是不用考虑“中断嵌套时不能切换任务”的问题,因为PendSV为最低优先级中断,不可能在中断嵌套中。
2、“软中断替代法”切换任务的效率偏低,不仅是因为额外的入栈、出栈,对于CosyOS来说,中断挂起服务的装载(加入到FIFO、触发PendSV)、
执行(从FIFO中取出,而后调用函数指针)都需花费额外的时间。
是的,我帮你用本排行榜的实际例子来说明:
//YWM ==== 定时器3 ISR =========
void Timer3_ISR (void) interrupt 19
{
// TODO: 在此处添加用户代码
P00 = ~P00;
// ---- 中断启动等待任务 ------------
P01=1;
iResumeTask(TASK_A);
}
上面是CosyOS的程序,与我们平常使用的C251裸机编程一样,这就方便了用户,可以很容易地就将自己裸机程序升级到RTO程序了。
但是对于tzz1983的第2名程序,他的用户中断是这样的:
void Timer3_ISR_Handler_Hook (void) // 19
{
//添加中断代码
P00=~P00;
// ---- 中断启动等待任务 ------------
P01=1;
OSTaskResume(2);
}
上面的钩子函数给人一种裸机编程的感觉,但是由于下面的中断模块的存在,对钩子里的程序还是有很大的限制。
/*中断函数宏模板*/
#define _ISR_Package_CODE(n) \
void ISR_Handler_##n (void) \
{ \
__asm{ISR_Handler##n:} /*汇编标号*/ \
portSAVE_CONTEXT(); /*寄存器入栈*/ \
if(OSIntNesting==0){ portSW_TO_MSP() }/*如果是第一层中断切换至MSP*/ \
OSIntNesting++; \
__asm { SETBEA } \
ISR_Handler_Hook##n(); /*app勾子*/ \
__asm { CLREA } \
OSIntExit(); \
if(OSIntNesting==0){ portSW_TO_PSP() } \
m_OSIntCtxSw(); \
portRESTORE_CONTEXT(); \
__asm { SETBEA } \
__asm { RETI } \
}
__asm{
CSEG AT009BH /**/
CLR EA
JMP ISR_Handler19 /**/
}
(4)顺带也说明一下,让RTOS中的用户中断像C251的裸机编程一样,不仅“软中断替代法”可以实现,采用其他方法也可以实现,只是编程技术要求高一些。
// ==== 实时任务唤醒测试 定时器3 中断 ========
void Timer3_ISR(void) interrupt 19
{
// ---- 定时信号 ------------
Test_CH0 = ~Test_CH0;
// ---- 中断启动等待任务 ------------
Test_CH1=1;
OSTaskResume(2);
}
上面是排行榜第1名的程序
(5)总之,两种方法都各有优势,平分秋色!
未来,CosyOS-II还将继续优化,在保证可靠性的前提下,争取进一步提高任务切换效率。
这个很好,只是最好将“平分秋色”改为“各有特色”,不然你俩将秋色都分了,其他方法怎么办?
作为老师,我更喜欢“待到山花烂漫时,都在丛中笑”
CosyOS
发表于 2024-4-13 16:26:48
本帖最后由 CosyOS 于 2024-4-13 16:32 编辑
刚才杨老师讲解的有一点非常重要,就是“有中断延迟”与“零中断延迟”的差别,
撇开“零中断延迟”是否有必要暂且不论,
两种技术路线,由系统保护临界段所带来的“中断延迟时间”之比是:有 / 无 = +∞,是天地之别。
在这里,仅是在描述两种技术路线的差别,不涉及具体作品的比较。
杨为民
发表于 2024-4-16 01:39:46
CosyOS 发表于 2024-4-11 17:19
测试程序已就绪,请杨老师评测:
你能不能参考你的STC32G的实时响应测试程序,把你的CosyOS-STC8H的实时响应测试程序也发上来参加排行,谢谢!
CosyOS
发表于 2024-4-16 15:29:45
杨为民 发表于 2024-4-16 01:39
你能不能参考你的STC32G的实时响应测试程序,把你的CosyOS-STC8H的实时响应测试程序也发上来参加排行,谢 ...
测试程序已发布,请杨老师评测:
这回排名要垫底了{:4_257:}
杨为民
发表于 2024-4-16 22:11:39
各位网友,3楼发布了运行在STC8H系列单片机上的一些RTOS的实时响应时间的排行榜。
等再多一些作品发布后一起点评
fanxsp
发表于 2024-4-16 23:23:17
杨为民 发表于 2024-4-16 22:11
各位网友,3楼发布了运行在STC8H系列单片机上的一些RTOS的实时响应时间的排行榜。
等再多一些作品发布后一 ...
杨教授,你好。刚看了你的测试程序。
我的测试例程在 V1.10的demo/STC8H/tut5中,原理基本是一样的。我是用开天斧的P20,P21端口分别接逻辑分析仪的两个通道,其中接P20的通道设为上升沿触发。按下P32按钮测试任务中切换。往串口1发送一个数据,测试中断中切换。两个通道波形的上升沿之间的时间就是任务切换的时间。
嵌入式之路
发表于 2024-4-16 23:31:13
能不能理解为,在相同的时间内(两个单片机主频一致),STC32G的任务调度更加精准? 如果是这样的话就可以说明,STC32G的RTOS库更加强大!
页:
1
2
[3]
4
5
6
7
8
9
10
11
12