浓毛老太交欧美老妇热爱乱,蜜臀性色av免费,妺妺窝人体色www看美女,久久久久久久久久久大尺度免费视频,麻豆人妻无码性色av专区

位置:51電子網(wǎng) » 技術(shù)資料 » 其它綜合

uC/OS-II在C8051F上的移植

發(fā)布時間:2008/6/5 0:00:00 訪問次數(shù):577

uc/os-ii在c8051f上的移植

1 開發(fā)工具和運行環(huán)境

  實現(xiàn)μc/os-ii的移植,要求所用的c編譯器支持混合編程。keil c51可為眾多的8051派生器件編程。我們選用的是keil7.02集成開發(fā)環(huán)境,仿真板基于c8051f015芯片。

2 移植中所需修改的文件

  和cpu相關(guān)的文件主要有三個,分別是匯編文件os_cpu_a.asm、c語言文件 os_cpu_c.c和頭文件os_cpu.h。

2.1 os_cpu.h文件

  os_cpu.h文件中定義了數(shù)據(jù)類型及與硬件相關(guān)的基本信息。其中改動部分如下:
typedef unsigned char os_stk; /* 堆棧的寬度為8位 */
os_cpu_ext int8u ie_shadow;
#define os_enter_critical() ie_shadow = ie; ie &= 0x7f /* 關(guān)中斷 */
#define os_exit_critical() ie = ie_shadow
/* 恢復(fù)中斷 */
#define os_stk_growth 0
#define os_task_sw() osctxsw()

  在c8051f中,堆棧都是按字節(jié)操作的,故數(shù)據(jù)類型os_stk聲明為8位。方向從低地址向高地址方向遞增,所以os_stk_growth設(shè)置為0。μc/os-ii在進入系統(tǒng)臨界代碼區(qū)之前要關(guān)中斷,等到退出臨界區(qū)后再打開,以保護核心數(shù)據(jù)不被多任務(wù)環(huán)境下的其它任務(wù)或中斷破壞。開、關(guān)中斷可通過設(shè)置sfr中的中斷屏蔽位實現(xiàn)。在關(guān)中斷時,先將ie的內(nèi)容保存在全局變量ie_ shadow中,然后關(guān)中斷;退出臨界區(qū)時,還原ie_shadow的值。os_task_sw()用來實現(xiàn)任務(wù)切換。就緒任務(wù)的堆棧初始化應(yīng)該模擬一次中斷發(fā)生后的樣子,堆棧中應(yīng)該按入棧次序設(shè)置好各個寄存器。os_task_sw()函數(shù)模擬一次中斷過程,在中斷返回的時候進行任務(wù)切換。由于c8051f015沒有軟中斷,故直接定義宏os_task_sw()為函數(shù)osctxsw()。

2.2 os_cpu_a.asm文件

  編譯器將每個文件作為一個模塊,編譯模塊以主名命名,稱為編譯模塊名,用name 來聲明。因此,應(yīng)在文件頭部聲明name os_cpu_a。

  函數(shù)有程序部分和局部變量部分,它們分別放在獨立的段中。在大模式下,段名聲明的固定格式為 ?pr?函數(shù)名?模塊名 segment code。因此需要將osstarthighrdy()、osctxsw()、osintctxsw()和ostickisr()用上面的格式一一聲明。如?pr?osstarthighrdy?os_cpu_a segment code,本模塊實現(xiàn)的函數(shù)需要用public聲明,如public osstarthighrdy等。

  c51將所有定義說明的數(shù)據(jù)標(biāo)識符轉(zhuǎn)換為大寫字符,對函數(shù)則根據(jù)有無寄存器參數(shù)傳送和函數(shù)是否可重入進行換名,如:void osintenter(void) reentrant函數(shù)的名字osintenter換成_?osintenter。這些規(guī)則可從編譯后的lst文件中看出。程序中聲明引用的五個全局變量為ostcbcur、ostcbhighrdy、osrunning、ospriocur、ospriohighrdy,聲明格式是extrn idata (ostcbcur)等。調(diào)用四個外部子程序ostaskswhook()、osintenter()、osintexit()、ostimetick(),固定格式為:extrn code (_?ostaskswhook)等。

  由于c8051f的堆棧指針只有8位,只能指向內(nèi)部數(shù)據(jù)區(qū)的256個字節(jié),因此,當(dāng)前運行的任務(wù)的堆棧在idata區(qū),堆棧大小為40h(64字節(jié)),堆棧起點由keil決定。通過標(biāo)號可以獲得keil分配的sp起點,代碼如下:
?stack segment idata
rseg ?stack
osstack:
ds 40h
osstkstart idata osstack-1
為簡化子程序特定義壓棧出棧宏。壓棧的次序為psw、acc、b、dpl、dph、r0~r7,出棧的次序與入棧相反。
pushall macro
irp reg, <psw,acc, b, dpl, dph, 0, 1, 2, 3, 4, 5, 6, 7>
push reg
endm
popall macro
irp reg, <7, 6, 5, 4, 3, 2, 1, 0, dph, dpl, b, acc, psw>
pop reg
endm
具體函數(shù)的修改部分見本刊網(wǎng)絡(luò)補充版(http://www.dpj.com.cn)。

2.3 os_cpu_c.c文件

  移植μc/os-ii 需要在os_cpu_c.c中定義六個函數(shù),而實際上需要定義的只有ostaskstkinit()一個函數(shù)。該函數(shù)用來初始化任務(wù)的堆棧。初始狀態(tài)的堆棧只須初始化?c_xbp (仿真堆棧指針)、任務(wù)地址及堆棧的長度。由于只有inc dptr指令,故返回棧的最低地址,且最低地址處存放棧的長度,方便用匯編語言實現(xiàn)任務(wù)的切換。堆的大小可根據(jù)任務(wù)的實際情況自行確定,由參數(shù)ppdata所指的值確定。
void *ostaskstkinit (void (*task)(void *pd), void *ppdata,
void *ptos, int16u opt) reentrant
{
os_stk *stk;
int8u heapsize;
heapsize=*(int8u *)ppdata;
opt = opt;
stk = (os_stk *)ptos+heapsize+2;
*stk++ = 15;
*stk++ = (int16u)task & 0xff;
*stk++ = (int16u)task >> 8;
stk = (os_stk *)ptos+heapsize+2;
*--stk = (int16u) (ptos+heapsize-1) >> 8;
*--stk = (int16u) (ptos+heapsize-1) & 0xff;
return ((void *)stk);
}

3 可重入函數(shù)

  因為51系列堆?臻g的限制, keil編譯器沒有像大系統(tǒng)那樣使用調(diào)用堆棧。一般c語言調(diào)用過程中

uc/os-ii在c8051f上的移植

1 開發(fā)工具和運行環(huán)境

  實現(xiàn)μc/os-ii的移植,要求所用的c編譯器支持混合編程。keil c51可為眾多的8051派生器件編程。我們選用的是keil7.02集成開發(fā)環(huán)境,仿真板基于c8051f015芯片。

2 移植中所需修改的文件

  和cpu相關(guān)的文件主要有三個,分別是匯編文件os_cpu_a.asm、c語言文件 os_cpu_c.c和頭文件os_cpu.h。

2.1 os_cpu.h文件

  os_cpu.h文件中定義了數(shù)據(jù)類型及與硬件相關(guān)的基本信息。其中改動部分如下:
typedef unsigned char os_stk; /* 堆棧的寬度為8位 */
os_cpu_ext int8u ie_shadow;
#define os_enter_critical() ie_shadow = ie; ie &= 0x7f /* 關(guān)中斷 */
#define os_exit_critical() ie = ie_shadow
/* 恢復(fù)中斷 */
#define os_stk_growth 0
#define os_task_sw() osctxsw()

  在c8051f中,堆棧都是按字節(jié)操作的,故數(shù)據(jù)類型os_stk聲明為8位。方向從低地址向高地址方向遞增,所以os_stk_growth設(shè)置為0。μc/os-ii在進入系統(tǒng)臨界代碼區(qū)之前要關(guān)中斷,等到退出臨界區(qū)后再打開,以保護核心數(shù)據(jù)不被多任務(wù)環(huán)境下的其它任務(wù)或中斷破壞。開、關(guān)中斷可通過設(shè)置sfr中的中斷屏蔽位實現(xiàn)。在關(guān)中斷時,先將ie的內(nèi)容保存在全局變量ie_ shadow中,然后關(guān)中斷;退出臨界區(qū)時,還原ie_shadow的值。os_task_sw()用來實現(xiàn)任務(wù)切換。就緒任務(wù)的堆棧初始化應(yīng)該模擬一次中斷發(fā)生后的樣子,堆棧中應(yīng)該按入棧次序設(shè)置好各個寄存器。os_task_sw()函數(shù)模擬一次中斷過程,在中斷返回的時候進行任務(wù)切換。由于c8051f015沒有軟中斷,故直接定義宏os_task_sw()為函數(shù)osctxsw()。

2.2 os_cpu_a.asm文件

  編譯器將每個文件作為一個模塊,編譯模塊以主名命名,稱為編譯模塊名,用name 來聲明。因此,應(yīng)在文件頭部聲明name os_cpu_a。

  函數(shù)有程序部分和局部變量部分,它們分別放在獨立的段中。在大模式下,段名聲明的固定格式為 ?pr?函數(shù)名?模塊名 segment code。因此需要將osstarthighrdy()、osctxsw()、osintctxsw()和ostickisr()用上面的格式一一聲明。如?pr?osstarthighrdy?os_cpu_a segment code,本模塊實現(xiàn)的函數(shù)需要用public聲明,如public osstarthighrdy等。

  c51將所有定義說明的數(shù)據(jù)標(biāo)識符轉(zhuǎn)換為大寫字符,對函數(shù)則根據(jù)有無寄存器參數(shù)傳送和函數(shù)是否可重入進行換名,如:void osintenter(void) reentrant函數(shù)的名字osintenter換成_?osintenter。這些規(guī)則可從編譯后的lst文件中看出。程序中聲明引用的五個全局變量為ostcbcur、ostcbhighrdy、osrunning、ospriocur、ospriohighrdy,聲明格式是extrn idata (ostcbcur)等。調(diào)用四個外部子程序ostaskswhook()、osintenter()、osintexit()、ostimetick(),固定格式為:extrn code (_?ostaskswhook)等。

  由于c8051f的堆棧指針只有8位,只能指向內(nèi)部數(shù)據(jù)區(qū)的256個字節(jié),因此,當(dāng)前運行的任務(wù)的堆棧在idata區(qū),堆棧大小為40h(64字節(jié)),堆棧起點由keil決定。通過標(biāo)號可以獲得keil分配的sp起點,代碼如下:
?stack segment idata
rseg ?stack
osstack:
ds 40h
osstkstart idata osstack-1
為簡化子程序特定義壓棧出棧宏。壓棧的次序為psw、acc、b、dpl、dph、r0~r7,出棧的次序與入棧相反。
pushall macro
irp reg, <psw,acc, b, dpl, dph, 0, 1, 2, 3, 4, 5, 6, 7>
push reg
endm
popall macro
irp reg, <7, 6, 5, 4, 3, 2, 1, 0, dph, dpl, b, acc, psw>
pop reg
endm
具體函數(shù)的修改部分見本刊網(wǎng)絡(luò)補充版(http://www.dpj.com.cn)。

2.3 os_cpu_c.c文件

  移植μc/os-ii 需要在os_cpu_c.c中定義六個函數(shù),而實際上需要定義的只有ostaskstkinit()一個函數(shù)。該函數(shù)用來初始化任務(wù)的堆棧。初始狀態(tài)的堆棧只須初始化?c_xbp (仿真堆棧指針)、任務(wù)地址及堆棧的長度。由于只有inc dptr指令,故返回棧的最低地址,且最低地址處存放棧的長度,方便用匯編語言實現(xiàn)任務(wù)的切換。堆的大小可根據(jù)任務(wù)的實際情況自行確定,由參數(shù)ppdata所指的值確定。
void *ostaskstkinit (void (*task)(void *pd), void *ppdata,
void *ptos, int16u opt) reentrant
{
os_stk *stk;
int8u heapsize;
heapsize=*(int8u *)ppdata;
opt = opt;
stk = (os_stk *)ptos+heapsize+2;
*stk++ = 15;
*stk++ = (int16u)task & 0xff;
*stk++ = (int16u)task >> 8;
stk = (os_stk *)ptos+heapsize+2;
*--stk = (int16u) (ptos+heapsize-1) >> 8;
*--stk = (int16u) (ptos+heapsize-1) & 0xff;
return ((void *)stk);
}

3 可重入函數(shù)

  因為51系列堆?臻g的限制, keil編譯器沒有像大系統(tǒng)那樣使用調(diào)用堆棧。一般c語言調(diào)用過程中

相關(guān)IC型號

熱門點擊

 

推薦技術(shù)資料

羅盤誤差及補償
    造成羅盤誤差的主要因素有傳感器誤差、其他磁材料干擾等。... [詳細(xì)]
版權(quán)所有:51dzw.COM
深圳服務(wù)熱線:13692101218  13751165337
粵ICP備09112631號-6(miitbeian.gov.cn)
公網(wǎng)安備44030402000607
深圳市碧威特網(wǎng)絡(luò)技術(shù)有限公司
付款方式


 復(fù)制成功!