UCOSIII支持中断嵌套,高优先级中断可以打断低优先级中断,在UCOSIII中使用OSIntNestingCtr来记录中断嵌套次数,最大支持250级嵌套,没进一个中盾嵌套OSIntNestingCtr就加1,反之则减1
进入中断函数:OSIntEnter(),仅进行OSIntNestingCtr加1操作
退出中断函数:OSIntExit()
void XXX_Handler(void)
{
OSIntEnter(); //标记进入中断服务程序,记录中断嵌套次数
//中间中断服务程序自己写
OSIntExit(); //触发中断任务切换
}
临界段代码也叫临界区,这部分代码不能被系统打断。
进入临界区:OS_CRITICAL_ENTER()
退出临界区:OS_CRITICAL_EXIT()是退出还进行任务调度,OS_CRITICAL_EXIT_NO_SCHED()退出不进行任务调度
UCOSIII对中断发布消息或者信号的处理有两种模式:直接发布和延迟发布。宏OS_CFG_ISR_POST_DEFERRED_EN来选择,置0使用直接发布,置1使用延迟发布。
直接发布模式下,UCOSIII通过关中断保护临界区代码,延迟模式下通过锁定任务调度
延迟模式的速度高于直接模式,两者仅是模式不同,代码无需更改。
- 延时函数:OSTimeDly(OS_TICK dly, OS_OPT opt, OS_ERR *p_err)
dly:延迟时间节拍数
opt:OS_OPT_TIME_DLY 相对模式
OS_OPT_TIME_TIMEOUT 和opt:OS_OPT_TIME_DLY 一样
OS_OPT_TIME_MATCH 绝对模式
OS_OPT_TIME_PERIODIC 周期模式
相对模式在系统负担重时可能会延迟多个节拍,周期模式下任务可能会被推迟执行。推荐使用周期模式
绝对模式可以指定上电后指定的时间执行具体动作,比如,上电N秒关闭某个外设
- 延时函数:OSTimeDlyHMSM(CPU_INT16U hours, //延时小时数
CPU_INT16U minutes, //延时分钟数
CPU_INT16U seconds, //延时的秒数
CPU_INT32U milli, //需要延时的毫秒数
OS_OPT opt, //选项
OS_ERR *p_err)
hours,minutes,seconds,milli:当OS_CFG_TICK_RATE_HZ为200,最小延时为5ms
opt:比OSTimeDly()多了两个,OS_OPT_TIME_HMSM_STRICT和OS_OPT_TIME_HMSM_NON_STRICT.
OS_OPT_TIME_HMSM_STRICT模式下,hours(0-99),minutes(0-59),seconds(0-59),milli(0-999)
OS_OPT_TIME_HMSM_NON_STRICT模式下,hours(0-999),minutes(0-9999),seconds(0-65535),milli(0-4294967259)
- 退出延时函数:OSTimeDlyResume(OS_TCB *p_tcb, OS_ERR *p_err)
用来使错误延时的任务恢复运行
OSTimeGet(),获取当前时钟节拍技术器的值
OSTimeSet(),设置当前时钟节拍计数器的值,最好别使用
网友评论