|
- /******************************************************/
- /********** 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: 任務(wù)的堆棧初始化函數(shù),這里是要模擬一次中斷發(fā)生以后任務(wù)的各種數(shù)據(jù)入棧的過(guò)程,其中最*/
- /* 開(kāi)始先要入棧的是任務(wù)的首地址即該函數(shù)的第一個(gè)參數(shù)task,是個(gè)指向該任務(wù)函數(shù)的一個(gè)指針*/
- /* ,因?yàn)楹竺嬖谌蝿?wù)級(jí)的任務(wù)切換函數(shù)OSCtxSw()和中斷級(jí)的任務(wù)切換函數(shù)OSintCtxSw()切換任務(wù)*/
- /* 的時(shí)候最后要利用任務(wù)返回指令ret將最開(kāi)始入棧的任務(wù)的地址裝入PC,從而使要啟動(dòng)的任務(wù)開(kāi)*/
- /* 始運(yùn)行. */
- /* */
- /*2: 然后開(kāi)始入棧的是cpu的各個(gè)寄存器,這里對(duì)于AVRmage128來(lái)說(shuō)就是R0~R31,但是里面還要注意*/
- /* 的一點(diǎn)就是這里根據(jù)編譯器的不同把將要傳遞給任務(wù)的參數(shù)的地址p_arg傳遞給任務(wù),UCOS里面*/
- /* 所有的任務(wù)的參數(shù)只有一個(gè)就是p_arg,比如建立一個(gè)任務(wù)void mytask(*p_arg);這里傳遞*/
- /* 給任務(wù)的參數(shù)就是一個(gè)指針,它是指向傳遞給任務(wù)參數(shù)的一個(gè)指針,任務(wù)得到這一個(gè)大小為兩個(gè)*/
- /* 字節(jié)的參數(shù)就可以在這個(gè)地址處取到需要的不同數(shù)量的參數(shù),這里的這個(gè)指針在該函數(shù)編譯的*/
- /* 的存放在R25和R24里面的,這是WINAVR編譯器的編譯規(guī)則所決定的,對(duì)于ICCAVR就是R16和R17*/
- /* 了,在任務(wù)切換以后,這個(gè)放在R25和R24里面的參數(shù)就正好被傳遞給了任務(wù)。 */
- /* */
- /*3: 這里的類似于 */
- /* *stk--=0x31; */
- /* *stk--=0x30; */
- /* *stk--=0x29; */
- /* 這樣的語(yǔ)句里面的數(shù)字0x31,0x29是示意性的或者說(shuō)象征性的給賦得值,就是為了說(shuō)明以后出棧*/
- /* 入棧的寄存器的順序而已,當(dāng)然除了給R25和R24以外,對(duì)于ICCAVR就是R16和R17,其他的所付*/
- /* 的值是沒(méi)有實(shí)際意義的,因?yàn)楹竺嫒蝿?wù)被切換開(kāi)始運(yùn)行的時(shí)候就會(huì)被新的值覆蓋了。所以我也*/
- /* 可以這樣做,*stk--=0x00;//R31除R25和R24以外,全部賦0,然后在后面的注釋里面寫明是哪個(gè)*/
- /* 寄存器的棧位。 */
- /* */
- /*4: 最后將SREG入棧,并返回這個(gè)初始化好了的堆棧,事實(shí)上這里應(yīng)該叫任務(wù)堆棧,但這個(gè)是用軟*/
- /* 件模擬的堆棧,后面等任務(wù)切換的時(shí)候?qū)⑦@個(gè)軟件堆棧的指針付給了SP就相當(dāng)于是硬件堆棧了*/
- 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;
- /*任務(wù)的首地址最先入棧,因?yàn)閞et指令即自動(dòng)將這個(gè)地址裝入PC,開(kāi)始運(yùn)行任務(wù)*/
- /*
- *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存放任務(wù)的首地址*/
- *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;//可以看到這個(gè)函數(shù)的返回類型就是堆棧指針類型,所以返回這個(gè)棧指針,以后這個(gè)指針就要裝入SP以將任務(wù)的數(shù)據(jù)恢復(fù)到CPU當(dāng)中
- }
-
- 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)
- {
-
- }
-
復(fù)制代碼
|
|