平常很少接觸單片機程序,都是系統的應用程序,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)))
此時編譯的時候,就會報錯:
這個報錯很好理解
const u16 gFlashDefValue[512] __attribute__((at(0x0800F000))) = {0x1111,0x1111,0x1111,0x0111,0x0111,0x0111};//定位在flash中,其他flash補充為00const u16 gflashdata__attribute__((at(0x0800F000))) = 0xFFFF;
u8 USART2_RX_BUF[USART2_REC_LEN] __attribute__ ((at(0X20001000)));//接收緩沖,最大USART_REC_LEN個字節,起始地址為0X20001000.