FreeRTOS for STC32G12K128内核代码解读(三)队列(3)
FreeRTOS for STC32G12K128内核代码解读第三章队列(3)队列读/写---Gentleman
1.写队列xQueueSend()
1.1 写队列前
默认的是这种 queueSEND_TO_BACK 方式 (下面会展开讲)
关闭了总中断
if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )
判断一下 队列是否满了(存入项数<总项数),或者覆盖模式
xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );
没满就调用prvCopyDataToQueue() 实现入队操作
1.2入队函数prvCopyDataToQueue()
uxMessagesWaiting = pxQueue->uxMessagesWaiting;
获取一下存入项数
信号量部分先跳过
看这段代码,这是默认的入队方式queueSEND_TO_BACK
( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize );
这里用memcpy 把项 复制到 pcWriteTo 待写指针指向的空间
pxQueue->pcWriteTo += pxQueue->uxItemSize;
写完了,把待写指针下移,指向等待写入新项的空间
if( pxQueue->pcWriteTo >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */
{
pxQueue->pcWriteTo = pxQueue->pcHead;
}
写到尾部了,就指向头部
对比队列读/写图来看
pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1;
已存入项+1
关于阻塞的部分先不看
2.读队列xQueueReceive()
与写相似的地方就不看了
直接看prvCopyDataFromQueue()
先讲读指针 下移
如果指向了尾部
就指向头部 (首个插入的数据 ,还是看图)
(下一次再读,就是读第二次写入的数据了)
pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1;
存入队列项数-1
上一期 FreeRTOS for STC32G12K128内核代码解读(三)队列(2) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
下一期 待更新
占
页:
[1]