本帖最后由 杨为民 于 2024-5-24 16:27 编辑
5月15日,采用“不关闭总中断”的临界区保护方法的CosyOS-II推出了官宣的“零中断延迟测试”程序:
笔者挑选了“CosyOS-II-STC8H-工程模板”,将原来每秒进行1次的“高优先级中断系统服务调用”修改为每25微秒(25uS)进行1次,结果在测试时系统崩溃了。 下面是测试过程和测试结果。 (1)测试类型选择1(有服务调用并恢复task_3): (2)增加任务1和任务2的LED/逻辑分析仪信号输出: 其中在第53行增加“P01=~P01;”作为任务1的信号输出,在第66行增加“P02=~P02;”作为任务2的信号输出。 (3)修改任务3的信号输出: 其中在第79行增加“P04=~P04;”作为任务3的信号输出。 对任务3的最重要修改是注释掉第77行原来串口输出语句,这样就可以排除系统崩溃中串口的因素。 (4)对于高优先级中断中调用系统服务的周期的修改测试: CosyOS-II的测试方法是将定时器1设置为最高优先级模式,然后将定时器1的中断周期设置为5微秒。然后在定时器1的ISR中用一个计数器控制进行中断调用的周期。 其中第100行程序是调用“iResumeTask(task_3)”系统服务来唤醒任务3。原来的第95行是每秒调用一次。第96行是每10毫秒调用一次,第97行是每25微秒调用一次。 测试时注释掉其中两行,留下一行进行对应的测试。 (5)每秒一次中断调用的测试结果: 其中可以看到通道3的中断内系统服务调用信号,通道4的任务3的每秒一次的周期反转信号。 (6)每10毫秒一次中断调用的测试结果: 从中可以看到通道4的任务3的每10毫秒一次的周期反转信号和通道3的中断调用信号。 图中通道1和通道2是任务1和任务2的信号,任务每激活一次信号就反转一次。 (7)每25微秒一次中断调用的测试结果: 从图中可以看出系统运行时崩溃了,除了定时器1的5微秒的中断信号,其他任务1、2、3的信号都没有了。
(8)对于崩溃的原因,笔者觉得不是程序BUG造成的,而是由于CosyOS-II没有采用关闭总中断作为临界区保护方法造成的。
附件1_原始的测试程序_CosyOS-II-STC8H.rar
(1.12 MB, 下载次数: 106)
附件2_修改后_高优先级中断调用测试_CosyOS-II-STC8H.rar
(1.12 MB, 下载次数: 102)
|