1 事件控制块的清空与状态查询
1.1 设计实现
事件控制块的清空:

事件控制块的查询:

/**********************************************************************************************************
** Function name : tEventRemoveAll
** Descriptions : 清除所有等待中的任务,将事件发送给所有任务
** parameters : event 事件控制块
** parameters : msg 事件消息
** parameters : result 告知事件的等待结果
** Returned value : 唤醒的任务数量
***********************************************************************************************************/
uint32_t tEventRemoveAll (tEvent * event, void * msg, uint32_t result)
{
tNode * node;
uint32_t count;
// 进入临界区
uint32_t status = tTaskEnterCritical();
// 获取等待中的任务数量
count = tListCount(&event->waitList);
// 遍历所有等待中的任务
while ((node = tListRemoveFirst(&event->waitList)) != (tNode *)0)
{
// 转换为相应的任务结构
tTask * task = (tTask *)tNodeParent(node, tTask, linkNode);
// 设置收到的消息、结构,清除相应的等待标志位
task->waitEvent = (tEvent *)0;
task->eventMsg = msg;
task->waitEventResult = result;
task->state &= ~TINYOS_TASK_WAIT_MASK;
// 任务申请了超时等待,这里检查下,将其从延时队列中移除
if (task->delayTicks != 0)
{
tTimeTaskWakeUp(task);
}
// 将任务加入就绪队列
tTaskSchedRdy(task);
}
// 退出临界区
tTaskExitCritical(status);
return count;
}
/**********************************************************************************************************
** Function name : tEventWaitCount
** Descriptions : 事件控制块中等待的任务数量
** parameters : event 事件控制块
** parameters : msg 事件消息
** parameters : result 告知事件的等待结果
** Returned value : 唤醒的任务数量
***********************************************************************************************************/
uint32_t tEventWaitCount (tEvent * event)
{
uint32_t count = 0;
// 进入临界区
uint32_t status = tTaskEnterCritical();
count = tListCount(&event->waitList);
// 退出临界区
tTaskExitCritical(status);
return count;
}
参考资料:
本文深入探讨了嵌入式操作系统中事件控制块的管理机制,包括如何清空事件控制块并唤醒所有等待的任务,以及如何查询等待任务的数量。通过具体函数实现,如tEventRemoveAll和tEventWaitCount,展示了事件控制块在任务调度中的核心作用。
173万+

被折叠的 条评论
为什么被折叠?



