FreeRTOS内核源码之消息队列

FreeRTOS内核实现与应用开发实战指南

P238 通用消息队列发送函数 xQueueGenericSend()(任务)

上面看到的那些在任务中发送消息的函数都是 xQueueGenericSend()展开的宏定义,真

正起作用的就是 xQueueGenericSend()函数,根据指定的参数不一样,发送消息的结果就不

一样,下面一起看看任务级的通用消息队列发送函数的实现过程,具体见代码清单 17-18。

代码清单 17-18 xQueueGenericSend()函数源码(已删减)

BaseType_t xQueueGenericSend(QueueHandle_t xQueue, const void *const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition)
{
    BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired;
    TimeOut_t xTimeOut;
    Queue_t *const pxQueue = (Queue_t *)xQueue;

    /* 已删除一些断言操作 */

    for (;;)
    {
        taskENTER_CRITICAL();/*进入临界段*/
        {
            /* 队列未满 */
            if ((pxQueue->uxMessagesWaiting < pxQueue->uxLength) || (xCopyPosition == queueOVERWRITE))
            {
                traceQUEUE_SEND(pxQueue);
                xYieldRequired =
                    prvCopyDataToQueue(pxQueue, pvItemToQueue, xCopyPosition);

                /* 已删除使用队列集部分代码 */
                /* 如果有任务在等待获取此消息队列 */
                if (listLIST_IS_EMPTY(&(pxQueue->xTasksWaitingToReceive)) == pdFALSE)
                {
                    /* 将任务从阻塞中恢复 */
                    if (xTaskRemoveFromEventList(&(pxQueue->xTasksWaitingToReceive)) != pdFALSE)
                    {
                        /* 如果恢复的任务优先级比当前运行任务优先级还高,
                         * 那么需要进行一次任务切换 */
                        queueYIELD_IF_USING_PREEMPTION();
                    }
                    else
                    {
                 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值