大宇的ucos移植c51心得

2021-04-19 19:36:09 字數 1584 閱讀 3624

這是我的移植心得:

微控制器使用

r7傳引數,在呼叫任務函式時,提前把

r7裡放上該傳的引數值,等到呼叫任務函式時,編譯器自動到

r7裡把引數取出放到任務函式的形參裡。

本人在做傳參時,在

main()

裡宣告int8u idata dat = 0x05

;注意是

idata

。在create()

任務時傳過去的引數是位址

&dat

,然後初始堆疊時也應該是位址,在然後是

osstart()

呼叫taskrdy()

,他是個匯程式設計序,在裡面

pop r7 這時

r7裡是位址;完了是開始任務函式了把

r7賦給

pd(形參),

pd是位址

在函式裡面處理

*pd = dat

了,就行了。

但犯了點毛病:

犯錯:第一,

osinitstack

時初始化堆疊對應

r7的堆疊裡放了*(

int8u *

)ppdata

,這是dat

這個數不是位址,然後

r7賦給pd,

pd = dat

,*pd =

???。

第二,r7傳引數時只能傳

8位的,我在

task

()任務函式的形參處這樣宣告的

task

(void *pd)

編譯器預設的是大模式,在

xdata

裡給pd

開闢記憶體單元,這時乙個

8位的給乙個多位的賦值當然不對了哈,必須宣告成

idata

即(void idta *pd)

在任務函式裡也能傳陣列,即把陣列的位址放到

r7裡面 /*

void task1(int8u idata *pd)

}void main()

傳陣列的:

void task1(void idata *pd)

}void main();

osinit();

ostaskcreate(task1,(void *)&dat,taskstk,1);

osstart(); }

*/ 在這裡只能是idata 因為早晚這個位址得給r7,而r7是個八位的,如果是xdata 的話,這個位址是大於8位的肯定裝不下了,就錯了 哈;這裡如果系統中不傳位址而直接傳值的話,那樣倒可以在記憶體的任何地方申請單元放變數,因為這個數肯定是unsigned char的,但這樣又不能傳陣列了,因為不傳位址的緣故。

關於重入問題:keil把重入函式的臨時變數放在?c_xbp這個暫存器所指向的記憶體單元中,即?c_xbp裡放的內容如:x:0x02f1,則臨時變數壓在從x:0x02f1單元開始往下的單元:如:

第乙個要儲存的重入引數是uchar c ,第二個引數是uchar b,則在x:0x02f0單元裡放c,在x:0x02ef單元裡放b。這個指標指的單元不用而用下個單元。

?c_xbp暫存器的位址是0x08,初始化時?c_xbp裡放的是0x02f1這個數, x:0x02f1裡放臨時變數。

關於uc os II在C51上移植的筆記

先前看過巨龍的楊屹老師關於在c51上移植uc的文章,看後感慨頗深。但隨著對uc的理解發現楊老師的移植程式中任務函式不能傳引數,所以就試著改了改。uc的執行過程是 第一 osinit 函式初始化空閒任務,如果可能還有統計任務,當然還有pcb,event空閒列表 想必知道uc的人都知道指點哈 第二 os...

C51儲存的優化

我們知道51微控制器只有128byte的ram,有的增強型有xram,此時程式設計時就要注意,否則就有可能超出空間 1 對於各模組的全域性變數 靜態變數 全域性列舉型常量,靜態列舉型常量 個別操作儲存 如外部spi flash 的區域性變數都要修飾成xdata型別,從而節省空間。2 對於bit型變數...

C51下彙編的嵌入

1 c51語言中呼叫組合語言程式 c51語言呼叫組合語言程式要注意以下幾點 1 在檔案欄選中 file group 和c51 程式原檔案,在配置檔案選項中啟用 產生彙編 src 檔案,編譯 src 檔案 和 建立工程 目標 時包含 三個選項。2 根據選擇的編譯模式,把相應的庫檔案 如 small 模...