前面的文章如何在IAR Embedded Workbench中把變量和函數放到指定的section介紹了如何把變量和函數放到指定的section,其中把函數放到指定的section可以通過下面幾種方法:
使用 @ 操作符
使用 GCC 風格的section屬性 __attribute__ ((section ))
使用 #pragma location 命令
使用 #pragma default_function_attributes 命令
這幾種方法都需要修改源代碼,如果對應源代碼不方便修改,那么對應函數默認會放到.text section。最新發布的IAR Arm開發工具鏈9.70.1版本增加了??function_sections編譯選項可以把函數放到單獨的section。
本文主要介紹在IAR Arm開發工具鏈中不修改源代碼的情況下使用??function_sections編譯選項把函數放到單獨的section。
01默認section
IAR Arm開發工具鏈中默認的section如下,其中函數/代碼默認會放到.text section:
02使用??function_sections編譯選項把函數放到單獨的section
下面通過具體的例子介紹在IAR Arm開發工具鏈中??function_sections編譯選項的使用。
對函數不做任何section放置處理
這里以CrcCheck函數為例,首先不做任何section放置處理,查看map文件發現CrcCheck函數會放到默認的.text section:
使用??function_sections編譯選項
使用--function_sections編譯選項把函數放到單獨的section:
查看map文件發現CrcCheck函數放到了使用--function_sections編譯選項生成的.text.CrcCheck section:
修改源代碼把函數放到指定的section
修改源代碼把函數放到指定的section,比如使用#pragmalocation命令將CrcCheck函數放到指定的.CrcCheck section
#pragmalocation =".CrcCheck" voidCrcCheck(void)
查看map文件發現CrcCheck函數放到了指定的.CrcCheck section:
03總結
本文介紹了在IAR Arm開發工具鏈中不修改源代碼的情況下使用??function_sections編譯選項把函數放到單獨的section。對應函數的section放置優先級順序如下:
如果源代碼里面把函數放到指定的section,那么對應的函數會放到指定的section。
如果源代碼里面沒有把函數放到指定的section,使用了??function_sections編譯選項,那么對應函數會放到單獨的section(對應單獨section的名字是.text.加上對應函數的名字,比如CrcCheck函數會放到.text.CrcCheck section)。
如果源代碼里面沒有把函數放到指定的section,也沒有使用??function_sections編譯選項,那么函數會放到默認的.text section。
注意事項:
當前IAR Arm開發工具鏈庫文件中的函數會放到.text section。
如果函數使用了__ramfunc關鍵字,對應函數默認會放到.text.rw section,對應Kind是inited,默認會放到RAM地址區域;但是如果使用了??function_sections編譯選項,對應函數會放到單獨的section,對應Kind是ro code, 默認會放到ROM地址區域。需要對相關section使用對應的initialize命令其Kind才會從ro code變成inited (更多關于initialize命令的信息,可以參考IAR Embedded Workbench中的初始化策略),同時需要把對應section放到RAM地址區域。
當前IAR Arm開發工具鏈中沒有類似GCC中的-fdata-sections編譯選項,因為在ICF文件中可以把變量放到指定的block。
如果可以修改源代碼,建議修改源代碼把對應的關鍵函數放到指定的section,因為??function_sections編譯選項有可能會影響編譯優化:
-
ARM
+關注
關注
134文章
9321瀏覽量
375382 -
IAR
+關注
關注
5文章
372瀏覽量
37288 -
函數
+關注
關注
3文章
4372瀏覽量
64292 -
源代碼
+關注
關注
96文章
2951瀏覽量
67970 -
開發工具鏈
+關注
關注
0文章
17瀏覽量
1697
原文標題:在IAR Arm開發工具鏈中使用??function_sections編譯選項把函數放到單獨的section
文章出處:【微信號:IAR愛亞系統,微信公眾號:IAR愛亞系統】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
Keil MDK 和 IAR 兩款ARM開發工具區別比較
Keil MDK 和 IAR 兩款ARM開發工具區別
Quake Global選擇IAR Systems的開發工具
ARM開發工具集
IAR EWARM軟件免費下載(嵌入式應用編程開發工具)

ARM教程之ARM常用開發工具及相應開發環境配置資料說明

IAR EW430開發工具的使用教程

KeilMDK和IAR兩款ARM開發工具哪個比較好

如何利用現代嵌入式開發工具中的堆棧保護功能

評論