1.uC/OS-III对从中断发布消息或信号的处理有两种模式:直接发布和延迟发布。
在文件os_cfg.h中,将OS_CFG_ISR_POST_DEFERRED_EN设置成0,使用直接发布模式;设置成1,则使用延迟发布模式。
2.直接发布模式使用关闭中断的方式来保护临界段代码。
3.延时发布模式通过给调度器上锁的方式来保护临界段代码。
4.延时发布模式与直接发布模式相比,主要是减少了关闭中断的时间,因而减少了中断延迟、中断响应和中断恢复的时间,但是因为使用的是给任务调度器上锁的方式保护临界段代码,反而使得任务延迟时间变长了。
5.基于uC/OS-III的系统通常需要底层平台提供一个周期性的定时信号,成为时钟节拍,或系统节拍。
uC/OS-III的时钟节拍的作用是通过时钟节拍对任务进行整数个节拍的延迟,并为等待事件的任务提供超时判断。
时钟节拍中断必须调用OSTimeTick()函数,该函数的代码位于文件os_time.c中,521行 - 565行
void OSTimeTick (void)
{
OS_ERR err;
#if OS_CFG_ISR_POST_DEFERRED_EN > 0u // 延迟发布模式
CPU_TS ts;
#endif
OSTimeTickHook(); // 介入函数--该函数允许uC/OS-III移植者在时钟节拍中断到来后进行额外的操作
#if OS_CFG_ISR_POST_DEFERRED_EN > 0u // 延时发布模式
ts = OS_TS_GET(); // 获取时间戳
OS_IntQPost((OS_OBJ_TYPE) OS_OBJ_TYPE_TICK, // 将发布函数调用请求和相关参数写入到中断队列中
(void *)&OSRdyList[OSPrioCur],
(void *) 0,
(OS_MSG_SIZE) 0u,
(OS_FLAGS ) 0u,
(OS_OPT ) 0u,
(CPU_TS ) ts,
(OS_ERR *)&err);
#else // 直接发布模式
(void)OSTaskSemPost((OS_TCB *)&OSTickTaskTCB, // 向时钟节拍任务发送信号量
(OS_OPT ) OS_OPT_POST_NONE,
(OS_ERR *)&err);
#if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u // 允许时间片轮转调度
OS_SchedRoundRobin(&OSRdyList[OSPrioCur]);
#endif
#if OS_CFG_TMR_EN > 0u // 允许定时器任务
OSTmrUpdateCtr--;
if (OSTmrUpdateCtr == (OS_CTR)0u) {
OSTmrUpdateCtr = OSTmrUpdateCnt;
OSTaskSemPost((OS_TCB *)&OSTmrTaskTCB, // 向定时器任务发送信号
(OS_OPT ) OS_OPT_POST_NONE,
(OS_ERR *)&err);
}
#endif
#endif
}
注:uC/OS-III一定需要时钟节拍,这是一个错误的概念,实际上,一些低功耗应用是不需要时钟节拍的。