#define portSTACK_TYPE uint32_t
#define portBASE_TYPE long
typedef portSTACK_TYPE StackType_t;
typedef long BaseType_t;
typedef unsigned long UBaseType_t;
typedef BaseType_t (*TaskHookFunction_t)( void * );
/*
* 任务控制块。 任务控制块(TCB)为每个任务分配,并存储任务状态信息,包括指向任务上下文的指针(任务的运行时环境,包括寄存器值)
*/
typedef struct tskTaskControlBlock
{
volatile StackType_t *pxTopOfStack; /*< 指向放置在任务堆栈上的最后一项的位置。它必须是TCB结构的第一个成员。 */
#if ( portUSING_MPU_WRAPPERS == 1 )
xMPU_SETTINGS xMPUSettings; /*< MPU设置被定义为端口层的一部分。它必须是TCB结构的第二个成员。 */
#endif
ListItem_t xStateListItem; /*< 任务的状态列表项所引用的列表表示该任务的状态(就绪、阻塞、挂起)。 */
ListItem_t xEventListItem; /*< 用于从事件列表中引用任务。 */
UBaseType_t uxPriority; /*< 任务的优先级。0是最低优先级。 */
StackType_t *pxStack; /*< 指向堆栈的开始。 */
char pcTaskName[ configMAX_TASK_NAME_LEN ];/*< 创建时给任务的描述性名称。便于调试。不合格的字符类型只允许用于字符串和单个字符。 */
#if ( portSTACK_GROWTH > 0 )
StackType_t *pxEndOfStack; /*< 在架构上指向堆栈的末端,在这种架构中,堆栈是从低内存增长起来的。 */
#endif
#if ( portCRITICAL_NESTING_IN_TCB == 1 )
UBaseType_t uxCriticalNesting; /*< 对于未在端口层中保持其计数的端口,保留关键部分的嵌套深度。 */
#endif
#if ( configUSE_TRACE_FACILITY == 1 )
UBaseType_t uxTCBNumber; /*< 存储一个数字,该数字在每次创建TCB时递增。 它允许调试器确定何时删除任务然后重新创建任务。 */
UBaseType_t uxTaskNumber; /*< 存储专门供第三方跟踪代码使用的数字。 */
#endif
#if ( configUSE_MUTEXES == 1 )
UBaseType_t uxBasePriority; /*< 最后分配给任务的优先级-由优先级继承机制使用。*/
UBaseType_t uxMutexesHeld; /*< 任务获取到的互斥信号量个数 */
#endif
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
TaskHookFunction_t pxTaskTag;
#endif
#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) /*< 与本地存储有关 */
void *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];
#endif
#if( configGENERATE_RUN_TIME_STATS == 1 )
uint32_t ulRunTimeCounter; /*< 存储任务在“运行”状态下所花费的时间。 */
#endif
#if ( configUSE_NEWLIB_REENTRANT == 1 )
/* 分配一个特定于此任务的Newlib reent结构。
注意,对新lib的支持已经被包括在大众的要求之中,但不是
由FreeRTOS维护人员自己使用。FreeRTOS不是
负责生成的newlib操作。用户必须熟悉
newlib和必须提供的全系统实现的必要
存根。请注意(在撰写本文时)当前的newlib设计
实现一个系统范围的malloc(),必须提供锁。 */
struct _reent xNewLib_reent;
#endif
#if( configUSE_TASK_NOTIFICATIONS == 1 )
volatile uint32_t ulNotifiedValue; /*< 任务通知值 */
volatile uint8_t ucNotifyState; /*< 任务通知状态 */
#endif
/* 请参阅上面tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE定义的注释。 */
#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )
uint8_t ucStaticallyAllocated; /*< 如果任务是静态分配的,则设置为pdTRUE,以确保没有尝试释放内存。如果是动态创建就设置为pdFALSE*/
#endif
#if( INCLUDE_xTaskAbortDelay == 1 )
uint8_t ucDelayAborted;
#endif
} tskTCB;
/* 新版本的任务控制块重命名为TCB_t,但本质上还是tskTCB,主要为了兼容旧版本的应用。 */
typedef tskTCB TCB_t;
/*
* 列表可以包含的唯一对象类型的定义。 列表项定义
*/
struct xLIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< 如果configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES设置为1,则设置为已知值。0x5a5a5a5aUL */
configLIST_VOLATILE TickType_t xItemValue; /*< 列表项的值。 在大多数情况下,它用于按降序对列表进行排序。 */
struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< 指向列表中下一个ListItem_t的指针。*/
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< 指向列表中前一个ListItem_t的指针。 */
void * pvOwner; /*< 指向包含列表项的对象(通常是TCB)的指针。因此,在包含列表项的对象和列表项本身之间存在双向链接。*/
void * configLIST_VOLATILE pvContainer; /*< 指向该列表项所在列表的指针(如果有的话)。 */
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< 如果configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES设置为1,则设置为已知值。0x5a5a5a5aUL */
};
typedef struct xLIST_ITEM ListItem_t; /* 由于某种原因,lint希望将此作为两个单独的定义。*/
/*
* 调度程序使用的队列类型的定义。列表
*/
typedef struct xLIST
{
listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< 如果configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES设置为1,则设置为已知值。0x5a5a5a5aUL */
configLIST_VOLATILE UBaseType_t uxNumberOfItems; /*< 列表项的数量 */
ListItem_t * configLIST_VOLATILE pxIndex; /*< 记录列表项索引号,用来遍历列表。指向调用listGET_OWNER_OF_NEXT_ENTRY()返回的最后一个项。*/
MiniListItem_t xListEnd; /*< 包含最大可能项值的列表项,这意味着它始终位于列表的末尾,因此用作标记。*/
listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< 如果configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES设置为1,则设置为已知值。0x5a5a5a5aUL */
} List_t;
/*
* 迷你列表项
*/
struct xMINI_LIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< 如果configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES设置为1,则设置为已知值。0x5a5a5a5aUL */
configLIST_VOLATILE TickType_t xItemValue; /*< 列表项值 */
struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< 指向下一个列表项 */
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< 指向前一个列表项 */
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;
FreeRTOS学习笔记---任务控制块源码分析
最新推荐文章于 2025-04-21 11:01:12 发布