GCC设置部分代码的编译选项 您所在的位置:网站首页 gcc编译源码所需指令集 GCC设置部分代码的编译选项

GCC设置部分代码的编译选项

2023-04-21 05:40| 来源: 网络整理| 查看: 265

前言:本文测试编译器为arm-none-eabi-gcc 2018-q4-major [gcc-8-branch revision 267074]

==================================================================

GCC可以对部分代码设置不同的编译选项,在编译时使用其指明的选项,而不用编译命令里指定的参数。

有几种方法可以实现该功能。

 

1. 使用#pragma指令

参数值可以是数字,也可以是字符串。数字就是优化级别,以O开头的字符串也被认为是一个优化级别(例如(“O1”)(“-O1”)和(“1”)是相同的作用),其他的字符串选项如果没有-前缀,编译器自动添加-f,例如("unroll-loops")代表-funroll-loops。

该指令最小的作用域为函数,也就是说无法在函数内部使用,但可以作用于多个函数。

具体实现:

Function Specific Option Pragmas,在特定代码前保存当前的编译选项,然后对特定的代码使用指定编译选项,最后再恢复之前保存的编译选项。

1 #pragma GCC push_options 2 #pragma GCC optimize ("O0") 3 ...your code... 4 #pragma GCC pop_options

 

1 #pragma GCC push_options 2 #pragma GCC optimize ("unroll-loops") 3 ...your code... 4 #pragma GCC pop_options

 

1 #pragma GCC push_options 2 #pragma GCC optimize ("-funroll-loops") 3 ...your code... 4 #pragma GCC pop_options

 

1 ...... 2 #pragma GCC unroll 2 3 for(i=0;iFLASH

 上述的LD文件内容指定了所有文件的.text和.text*段放置在FLASH所在基地址。

其中*符号为多字符通配符,加入.text*是因为如果编译器开启-ffunction-sections选项,会给所有的函数生成单独的text段,例如main函数会生成.text.main段,加入.text*就可以覆盖这些text段。

假如我们想把目标文件中test.o这个文件从中取出来放在另外的FLASH2地址,可以这么实现:

(1)在FLASH段的描述中使用EXCLUDE_FILE把该文件排除:

.text : { . = ALIGN(4); *(EXCLUDE_FILE(*test.o) .text) /* .text sections (code) */ *(EXCLUDE_FILE(*test.o) .text*) /* .text* sections (code) */ *(.rodata) /* .rodata sections (constants, strings, etc.) */ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ *(.glue_7) /* glue arm to thumb code */ *(.glue_7t) /* glue thumb to arm code */ *(.eh_frame) KEEP (*(.init)) KEEP (*(.fini)) . = ALIGN(4); _etext = .; /* define a global symbols at end of code */ } >FLASH

(2)在FLASH2段的描述中填入该文件text段:

.text_back : { . = ALIGN(4); *test.o(.text) /* .text sections (code) */ *test.o(.text*) /* .text* sections (code) */ . = ALIGN(4); } >FLASH2

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有