FreeRTOS—TCB_t结构体及重要变量说明

本文详细解析了FreeRTOS中Task Control Block(TCB_t)的结构,包括栈生长方式、状态链表、任务相关变量如pxCurrentTCB、pxReadyTasksLists、pxDelayedTaskList和xSuspendedTaskList,以及任务调度器操作和任务删除的相关变量。通过理解这些概念,有助于深入理解FreeRTOS的任务管理和调度机制。
摘要由CSDN通过智能技术生成

1.TCB_T

TCB_t的全称为Task Control Block,也就是任务控制块。

typedef struct tskTaskControlBlock             
{
        //栈顶指针,中断或任务切换时,会对任务压栈
        volatile StackType_t    *pxTopOfStack;    

        // 启用MPU的情况下设置
        #if ( portUSING_MPU_WRAPPERS == 1 )
            /* 设置任务访问的内存权限 */
            xMPU_SETTINGS    xMPUSettings;        
        #endif

        // 表示任务状态,不同的状态会挂接在不同的状态链表下
        ListItem_t            xStateListItem;    
        // 事件链表项,会挂接到不同事件链表下
        ListItem_t            xEventListItem;        
        // 任务优先级,数值越大优先级越高
        UBaseType_t            uxPriority;            
        // 指向堆栈起始位置,这只是单纯的一个分配空间的地址,可以用来检测堆栈是否溢出
        StackType_t            *pxStack;            
        // 任务名
        char                pcTaskName[ configMAX_TASK_NAME_LEN ];

        /* 对于向上生长的栈,用于指明栈的上边界,用于判断是否溢出 */
        #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )
            StackType_t        *pxEndOfStack;        
        #endif

        // 记录临界段的嵌套层数
        #if ( portCRITICAL_NESTING_IN_TCB == 1 )
            UBaseType_t        uxCriticalNesting;    
        #endif

        // 跟踪调试用的变量
        #if ( configUSE_TRACE_FACILITY == 1 )
             /* 用于调试,表示本任务是第几个创建,每创建一个任务,系统有一个全局变量加1*/
            UBaseType_t        uxTCBNumber; 
            /* 调试用,用户通过API函数vTaskSetTaskNumber()来设置,数值由函数参数指定 */
            UBaseType_t        uxTaskNumber;        
        #endif

        /* 如果使用任务互斥量信号 */
        #if ( configUSE_MUTEXES == 1 )
           /* 优先级提升前,保存原优先级,优先级反转时用*/
            UBaseType_t        uxBasePriority;   
           /* 任务获取的互斥信号量个数,为0*/
            UBaseType_t        uxMutexesHeld;
        #endif

        // 任务的一个标签值,可以由用户自定义它的意义,例如可以传入一个函数指针可以用来做Hook    函数调用
        #if ( configUSE_APPLICATION_TASK_TAG == 1 )
            TaskHookFunction_t pxTaskTag;
        #endif

        // 任务的线程本地存储指针,可以理解为这个任务私有的存储空间
        #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )
            void  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值