FreeRTOS 列表与列表项 实验

目录

列表和列表项的初始化

1 列表没有添加列表项的情况

 打印结果

 2 列表添加列表项1 的情况

3 添加列表项 2 

  4 添加列表项 3

 删除列表项2

插入列表项 2 


列表和列表项的初始化

List_t     Testlist;定义一个列表
ListItem_t ListItem1;//定义三个列表项 
ListItem_t ListItem2;
ListItem_t ListItem3;
//初始化
vListInitialise(&Testlist); 
vListInitialiseItem(&ListItem1); 
vListInitialiseItem(&ListItem2); 
vListInitialiseItem(&ListItem3);
// 赋值
ListItem1.xItemValue = 40;
ListItem2.xItemValue = 60;
ListItem3.xItemValue = 50;

1 列表没有添加列表项的情况

在这里插入图片描述

 

1 打印 他的头指针地址 &Testlist  
2 打印 头指针的下一个元素 因为是 XXXX=0xfffff  所以不用取地址 
(Testlist.pxIndex )直接访问他的变量就行了 
3 因为没有列表项  end 只能自己指向自己 &(Testlist.xListEnd)
1 2 3 前面 多加 int 防止变成 其他类型的数据 
我么实验要的是16进制的地址  所以要整形数据。

 打印结果

在这里插入图片描述

列表与列表项并没关联 
pxIndex的值 和listEnd 的值是相等的 
因为根据图可知  没有列表项 listEND只能自己指自己。 

 2 列表添加列表项1 的情况

在这里插入图片描述

 

相当于 链表只有一个元素 形成环形的话 就很好判断 不管怎么 头指针的下一个永远是它 它的下一个就是listEND 

 在这里插入图片描述

3 添加列表项 2 

在这里插入图片描述

1 链表是环形的 想象一下环形结构 
2 红色为第一次的(去的时候)因为是第一次参数
3 蓝色为第二次的 (回来的时候)因为是第二个参数
4 引出一个总结  去的时候是第一个  回来的时候是最后一个 因为 Pxnet的第一次是指向 40  pxPrevious第一次指向的是 60 

在这里插入图片描述

只要保证 黄色框的对了  然后在和下面三组作对比  
之前的第一个 到了第二次肯定在最 后面
然后下面的 pxNext的下一个 肯定是列表二 (因为列表项1 在黄色框的时候就是第一个 )所以中间就是listEND的地址了 

  4 添加列表项 3

在这里插入图片描述

 先看红色  对着 代码的printf 一一个看 先打印 Pxnext 对着串口打印的两幅图
就能得出结果 
还是一个理论  去的时候 是第一个 回来的时候就是最后一个。

在这里插入图片描述

 删除列表项2

 在这里插入图片描述

插入列表项 2 

 

 

 

 

相当于 第一次 指向 list1 下一个就是 lsit2 lsit3就是最后一个
到了第二次 list1 就是第一个 索引改为1了,所以2会插到1后面  1可以是头也可以是尾  
Testlist.pxIndex=Testlist.pxIndex->pxNext; //改变索引 
  vListInsertEnd(&Testlist,&ListItem2);//初始化 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
FreeRTOS中,任务、队列、信号量等都是以列表的形式存储的,因此,列表的遍历是非常常见的操作。FreeRTOS提供了一些API来遍历不同类型的列表。 以任务列表为例,FreeRTOS提供了以下API来遍历任务列表: 1. `vTaskList()`:此API将任务列表的详细信息打印到标准输出。 2. `vTaskGetRunTimeStats()`:此API将任务列表中每个任务的运行时间、CPU使用率等信息打印到标准输出。 如果你需要在代码中遍历任务列表,可以使用以下API: 1. `vTaskSuspendAll()`:此API将所有任务暂停,以便安全地遍历任务列表。 2. `xTaskGetNextTask()`:此API返回一个指向下一个任务控制块的指针。 3. `xTaskResumeAll()`:此API将所有任务恢复,以便它们可以继续执行。 以下是一个示例代码,展示了如何使用上述API来遍历任务列表: ``` void vTaskListAll(void) { TaskStatus_t *pxTaskStatusArray; volatile UBaseType_t uxArraySize, x; // 获取任务数量 uxArraySize = uxTaskGetNumberOfTasks(); // 分配存储任务状态信息的内存 pxTaskStatusArray = pvPortMalloc(sizeof(TaskStatus_t) * uxArraySize); // 获取任务状态信息 uxArraySize = uxTaskGetSystemState(pxTaskStatusArray, uxArraySize, NULL); // 打印任务状态信息 printf("TaskName\t\tPriority\tStatus\t\tStackHighWaterMark\n"); for(x = 0; x < uxArraySize; x++) { printf("%s\t\t%d\t\t%s\t\t%d\n", pxTaskStatusArray[x].pcTaskName, pxTaskStatusArray[x].uxCurrentPriority, pxTaskStatusArray[x].eCurrentState == eRunning ? "Running" : pxTaskStatusArray[x].eCurrentState == eReady ? "Ready" : pxTaskStatusArray[x].eCurrentState == eBlocked ? "Blocked" : "Unknown", pxTaskStatusArray[x].usStackHighWaterMark); } // 释放存储任务状态信息的内存 vPortFree(pxTaskStatusArray); } ``` 这个函数将列出所有任务的名称、优先级、状态和堆栈高水位标记。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Paradise_Violet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值