博士
最后登录1970-1-1
在线时间 小时
注册时间2015-3-6
|
发表于 2015-10-19 14:09:44
|
显示全部楼层
void OSTimeTick (void) (os_time.c文件)
函数里边有
(void)OSTaskSemPost((OS_TCB *)&OSTickTaskTCB, /* Signal tick task */
(OS_OPT ) OS_OPT_POST_NONE,
(OS_ERR *)&err);
就是发送一个任务信号量给OSTickTaskTCB任务
在os_tick.c文件中的
void OS_TickTaskInit (OS_ERR *p_err)函数里边有创建一个OSTickTaskTCB任务:
OSTaskCreate((OS_TCB *)&OSTickTaskTCB,
(CPU_CHAR *)((void *)"uC/OS-III Tick Task"),
(OS_TASK_PTR )OS_TickTask,
(void *)0,
(OS_PRIO )OSCfg_TickTaskPrio,
(CPU_STK *)OSCfg_TickTaskStkBasePtr,
(CPU_STK_SIZE)OSCfg_TickTaskStkLimit,
(CPU_STK_SIZE)OSCfg_TickTaskStkSize,
(OS_MSG_QTY )0u,
(OS_TICK )0u,
(void *)0,
(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR | OS_OPT_TASK_NO_TLS),
(OS_ERR *)p_err);
任务的服务函数就是:void OS_TickTask (void *p_arg)函数
在该函数内有任务信号量等待函数
(void)OSTaskSemPend((OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(CPU_TS *)0,
(OS_ERR *)&err); /* Wait for signal from tick interrupt */
这样整个的逻辑就是:
时钟中断循环调用void OSTimeTick (void)函数发送任务信号量给OSTickTaskTCB任务
void OS_TickTask (void *p_arg)函数在接收到任务信号量后就给改变时间标志OSTickCtr++;
然后就是更新延时链表和超时链表里边内容
OS_TickListUpdateDly()和OS_TickListUpdateTimeout()
在两个函数内就就好更新每个延时函数的剩余时间,是否延时完毕等等操作
楼主可以参考Micrium官方书籍《嵌入式实时操作系统uCOS-III》的5.6.2小节内容 |
|