http://static.grumpycoder.net/pixel/uC-sdk-doc/index.html
新的TCB均需加入工作就緒列表(pxReadyTaskLists),如果是第一個工作,則就需被執行,否則需等待排程。
建立一個新的TCB主要是初化TCB堆疊區,回顧TCB之資料結構
volatile把變數值存放至暫存器,不要存放至記憶體
typedef struct tsTaskControlBlock {
volatile portSTACK_TYPE *pxTopOfStack;//指向堆疊區最上面
xListItem xGenericListItem;
xListItem xEventListItem;
portBASE_TYPE uxPriority;
portSTACK_TYPE *pxStack;
char pcTaskName[名稱最大長度];
portSTACK_TYPE *pxEndOfStack;
.
.
.
.
}
初始化堆疊區
會呼叫
pxPortInitializeStack(portSTACK_TYPE *pxTopOfStack,pdTASK_CODE pxCode,void *pvParameters)//初始化堆疊區與平台相關,不同平台需改寫
{
pxTopOfStack--;//去掉一個堆疊區的位址,對齊
//以下填入與平台相關資料
*pxTopOfStack=portINITIAL_XPSR;//此例主要是給ARM Cortex M3使用
pxTopOfStack--;
*pxTopOfStack=pxCode;
pxTopOfStack--;
*pxTopOfStack=portSTACK_RETURN_ADDRESS;
pxTopOfStack-=5;//放入五個暫存器,對Cortex M3暫存器為R12,R3,R2,R1預留暫>存器空間
*pxTopOfStack=(portSTACK_TYPE) pvParameters;//此回呼叫task的pvParameters
,放置R0
pxTopOfStack-=8;//R11~R4預留暫存器空間,等文本切換後會存入值進去
}
建立Task時呼叫的
xTaskCreate(----)為一個巨集指令
真正的API副程式為
signed portBASE_TYPE xTaskGenericCreate(pdTask_CODE pxTaskCode,char *pcName,unsigned short usStackDepth,void *pvParameters,unsigned portBASE_TYPE uxPriority,xTaskHandle *pxCreatedTask,portSTACK_TYPE *puxStackBuffer,const xMemoryRegion *const xRegion);
xTaskGenericCreate之流程
建立新的工作要先建立新的TCB
列表初始化
prvInitializeTaskLists(void) {
for(uxPriority=0;uxPriority<configMAX_PRIORITY;uxPriority++) {
vListInitiallize(&()pxReadyTaskLists[uxPriority]));
vListInitiallize(&xDelayTaskList1);
vListInitiallize(&xDelayTaskList2);
vListInitiallize(&xPendingReadyList);
共餘尚有
待刪除列表
vListInitiallize(&xTaskWaitingTermination);
擱置列
vListInitiallize(&xSuspendTaskList);
}
新的工作會進入就緒列表
或阻斷後要進入就緒狀態時也會進入就緒列表
沒有留言:
張貼留言
文章有誤或有問題麻煩您留言告知! 謝謝您~~