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
{