打印
[开发工具]

编译器相关,初始值为零的变量

[复制链接]
567|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sonicll|  楼主 | 2022-3-15 16:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初始值为零的变量,或者没有初始值的变量,按道理应该会被分配到bss段,也就是ZI-data,但是我发现在ARM编译器5和编译器6里的现象不一样。定义一个全局变量
int test_val;

不给初始值,在ARM编译器6里,查看map文件,显示test_val在bss段,符合常规的理解

    __stdout                                 0x20000000   Data           4  stdout.o(.data)
    COM_RX_PORT                              0x20000004   Data           8  stm32_eval.o(.data.COM_RX_PORT)
    COM_TX_PORT                              0x2000000c   Data           8  stm32_eval.o(.data.COM_TX_PORT)
    COM_USART                                0x20000014   Data           8  stm32_eval.o(.data.COM_USART)
    USART_InitStructure                      0x20000020   Data          16  main.o(.bss.USART_InitStructure)
    test_val                                 0x20000030   Data           4  main.o(.bss.test_val)
    __initial_sp                             0x20000438   Data           0  startup_stm32f10x_hd_vl.o(STACK)


而使用ARM编译器5的话,test_val却被分配到了data段
    test_val                                 0x20000000   Data           4  main.o(.data)
    GPIO_PORT                                0x20000018   Data          16  stm32_eval.o(.data)
    BUTTON_PORT                              0x20000028   Data          32  stm32_eval.o(.data)
    COM_USART                                0x20000048   Data           8  stm32_eval.o(.data)
    COM_TX_PORT                              0x20000050   Data           8  stm32_eval.o(.data)
    COM_RX_PORT                              0x20000058   Data           8  stm32_eval.o(.data)
    __stdout                                 0x20000060   Data           4  stdout.o(.data)
    USART_InitStructure                      0x20000064   Data          16  main.o(.bss)
    __initial_sp                             0x20000478   Data           0  startup_stm32f10x_hd_vl.o(STACK)


我的编译器5版本是5.06 update 7 build 960,编译器6版本是6.15,有没有大佬来解释一下,这个算是编译器5的bug吗?

使用特权

评论回复
沙发
sonicll|  楼主 | 2022-3-15 17:10 | 只看该作者
找到原因了,ARM编译器5,对于没有初始值的变量是否放在bss段,是有一个阈值的,默认阈值是8字节,也就是说没有初始值的变量,长度需要大于8字节才会被放进bss段,否则会被放进rw-data,可以通过命令 --bss_threshold 来修改这个阈值,以下是ARM Compiler v5.06 user guide里的说明:


--bss_threshold=num

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.

Syntax
--bss_threshold=num
Where:
num is either:
    0    place small global ZI data items in ZI data sections
    8    place small global ZI data items in RW data sections.


使用特权

评论回复
板凳
skyred| | 2022-3-16 13:23 | 只看该作者
都没研究过个个段~
学习了

使用特权

评论回复
地板
cyclefly| | 2022-3-16 16:17 | 只看该作者
好~不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

883

帖子

3

粉丝