找回密码
 立即注册
查看: 937|回复: 0

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

[复制链接]

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10922
发表于 2023-9-22 11:11:14 | 显示全部楼层 |阅读模式
本帖最后由 杨为民 于 2024-3-31 10:52 编辑


关闭总中断或者关闭系统中断是单片机RTOS最常用的临界区保护方法。但是如果需要保护的程序临界区较长,关闭总中断方法会导致所有的中断都被停止,这使得整个RTOS系统的实时响应能力下降,如果只关闭系统中断,那么像RTOS的时间系统就会受到影响,影响定时时间的精度。
利用对任务切换加锁/解锁进行临界区保护的方法是单片机RTOS临界区保护的最古老方法之一。采用这个方法,只是对任务切换的功能加锁,进入临界区后锁住RTOS不让进行任务切换,始终执行当前任务,直到退出临界区保护。
本介绍一个对任务切换进行加锁/解锁的嵌套性进行测试的程序和对两款在STC32G单片机上使用替代软中断进行任务调度的uC/OS-II移植版进行测试的结果。
本文测试的硬件平台是使用STC32G单片机的“降龙棍”开发板,并在P2端口连接了一个8通道逻辑分析仪。
一、任务切换加锁/解锁的临界区保护方法测试
(1)本文的测试程序是把上一篇文章的第二个测试程序的任务C里进入/退出临界区保护的语句修改为对任务切换加锁/解锁的语句得到的,见下图:
Fig_01_加锁.jpg
其中第169行和第191行调用任务切换加锁函数“OSSchedLock()”进入临界区保护,
Fig_02_解锁.jpg
然后第210行和第216行调用任务切换解锁函数“OSSchedUnlock()”退出临界区保护。

(2)方法0的测试结果。采用方法0运行上面的测试3程序,运行结果的时序见下图:
Fig_03_有保护.jpg
可以看到通道0、通道6和通道7的中断信号是连续的,没有被临界区保护中断掉。与上篇文章无任何临界区保护的时序图(见下图)相比:
Fig_04_无保护.jpg
可以看到任务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则整个测试运行的过程中都没有关闭总中断(程序中也没有关闭任何中断),本测试本质上是实现了一种不关闭任何中断进行临界区保护的方法。

测试3_C251-UCOSII.rar (714.76 KB, 下载次数: 27)

测试3_uCOSII-STC32G-V1.00.rar (696.53 KB, 下载次数: 28)

回复 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-21 14:50 , Processed in 0.055683 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表