C語言中 「 at 」 特殊位址定位詳解

2021-10-04 07:56:43 字數 658 閱讀 5725

c語言中 「_at()」 特殊位址定位詳解

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

指令為 __at ,使用方法如下

1int variable __at(0x8000) = 100;

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

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

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

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

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

C語言中強制位址跳轉詳解

c語言中強制位址跳轉詳解 defgyivnuine jump targetaddr vgyivnuoid targetaddr 第乙個 void 意思為強制型別轉換為乙個無形參,無返回值的函式指標,targetaddr 為跳轉位址,但是函式指標變數不能為常數所以要加 void 進行強制型別轉換。最後...

C語言中遞迴詳解

編寫乙個簡單的cheng函式,輸入的b全為數值5。第一種情況 1 include2 int cheng int a 3 10 return a 11 12 13 int main 14這種情況會輸出 2624 120120為什麼會產生這樣的結果?首先我們要明白,函式在未完成自己的計算之前,是無法被呼...

C語言中 enum詳解

note 儘管乙個列舉常量占用4個位元組,恰好和int型別占用的位元組數相同,通過sizeof操作符求得,但enum型別和int型別並不等價,將int型別的整數賦值給enum變數時,需要進行強制型別裝換。因為列舉型別是一種基本資料型別,而不是一種構造型別,所以不能把這些列舉常量說明為整形,字元型或其...