UC/OS基礎知識之任務堆棧

UC/OS基礎知識之任務堆棧

1.任務堆棧
所謂堆棧就是在存儲器中按數據“後進先出(LIFO)”的原則組織的連續存儲空間,爲了滿足任務切換和響應中斷時保存CPU寄存器中的內容及任務調用其他函數時的需要,每個任務都應該配有自己的堆棧。每個任務控制塊都有一個指向該任務堆棧的指針。
PO:堆棧是一種簡單的數據結構,是一種只允許在其一端進行插入或刪除的線性表。允許插入或刪除操作的一端稱爲棧頂,另一端稱爲棧底,對堆棧的插入和刪除操作被稱爲入棧和出棧。有一組CPU指令可以實現對進程的內存實現堆棧訪問。其中,POP指令實現出棧操作,PUSH指令實現入棧操作。
注意:
堆棧的增長方向隨系統所使用的處理器不同而不同,在使用OSTaskCreate()來創建任務時,一定要注意堆棧的增長方向。
在OS_CFG.H文件中的常數OS_STK_GROWTH 作爲選擇開關,默認爲向上增長。

#define  OS_STK_GROWTH        1                             /* Stack grows from HIGH to LOW memory on 80x86  */

2.任務堆棧的創建
在OS_CPU.H中專門定義了一個數據類型OS_STK

typedef unsigned short OS_STK; // Each stack entry is 16-bit wide      

在定義任務堆棧的時候,只要定義一個OS_STK類型的數組即可

#define TASK_STK_SIZE 512//定義堆棧的長度爲1024個字節
OS_STK TaskStk[TASK_STK_SIZE];//定義一個數組作爲任務堆棧

在調用函數OSTaskCreate()來創建一個任務時,把數組的指針傳遞給OSTaskCreate()中的堆棧棧頂參數ptos,就可以把該數組與任務關聯起來而成爲該任務的任務堆棧。OSTaskCreate()的原型:

INT8U  OSTaskCreate (
 void (*task)(void *p_arg),//指向任務的指針
 void *p_arg,//傳遞給任務的參數
 OS_STK *ptos,//指向任務堆棧棧頂指針
 INT8U prio)//任務的優先級別

3.任務堆棧的初始化
當CPU在啓動運行一個任務時,CPU各寄存器總是需要預置一些初始數據,例如任務的指針,程序狀態字PSW等,由於他們都是任務的私有數據,所以應將他們存放在任務堆棧中。把任務初始數及存放到任務堆棧的工作就叫做任務堆棧的初始化,UC/OS在OS_CPU_C.C中提供了堆棧初始化函數OSTaskStkInit(),函數原型如下:

OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
    OS_EMU_STK *stk;
    stk=(OS_EMU_STK *)((char*)ptos-sizeof(OS_EMU_STK));   /* Load stack pointer*/
    stk->pData      = pdata;
    stk->Opt        = opt;
    stk->Task       = task;
    stk->Handle     = NULL;
    stk->Id         = 0;
    stk->Exit       = 0;
    return ((void *)stk);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章