gentleman 发表于 2024-3-17 10:14:15

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



   
      




gentleman 发表于 2024-3-17 17:33:46

上一期 FreeRTOS for STC32G12K128内核代码解读(三)队列(2) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)


下一期 待更新

gentleman 发表于 2024-3-17 17:33:53


页: [1]
查看完整版本: FreeRTOS for STC32G12K128内核代码解读(三)队列(3)