找回密码
 立即注册
查看: 795|回复: 23

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

[复制链接]

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10904
发表于 2023-9-18 12:59:13 | 显示全部楼层 |阅读模式
本帖最后由 杨为民 于 2024-3-31 10:46 编辑

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

下面是网友“tzz1983”移植的C251-UCOSII的测试程序:
C251-UCOSII_原始版.rar (707.82 KB, 下载次数: 18)
C251-UCOSII_任务切换.rar (708.43 KB, 下载次数: 19)
下面是熊仔网友移植的UCOSII-STC32G的测试程序
uCOSII-STC32G-V1.00_原始版.rar (663.92 KB, 下载次数: 21)
uCOSII-STC32G-V1.00_任务切换.rar (664.35 KB, 下载次数: 21)


回复 送花

使用道具 举报

该用户从未签到

11

主题

331

回帖

886

积分

荣誉版主

积分
886
发表于 2023-9-18 13:19:56 来自手机 | 显示全部楼层
因为测试例子没有高优先级的中断抢占。
当高优先级的中断抢占了这个切换函数。然后调用了系统的函数。就会有影响
比如刚好抢占的时候有高优先级的任务就绪,就会改变了当前的任务。

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

点评

RTOS是一门计算机科学,科学就应该接受实践的检验。别只用嘴说,不要多,你只要举出一个实际程序例子来推翻我的结论就行了,如果举不出实际例子来,那么本身就证明我的结论是正确的。  详情 回复 发表于 2023-9-18 13:31
回复 支持 反对 送花

使用道具 举报

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10904
 楼主| 发表于 2023-9-18 13:31:26 | 显示全部楼层
熊仔 发表于 2023-9-18 13:19
因为测试例子没有高优先级的中断抢占。
当高优先级的中断抢占了这个切换函数。然后调用了系统的函数。就会 ...

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

使用道具 举报

该用户从未签到

20

主题

575

回帖

1191

积分

荣誉版主

积分
1191
发表于 2023-9-18 14:17:42 | 显示全部楼层
本帖最后由 tzz1983 于 2023-9-18 14:19 编辑

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

点评

(1)把两种类型的任务切换放在一个中断中,而中断过程本身就是互斥的:当前中断没有结束(没有发表RETI指令之前),本中断不会第二次进入的。 (2)你是老程序员了,实践出真知,你编个测试程序试试看能不能推翻我  详情 回复 发表于 2023-9-18 14:36
回复 支持 反对 送花

使用道具 举报

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10904
 楼主| 发表于 2023-9-18 14:36:05 | 显示全部楼层
本帖最后由 杨为民 于 2023-9-18 14:37 编辑
tzz1983 发表于 2023-9-18 14:17
读写全局还是需要互斥的. 成组的全局变量需要放在同一个临界区
以这个例子:
    OSPrioCur = OSPrioHighRdy ...

(1)把两种类型的任务切换放在一个中断中,而中断过程本身就是互斥的:当前中断没有结束(没有发布RETI指令之前),本中断不会第二次进入的。

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

回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

331

回帖

886

积分

荣誉版主

积分
886
发表于 2023-9-18 14:43:59 | 显示全部楼层
比如OSQPost函数

截图202309181440311320.jpg

截图202309181442232904.jpg

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

点评

这是计算机论坛江湖召开武林大会,不是君子演讲比赛,要想说服谁:上程序!  详情 回复 发表于 2023-9-18 16:25
回复 支持 反对 送花

使用道具 举报

该用户从未签到

20

主题

575

回帖

1191

积分

荣誉版主

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

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

点评

这是计算机论坛江湖召开武林大会,不是君子演讲比赛,要想说服谁:上程序!  详情 回复 发表于 2023-9-18 16:26
回复 支持 反对 送花

使用道具 举报

该用户从未签到

11

主题

331

回帖

886

积分

荣誉版主

积分
886
发表于 2023-9-18 16:15:52 | 显示全部楼层
本帖最后由 熊仔 于 2023-9-18 16:16 编辑

中断退出前调用OSIntExit (),

OSIntExit ()调用OS_SchedNew(),

截图202309181612306896.jpg


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

OS_EventTaskRdy函数就有对OSRdyGrp,OSRdyTbl操作。
截图202309181616482666.jpg




点评

我不接受嘴说,我的程序已经亮出来了,你直接亮程序来说服我,我一运行便知对错!  详情 回复 发表于 2023-9-18 16:28
回复 支持 反对 送花

使用道具 举报

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10904
 楼主| 发表于 2023-9-18 16:25:16 | 显示全部楼层

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



回复 支持 反对 送花

使用道具 举报

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10904
 楼主| 发表于 2023-9-18 16:26:03 | 显示全部楼层
tzz1983 发表于 2023-9-18 14:51
我说的嵌套是被别的中断打断自己,不是自己打断自己, 其二是别的中断函数调用OS应用时可能会用到这两个值, ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-17 23:38 , Processed in 0.071724 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表