本帖最后由 杨为民 于 2024-5-6 22:08 编辑
一、不关闭总中断与零中断延迟
(1)STC8H和STC32G/F系列单片机的推出为在STC单片机上移植主流 RTOS和研发针对STC单片机的RTOS提供了硬件基础。不过由于STC系列单片机缺乏像Cortex-M系列单片机上的专门针对RTOS的“SVC”和“PendSV”软中断指令,因此对于RTOS的临界区保护方法出现了“关闭总中断”和“不关闭总中断”两种类型,后者又被称为“零中断延迟”类型。 (2)对于STC单片机,除了定时器0的不可屏蔽中断模式3外,其余的中断都受总中断控制。如果RTOS的临界区保护方法是采用关闭总中断的方法,则RTOS系统运行到临界区中时(比如进行任务切换时),关闭总中断会导致所有的新中断被禁止,新中断要延迟到系统从临界区中退出,总中断重新被打开后才能发生。这种延迟影响了RTOS的实时性。 (3)结论:对于STC单片机上的RTOS,只要临界区保护方法是采用关闭总中断方法的,无论是可嵌套的或者是不可嵌套的,都可能对单片机的用户中断产生阻塞,对用户中断的发生时间产生延迟。 假定在RTOS系统中,程序中临界区保护最长的那一段的执行时间为T,那么这个时间T就是这个RTOS系统运行时用户中断的“最大中断延迟时间”,也就是在最坏情况下用户中断可能产生的最大延迟时间。 (4)不关闭总中断的临界区保护方法的思路是在进入临界区时不关闭总中断吗,只关闭那些涉及RTOS系统服务的中断,这样那些不涉及RTOS系统服务的用户中断仍然可以及时发生,这样就不会影响RTOS系统对用户中断响应的实时性了,理论上就可以实现对用户中断的“零中断延迟”了。 (5)为了验证不关闭总中断的临界区保护方法在STC单片机上是否能真正实现“零中断延迟”,笔者在STC32G单片机上分别采用了关闭总中断的和不关闭总中断这两种临界区保护方法对uC/OS-II进行了移植(微山x51和挑战者x51)。本文介绍了对这两种RTOS进行“最大中断延迟时间”的测量方法和测量结果。 (6)本文还对率先在STC单片机是采用“不关闭总中断”临界区保护方法的CosyOS-II进行了测量。 (7)最后得到结论是: A)在STC单片机是目前采用“不关闭总中断”临界区保护方法的RTOS,无论是笔者的挑战者x51或者是CosyOS-II的目前版本,都没有能真正实现对用户中断的“零中断延迟”。 B)这些“不关闭总中断”临界区保护方法的RTOS的“最大中断延迟时间”与“关闭总中断”临界区保护方法的RTOS的“最大中断延迟时间”都在同一个量级。
二、关闭总中断的RTOS系统的最大中断延迟时间测量 (8)针对STC32G/STC8H单片机的具体情况,本文对最大中断延迟时间测量方法是用定时器3产生一个1微秒(1MHz)的用户中断,该中断仅仅是在P00端口上产生一个方波,然后用逻辑分析仪查看这个用户中断的信号是否被RTOS系统阻塞,测量最大的阻塞时间,就是该RTOS以微秒为单位的“最大中断延迟时间”。 (9)下图是采用“关闭总中断”临界区保护方法的uC/OS-II移植版微山x51的测试程序: 其中ISR只有一行程序“CPL 080H;”。由于这条指令不会改变PSW和任何寄存器的内容,所以ISR连中断现场保护都不需要。 程序中的080H对应于P00端口,可以通过对逻辑分析仪的0通道测量这个中断信号。
(10)为了模拟正常的RTOS运行环境,本测试在任务B和任务C之间进行了任务切换和任务休眠,见下图: 其中包括了RTOS的基本功能调用。
(11)为了找到用户中断延迟发生在什么地方,本测试程序给出了P01和P02两个参考信号,对应逻辑分析仪的通道1和通道2。这两个信号对于uC/OS-II的系统节拍处理“OSTimeTick()”和中断任务切换“uCx51_IntSched()”函数。测试信号程序见下图: (12)系统节拍产生的中断延迟。下图是1毫秒周期的系统节拍产生的用户中断延迟信号: 从中可以看到,当没有发生任务切换时,系统节拍(通道1)和中断任务切换程序(通道2)导致的用户中断延迟(通道0)的时间是10.625微秒(11.625-1.000)。
(13)任务切换产生的中断延迟。下图是uC/OS-II系统在进行中断外任务切换时产生的用户中断延迟信号: 从图中可以看到用户中断(通道1)多次被延迟(不均匀脉冲部分),也就是多次进入和退出临界区保护。其中最长的延迟时间是11.750微秒(12.750-1.000)。 (14)结论:对于使用关闭总中断作为临界区保护方法的uC/OS-II的最大中断延迟时间为12微秒左右。 (15)注意:本文的1微秒的用户中断测试是处于RTOS的非正常工作状态下,因此测试程序运行了一段时间后有可能进入死机状态。
三、不关闭总中断的RTOS系统的最大中断延迟时间测量 (16)挑战者x51是为了研究“零中断延时”技术在STC32G单片机是对uC/OS-II进行移植的版本,该版本采用了不关闭总中断的临界区保护方法。 (17)除了研究“不关闭总中断”的零中断延迟问题,挑战者x51还研究了关闭总中断对RTOS的影响。为了达到关闭总中断也不影响RTOS系统的运行效果,挑战者x51将系统节拍和中断任务切换都放到定时器0中断中,并且将定时器0设置为不可屏蔽中断模式3,同时还将定时器0的中断优先级设置为最高优先级3。
(18)下图为挑战者x51的中断延迟信号图: 从图中可以看到,由于定时器0的不可屏蔽中断(通道1)存在,在系统节拍和中断内任务切换时用户中断信号(通道0)被延迟了3.625微秒(4.625-1.000)。 (19)从图中还可以看到,由于采用了不关闭总中断的临界区方法,在中断外任务切换期间(通道3的正脉冲),用户中断没有受到任何影响。 (20)结论:挑战者x51没有实现真正的“零中断延迟”。其最大中断延迟时间约为4个微秒。 (21)本论坛的CosyOS-II 的临界区保护方法也是不关闭总中断的,本文对排行榜上的“CosyOS-II-STC32G-TEST-V2.1.3-20240410”版本进行了测试。 A)对其每1毫秒一次的节拍中断处理进行测量如下图: 大约是13.125微秒(14.125-1.000)
B)对其休眠任务“uDelay_ms(5)”切换造成的用户中断延迟测试如下图: 其中也出现了多次中断延迟(猜测是含有PenSV中断造成的),其中最长的延迟为11.250微秒(12.250-1.000)。
C)对其任务恢复“uResumeTask(TASK_B);”切换造成的用户中断延迟测试如下图: 其中也出现了多次中断延迟(猜测是含有PenSV中断造成的),其中最长的延迟为12.250微秒(13.250-1.000)。
(22)结论:CosyOS也没有实现真正的“零中断延迟”。其最大中断延迟时间约为13个微秒,与使用关闭总中断作为临界区保护方法的uC/OS-II的最大中断延迟时间差不多。
|