本帖最后由 杨为民 于 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一样。
|