本帖最后由 杨为民 于 2024-5-2 19:41 编辑
(1)测试的起源:
92楼: 楼主: 如果是用Timer0做系统节拍,那就要调用OSTimeTick()函数,那设为“不可屏蔽中断模式3”,也是不行的。只有Timer0中断中不调用任何系统服务时,才可以。
93楼:杨为民: 这是理论,你试过吗?要不我来试试?
94楼:楼主: Timer0我也没有试过,因为我是用Timer0做为定时服务的,Timer0不能关中断肯定不行,我有试过Timer3不关中断的情况。如果要试Timer0的话,那要改用Timer3做系统的定时服务。这种情况,我也试试看。
95楼:楼主: 还是原来的测试程序,我改了一下,改用Timer3做系统定时,Timer0改为不可屏蔽模式,测试正常,稍等我发上来,你也试一下。
(2)最后楼主还是不敢试,楼主的测试程序为:
其中第174行将定时器0设置为不可屏蔽中断模式3
其中第131行是定时器0的中断ISR,第140行是定时器3的中断ISR
测试程序工作正常。
(3)我对测试程序进行了如下修改:
将第131行的中断号从1修改为19,将第140行是的中断号从19修改为1,这样第131行开始的就是定时器3的中断ISR,而第140行开始的是定时器0的中断ISR。
修改后的测试程序工作正常。
在修改后的测试程序中,系统节拍定时器ISR中不仅有第144行的系统节拍服务,而且还有第151行的用户服务调用,这些功能当定时器0工作在模式3也是可以正常运行的。
(4)结论:楼主的RTOS的系统节拍定时器是可以工作在“不可屏蔽中断模式3”的。
(5)建议:不管别人说了什么,只要有条件就应该自己亲自去试一试,就像本测试一样。
(6)楼主不敢试的责任应该我来负:我想可能来源于我的文章《STC单片机uC/OS-II移植记(6):消除原移植程序中系统中断存在的瑕疵》(https://www.stcaimcu.com/forum.php?mod=viewthread&tid=2466)
其中“一、系统定时器中断不能采用不可屏蔽模式”一节有结论“(6)上面的理论分析说明在uC/OS-II操作系统中,系统中断的定时器0不能工作模式3的不可屏蔽中断模式下。”
这里我也向所有因这篇文章产生误解的网友说声抱歉。
(7)辩解:这是针对“目前的uC/OS-II移植版本”,针对当时的STC8H资深专家版本说的,并且给出了该结论成立的前提条件:
RTOS系统离不开临界区保护功能,对于系统中断定时器0能否使用模式3的问题,可以用理论模型的方法来论证。 假定RTOS程序采用进入临界区保护EA=0和退出临界区保护EA=1的方法,假定RTOS程序正在处于临界区保护状态,这时总中断已经被关闭(EA=0)了。
也就是说只有对于采用不可嵌套的、直接关闭总中断的临界区保护方法的RTOS,上面那个结论才成立。
(8)新结论:如果一个RTOS的临界区保护方法不是“采用不可嵌套的、直接关闭总中断”的方法,那么系统中断的定时器0可以也应该工作在模式3的不可屏蔽中断模式下。 由于楼主的RTOS的临界区保护方法是可嵌套的关闭总中断的方法: 因此楼主的RTOS的系统中断自然可以工作在不可屏蔽中断模式3下。 (9)推论:RTOS的临界区保护方法是否可嵌入的问题在本论坛已经经历了多次深入的讨论,目前本论坛里除了“FreeRTOS”外的RTOS大都采用了可嵌入的临界区保护方法,因此对这些RTOS,系统中断的定时器0可以也应该工作在模式3的不可屏蔽中断模式下的。比如CosyOS-II的系统中断也可以工作在不可屏蔽中断模式3下。
|