FreeRTOS学习笔记---任务控制块源码分析

#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;



 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值