一。列表及列表项概念以及应用
1.freeRTOS列表介绍
列表项都是由链表生成,想要了解列表项,首先应该把上述的链表都要搞懂。
这是列表项的组件列表。
2.列表及列表项的定义
列表是双向链表构成,原因是双向链表的插入与删除效率高,只需要操作一次就能完成,而且对数据的管理更加灵活与便捷,有利于编写逻辑清晰的程序。
3.freeRTOS列表操作API
(1)vListInitialise()初始化列表
(2)vListInitialiseItem()初始化列表项
(3)vListInsert()指定序号插入列表项到列表中
(4)vListInsertEnd()插入列表项到列表尾部
(5)uxListRemove()从列表中移除列表项
二。实验:列表及列表项函数应用
1.功能需求
1、当按键K3按下插入列表项
2、当按键K4按下移除列表项
3、当按键K5按下打印所有列表项信息
2.功能实现
功能业务划分
1.创建列表及列表项
2.列表及列表项初始化
3.插入功能开发
4.移除功能开发
5.打印功能开发
3.cubemx创建,在11课的基础上
4.步骤:
(1)Delay_Task的全局变量与局部变量的定义
全局变量
#define ITEM_NUMBER 5
List_t ListTest;
ListItem_t ListItemTest[ITEM_NUMBER];
局部变量与列表的初始化
EventBits_t KeyEventBits;
uint8_t index;
static uint8_t record = 0;
ListItem_t* pListItem;
/*
1、列表及列表项初始化
*/
vListInitialise(&ListTest);
for(index=0;index<ITEM_NUMBER;index++){
vListInitialiseItem(&ListItemTest[index]);
ListItemTest[index].xItemValue = index;
}
(3)for(;;)主函数中,实现功能
/*
1、修改事件标志组等待状态为 触发后清除标志
2、检测按键,处理相关功能
*/
KeyEventBits = xEventGroupWaitBits(KeyEventGroup,
KEY3_EVENT_BIT|KEY4_EVENT_BIT|KEY5_EVENT_BIT|KEY6_EVENT_BIT,
pdTRUE,
pdFALSE,
portMAX_DELAY);
printf("Key is Down Key Event Bit is %x\r\n",KeyEventBits);
switch(KeyEventBits){
case KEY3_EVENT_BIT:
/*
当列表项在范围内,允许插入
插入完毕后,记录值record加一
*/
if(record < ITEM_NUMBER){
vListInsert(&ListTest,&ListItemTest[record++]);
}
else{
printf("plese press K4 remove!\r\n");
}
break;
case KEY4_EVENT_BIT:
/*
当记录值有效时,允许移除
插入完毕后,记录值record减一
*/
if((record != 0)&&(record <= ITEM_NUMBER)){
uxListRemove(&ListItemTest[--record]);
}
else{
printf("plese press K3 insert!\r\n");
}
break;
case KEY5_EVENT_BIT:
/*
1、打印有效列表项地址
2、打印有效列表项(ItemValue)
3、打印有效列表项前节点地址
4、打印有效列表项后节点地址
*/
for(pListItem = ListTest.xListEnd.pxNext;pListItem != (ListItem_t*)&ListTest.xListEnd;pListItem=pListItem->pxNext){
printf("pListItem addr = %x\r\n",pListItem);
printf("pListItem item value = %d\r\n",pListItem->xItemValue);
printf("pListItem previous addr = %x\r\n",pListItem->pxPrevious);
printf("pListItem next addr = %x\r\n",pListItem->pxNext);
}
break;
default:
break;
}
osDelay(10);
}
结果:
问题:
按键没有处理好,有波动。
删除一下子全部删除,创建是正确的,一次创建一个