杨为民 发表于 2023-9-22 11:11:14

STC单片机 uC/OS-II核心技术(5):单片机RTOS的一种不关闭任何中断的临界区保护方法

本帖最后由 杨为民 于 2024-3-31 10:52 编辑


关闭总中断或者关闭系统中断是单片机RTOS最常用的临界区保护方法。但是如果需要保护的程序临界区较长,关闭总中断方法会导致所有的中断都被停止,这使得整个RTOS系统的实时响应能力下降,如果只关闭系统中断,那么像RTOS的时间系统就会受到影响,影响定时时间的精度。利用对任务切换加锁/解锁进行临界区保护的方法是单片机RTOS临界区保护的最古老方法之一。采用这个方法,只是对任务切换的功能加锁,进入临界区后锁住RTOS不让进行任务切换,始终执行当前任务,直到退出临界区保护。本介绍一个对任务切换进行加锁/解锁的嵌套性进行测试的程序和对两款在STC32G单片机上使用替代软中断进行任务调度的uC/OS-II移植版进行测试的结果。本文测试的硬件平台是使用STC32G单片机的“降龙棍”开发板,并在P2端口连接了一个8通道逻辑分析仪。 一、任务切换加锁/解锁的临界区保护方法测试(1)本文的测试程序是把上一篇文章的第二个测试程序的任务C里进入/退出临界区保护的语句修改为对任务切换加锁/解锁的语句得到的,见下图:
其中第169行和第191行调用任务切换加锁函数“OSSchedLock()”进入临界区保护,
然后第210行和第216行调用任务切换解锁函数“OSSchedUnlock()”退出临界区保护。
(2)方法0的测试结果。采用方法0运行上面的测试3程序,运行结果的时序见下图:
可以看到通道0、通道6和通道7的中断信号是连续的,没有被临界区保护中断掉。与上篇文章无任何临界区保护的时序图(见下图)相比:
可以看到任务A和任务B的执行位置不同了。在进入了禁止任务切换的临界区保护状态之后,第187行的“OSTaskResume(2)”激活任务A语句和第206行的“OSTaskResume(3)”激活任务B语句在分别将任务A和任务B的状态改变为“就绪”之后,尽管它们的优先级比正在执行的任务C的优先级高,但在临界区保护中并不能够立即进行任务切换得到执行,也就是说区间3和区间5并不能得到执行。从图上可以看在第170行到第216行的临界区保护的程序区间,任务C程序的程序连续执行不被打断,实现了不依赖关闭任何中断的临界区保护。(3)当任务C的程序按照区间1、2、4、6顺序执行到第210行解除禁止任务切换后,由于系统中断产生的中断内任务调度程序就会将CPU控制权交给最高优先级的就绪任务A执行,见前图的通道4,等到任务A挂起自己后,中断内任务调度程序就会将CPU控制权交给次高优先级的就绪任务B执行,见前图的通道5,等到任务B挂起自己后,CPU控制权被切换回任务C继续执行区间7和9。最终整个测试程序是按照区间1、2、4、6、3、5、7、8的顺序执行的,与无临界区保护的顺序不同。(4)方法3的测试结果。虽然采用了方法3,但用户程序中并没有使用关闭中断的临界区保护方法语句,因此对两个移植版的测试结果均与方法0一样。
(5)测试3结论:如果采用方法0则整个测试运行的过程中都没有关闭总中断(程序中也没有关闭任何中断),本测试本质上是实现了一种不关闭任何中断进行临界区保护的方法。





页: [1]
查看完整版本: STC单片机 uC/OS-II核心技术(5):单片机RTOS的一种不关闭任何中断的临界区保护方法