C語(yǔ)言中 “_at()” 特殊地址定位詳解
南充網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
在keil里面,有一個(gè)特殊地址定位的指令,就是將一個(gè)變量或常量定位到一個(gè)指定的地址上面
指令為 __at ,使用方法如下
int variable __at(0x8000) = 100;
意為將variable變量定位到0x8000這個(gè)地址。
指令的目的是告訴鏈接器將指定地址定位到某個(gè)地址里面,在使用該功能的時(shí)候需要注意一點(diǎn)的是,地址的范圍需要符合單片機(jī)的datasheet給出的地址映射表,
注意,如果地址超出了flash的最大范圍,程序?qū)o(wú)法得到這個(gè)值,例如一個(gè)256Kflash的芯片,在使用功能__at指令的時(shí)候,地址就不要超過(guò)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的物理地址中。以上都是在沒(méi)有MMU的情況的關(guān)于地址映射的解釋?zhuān)绻麊⒂昧薓MU,情況也許會(huì)不一樣,畢竟多了一層虛擬地址,實(shí)際上還能不能使用__at指令,我也不知道,后續(xù)筆者會(huì)繼續(xù)鉆研,更多關(guān)于__at指令的說(shuō)明,可以直接在keil的幫助文件中找到。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!