freertos任務

任務task control block,tcb分配給每個任務**
typedef struct tskTaskControlBlock
{
volatile StackType_t *pxTopOfStack//任務堆棧的棧頂
ListItem_t xStateListItem;//任務的狀態列表項的列表引用標識任務的狀態
ListItem_t xEventListItem;//從事件列表中引用任務
UBaseType_t uxpriority;//任務優先級
StackType_t *pxStack;//指向堆棧的開始
char pcTaskName[configMAX_TASK_NAME_LEN];//任務名字
UBaseType_t uxCriticalNesting; //臨界段嵌套深度
UBaseType_t uxTCBNumber;tcb創建一次增加一次
UBaseType_t uxTaskNumber;
UBaseType_t uxBasePriority;//最後指定的優先級
UBaseType_t uxMutexesHeld;
askHookFunction_t pxTaskTag;//任務標籤
void *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];//本地線程指針
ulRunTimeCounter//任務在running態的時間

volatile uint32_t ulNotifiedValue;//任務通知
	volatile uint8_t ucNotifyState;
	uint8_t	ucStaticallyAllocated; //任務靜態創建
	uint8_t ucDelayAborted;

}

任務創建xTaskCreate()*
申請任務堆棧 ,StackType_t類型
#define portSTACK_TYPE uint32_t
typedef portSTACK_TYPE StackType_t;//4字節
申請任務控制塊
任務堆棧給tcb的成員
標記動態創建
初始化任務
添加tcb到就緒列表

初始化任務prvInitialiseNewTask**
填充堆棧0xa5
獲取棧頂指針,地址8字節對其
pxNewTCB->pcTaskName[ x ] = pcName[ x ];//獲取名字
名字加’\0’
優先級 //優先級作爲數組的索引,確保不超標
uxBasePriority
pxNewTCB->uxMutexesHeld
初始化狀態列表項
初始化事件列表項
設置xStateListItem的owner,即TCB
事件列表項的值
設置xSEventListItem的owner,即TCB
臨界區嵌套
標籤
運行時間計數
pvThreadLocalStoragePointers
任務通知
pxNewTCB->ulNotifiedValue = 0;
pxNewTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION;
初始化堆棧pxPortInitialiseStack()
handle = tcb

*初始化堆棧pxPortInitialiseStack()
#define portINITIAL_XPSR ( 0x01000000 )
24bits爲1,表示thumb
pxTopOfStack任務棧頂依次減小
xpsr.pc,lr,r12,r3,r2,r1,r0//由高地址到低地址

添加到就緒列表prvAddNewTaskToReadyList()
當前任務數量
沒有任務創建,pxCurrentTCB = pxNewTCB;
第一個任務,初始化列表
已經有任務,任務調度
當前的優先級VS新創建的優先級
uxTaskNumber;任務標號
prvAddTaskToReadyList( pxNewTCB );
判斷xSchedulerRunning
創建任務優先級VS當前優先級

prvAddTaskToReadyList()******
portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority ) //uxTopReadyPriority是全局變量,可以在
portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority );選擇優先級最高的
#define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )

刪除任務vTaskDelete( TaskHandle_t xTaskToDelete )*****
根據handle獲取tcb;prvGetTCBFromHandle
移除就緒列表
清除中斷( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
任務是否等待事件
任務號加1
刪除自己,加入termination list
++uxDeletedTasksWaitingCleanUp;//爲了讓idle檢查
不是刪除自己
任務數減1
prvDeleteTCB( pxTCB );//刪除tcb
reset下個解除阻塞的時間//刪除自己,參考自己的時間發生變化
任務調度

***vTaskSuspend()
由句柄獲得TCB
從狀態列表移除
從事件列表移除
添加到掛起列表
如果調度運行
復位解除prvResetNextTaskUnblockTime
掛起的自己,
調度在運行,進行一次調度
調度沒有運行,
掛起列表==所有任務
pxCurrentTCB = NULL;
查找要下一個要運行的vTaskSwitchContext( void )

***vTaskResume()***Resumes a suspended task.恢復掛起的任務
handle到TCB
判斷任務是不是掛起
移除列表
添加到就緒列表
大於當前任務優先級,任務切換

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章