C言语KEIL的ARM编译器对RW和ZI段的处理
按照C编译器编译的结果,一般会产生RO段,RW段,ZI段。RO是程序中的指令和常量,RW是程序中的已初始化全局变量,ZI是程序中的未初始化或初始化为零的全局变量。下面是小编为大家带来的C言语KEIL的ARM编译器对RW和ZI段的处理的知识,欢迎阅读。
C言语KEIL的ARM编译器对RW和ZI段的处理按照C编译器编译的结果,一般会产生RO段,RW段,ZI段。RO是程序中的指令和常量,RW是程序中的已初始化全局变量,ZI是程序中的未初始化或初始化为零的全局变量。
那么如下的代码
int aaa;
int bbb;
int main()
{
aaa = 7;
bbb = 8;
return 0;
}
应该产生的是八个字节的ZI段,但很奇怪,--bss_threshold=0
Program Size: Code=464 RO-data=268 RW-data=8 ZI-data=608
如上所示,其中的Code段,RO-data段和ZI-data段是启动代码产生的,这里不深究。
它产生了8个字节的RW段,可以分析产生的map文件查看main汇编代码和RW段,发现的确将aaa和bbb分配在了RW段。
map文件中的符号如下:
aaa 0x20000000 Data 4 main.o()
bbb 0x20000004 Data 4 main.o()
Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00000268, Max: 0x00001000, ABSOLUTE)
Base Addr Size Type Attr Idx E Section Name Object
0x20000000 0x00000008 Data RW 11 main.o
想想没道理,尝试发现初始化了的全局变量也是放在RW段。
最后发现罪魁祸首是KEIL的armcc的“--bss_threshold=num”这个编译选项,查看手册介绍如下:
This option controls the placement of small global ZI data items in sections. A small global ZI data item is an uninitialized data item that is eight bytes or less in size.
--bss_threshold=num
where:
num
is either:
place small global ZI data items in ZI data sections
place small global ZI data items in RW data sections.
In ARM Compiler 4.1 and later, the compiler might place small global ZI data items in RW data sections as an optimization. In RVCT 2.0.1 and earlier, small global ZI data items were placed in ZI data sections by default.
Use --bss_threshold=0 to emulate the behavior of RVCT 2.0.1 and earlier with respect to the placement of small global ZI data items in ZI data sections.
将比较小的'全局ZI变量存放到RW段当中作为优化手段,默认是小于8个字节的当做small global ZI data,也就是说char,int这些类型全部会放到ZI,除非是大于8个字节的数组。
知道这个之后在编译选项里面添加--bss_threshold=0就可以将其恢复到正常的ZI段中了。
gcc的arm编译器编出来的就是正常的放在ZI段的,感觉keil这样做没什么道理,万一少字节的全局变量很多的话就增加了很大的bin size。
当然全局变量太多也不是一个有素质的程序员应该写出的代码。
-
C语言指针知识点
引导语:在信息工程中,指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中的寄存器(Register)。以下是本站小编分享给大家的C语言指针知识点,欢迎阅读!【考点1】指针变量指针变量是用来存储地址的,而一般变量是存储数值的。指针变量可指向任意一...
-
C语言中的三种预处理功能
导语:预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是C语言三种预处理功...
-
C语言顺序结构知识归纳
C语言的顺序结构里面有哪些知识需要学习的呢,下面小编为大家归纳了C语言顺序结构知识,欢迎大家阅读!C语言顺序结构知识归纳一、表达式语句、函数调用语句和空语句1.C语言的语句共分五大类:表达式语句、控制语句、函数调用语句、空语句和复合语句。2.表达式语句的...
-
C语言函数说明与返回值
导语:在C语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现C语言程序。下面就由小编为大家介绍一下C语言函数说明与返回值,欢迎大家阅读!函数的一般形式是:type-specifierfunction_name(parameterlist)parameterdeclarations{bodyofthe...
相关文章
- 英语阅读:African Union Leaders Talk Mali, Chinese Investmen
- 英语写作技巧分享Writing Tips from Oakley Hall
- Walk for children in poor areas英语作文
- Perseverance will make you successful英语作文
- 高中英语作文:Smart tech makes life simpler
- 英语词汇辨析:similar和alike
- 如何在Javascript中为String对象添加trim,ltrim,rtrim方法
- Should women work after marriage英语作文
- 英语短文:City Life Compared with Rural Life
- 高中生优秀英语作文:Have a break away from electronics