12.物联网操作系统之多任务核心

一。列表及列表项概念以及应用

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);
  }

结果:

问题:

        按键没有处理好,有波动。

        删除一下子全部删除,创建是正确的,一次创建一个

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值