advertisement

2014年12月19日

2014/12/19 進階微控制器應用

http://static.grumpycoder.net/pixel/uC-sdk-doc/index.html

在freeRTOS中每一個工作均以一個TCB來代表,所以建立一個新的工作,實際就是建立一個新的TCB資料。

新的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);
}

新的工作會進入就緒列表
或阻斷後要進入就緒狀態時也會進入就緒列表

沒有留言:

張貼留言

文章有誤或有問題麻煩您留言告知! 謝謝您~~