1、引言
在實際項目開發中經常有要求將某些數據固定生成在芯片的某個地址中,我們稱之爲定位,本文基於IAR Embedded Workbench for Arm 8.32.1編譯器,S32K144芯片實現,以將一個16長度的數組定位到0x0000FB00地址爲例。其他芯片其他編譯器可參考該套路。
2、改C代碼
確定需要定位的數據,以testData爲例:
unsigned char testData[16] =
{
1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16
};
添加關鍵字,將其定位到期望的位置:
const unsigned char testData[16] __attribute__((section (".testsection"))) =
{
1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16
};
這個很好理解__attribute__即at的意思,後面的(section (".testsection"))是期望將其放置的位置,section爲鏈接文件的關鍵字,testsection爲自定義的段。所以要繼續修改鏈接文件與上述對應。另外數組定義前要加const關鍵字,否則不會成功。
3、改鏈接文件
針對上述編譯器與芯片使用的鏈接文件爲.icf文件。
首先,添加上述的自定義段testsection:
place in irom_testData_region {readonly section .testsection };
該句意思是將自定義的testsection段添加到irom_testData_region區域,irom_testData_region也是自定義的。
其次,設置自定義區域irom_testData_region地址:
define region irom_testData_region = mem:[from 0x0000FB00 to 0x0000FB0F];
這個也很好理解,並將上述流程穿起來就實現了數據的地址定位,但還沒結束。
最後一步,最爲關鍵,只進行上述設置你會發現生成的hex/s19文件在FB00地址並沒有數據,因爲還缺一條指令:
keep {section .testsection};
keep關鍵字可保證該自定義段不被優化。
效果展示,生成的s19文件如下,可看到FB00地址已生成testData相應數據:
更多內容歡迎關注我的公衆號,任何技術 問題與我討論: