微前端架构如何改变企业的开发模式与效率提升
810
2022-11-08
1324_FreeRTOS队列创建函数实现分析
全部学习汇总: GitHub - GreyZhang/g_FreeRTOS: learning notes about FreeRTOS.
这个是之前常用的一个队列对象创建的接口,其实xQueueCreate是一个定义出来的宏。
这个是宏定义的部分,为了方便查看我做了一个换行信息。这里,其实是一个通用的队列创建接口,固定了其中的一个参数数值。另外需要注意的一点是,这个功能是必须开启动态的分配功能的时候才支持的功能。
关于固定的参数,这里是定义的地方。从这里基本上可以推测,队列有6中基本的用法,而其中的2种其实是一回事儿。
创建队列的时候,采用动态的方式会先进行存储分配。存储的信息主要是两部分,一部分是队列的对象,另一部分是队列容纳的数据信息。
这个是队列的信息的定义,看起来还是很复杂的。接下来,我先测试一下这个数据类型的空间占用情况。
一个队列的信息占用了72个字节,看起来资源的消耗还是很大的。
分配成功之后,初始化新的队列。感觉上其实是根据数据存储的地方进行数据区域的初始化。这里也到了函数的最后部分了,可以看得出来,如果创建成功函数返回的句柄其实是指向存储空间的指针,否则返回的是NULL。这样,其实就很容易理解为什么在很多例子中看到测试代码需要判断这个是否是非NULL的数值再进行下一步的操作了。而收发队列都是借用的这个返回信息,其实是给了相关的动作操作队列空间的方式。
如果队列的类型是基础类型或者是队列集合,那么pcHead指向队列的开始。如果是其他几种用途,看上去是只利用队列的数据区。
之后设置队列的长度以及元素个数等属性,设置完了之后对队列进行复位的操作。接下来,看看这个队列的复位操作如何处理的。
这个是reset的操作,队列尾其实是最后的字节位置,写入指定在队列头,读取是在队列尾部的前一个元素的位置。读取的这个指针操作,多少是有一些没看懂为什么这么处理。后面,这个操作还是得理解一下。可能,这个得结合读取的动作来看了。
接下来的这部分,按照前面的调用,应该执行画出来的这部分。也就是对发送事件链表以及等待事件链表进行初始化。这样,其实大概的机理也很容易弄明白了。其实,队列跟任务的绑定关系是在发送或者接收的接口调度的时候建立的。
这样,队列的创建函数基本就分析完了。跟我之前猜测的还是不是很相同,我以为是直接借助于简单的任务调度创建一下逻辑操作就可以,看起来这里还是把实现转向了状态链表的方式上去了。也可以理解,这样的方式会跟任务有着更好的粘合度。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~