fanxsp
发表于 2024-5-2 22:34:04
本帖最后由 fanxsp 于 2024-5-2 23:17 编辑
杨为民 发表于 2024-5-2 19:36
(1)测试的起源:
92楼: 楼主: 如果是用Timer0做系统节拍,那就要调用OSTimeTick()函数,那设为“不可 ...
关于我的测试程序,我仔细想了一下,我把Timer0中断设为1ms, 这个间隔时间太长了,不能保证在任务切换的过程中timer0有发生中断,有可能发现不了问题。我把Timer0的中断间隔改为2us,重新进行了测试,发现任务切换时间变长了很多,说明在任务切换过程中,Timer0已经发生了多次中断。将Timer0的中断间隔改为2us进行测试,程序工作正常。这样就可以证明在没有调用系统服务的情况,是没问题的。关于你修改的测试程序,我也试一下。
fanxsp
发表于 2024-5-2 23:30:20
本帖最后由 fanxsp 于 2024-5-2 23:37 编辑
杨为民 发表于 2024-5-2 19:36
(1)测试的起源:
92楼: 楼主: 如果是用Timer0做系统节拍,那就要调用OSTimeTick()函数,那设为“不可 ...
关于你修改的测试程序我也进行了测试,之所以能正常工作,没有发现问题,原因就是Timer0 1ms的间隔时间太长了,结果在任务切换过程中,Timer0没有发生中断,也就没有发现问题。我把Timer0的中断间隔改为4us, OSTimeTick()的预分频改为250,Tick间隔 还是 1ms, 结果运行一段时间,就死机了。
fanxsp
发表于 2024-5-3 00:06:08
我增加了P06输出,用来指示Timer0中断频率,这样就能观察到任务切换过程中Timer0中断的次数。
杨为民
发表于 2024-5-3 00:45:04
本帖最后由 杨为民 于 2024-5-3 01:15 编辑
fanxsp 发表于 2024-5-2 23:30
关于你修改的测试程序我也进行了测试,之所以能正常工作,没有发现问题,原因就是Timer0 1ms的间隔时间太 ...
(1)敢于实验,好事,点赞。而且给出了实验程序供大家讨论研究,更要点赞。
(2)试到死机,好事,说明你碰到了自己认知的一个边界,如果解决了,自己的眼界就提升到一个新阶段了。
(3)定时器0的不可屏蔽中断模式3是STC单片机专门为OS预留的系统节拍中断,因此弄清楚其正确使用的各种条件是很重要的。
(4)所以一定要弄清楚为什么定时器0中断时间缩短到4uS后会死机。为了方便大家研究探讨,我截了逻辑分析仪的屏:
A)下图是死机开始的现场:
从32.25秒开始,任务B和任务C不工作了。
B)下图是中断唤醒响应时间图:
中断唤醒响应时间从原来正常时的17uS,拉长到56us了。
C)下图是任务切换响应时间图:
任务切换响应时间从原来正常时的14uS,拉长到54us了。
(5)现在要研究的是我在98楼的新结论还正确吗?或者还需要加入什么条件吗?
98楼:(8)新结论:如果一个RTOS的临界区保护方法不是“采用不可嵌套的、直接关闭总中断”的方法,那么系统中断的定时器0可以也应该工作在模式3的不可屏蔽中断模式下。
补充说明:上面逻辑分析仪截屏中的第6通道信号不连续是采样时间太长(2uS)造成的
杨为民
发表于 2024-5-3 01:15:47
fanxsp 发表于 2024-5-3 00:06
我增加了P06输出,用来指示Timer0中断频率,这样就能观察到任务切换过程中Timer0中断的次数。 ...
等你自己的研究结论
fanxsp
发表于 2024-5-3 07:50:28
杨为民 发表于 2024-5-3 01:15
等你自己的研究结论
我的结论: TinyRTOS51可支持不可屏蔽中断,条件是在不可屏蔽中断中不调用任何系统服务。
死机的原因:任务切换期间需要操作链表、任务控制块(TCB)及堆栈,所以是要通过关中断进入临界区,由于Timer0是不可
屏蔽中断,关中断不起作用,如果在任务切换期间发生了Timer0中断,且在Timer0中断中调用了系统服务,就有可能会破坏
链表、TCB及堆栈的数据,造成系统死机。所以在不可屏蔽中断中不能调用任何系统服务。Timer0中断间隔为1ms时,
Timer0中断都是发生在空闲任务里,不会在任务切换期间发生中断,所以程序运行正常。Timer0中断间隔为4us时,就会在
任务切换期间发生Timer0中断,所以就死机了。
任务切换时间变长的原因:在切换过程中,发生了多次Timer0中断,中断响应的时间,就加到任务切换时间里了。
fanxsp
发表于 2024-5-3 08:03:55
本帖最后由 fanxsp 于 2024-5-3 09:08 编辑
Timer0中断间隔改为2us, 增加P06输出,用于指示Timer0的中断频率,这样就可以直观观察到
任务切换期间Timer0发生了多少次中断。通过这个测试,才能真正证明RTOS是支持不可屏蔽中断的。
神农鼎
发表于 2024-5-3 09:39:54
Timer0中断间隔为4us时
===如果 STC8H8K64U工作在 40MHz
1个uS是40个时钟
4个uS是160个时钟,可以执行完 51的全部 111条指令了
4个uS能干点事
CosyOS
发表于 2024-5-3 10:55:02
我想,杨老师可能是要提示我们,
当RTOS的临界区保护方法不是“采用不可嵌套的、直接关闭总中断”的方法时,
有一种可以在不可屏蔽中断中执行系统服务的方法。
难道是查询临界区嵌套计数器?
为假就执行服务;
为真就缓存服务,待最终退出临界区之前再执行?
fanxsp
发表于 2024-5-3 11:11:48
本帖最后由 fanxsp 于 2024-5-3 11:15 编辑
CosyOS 发表于 2024-5-3 10:55
我想,杨老师可能是要提示我们,
当RTOS的临界区保护方法不是“采用不可嵌套的、直接关闭总中断”的方法时 ...
我的系统没有提供这种方法,只能是在不可屏蔽中断中不调用系统服务。因为不可屏蔽中断的目的就是为了快速响应,如果要等待退出临界区,那就相当于中断被屏蔽了,那不可屏蔽中断就没有什么意义了。