前言
UCOSIII(也称为µC/OS-III)的中断管理是其实时操作系统(RTOS)功能的重要组成部分。中断是CPU的一种常见特性,用于向CPU通知异步事件的发生,使得CPU能够暂停当前正在执行的程序,转而执行中断服务程序(ISR)。在UCOSIII中,中断管理涉及多个方面,包括中断嵌套、中断服务程序的编写、临界区保护以及中断发布模式等。
一、中断嵌套
UCOSIII支持中断嵌套,即高优先级的中断可以打断低优先级的中断。UCOSIII使OSIntNestingCtr
来记录中断嵌套的次数,最大支持250级的中断嵌套。每进入一次中断服务函数OSIntNestingCtr
就会加1;当退出中断服务函数时,OSIntNestingCtr
就会减1。
二、中断服务程序的编写
在UCOSIII中,编写中断服务程序时需要使用到两个函数:OSIntEnter()
和OSIntExit()
。OSIntEnter()
用于标记进入中断服务函数,并更新中断嵌套次数;OSIntExit()
用于退出中断服务函数,并根据需要发起中断级任务切换。
在uC/OS-III(UCOSIII)中,并不是所有中断的处理程序中都必须显式地调用OSIntEnter()
函数。然而,为了确保UCOSIII能够正确地管理中断嵌套和任务调度,建议在所有中断服务程序(ISR)的入口处调用OSIntEnter()
,并在退出中断服务程序之前调用OSIntExit()。
一个典型的中断服务程序模板如下:
void XXX_Handler(void) {
OSIntEnter(); // 进入中断,记录中断嵌套次数
// 用户自行编写的中断服务程序
OSIntExit(); // 退出中断,发起任务切换
}
三、临界区保护
临界区(Critical Section)指的是代码中的某些关键部分,这些部分的执行要求不能被打断。在UCOSIII中,有两种方式用于保护临界区代码:
直接发布模式:当宏OS_CFG_ISR_POST_DEFERRED_EN
定义为0时,UCOSIII通过关闭中断来保护临界段代码。这种方式可能会延长中断的响应时间。
延迟发布模式:当宏OS_CFG_ISR_POST_DEFERRED_EN
定义为1时,UCOSIII通过锁定任务调度来保护临界段代码。在延迟发布模式下,基本不存在关闭中断的情况,而是通过任务调度来实现中断发布,从而减少中断关闭时间。
四、时间管理
4.1时钟节拍
时钟节拍是UCOSIII实时操作系统的“心脏”,它决定了系统时间的最小单位。时钟节拍就是系统以固定的频率产生中断(时基中断),并在中断中处理与时间相关的事件,推动所有任务向前运行。时钟节拍需要依赖于硬件定时器,例如在STM32裸机程序中经常使用的SysTick时钟。
用户需要在os_cfg_app.h
中设定时钟节拍的频率(例如#define OS_CFG_TICK_RATE_HZ 1000u
),该频率越高,操作系统检测事件就越频繁,可以增强任务的实时性,但也会增加操作系统内核的负担。
4.2任务睡眠延时
UCOSIII提供了OSTimeDly()
函数,允许任务调用该函数将执行挂起直到一段时间过去。OSTimeDly()
函数允许三种模式:
- 相对模式(OS_OPT_TIME_DLY):延时时间从当前时刻开始计算。但是,由于系统负荷的影响,实际延时时间可能并不精确。
- 周期模式(OS_OPT_TIME_PERIODIC):任务延时时间间隔总是相同,不受负载变化的影响。
- 绝对模式(OS_OPT_TIME_MATCH):在上电后指定的时间执行特定的动作。
4.3延时精度
由于UCOSIII的时钟节拍是固定的,因此任务的延时精度受限于时钟节拍的频率。例如,如果时钟节拍频率设置为1000Hz(即每秒钟1000个节拍),则最小延时单位为1毫秒。但是,由于系统调度和其他任务的影响,实际延时时间可能并不完全精确。
注意,如果调用延时函数小于最小延时单位(1000Hz下为1毫秒),任务会被阻塞不会进行调度。
标签:服务程序,UCOSIII,管理,中断,嵌套,延时,OS From: https://blog.csdn.net/qq_38072731/article/details/140796363