完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>
|
|
相关推荐
1个回答
|
|
2.FreeRTOS列表和列表项
2.1列表和列表项简介 学习FreeRTOS,肯定少不了列表和列表项,列表和列表项是FreeRTOS的一个数据结构,它是FreeRTOS的基石。 列表被用来跟踪FreeRTOS中的任务,在list.h文件中定义了列表结构体List_t如下 typedef struct xLIST { listFIRST_LIST_INTEGRITY_CHECK_VALUE configLIST_VOLATILE UBaseType_t uxNumberOfItems; ListItem_t * configLIST_VOLATILE pxIndex; MiniListItem_t xListEnd; listSECOND_LIST_INTEGRITY_CHECK_VALUE } List_t; 第一行和第五行都是用来检查列表完整性,需要将宏 configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES设置为1。 uxNumberOfItems用来记录列表中列表项的数量。 pxIndex用来记录当前列表项索引号,用于遍历列表。 xListEnd表示列表中最后一个列表项,用来表示列表结束。 列表项就是存放在列表中的项目,其定义如下 struct xLIST_ITEM { listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE configLIST_VOLATILE TickType_t xItemValue; struct xLIST_ITEM * configLIST_VOLATILE pxNext; struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; void * pvOwner; void * configLIST_VOLATILE pvContainer; listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE }; typedef struct xLIST_ITEM ListItem_t; 第一行和第七行同列表一样,都是用来检查列表项完整性。 xItemValue为列表项值。 pxNext指向下一个列表项。 pxPrevious指向前一个列表项,与pxNext相配合。 pvOwner记录此列表项归谁拥有,通常是任务控制块。 pvContainer用来记录此列表项归哪个列表。 另外还有一种迷你列表项,其定义如下 struct xMINI_LIST_ITEM { listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE configLIST_VOLATILE TickType_t xItemValue; struct xLIST_ITEM * configLIST_VOLATILE pxNext; struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; }; typedef struct xMINI_LIST_ITEM MiniListItem_t; 第一行同样用于检查迷你列表项的完整性。 xItemValue记录列表项值。 pxNext指向下一个列表项。 pxPrevious指向前一个列表项。 在这里之所以弄个迷你列表项,是因为有些情况下,我们不需要列表项那么全的功能,可能只需要其中的某几个成员变量,此时用列表项的话可能会造成内存浪费。 2.2列表与列表项函数 2.2.1列表与列表项初始化 新创建或者定义的列表都需要对其做初始化处理,对列表的初始化函数为vListInitialise(),其函数原型如下: void vListInitialise ( List* const pxList) 参数: pxList: 要进行初始化的列表。 返回值:无 对列表项的初始化函数为vListInitialiseItem(),其函数原型如下: void vListInitialiseItem ( ListItem_t * const pxItem) 参数: pxItem: 要进行初始化的列表。 返回值:无 在此不对初始化函数的具体代码做描述了,有兴趣的可以去list.c文件中查看。 2.2.2 列表项插入 列表项的插入函数为vListInsert(),其函数原型如下: void vListInsert( List* const pxList, ListItem_t * const pxNewListItem) 参数: pxList: 列表项要插入的列表。 pxNewListItem: 要插入的列表项。 返回值:无 2.2.3列表项末尾插入 列表在末尾插入列表项的函数为vListInsertEnd(),其函数原型如下: void vListInsertEnd( List * const pxList, ListItem_t * const pxNewListItem) 参数: pxList: 列表项要插入的列表。 pxNewListItem: 要插入的列表项。 返回值:无 2.2.4 列表项删除 有插入那么必然有删除,列表项的删除函数为uxListRemove(),其函数原型如下: UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) 参数: pxItemToRemove: 要删除的列表项。 返回值: 返回删除列表项以后的列表剩余列表项数目。 列表项的删除只是将指定的列表项从列表中删除掉,并不会将列表项的内存给释放掉。 2.3操作实验 2.3.1实验设计 本次设计中创建了一个列表以及三个列表项,通过中断采集按键状态,当KEY1按下时,依次将三个列表项添加到列表中,当KEY2按下时,删除第2条列表项,当KEY3按下时,再将第2条列表项从末尾插入。 可参考12.3.2章节进行导入已有工程,工程存放路径【华清远见-FS-MP1A开发资料 |