今天是2024.10.3,学习了列表和列表项,个人学习的小小总结,如果有误请指正

列表和列表项是什么

列表可以说是freertos中的一种数据结构吧,列表是由列表项组成的,每个列表项又有前继和后继(包括首尾),和双向列表有点像。

列表结构体

(1)和(5)据说是调试的时候用到的宏定义,我们不需要多理会。

(2)是列表中列表项的个数

(3)pxindex是当前列表中所指的列表项,用来遍历列表

(4)迷你列表项,代表一个列表的最后一个列表项,仅用作充当末尾列表项连接列表

简略概括为

列表项结构体

(1)(7)据说是调试的时候用到的宏定义,我们不需要多理会。

(2)代表列表项的值(用于升序排序)

(3)该列表项的后继

(4)该列表项的前继

(5)该列表项归谁所有,通常是任务控制块

(6)该列表项属于哪个列表

简略概括为

迷你列表项

迷你列表项有提到过,他是一个列表的最后一个列表项,而且仅作列表的最后一项,用于连接列表项,无其他作用。因此他只有值,前继,后继三个成员变量(它的value是0xffffffff,因为他是末尾项,最大值)

简略概括为

相关API函数

初始化列表和列表项

初始化列表

void vListInitialise( List_t * const pxList )

列表刚初始化时只带有一个作为末尾列表项的迷你列表项,所以他的index,previous,next都是指向这个末尾列表项。

初始化列表项

void vListInitialiseItem( ListItem_t * const pxItem )

而初始化列表项的函数就很简单了,他只需要初始化他所属的列表为空就可以了

插入列表项

按照升序插入

void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )

这个是升序插入的函数,也就是说它会根据列表项的value来决定列表项目插入的位置,如果待插列表项的value等于0xffffffff,那他就直接插入在迷你尾列表项之前。如果不是的话,就通过一个for循环,遍历到列表最后一个value小于待插项value的列表项,然后再插入。

按照尾插入

void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )

尾插入就比较简单了,他会直接插入到列表pxindex所指的列表项的后面。

删除列表项

UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )

返回值是列表中所剩的列表项数目。

个人学习的小小总结,如果有误请指正

Logo

「智能机器人开发者大赛」官方平台,致力于为开发者和参赛选手提供赛事技术指导、行业标准解读及团队实战案例解析;聚焦智能机器人开发全栈技术闭环,助力开发者攻克技术瓶颈,促进软硬件集成、场景应用及商业化落地的深度研讨。 加入智能机器人开发者社区iRobot Developer,与全球极客并肩突破技术边界,定义机器人开发的未来范式!

更多推荐