這是我的移植心得:
微控制器使用
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 模...