当前位置: 首页 > news >正文

优秀个人网站设计模板互联网技术发展现状

优秀个人网站设计模板,互联网技术发展现状,长春火车站封闭了吗,谷歌google官网入口认识列表和列表项 FreeRTOS 中的 列表(List) 和 列表项(ListItem)是其内核实现的核心数据结构,广泛用于任务调度、队列管理、事件组、信号量等模块。它们通过双向链表实现,支持高效的元素插入、删除和遍历…
认识列表和列表项

FreeRTOS 中的 列表(List) 和 列表项(ListItem)是其内核实现的核心数据结构,广泛用于任务调度、队列管理、事件组、信号量等模块。它们通过双向链表实现,支持高效的元素插入、删除和遍历操作。

1. 列表(List)
列表是 FreeRTOS 中用于管理多个列表项的容器,其结构定义在 "list.h" 中  
主要成员如下:
     - uxNumberOfItems: 当前列表中包含的列表项数量。
     - pxIndex: 指向列表中的一个列表项,用于遍历列表(如任务切换时遍历就绪列表)。
     - xListEnd: 列表的“结束标记”,是一个特殊的列表项,作为链表的头和尾的锚点。

列表特点:
     - 列表是一个双向循环链表,通过 "xListEnd "作为链表的起点和终点。
     - 列表项按 "xItemValue"(列表项的值)"升序排列",便于快速插入和查找(如任务优先级调度)。

 2. 列表项(ListItem)
列表项是链表的节点,定义在 "list.h" 中
主要成员如下:
     - pvOwner: 指向列表项的所有者(如任务控制块 `TCB_t`)。
     - pxContainer: 指向该列表项所属的列表。
     - pxPrevious/pxNext: 指向前一个和后一个列表项的指针。
     - xItemValue: 列表项的值,用于排序(如任务的优先级)。

 列表项特点:
     - 每个列表项可以动态插入或移除到不同的列表中。
     - 列表项的 "xItemValue"决定了它在列表中的位置(按升序排列)。

3. 列表和列表项的关系
- 列表通过 "xListEnd"作为根节点,所有列表项通过 "pxPrevious"和 "pxNext" 指针链接成一个环。
- 例如,FreeRTOS 的任务就绪列表(pxReadyTasksLists)是一个列表,每个任务的控制块(TCB)中的状态列表项(xStateListItem)会插入到对应的就绪列表中。

4. 应用场景
1. 任务管理  
   - 任务的就绪列表、阻塞列表、挂起列表均通过列表和列表项管理。
   - 例如,任务的 "xStateListItem" 会根据任务状态插入到不同的列表中。
   - 任务的优先级由 "xItemValue" 表示,列表按优先级排序。

2. 事件组、队列、信号量
   - 当任务等待事件或资源时,其事件列表项(如 xEventListItem)会被插入到事件或资源的等待列表中。

5. 常用操作函数
FreeRTOS 提供了一系列 API 操作列表和列表项:

列表操作:
     - vListInitialise(List_t *pxList): 初始化一个空列表。
     - vListInsert(List_t *pxList, ListItem_t *pxNewListItem): 按 "xItemValue" 升序插入列表项。
     - vListRemove(ListItem_t *pxItemToRemove): 从列表中移除某个列表项。

列表项操作:
     - vListInitialiseItem(ListItem_t *pxItem): 初始化列表项。
     - listSET_LIST_ITEM_OWNER(ListItem_t *pxListItem, void *pvOwner): 设置列表项的所有者(如任务句柄)。
     - listGET_LIST_ITEM_VALUE(ListItem_t *pxListItem): 获取列表项的值。

下面用代码演示列表项的插入、删除以及末尾插入:

1.插入列表项1,值为40

//列表任务
void list_task(void *pvParameters)
{vListInitialise( &TestList );//初始化列表1vListInitialiseItem(&ListItem1);//初始化列表项1vListInitialiseItem(&ListItem2);//初始化列表项2vListInitialiseItem(&ListItem3);//初始化列表项3ListItem1.xItemValue = 40;ListItem2.xItemValue = 60;ListItem3.xItemValue = 50;printf("----------------------------列表与列表项地址------------------------- \r\n");
printf("项目                         地址                                    \r\n");
printf("TestList                     %#x                         \r\n",(int)&TestList);
printf("TestList->pxIndex            %#x                 \r\n",(int)TestList.pxIndex);
printf("TestList->xListEnd           %#x             \r\n",(int)&(TestList.xListEnd));
printf("ListItem1                    %#x                   \r\n",(int)&ListItem1);
printf("ListItem2                    %#x                     \r\n",(int)&ListItem2);
printf("ListItem3                    %#x                     \r\n",(int)&ListItem3);//TestList插入列表项1
vListInsert(&TestList ,&ListItem1);//插入列表项函数
printf("---------------------------插入列表项ListItem1------------------------\r\n");
printf("TestList->xListEnd->pxNext        %#x       \r\n",(int)(TestList.xListEnd.pxNext));
printf("ListItem1->pxNext                 %#x              \r\n",(int)(ListItem1.pxNext));
printf("----------------------------前后连接分割线----------------------------\r\n");
printf("TestList->xListEnd->pxPrevious    %#x   \r\n",(int)(TestList.xListEnd.pxPrevious));
printf("ListItem1->pxPrevious             %#x           \r\n",(int)(ListItem1.pxPrevious));
printf("------------------------------结束---------------------------------------\r\n");

用串口打印连接结果:

可以看出列表和列表项1进行了环形连接

2.紧接着上面的代码再插入列表项2,值为60

	//插入列表项2vListInsert(&TestList ,&ListItem2);
printf("--------------------------------再插入列表项ListItem2------------------------\r\n");
printf("TestList->xListEnd->pxNext        %#x       \r\n",(int)(TestList.xListEnd.pxNext));
printf("ListItem1->pxNext                 %#x               \r\n",(int)(ListItem1.pxNext));
printf("ListItem2->pxNext                 %#x               \r\n",(int)(ListItem2.pxNext));printf("---------------------------------前后连接分割线-----------------------------\r\n");
printf("TestList->xListEnd->pxPrevious    %#x  \r\n",(int)(TestList.xListEnd.pxPrevious));
printf("ListItem1->pxPrevious             %#x          \r\n",(int)(ListItem1.pxPrevious));
printf("ListItem2->pxPrevious             %#x          \r\n",(int)(ListItem2.pxPrevious));
printf("---------------------------------结束--------------------------------------\r\n");

用串口打印连接结果:

可以看出他们的连接方式

3.紧接着上面的代码再插入列表项3,值为50

//插入列表项3vListInsert(&TestList ,&ListItem3);
printf("---------------------------再插入列表项ListItem3------------------------\r\n");
printf("TestList->xListEnd->pxNext        %#x      \r\n",(int)(TestList.xListEnd.pxNext));
printf("ListItem1->pxNext                %#x                \r\n",(int)(ListItem1.pxNext));
printf("ListItem2->pxNext                %#x              \r\n",(int)(ListItem2.pxNext));
printf("ListItem3->pxNext                %#x               \r\n",(int)(ListItem3.pxNext));printf("----------------------------前后连接分割线---------------------------------\r\n");
printf("TestList->xListEnd->pxPrevious    %#x \r\n",(int)(TestList.xListEnd.pxPrevious));
printf("ListItem1->pxPrevious             %#x          \r\n",(int)(ListItem1.pxPrevious));
printf("ListItem2->pxPrevious             %#x         \r\n",(int)(ListItem2.pxPrevious));
printf("ListItem3->pxPrevious             %#x         \r\n",(int)(ListItem3.pxPrevious));
printf("-----------------------------------结束-----------------------------------\r\n");

用串口打印结果:

可以看出列表项3插在了列表项1和2之间,说明列表项的 "xItemValue"决定了它在列表中的位置(按升序排列)

4.紧接着上面的代码删除列表项2

//列表删除列表项2uxListRemove(&ListItem2);
printf("--------------------------------列表删除ListItem2------------------------\r\n");
printf("TestList->xListEnd->pxNext       %#x        \r\n",(int)(TestList.xListEnd.pxNext));
printf("ListItem1->pxNext                %#x                \r\n",(int)(ListItem1.pxNext));
printf("ListItem3->pxNext                %#x                \r\n",(int)(ListItem3.pxNext));printf("-------------------------------前后连接分割线-----------------------------\r\n");
printf("TestList->xListEnd->pxPrevious    %#x   \r\n",(int)(TestList.xListEnd.pxPrevious));
printf("ListItem1->pxPrevious             %#x           \r\n",(int)(ListItem1.pxPrevious));
printf("ListItem3->pxPrevious             %#x           \r\n",(int)(ListItem3.pxPrevious));
printf("---------------------------------结束--------------------------------------\r\n");

用串口打印结果:

可以看出ListItem3->pxNext  由原来指向列表项2指向了迷你列表向形成新的环

5.紧接着上面的代码末尾插入列表项2

//末尾插入列表项2TestList.pxIndex = TestList.pxIndex->pxNext;vListInsertEnd(&TestList ,&ListItem2);
printf("---------------------------末尾插入列表项ListItem2--------------------------\r\n");
printf("TestList->xListEnd->pxNext        %#x      \r\n",(int)(TestList.xListEnd.pxNext));
printf("ListItem1->pxNext                %#x               \r\n",(int)(ListItem1.pxNext));
printf("ListItem2->pxNext                %#x               \r\n",(int)(ListItem2.pxNext));
printf("ListItem3->pxNext                %#x               \r\n",(int)(ListItem3.pxNext));printf("-------------------------------前后连接分割线--------------------------------\r\n");
printf("TestList->xListEnd->pxPrevious    %#x   \r\n",(int)(TestList.xListEnd.pxPrevious));
printf("ListItem1->pxPrevious             %#x           \r\n",(int)(ListItem1.pxPrevious));
printf("ListItem2->pxPrevious             %#x           \r\n",(int)(ListItem2.pxPrevious));
printf("ListItem3->pxPrevious             %#x           \r\n",(int)(ListItem3.pxPrevious));
printf("-------------------------------结束-----------------------------------------\r\n");

用串口打印结果:

这时List的pxIdex指向了ListItem1,就是TestList.pxIndex = TestList.pxIndex->pxNext;这时ListItem1指向ListItem3,ListItem3指向迷你列表项,迷你列表项指向ListItem2,ListItem2指向ListItem1,形成环

http://www.dtcms.com/a/430529.html

相关文章:

  • 云南做网站价格网站的策划书
  • 做本地网站要服务器吗自动化毕设题目网站开发
  • 网站后端技术有哪些文学网站做编辑
  • 做淘客应该知道的网站咸阳学校网站建设费用
  • 适合女生做的网站投资公司网站设计
  • 专业网站维护如何免费建立自己的网页
  • 做社交网站的预算怎样查询网站空间
  • 网站重购出行南宁app软件下载
  • html怎么做成网站打开免费百度啊
  • 网站建设的时候如何上传图片如何建设一个个人网站
  • wordpress建设网站的方法怎么查寻一个网站做的竞价
  • 三亚网站制作上海做哪些行业赚钱
  • 静态网站站内搜索网站建设原则应考虑哪些
  • 1688拿货网义乌seo推广
  • 中国十大购物网站排行榜我做网站编辑写文章很慢怎么办
  • 邢台中北世纪城网站兼职贸易公司怎么做网站比较好
  • 企业网站建设杭州在家做兼职哪个网站
  • 青岛做网站优化哪家好园林公司网站建设费用
  • 临沂做网站建设的公司哪家好做旅游网站的意义
  • 基于django的电子商务网站开发腾讯云域名注册官网
  • 什么是公司注册资金快速网站推广优化
  • 网站上怎么做福彩卖家网络营销功能
  • 怎么把网站设置为主页面装潢设计培训中心
  • 好的html5网站快排seo
  • 软件ui设计培训机构下载班级优化大师并安装
  • 做装修的网站怎么做好中山做营销型网站公司
  • 网站建站行业新闻外链网站是什么
  • 邯郸网站设计报价山西省确诊病例最新情况
  • 网站方案组成要素昆明软件开发培训
  • 网站统计模板网站建设需求分析的实施