杨为民 发表于 2023-9-18 18:29:12

STC单片机 uC/OS-II核心技术(3):任务切换用软中断时RTOS系统不需要任何关闭总中断

本帖最后由 杨为民 于 2024-3-31 10:49 编辑

(1)根据笔者很早以前对RTOS的研究表明,当RTOS系统采用软中断指令进行任务切换的时候,RTOS系统本身是不需要任何关闭总中断的临界区保护方法的,系统包含的关闭总中断的临界区保护方法只是提供给用户做特殊用途的。为此我论坛上面的两个移植版本进行了测试,果然如此。(2)uC/OS-II的系统代码把进入和退出临界区保护语句作为宏定义,这样就方便了用户自己选择和定义不同的临界区保护方法,当然要取消RTOS系统的临界区保护也就简单了,只需要把这两个宏定义为“空”就行了。下面是对挑战者网友的移植的C251-UCOSII程序进行修改的部分,其中任务切换部分仍然保持了上一篇帖子的去除临界区保护的注释:
上面第47行程序将临界区保护方法设置为“0”,第50行到第53行将方法0设置为“空”,这时对RTOS系统将不进行任何形式的临界区保护。
(3)下面是将上一篇帖子的例子进行修改后进行测试的结果:
OK,实际运行结果居然与有临界区保护的一模一样。上图是从开机开始的50秒的逻辑分析仪输出结果。在上图左面明显可以看到P2端口的开机LOGO信号。(4)结论:对于STC32G单片机,如果使用软中断替代法作为任务切换方法的时候,对于整个uC/OS-II系统(就是那些组成系统的C语言文件中的程序)无需采用任何临界区保护措施。
(5)下面是对熊仔网友移植的UCOSII-STC32G进行无临界区保护测试的结果:
很不幸,在大约32秒后翻车了。
(6)下面是本次测试对熊仔网友移植的UCOSII-STC32G范例程序进行修改的地方:
上面第72行程序将临界区保护方法设置为“0”,第75行到第78行将方法0设置为“空”,对RTOS系统不进行任何形式的临界区保护。
(7)结论:对于没有翻车的例子,可能存在BUG,但是对于已经翻车的例子,其肯定存在BUG。也就是说,与挑战者网友的移植版相比, 熊仔的移植版存在BUG。

这是本文例子程序




tzz1983 发表于 2023-9-18 18:58:43

真的是越来越。。。没有办法,控制不住自已
杨老师:之前和你的另一个约定,“通不通得过临界区测试〞那个,我也认输。对赌不是好习惯,我要做个好孩子。

杨为民 发表于 2023-9-18 19:35:29

tzz1983 发表于 2023-9-18 18:58
真的是越来越。。。没有办法,控制不住自已
杨老师:之前和你的另一个约定,“通不通得过临界区测试〞那个 ...

恭喜你,你挖到金矿了,你为STC32G单片机的RTOS找到了一个好方法,找到了一个新的研究方向

熊仔 发表于 2023-9-19 12:31:52

这里还有一个帖子啊
杨老师真的是脑洞大开,还有这么尝试的。晚一点瞄一下为啥测试不通过。不应该呀,核心部分都一样。

熊仔 发表于 2023-9-19 12:36:25

看了一下提供的图片,P26,P27这么多脉冲,那是因为开启了两个定时器中断。很可能是因为这个导致的。

熊仔 发表于 2023-9-19 14:35:47

加上2个定时器后,工作几秒钟,直接重启。







结论:无临界区不可行。

杨为民 发表于 2023-9-19 16:00:50

熊仔 发表于 2023-9-19 14:35
加上2个定时器后,工作几秒钟,直接重启。




我觉得你应该先测试你自己的程序,把它弄正确了。即使别人的移植程序错了,也不能证明你的移植程序是对的,拉垫背不解决你自己的问题

熊仔 发表于 2023-9-19 18:24:41

本帖最后由 熊仔 于 2023-9-19 18:28 编辑

一,用我移植的版本,把杨老师测试的例子弄过去,也是不会死机。





结论:之前我的例子和杨老师的例子有点不一样。导致结果不同。

二,对之前的例子使用临界区方法0测试:
1,在全局不关闭中断的情况下,即便关闭定时器1和定时器3中断,运行时间长了,会出错。
2,仅在PendSv切换中断函数,对关键语句关中断,运行时间长了,不会出错。   


杨为民 发表于 2023-9-19 21:23:32

熊仔 发表于 2023-9-19 18:24
一,用我移植的版本,把杨老师测试的例子弄过去,也是不会死机。




{:4_250:}“结论:之前我的例子和杨老师的例子有点不一样。导致结果不同。”

有进步,开始怀疑测试程序的问题,并且做实验来证实。
对于一个合格的RTOS移植者,知其然还要知其所以然,因此你还是得回答:为什么你的灶(你的移植版)配你的锅(你的范例程序)就不行了呢?
期待你的进一步研究结果

熊仔 发表于 2023-9-19 22:36:09




1,通过对比,就Task_A稍微不一样。
增加Delay_MS(50);            // 50毫秒
测试竟然可以工作,但是长时间工作后还是有问题,任务A,B不工作了。

2,然后关闭定时器1和定时器3.可以长时间工作。

结论:方法0有bug,不能用。

页: [1] 2 3 4
查看完整版本: STC单片机 uC/OS-II核心技术(3):任务切换用软中断时RTOS系统不需要任何关闭总中断