FreeRTOS的列表

FreeRTOS的列表

列表

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;  

列表项

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;                                     /*指向一个任务TCB*/  
     void * configLIST_VOLATILE pvContainer;             /*指向包含该列表项的列表 */  
     listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE          /*用于检测列表项数据是否完整*/  
};  
typedef struct xLIST_ITEM ListItem_t;  

迷你列表项

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;  
pxReturn = ( xExecutingBufferDescriptor_t * ) listGET_OWNER_OF_HEAD_ENTRY( &xExecuting_FreeBuffersList );
#define listGET_OWNER_OF_HEAD_ENTRY( pxList )  ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner )

( pxList )->xListEnd ):列表的xListEnd,列表中的最后一个列表项,类型是MiniListItem_t
(&( ( pxList )->xListEnd ))->pxNext:指向下一个列表项
由于列表中的列表项是一个循环项,所以最后一个列表项的下一个列表就是列表的第一个列表项
( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ):列表项的pvOwner,记录列表归谁拥有,通常是任务控制块

void * pvOwner; 表示定义一个pvOwner指针,指向目标的类型是void
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; 表示定义一个pxPrevious的指针,指向的目标是xLIST_ITEM 结构体

  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值