前面的文章如何在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
+关注
关注
135文章
9499浏览量
388549 -
IAR
+关注
关注
5文章
400浏览量
38332 -
函数
+关注
关注
3文章
4406浏览量
66812 -
源代码
+关注
关注
96文章
2953浏览量
69638 -
开发工具链
+关注
关注
0文章
25浏览量
1794
原文标题:在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开发工具哪个比较好
如何利用现代嵌入式开发工具中的堆栈保护功能

在IAR Arm开发工具链中--function_sections编译选项的使用
评论