中断管理
- UCOSIII支持中断嵌套的,高优先级的中断可以打断低优先级的中断,最高支持250级中断嵌套,OSInitNestingCtr就是记录中断嵌套层数的(进入+1,退出-1)。
- 中断会打断正在执行的的任务,转而执行中断服务程序,但是如果在执行中断服务程序时有比之前更高优先级的任务就绪,当退出中断服务程序的时候,cpu就会直接执行这个更高级别的任务。
- 编写中断服务函数
- 例程:
void XXX_Handler(void) { OSIntEnter(); //进入中断 /*........... 用户自己编写的代码。 ...........*/ OSInitExit(); //触发任务切换软中断 }
-
XXX为不同中断源的中断函数的名字
- 例程:
-
直接发布和延时发布
-
通过宏OS_CFG_ISR_POST_DEFERRED_EN定义。(1:延时发布,0:直接发布)
-
延时模式下:中断服务程序调用系统的发布函数时,系统不会直接调用,而是将这个发布函数调用和相应的参数写入到专用的队列中,该队列称为中断队列,然后使中断队列处理任务进入就绪态。
-
一般使用延时发布,直接发布会导致中断响应时间延长。
-
延时发布模式下:UCOSIII通过关闭中锁定任务调度来保护临界代码
-
直接发布模式下:UCOSIII通过关闭中断来保护临界代码。
-
在中断队列处理任务访问队列时仍然需要关闭中断,但是提取发布函数需要的参数后会打开中断,然后用锁定任务调度器进行发布函数调用。
-
临界代码保护
有些代码需要保证其完成运行,不能被打断,这些代码称为临界代码,也叫临界区
- 进入临界区:OS_CRITICAL_ENTER()
- 退出临界区:OS_CRITICAL_EXIT()或OS_CRITICAL_NO_SCHED()
- 当宏OS_CFG_ISR_POST_DEFERRED_EN定义为0时,进入临界区会使用关中断的方法,定义为1的时候进入临界区会使用给任务调度器上锁的方法(不关闭中断,中断可打断)。
延时函数具体使用
OSTimeDly()函数
- 原型:void OSTimeDly(OS_TICK dly,OS_OPT opt,OS_ERR *p_err)
- dly: 指定延时的时间长度,单位为时间节拍数
- opt: 指定的延时使用选项,有四种选项
- OS_OPT_TIME_DLY 相对模式(不是很准确,偶尔会相差+-一个节拍)
- OS_OPT_TIME_TIMEOUT 同上
- OS_OPT_TIME_MATCH 绝对模式(指上电后多少个时间节拍来执行)
- OS_OPT_TIME_PERIODIC 周期模式(用于长时间运行的周期性延时)
- p_err : 指向调用该函数后返回的错误码
OSTimeDlyHMSM()函数(常用的)
原型:void OSTimeDlyHMSM(CPU_INT16U hours, //需要延时的小时数
CPU_INT16U minutes, //需要延时的分钟数
CPU_INT16U seconds, //需要延时的秒数
CPU_INT32U milli, //需要延时的毫秒数
CPU_OPT opt, //选项
OS_ERR *p_err)
opt :相比OSTimeDly()函数多两个选项OS_OPT_TIME_HMSM_STRICT和OS_OPT_TIME_HMSM_NON_STRICT。
(范围不同:第一个:hours:0~99,minutes:0~60,seconds:0~59,milli:0~999。
第二个:hours:0~999,minutes:0~9999,seconds:0~65535,milli:0~4294967259)