STM32也會遇到這樣的絕對定位的問題如下:
uint8_t UART_RX_BUF[1024] __attribute__ ((at(0X20001000))); //就是將串口接收的數據定位到RAM中起始地址為0X20001000;
絕對定位要么定位到flash、要么定位到RAM,這里我們將定位在flash進行說明。
MDK如何實現將數據存儲到FLASH指定地址?
我們在燒錄數據的時候,一般是從0x08000000開始按照順序燒錄到flash里面的,如何讓數據能夠定義到絕對地址如0800F000,就必須保證文件內數據也是存儲在該地址,為了實現這個目的,MDK在生成文件時會填充0x00字段,從而確保能夠將數據定義到

從實際情況也能驗證這個原理,我以我的測試代碼為例:
const u16 gFlashDefValue4[512] __attribute__((at(0x0800F000))) = {0x1111, 0x1111, 0x1111, 0x0111, 0x0111,0x0111};

可以看到Code+ReadOnly= 15236+47228 = 62464
而gFlashDefValue4占絕對地址F000+512*2 = 62464
從生成的BIN文件也可以證實該觀點:


如果你自己查看生成文件也可以發現中間填充了大量的0x00.但有一點要注意, FLASH定義絕對地址時要考慮ZI-Data的長度,否則可能會導致FLASH溢出。
