應用C語言的 at 函數


平常很少接觸單片機程序,都是系統的應用程序,windows 、linux下一些應用程序

 

C語言本身沒啥問題,本身就跟C++風格接近,linux下很多代碼也用c來實現

但基本上用不到一些特殊函數,例如 at 函數

 

先來了解下 at是干嘛用的

絕對定位,可以把變量或函數絕對定位到Flash中,或者定位到RAM

 

是一個功能比較底層的操作,往往要跟__attribute__ 一起使用。

例如:uint8_t byMemp[15000u] __attribute__((at(0xc1405208)))

就是說把 byMemp 強制定位到 0xc1405208 這個地址上面去。

如果僅僅是 uint8_t byMemp[15000u]; 那么意味着是堆棧里進行分配,對於單片機而言,一下子分配那么多,就要考慮是否不夠用等情況

如果用at指令,就可以把地址定位到其他地方去,比如外部sdram上面,這樣就不用占用內部的堆棧。

 

以上大概 可以說明 at 的作用了。

 

那么,再來看下map信息(不知道平時有沒有關注過這個文件)用at過的地方map里面都能夠看到具體信息:

 

 從map里也可以看到 byMemp  是被映射到 0xc1405208 這個地址上,大小也有顯示

 

這些信息都是存放在

Image Symbol Table

這里的 Local Symbols 里面

 

 

 

問:如果連續at有重疊會怎么樣?

例如:

uint8_t byMemp[15000u] __attribute__((at(0xc1405208)))

uint8_t byMempTest[15000u] __attribute__((at(0xc1405308)))

 

此時編譯的時候,就會報錯:

 

 這個報錯很好理解

 

 

__attribute__( at(絕對地址) )的作用分兩個,一個是絕對定位到Flash,另個一是絕對定位到RAM。
1、定位到flash中
一般用於固化的信息,如出廠設置的參數,上位機配置的參數,ID卡的ID號,flash標記等等

const u16 gFlashDefValue[512] __attribute__((at(0x0800F000))) = {0x1111,0x1111,0x1111,0x0111,0x0111,0x0111};//定位在flash中,其他flash補充為00const u16 gflashdata__attribute__((at(0x0800F000))) = 0xFFFF;

 
2、定位到RAM中
一般用於數據量比較大的緩存,如串口的接收緩存,再就是某個位置的特定變量

u8 USART2_RX_BUF[USART2_REC_LEN] __attribute__ ((at(0X20001000)));//接收緩沖,最大USART_REC_LEN個字節,起始地址為0X20001000.

注意:
1、絕對定位不能在函數中定義,局部變量是定義在棧區的,棧區由MDK自動分配、釋放,不能定義為絕對地址,只能放在函數外定義。
2、定義的長度不能超過棧或Flash的大小,否則,造成棧、Flash溢出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM