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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2144

    积分

    荣誉版主

    积分
    2144
    发表于 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 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2144

    积分

    荣誉版主

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2144

    积分

    荣誉版主

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 06:03
  • 签到天数: 156 天

    [LV.7]常住居民III

    18

    主题

    604

    回帖

    675

    积分

    高级会员

    打工人

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-21 06:32 , Processed in 0.064755 second(s), 44 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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