【freertos】010-消息队列概念及其实现细节
目录前言重点问题 10.1 消息队列概念 10.2 消息队列的数据传输机制 10.3 消息队列的阻
塞访问机制 10.4 消息队列使用场景 10.5 消息队列控制块 10.5.1 队列控制块源码 10.5.2 队
列控制块成员剖析 10.5.3 cRxLock 和 cTxLock10.5.4 队列控制块数据结构图 10.6 创建消息
队列 10.6.1 创建消息队列 API 说明 10.6.2 创建消息队列简要步骤 10.6.3 创建消息队列源码
10.6.4 消息队列数据结构图 10.7 发送消息 10.7.1 发送消息 API10.7.2 发送消息实现简要步
骤 10.7.3 发送消息源码分析 10.7.5 中断专用的发送消息 API10.8 接收消息 10.8.1 接收消息
API10.8.2 接收消息简要步骤 10.8.3 接收消息源码 10.9 窥探消息 10.10 队列查询 10.10.1
查询队列当前有效数据个数 10.10.2 查询队列当前可以空间个数 10.11 删除消息队列 10.12
消息队列使用注意小结
前言
消息队列是任务间通信系列介绍的首篇笔记,因为学习完消息队列的源码实现后,信号量、
互斥量这些任务间通信机制也相当于学完了,只剩下概念性的内容了。
参考:
https://www.freertos.org/a00018.html
李柱明文章:https://www.cnblogs.com/lizhuming/p/16344076.html
重点问题
这个只是阅读源码时发现的,并未验证,有空再填这个坑。
从 vQueueDelete()就知道,这玩意只是释放内存,没做别的操作。
那 么 我 们 思 考 一 个 问 题 , 如 果 此 时 有 任 务 阻 塞 在 这 个 队 列 对 象 里 面 , 我 们 调 用
vQueueDelete()释放内存后,如果阻塞在这个队列对象的任务被唤醒了,需要解除阻塞,解
除任务事件节点值,那岂不是会对内存的乱踩?
唤醒参考阻塞超时唤醒后调用 xTaskIncrementTick()里面的代码段:
/* Is the task waiting on an event also? If so remove it from the event
list. */
if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) !=
NULL )
{
listREMOVE_ITEM( &( pxTCB->xEventListItem ) );
}
freertos 的这个问题确实会存在,所以我们删除消息队列时必须确保没有任务阻塞在这个
队列里面。
评论0
最新资源