欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
OS_CPU_C.c
[打印本頁]
作者:
hongniu
時間:
2015-6-24 21:22
標題:
OS_CPU_C.c
/******************************************************/
/********** 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)
{
}
復制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1