C語言中 “_at()” 特殊地址定位詳解
C語言中 “_at()” 特殊地址定位詳解
在keil里面,有一個(gè)特殊地址定位的指令,就是將一個(gè)變量或常量定位到一個(gè)指定的地址上面
指令為 __at ,使用方法如下
int variable __at(0x8000) = 100;
意為將variable變量定位到0x8000這個(gè)地址。
指令的目的是告訴鏈接器將指定地址定位到某個(gè)地址里面,在使用該功能的時(shí)候需要注意一點(diǎn)的是,地址的范圍需要符合單片機(jī)的datasheet給出的地址映射表,
注意,如果地址超出了flash的最大范圍,程序?qū)o法得到這個(gè)值,例如一個(gè)256Kflash的芯片,在使用功能__at指令的時(shí)候,地址就不要超過256*1024了,否則你是找不到這個(gè)變量的。
下面以MB9AF310系列芯片為例,講一下關(guān)于芯片的flash在內(nèi)存中的映射,
如圖,flash被映射到了0x00000000這個(gè)地址上,以0x00100000結(jié)束,但是仍然需要看具體芯片的flash是多大的,這個(gè)地址只是310系列芯片的地址映射,如果超出了實(shí)際的地址,仍然不能找到變量。
keil的鏈接器最后會(huì)把變量放到生成文件的相應(yīng)地址中去,在燒錄的時(shí)候,如果是BIN文件,文件的字節(jié)地址會(huì)和flash的地址一一對(duì)應(yīng)。用戶定義的變量將被燒錄到相應(yīng)的flash的物理地址中。以上都是在沒有MMU的情況的關(guān)于地址映射的解釋,如果啟用了MMU,情況也許會(huì)不一樣,畢竟多了一層虛擬地址,實(shí)際上還能不能使用__at指令,我也不知道,后續(xù)筆者會(huì)繼續(xù)鉆研,更多關(guān)于__at指令的說明,可以直接在keil的幫助文件中找到。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(647.回文子字符串)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(647.回文子字符串),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn)
這篇文章主要介紹了C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn),幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-08-08C++實(shí)例分析講解臨時(shí)對(duì)象與右值引用的用法
對(duì)性能來說,許多的問題都需要和出現(xiàn)頻率及本身執(zhí)行一次的開銷掛鉤,有些問題雖然看似比較開銷較大,但是很少會(huì)執(zhí)行到,那也不會(huì)對(duì)程序有大的影響;同樣一個(gè)很小開銷的函數(shù)執(zhí)行很頻繁,同樣會(huì)對(duì)程序的執(zhí)行效率有很大影響。本章中作者主要根據(jù)臨時(shí)對(duì)象來闡述這樣一個(gè)觀點(diǎn)2022-08-08用QT實(shí)現(xiàn)計(jì)時(shí)器功能
這篇文章主要為大家詳細(xì)介紹了用QT實(shí)現(xiàn)計(jì)時(shí)器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C++代碼實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++代碼實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06C++?Cartographer的入口node main詳細(xì)講解
這篇文章主要介紹了C++Node類Cartographer的入口node main,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03