- /******************************************************/
- /********** OS_CPU_C.c*********************************/
- /******************************************************/
-
- #include <avr/io.h>
- #include "os_cpu.h"
- #include "os_cfg.h"
- #include "ucos_ii.h"
- /* changed by dragontorch on 2009.11.10 */
- /*1: 任務的堆棧初始化函數,這里是要模擬一次中斷發生以后任務的各種數據入棧的過程,其中最*/
- /* 開始先要入棧的是任務的首地址即該函數的第一個參數task,是個指向該任務函數的一個指針*/
- /* ,因為后面在任務級的任務切換函數OSCtxSw()和中斷級的任務切換函數OSintCtxSw()切換任務*/
- /* 的時候最后要利用任務返回指令ret將最開始入棧的任務的地址裝入PC,從而使要啟動的任務開*/
- /* 始運行. */
- /* */
- /*2: 然后開始入棧的是cpu的各個寄存器,這里對于AVRmage128來說就是R0~R31,但是里面還要注意*/
- /* 的一點就是這里根據編譯器的不同把將要傳遞給任務的參數的地址p_arg傳遞給任務,UCOS里面*/
- /* 所有的任務的參數只有一個就是p_arg,比如建立一個任務void mytask(*p_arg);這里傳遞*/
- /* 給任務的參數就是一個指針,它是指向傳遞給任務參數的一個指針,任務得到這一個大小為兩個*/
- /* 字節的參數就可以在這個地址處取到需要的不同數量的參數,這里的這個指針在該函數編譯的*/
- /* 的存放在R25和R24里面的,這是WINAVR編譯器的編譯規則所決定的,對于ICCAVR就是R16和R17*/
- /* 了,在任務切換以后,這個放在R25和R24里面的參數就正好被傳遞給了任務。 */
- /* */
- /*3: 這里的類似于 */
- /* *stk--=0x31; */
- /* *stk--=0x30; */
- /* *stk--=0x29; */
- /* 這樣的語句里面的數字0x31,0x29是示意性的或者說象征性的給賦得值,就是為了說明以后出棧*/
- /* 入棧的寄存器的順序而已,當然除了給R25和R24以外,對于ICCAVR就是R16和R17,其他的所付*/
- /* 的值是沒有實際意義的,因為后面任務被切換開始運行的時候就會被新的值覆蓋了。所以我也*/
- /* 可以這樣做,*stk--=0x00;//R31除R25和R24以外,全部賦0,然后在后面的注釋里面寫明是哪個*/
- /* 寄存器的棧位。 */
- /* */
- /*4: 最后將SREG入棧,并返回這個初始化好了的堆棧,事實上這里應該叫任務堆棧,但這個是用軟*/
- /* 件模擬的堆棧,后面等任務切換的時候將這個軟件堆棧的指針付給了SP就相當于是硬件堆棧了*/
- OS_STK *OSTaskStkInit(void (*task)(void *pd),void *p_arg,OS_STK *ptos,INT16U opt)
- {
- OS_STK *stk=ptos;
-
- *stk--=((unsigned int)task)&0xff;
- *stk--=((unsigned int)task)>>8;
- /*任務的首地址最先入棧,因為ret指令即自動將這個地址裝入PC,開始運行任務*/
- /*
- *stk--=(INT8U)(task)
- *stk--=(INT8U)(task>>8);
- */
-
- *stk--=0x31;//R31入棧
- *stk--=0x30;//R30入棧
- *stk--=0x29;//R29入棧
- *stk--=0x28;//R28入棧
- *stk--=0x27;//R27入棧
- *stk--=0x26;//R26入棧
- *stk--=((unsigned int)p_arg)&0xff; //R25入棧
- *stk--=((unsigned int)p_arg)>>8; //R24入棧
- /*R25和R24存放任務的首地址*/
- *stk--=0x23;//R23入棧
- *stk--=0x22;//R22入棧
- *stk--=0x21;//R21入棧
- *stk--=0x20;//R20入棧
- *stk--=0x19;//R19入棧
- *stk--=0x18;//R18入棧
- *stk--=0x17;//R17入棧
- *stk--=0x16;//R16入棧
- *stk--=0x15;//R15入棧
- *stk--=0x14;//R14入棧
- *stk--=0x13;//R13入棧
- *stk--=0x12;//R12入棧
- *stk--=0x11;//R11入棧
- *stk--=0x10;//R10入棧
- *stk--=0x09;//R9入棧
- *stk--=0x08;//R8入棧
- *stk--=0x07;//R7入棧
- *stk--=0x06;//R6入棧
- *stk--=0x05;//R5入棧
- *stk--=0x04;//R4入棧
- *stk--=0x03;//R3入棧
- *stk--=0x02;//R2入棧
- *stk--=0x01;//R1入棧
- *stk--=0x00;//R0入棧
-
- *stk--=0x80;//SREG入棧
-
- return stk;//可以看到這個函數的返回類型就是堆棧指針類型,所以返回這個棧指針,以后這個指針就要裝入SP以將任務的數據恢復到CPU當中
- }
-
- void OSDebugInit(void)
- {
-
- }
-
-
- void OSTaskCreateHook(OS_TCB *ptcb)
- {
- ptcb=ptcb;
-
- }
-
- void OSTaskDelHook(OS_TCB *ptcb)
- {
- ptcb=ptcb;
-
- }
-
-
-
-
- void OSTaskIdleHook(void)
- {
-
-
- }
-
- void OSTaskStatHook(void)
- {
-
-
- }
-
- void OSTaskSwHook(void)
- {
-
-
- }
-
- void OSTCBInitHook(OS_TCB *ptcb)
- {
- ptcb=ptcb;
-
- }
-
-
- void OSTimeTickHook(OS_TCB *ptcb)
- {
-
-
- }
-
- void OSInitHookBegin(void)
- {
-
- }
-
- void OSInitHookEnd(void)
- {
-
- }
-
復制代碼
|