找回密码
 立即注册
查看: 771|回复: 3

FreeRTOS for STC32G12K128内核代码解读(三)队列(2)

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2024-3-14 11:31:47 | 显示全部楼层 |阅读模式
FreeRTOS for STC32G12K128内核代码解读
    第三章  队列(2)队列创建                -Gentleman



    截图202403141113513676.jpg





1.队列创建函数xQueueCreate()
    queue = xQueueCreate( 100, sizeof( int ) );

   
  跳进去发现一个宏
截图202403141012021388.jpg

   几个参数:
       参数1:队列长度, 即有多少个项,实例中为 100个 int类型变量
       参数2:项大小, 每项内存空间的大小, 直接通过sizeof 返回
       参数3:队列类型
       截图202403141018315703.jpg
             这里是创建基础的队列 不是其他的信号量

   再跳一次
    截图202403141013349369.jpg

   到函数内部了
   
   定义了一个 Queue_t 队列(头)结构


   我们观察一下这个结构


2.队列头 Queue_t

   
    截图202403141020417146.jpg

    截图202403141022465137.jpg

    这个头用于记录  队列起始地址 ,待写数据指针,联合体在下面展开,两个链表(待发送和接收),队列已存放长度,队列总长度 ,队列项大小,读写队列锁等信息

      截图202403141025022725.jpg
      联合体展开
          队列 和 信号量需要的结构,信号量先跳过

       截图202403141026049687.jpg

        队列的结构里 存放 队列结束地址 与 最后一项指针

  3.初始化队列

    截图202403141115378874.jpg
    判断一下,是否溢出

   xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize );
    计算队列多少字节 分配空间用
               pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); /*lint !e9087 !e9079 see comment above. */
    给新队列分配内存空间
                   pucQueueStorage = ( uint8_t * ) pxNewQueue;

                pucQueueStorage += sizeof( Queue_t ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */

    队列数据存储空间 在队列头后面
  
                   prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue );
    初始化新队列
      
    截图202403141120241096.jpg
   空队列(数据区域) 就吧pcHead指向 队列(头)的起始空间
   非空  就把pcHead 指向 队列数据存储区域



    pxNewQueue->uxLength = uxQueueLength;
    pxNewQueue->uxItemSize = uxItemSize;




    长度和 项大小 赋值
    跳进下个函数
截图202403141123159965.jpg



    pxQueue->u.xQueue.pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */
            pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;
            pxQueue->pcWriteTo = pxQueue->pcHead;
            pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - 1U ) * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */
            pxQueue->cRxLock = queueUNLOCKED;
            pxQueue->cTxLock = queueUNLOCKED;


     看这段代码
          pcTail 指向了 队列结束
          pcWriteTo 指向了第一项
          pcReadFrom 指向 队列最后的项
          读写锁 未锁
          (可以对照队列结构图来看)
         

1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2024-3-14 11:34:42 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2024-3-14 11:35:33 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:488
  • 最近打卡:2025-05-02 07:02:30
已绑定手机

27

主题

693

回帖

1954

积分

金牌会员

打工人

积分
1954
发表于 2024-3-14 12:14:03 | 显示全部楼层
暂时还是不接触了,有点高深
打工人
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 18:11 , Processed in 0.109283 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表