freertos taskTCB xList xListItem xQUEUE 結構體 源碼分析

任務結構體
typedef struct tskTaskControlBlock
{
volatile portSTACK_TYPE *pxTopOfStack;  //指向任務堆棧結束處
 
#if ( portUSING_MPU_WRAPPERS == 1 )
xMPU_SETTINGS xMPUSettings; /*接口  TCB STRUCT第二個成員 */
#endif
 
xListItem    xGenericListItem; //用於把TCB插入就緒鏈表或等待鏈表
xListItem    xEventListItem; //用於把TCB插入事件鏈表(如消息隊列)
unsigned portBASE_TYPE uxPriority;   /*任務優先級 0 is the lowest priority. */
portSTACK_TYPE   *pxStack;   /*< 指向棧的開始 */
signed char    pcTaskName[ configMAX_TASK_NAME_LEN ];/*< 描述建立任務時的名稱,便於調試 */
 
#if ( portSTACK_GROWTH > 0 )
portSTACK_TYPE *pxEndOfStack;   /*< 指向棧底內存. */
#endif
 
#if ( portCRITICAL_NESTING_IN_TCB == 1 ) //臨界
unsigned portBASE_TYPE uxCriticalNesting; /*< 佔着關鍵的部分nesting depth for ports that do not maintain their own count in the port layer. */
#endif
 
#if ( configUSE_TRACE_FACILITY == 1 ) //追蹤功能
unsigned portBASE_TYPE uxTCBNumber; /*< TCB 建立時計數.  調試時記錄任務刪除和從新建立 */
unsigned portBASE_TYPE  uxTaskNumber; /*< 存儲一個值供第三方追蹤. */
#endif
 
#if ( configUSE_MUTEXES == 1 ) //互斥器
unsigned portBASE_TYPE uxBasePriority; /*< 最後分配給任務的優先級 優先級繼承機制 */
#endif
 
#if ( configUSE_APPLICATION_TASK_TAG == 1 )
pdTASK_HOOK_CODE pxTaskTag; //任務標籤,用於識別
#endif
 
#if ( configGENERATE_RUN_TIME_STATS == 1 ) //運行時間狀態
unsigned long ulRunTimeCounter;   /*< 運行狀態時的時間 */
#endif
 
#if ( configUSE_NEWLIB_REENTRANT == 1 ) //重入函數
/*分配一個Newlib C語言程式庫  */
struct _reent xNewLib_reent; //_reent靜態實例
#endif
 
} tskTCB;


一個雙向鏈表
struct xLIST_ITEM  
{   
    portTickType xItemValue;   //鏈表節點的值 一個任務延時的節拍數
    volatile struct xLIST_ITEM * pxNext;  
    volatile struct xLIST_ITEM * pxPrevious;   
    void * pvOwner;   //item全部者 一般是任務控制模塊 TCB
    void * pvContainer;   //指向鏈表節點所在地鏈表 根據這個指針,就能知道任務是在就   緒任務鏈表中仍是阻塞任務鏈表中
};
typedef struct xLIST_ITEM xListItem;


struct xMINI_LIST_ITEM
{
	portTickType xItemValue;                 //值
	volatile struct xLIST_ITEM *pxNext;      //下一個節點
	volatile struct xLIST_ITEM *pxPrevious;  //上一個
};
typedef struct xMINI_LIST_ITEM xMiniListItem;  //mini


//通用的鏈表節點
typedef struct xLIST  
{  
    volatile unsigned portBASE_TYPE uxNumberOfItems; // 鏈表中有多少元素  
    volatile xListItem * pxIndex;    //用來遍歷列表 指向上次訪問的節點
    volatile xMiniListItem xListEnd; // 鏈表尾節點 沒有鏈表元素時指向本身  
} xList;

隊列
typedef struct QueueDefinition
{
signed char *pcHead;     /*< 指向 隊列的存儲區域開始 */
signed char *pcTail;     /*< 指向隊列的存儲區域的結束字節. 一旦更多的字節被分配要存儲的隊列項,這是做爲一個標記。 */
 
signed char *pcWriteTo;     /*< 指向隊列的存儲區域下一個空的地方 */
 
union  /* 使用聯合編碼標準是個例外,以確保兩個相互排斥的結構成員不一樣時出現(浪費RAM)。 */
{
signed char *pcReadFrom;   /*< 指向最後一個地方that a queued item was read from 當一個結構體被用做隊列. */
unsigned portBASE_TYPE uxRecursiveCallCount;/*< Maintains a count of the numebr of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */
} u;
 
xList xTasksWaitingToSend;    /*< 任務列被阻塞等待添加到這個隊列.  Stored in priority order. */
xList xTasksWaitingToReceive;   /*< 任務列被阻塞等待讀這個隊列 Stored in priority order. */
 
volatile unsigned portBASE_TYPE uxMessagesWaiting;/*< 目前隊列中的項目數  */
unsigned portBASE_TYPE uxLength;  /*< 隊列的長度 defined as the number of items it will hold,  */
unsigned portBASE_TYPE uxItemSize;  /*< 隊列每一個項目的大小 */
 
volatile signed portBASE_TYPE xRxLock; /*< 當隊列被鎖時存儲隊列接受到的任務的數量 (removed from the queue) .  Set to queueUNLOCKED when the queue is not locked. */
volatile signed portBASE_TYPE xTxLock; /*< 當隊列被鎖時存儲隊列傳輸的任務的數量  (added to the queue).  Set to queueUNLOCKED when the queue is not locked. */
 
#if ( configUSE_TRACE_FACILITY == 1 )
unsigned char ucQueueNumber;
unsigned char ucQueueType;
#endif
 
#if ( configUSE_QUEUE_SETS == 1 )
struct QueueDefinition *pxQueueSetContainer;
#endif
 
} xQUEUE;
相關文章
相關標籤/搜索