函式絕對定位方法:
將鏈結方式從lx51改回bl51,然後再bl51 locate中的code框中寫入:
?pr?_delay?delay(0x8000)
其中,前面那個_delay是指函式名叫做delay,前面為什麼要加_還不清楚,而且原來無論是什麼這裡都是大寫;
後面那個delay是指檔名叫做delay,也就是說這個函式要到delay.c中去找;
括號裡面的當然就是要定位到的位址了。
如果不強制定位,聯結器一般都會把程式從0開始安排,有多大安排多大。
1、**定位:
方法1:使用偽指令cseg。比如要將myfunc1定位到**區c:0x1000,則新建乙個a51檔案,新增以下內容:
public myfunc1
cseg at 1000h
myfunc1:
;其它**
ret在其它原始檔中,就可以呼叫myfunc()函式了。需要注意的是,編譯器不檢測傳遞引數的數目,僅檢測函式是否有返回值。
方法2:使用bl51 locate選項。比如在main.c中定義了乙個myfunc2函式,並且要將該函式定位到**區c:0x2000,則從選單中選擇project->options for target 'target1',在彈出的對話方塊中選擇bl51 locate頁,在下面的code欄中寫上?pr?myfunc2?main(0x2000)即可。
如果想定位多個函式,也可以使用*萬用字元。
2、變數定位:
只有全域性變數可以絕對定位,區域性變數無法實現絕對定位。
方法1:使用_at_關鍵字。宣告乙個全域性變數unsigned char data mybuf1[8] _at_ 0x20;
方法2:使用bl51 locate選項。比如將main.c中定義的所有data型的全域性變數定位到資料區d:0x28開始的空間,則從選單中
選擇project->options for target 'target1',在彈出的對話方塊中選擇bl51 locate頁,在下面的data欄中寫上?dt?main(0x28)即可。
如果是idata,則使用?id?main(0x28),如果是xdata,則使用?xd?main(0x28),如果是pdata,則使用?pd?main(0x28)
3、堆疊定位:
在startup.a51檔案中定義了堆疊區?stack,其起始位址同樣可以在bl51 locate頁中設定,在stack欄寫上?stack(0x80)
lx51定位方法:
這個方法是在wiznet的isp教程中發現的。
首先在需要定位的那個檔案的首行寫上 #pragma userclass(code = isp)
當然=後面的那個名字是自己起的。
然後再options的lx51 locate中的userclass中寫上 code_isp(c:0x8000)即可
很顯然:後面的是定位位址,如果有多個,就再加逗號繼續寫。
關於keil中無法跳轉到函式 變數定義處的問題
keil中無法跳轉到定義的情況有多種情況 1 工程編譯不成功,這種情況肯定跳轉不到定義的,這時只能根據編譯提示資訊檢查程式直到程式正常通過編譯吧。2 工程未編譯或工程清空編譯資訊後未再進行編譯,肯定會跳轉不到定義處,這時一般再編譯一次工程就可以了。3 某些暫存器變數,列舉型別或結構體變數。4 定義的...
keil中關於使用 at 絕對位址定位問題
在網上看到有人提到在keil中使用 at 進行絕對位址定位問題,我簡單介紹一下它的用法。使用 at 關鍵字對儲存器進行絕對位址定位程式如下 i nclude char xdata led data 50 at 0x8000 main led data 0 0x23 值得指出的幾點是 1.在給變數le...
關於變數與儲存空間的解惑!(keil中)
注意 keil 中帶有reentrant關鍵字的函式是不同於這裡將要說的東西 如 void myfunc void reentrant 在keil 中的compact 變數被定義在pdata中 模式不能被定義 void main void 在keil 中 有data idata pdata xdat...