事件控制块的清空与状态查询

本文深入探讨了嵌入式操作系统中事件控制块的管理机制,包括如何清空事件控制块并唤醒所有等待的任务,以及如何查询等待任务的数量。通过具体函数实现,如tEventRemoveAll和tEventWaitCount,展示了事件控制块在任务调度中的核心作用。

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;
}  

参考资料:

  1. 【李述铜】从0到1自己动手写嵌入式操作系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值