1. 程式人生 > >C語言好難——“_at()” 特殊地址定位指令

C語言好難——“_at()” 特殊地址定位指令

在keil裡面,有一個特殊地址定位的指令,就是將一個變數或常量定位到一個指定的地址上面

指令為 __at ,使用方法如下

int variable __at(0x8000) = 100;

意為將variable變數定位到0x8000這個地址。

指令的目的是告訴連結器將指定變數定位到某個地址裡面,在使用該功能的時候需要注意一點的是,地址的範圍需要符合微控制器的datasheet給出的地址對映表,

注意,如果地址超出了flash的最大範圍,程式將無法得到這個值,例如一個256Kflash的晶片,在使用功能__at指令的時候,地址就不要超過256*1024了,否則你是找不到這個變數的。

下面以MB9AF310系列晶片為例,講一下關於晶片的flash在記憶體中的對映,


如圖,flash被對映到了0x00000000這個地址上,以0x00100000結束,但是仍然需要看具體晶片的flash是多大的,這個地址只是310系列晶片的地址對映,如果超出了實際的地址,仍然不能找到變數。

keil的連結器最後會把變數放到生成檔案的相應地址中去,在燒錄的時候,如果是BIN檔案,檔案的位元組地址會和flash的地址一一對應。使用者定義的變數將被燒錄到相應的flash的實體地址中。以上都是在沒有MMU的情況的關於地址對映的解釋,如果啟用了MMU,情況也許會不一樣,畢竟多了一層虛擬地址,實際上還能不能使用__at指令,我也不知道,後續筆者會繼續鑽研,更多關於__at指令的說明,可以直接在keil的幫助檔案中找到。

寫於2017-3-19 

深圳 夜