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

STC单片机 uC/OS-II核心技术(2):在替代法中任务切换时其实不需要临界区保护

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

(1)最近网友“tzz1983”在论坛上推出了他用替代法软中断作为任务切换的方法的“C251-UCOSII”uC/OS-II移植版,引起了对任务切换核心过程要不要进行关闭总中断进行临界区保护的大讨论。(2)今天熊仔网友也在论坛上推出了他用替代法软中断作为任务切换的方法的“uCOSII-STC32G”uC/OS-II移植版。并且请帮忙查错。(3)根据笔者很早以前对RTOS的研究,采用软中断指令进行任务切换的时候不需要在软中断程序中进行临界区保护,因此对上面两个移植版本进行了测试,果然如此。(4)下面是对网友“tzz1983”移植的C251-UCOSII_原始版进行测量的结果:
(5)然后注释掉任务切换中断中的第115行关闭总中断程序和第119行的打开总中断程序,这个任务切换无临界区保护的测试程序编译后的运行结果与原始的一样。
(6)下面是对熊仔网友移植的UCOSII-STC32G_原始版进行测量的结果:
(7)然后注释掉任务切换中断中的第163行到第167行关闭总中断程序以及第174和175行的打开总中断程序,这个任务切换无临界区保护的测试程序编译后的运行结果与原始的一样。
(8)结论:对于STC32G单片机,使用软中断替代法作为任务切换方法时,在软中断程序中无需采用任何临界区保护措施。
下面是网友“tzz1983”移植的C251-UCOSII的测试程序:


下面是熊仔网友移植的UCOSII-STC32G的测试程序




熊仔 发表于 2023-9-18 13:19:56

因为测试例子没有高优先级的中断抢占。
当高优先级的中断抢占了这个切换函数。然后调用了系统的函数。就会有影响
比如刚好抢占的时候有高优先级的任务就绪,就会改变了当前的任务。

其实保护就是两条c语言的,这两条必须同时修改。系统重要变量。

杨为民 发表于 2023-9-18 13:31:26

熊仔 发表于 2023-9-18 13:19
因为测试例子没有高优先级的中断抢占。
当高优先级的中断抢占了这个切换函数。然后调用了系统的函数。就会 ...

RTOS是一门计算机科学,科学就应该接受实践的检验。别只用嘴说,不要多,你只要举出一个实际程序例子来推翻我的结论就行了,如果举不出实际例子来,那么本身就证明我的结论是正确的。

tzz1983 发表于 2023-9-18 14:17:42

本帖最后由 tzz1983 于 2023-9-18 14:19 编辑

读写全局还是需要互斥的. 成组的全局变量需要放在同一个临界区
以这个例子:
    OSPrioCur = OSPrioHighRdy;
    OSTCBCur= OSTCBHighRdy;
当执行完第第一条语句时, 此时发生嵌套中断, 在高优先中断里,调用OS应用POST一个信号, 使一个更高级任务就绪, 此时OSPrioCur 还是之前的OSPrioHighRdy, 而OSTCBCur会读到已经被更新的OSTCBHighRdy. 两者的组合在短时间内出现了错位
但是这里有个很特殊的地方就是, 当前切换完成后,紧接着又会来一次切换, 因为有更高级任务就绪时使中断标志又有效了, 在下一次切换时, 会更正之前的错误, 所以程序运行时,对外并没有体现出这个错误. (如果能证明, 在任何情况下都能保证实际运行不会出偏差,"这要考虑情景的太多了, 一不留神可能就是坑". 又比如再次出现嵌套, 外部又用到了这两个变量, 就不能保证它们用到了正确的值组合).

杨为民 发表于 2023-9-18 14:36:05

本帖最后由 杨为民 于 2023-9-18 14:37 编辑

tzz1983 发表于 2023-9-18 14:17
读写全局还是需要互斥的. 成组的全局变量需要放在同一个临界区
以这个例子:
    OSPrioCur = OSPrioHighRdy ...
(1)把两种类型的任务切换放在一个中断中,而中断过程本身就是互斥的:当前中断没有结束(没有发布RETI指令之前),本中断不会第二次进入的。

(2)你是老程序员了,实践出真知,你编个测试程序试试看能不能推翻我的结论!编不出来,你就得认。上个世纪的操作系统书里,从来就没有这种关中断的招数,但那个时候火箭卫星都上天了。

熊仔 发表于 2023-9-18 14:43:59

比如OSQPost函数





如果中断使用这个函数,会造成影响。

tzz1983 发表于 2023-9-18 14:51:41

杨为民 发表于 2023-9-18 14:36
(1)把两种类型的任务切换放在一个中断中,而中断过程本身就是互斥的:当前中断没有结束(没有发布RETI指 ...

我说的嵌套是被别的中断打断自己,不是自己打断自己, 其二是别的中断函数调用OS应用时可能会用到这两个值,(你说的意思应该是:"别的中断最终还是会通个本中断来切换任务", )

熊仔 发表于 2023-9-18 16:15:52

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

中断退出前调用OSIntExit (),

OSIntExit ()调用OS_SchedNew(),




影响OSRdyGrp,OSRdyTbl的函数,都会影响。

OS_EventTaskRdy函数就有对OSRdyGrp,OSRdyTbl操作。





杨为民 发表于 2023-9-18 16:25:16

熊仔 发表于 2023-9-18 14:43
比如OSQPost函数




这是计算机论坛江湖召开武林大会,不是君子演讲比赛,要想说服谁:上程序!



杨为民 发表于 2023-9-18 16:26:03

tzz1983 发表于 2023-9-18 14:51
我说的嵌套是被别的中断打断自己,不是自己打断自己, 其二是别的中断函数调用OS应用时可能会用到这两个值, ...

这是计算机论坛江湖召开武林大会,不是君子演讲比赛,要想说服谁:上程序!
页: [1] 2 3
查看完整版本: STC单片机 uC/OS-II核心技术(2):在替代法中任务切换时其实不需要临界区保护