打印
[C语言]

“u8 buf[200]={0};”为什么会使.bin文件由7k变成8M?

[复制链接]
3584|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feilusia|  楼主 | 2014-10-20 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定义缓冲区的同时初始化缓冲区,会使编译出来的.bin文件的大小由7K变成8M,导致下载程序很慢,但是去掉后面的“={0};”就正常。求大神指教是什么原因导致的,谢谢了!
评分
参与人数 1威望 +5 收起 理由
xyz549040622 + 5

相关帖子

沙发
ayb_ice| | 2014-10-20 11:36 | 只看该作者
会不会是很多地方都有定义

使用特权

评论回复
板凳
feilusia|  楼主 | 2014-10-20 13:30 | 只看该作者
ayb_ice 发表于 2014-10-20 11:36
会不会是很多地方都有定义

没有重定义,我在变量段里放了了一个.c文件,这个.c专门放全局变量的。变量段的段长是3K,应该也不会造成溢出什么的。

使用特权

评论回复
地板
aozima| | 2014-10-20 13:46 | 只看该作者
查看map文件,一切了然。

使用特权

评论回复
5
feilusia|  楼主 | 2014-10-20 14:06 | 只看该作者
aozima 发表于 2014-10-20 13:46
查看map文件,一切了然。

你说的map文件是地址映射的头文件吗?跟那个没关系吧。

使用特权

评论回复
6
xlsbz| | 2014-10-20 15:37 | 只看该作者
这个不清楚啊。有空你可以看看内存分配规则。这个arm好像内存分配不太连续 和51不一样

使用特权

评论回复
7
aozima| | 2014-10-21 11:18 | 只看该作者
本帖最后由 aozima 于 2014-10-21 11:20 编辑
feilusia 发表于 2014-10-20 14:06
你说的map文件是地址映射的头文件吗?跟那个没关系吧。

编译,再链接之后由链接器给出的报表,基本都叫  **.map   里面有详细给出了每个函数和变量的大小,位置等信息。

以KEIL为例,生成需要勾一下选项,默认应该是勾上的。

使用特权

评论回复
8
feilusia|  楼主 | 2014-10-21 13:53 | 只看该作者
aozima 发表于 2014-10-21 11:18
编译,再链接之后由链接器给出的报表,基本都叫  **.map   里面有详细给出了每个函数和变量的大小,位置等 ...

我大概明白了,按你说的查看了map文件,发现未初始化时被分在.bss段里,如下图

而如果把数组定义时并初始化,则被分在数据段里,如下图



百度了才知道.bss段是不占用.exe文件空间的,其内容由操作系统初始化(清零);而.data却需要占用,其内容由程序初始化。
所以定义时初始化生成的可执行文件会更大,但是我才加200个字节,不知道为何会从7K大到8M差这么多

使用特权

评论回复
9
车彦锋| | 2014-10-21 14:15 | 只看该作者
路过

使用特权

评论回复
10
aozima| | 2014-10-21 15:57 | 只看该作者
那么仔细看这个文件呀,把前后两份文件对比。

如果是GCC,特别注意有没多个section,他会生成一个BIN,然后把两块空间连接起来,这样BIN文件可能上百M甚至上G。

针对多个RAM section,可以添加在链接脚本中对其添加  NOLOAD 属性。
如果是 text section,可以单独把每个section生成BIN文件。

使用特权

评论回复
11
feilusia|  楼主 | 2014-10-22 12:00 | 只看该作者
aozima 发表于 2014-10-21 15:57
那么仔细看这个文件呀,把前后两份文件对比。

如果是GCC,特别注意有没多个section,他会生成一个BIN,然后 ...

我仔细看了看,两份文件区别就只有一个在.bss段、一个在.data段。
我在想是不是因为以4个字节排列的原因,造成数据很大。

使用特权

评论回复
12
john_lee| | 2014-10-22 12:27 | 只看该作者
估计你的 bin 是从 0 地址开始生成数据的,到 0x80C000 就是 8M 多。

使用特权

评论回复
13
icekoor| | 2014-10-22 13:22 | 只看该作者
学习了

使用特权

评论回复
14
feilusia|  楼主 | 2014-10-22 13:48 | 只看该作者
john_lee 发表于 2014-10-22 12:27
估计你的 bin 是从 0 地址开始生成数据的,到 0x80C000 就是 8M 多。

经你这么一说,验证一下确实是这样!
一、当链接文件中的.data段设置在0x0080c000时,.bin文件是8241K。


二、当.data段往后移64k至0x0081c000时,.bin文件也大了64K至8305K。



三、而没有初始化数组时,.bin文件只编译到TEST段,就是0x1000(4K)+代码(4K)=8K。


但是我还有一个疑问,我的.data段明明没有定义长度,为何初始化的数组会被分到.data段呢?


使用特权

评论回复
15
feilusia|  楼主 | 2014-10-22 13:49 | 只看该作者
aozima 发表于 2014-10-21 15:57
那么仔细看这个文件呀,把前后两份文件对比。

如果是GCC,特别注意有没多个section,他会生成一个BIN,然后 ...

原因我知道了,在上一楼的回复中。

使用特权

评论回复
16
john_lee| | 2014-10-22 22:50 | 只看该作者
把 ld script 中关于 .data 的输出段描述贴出来看看(不要传文件,只贴文本就好)。

使用特权

评论回复
17
feilusia|  楼主 | 2014-10-23 09:03 | 只看该作者
本帖最后由 feilusia 于 2014-10-23 09:04 编辑
john_lee 发表于 2014-10-22 22:50
把 ld script 中关于 .data 的输出段描述贴出来看看(不要传文件,只贴文本就好)。 ...

ld script应该是我项目中的.lcf链接文件吧?几乎没东西的。
     .data:
     {
             . = ALIGN(0x4);
            
             __data_begin = .;                  
             * (.data)     
             __data_end = .;

     } > DATA

使用特权

评论回复
18
john_lee| | 2014-10-23 09:57 | 只看该作者
feilusia 发表于 2014-10-23 09:03
ld script应该是我项目中的.lcf链接文件吧?几乎没东西的。
     .data:
     {

lcf 文件是什么?你不是用的 GNU 工具链?

使用特权

评论回复
19
feilusia|  楼主 | 2014-10-23 10:33 | 只看该作者
john_lee 发表于 2014-10-23 09:57
lcf 文件是什么?你不是用的 GNU 工具链?

我用的IDE是metrowerks codewarrior,它的链接文件就是lcf,分配段地址和大小什么的都是放在lcf里的。
具体用的是什么工具链我不是很清楚,在哪里能查看用的是什么工具链?

使用特权

评论回复
20
feilusia|  楼主 | 2014-10-23 10:35 | 只看该作者
这是我的链接文件里的内容
#
#   linker.lcf  -   linker command file for CCore 3202
#


MEMORY
{
       
    VECTORS (RX)   : ORIGIN = 0x00000000,         LENGTH = 0x00000200
    OS (RX)        : ORIGIN = 0x00000200,         LENGTH = 0x00000E00
    TEXT (RX)      : ORIGIN = 0x00001000,         LENGTH = 0x00010E00   
      
    GLOBAL_BSS                (RW)  : ORIGIN = 0x00800000,     LENGTH = 0x00001000        // 4K
  
    DATA                        (RW)  : ORIGIN = 0x0080C000,     LENGTH = 0x00000000        // 0K
   
    BSS                           (RW)  : ORIGIN = AFTER(DATA),         LENGTH = 0x00000000
   
   
    //SRAM
    //VECTORS (RX)   : ORIGIN = 0x00800000,         LENGTH = 0x00000200
   // OS (RX)        : ORIGIN = 0x00800200,         LENGTH = 0x00000E00
    //TEXT (RX)      : ORIGIN = 0x00801000,         LENGTH = 0x00002000   
      
    //GLOBAL_BSS                (RW)  : ORIGIN = 0x00803000,     LENGTH = 0x00001000        // 4K
  
    //DATA                        (RW)  : ORIGIN = 0x00804000,     LENGTH = 0x00004400        // 0K
   
    //BSS                           (RW)  : ORIGIN = AFTER(DATA),         LENGTH = 0x00000000

}



SECTIONS {
   
     .vectormap :   
     {
             . = ALIGN(0x400);     // Align table on 1024-byte boundary per, by VBR required                 
             __exception_table_begin = .;
             drv_vtable.c      (.rodata)     
             __exception_table_end = .;
     } > VECTORS

     .operating_system:
     {
             Startup.c                (.text)
             Core_Entry.c        (.text)
             *                    (.rodata)
     } > OS

   
    .main_application :            
     {
                Global_Var.c        (.text)
            Core_Entry.c        (.text)

            interrupt.c                (.text)
             
            sci1.c                        (.text)       
            sci1_judge.c        (.text)                
            sci1_dispatch.c        (.text)             

            spi1.c                        (.text)       
            spi1_judge.c        (.text)                              
            spi1_dispatch.c        (.text)

            drv_psr.s                (.text)
             
            eflash.c                (.text)
            *        (.rodata)     
             
     } > TEXT

       
     .global_bss:
     {
             . = ALIGN(0x4);
             Global_Var.c (.bss)                     
     } > GLOBAL_BSS

     
     
     .data:
     {
             . = ALIGN(0x4);
             
             __data_begin = .;                  
             * (.data)     
             __data_end = .;

     } > DATA
      
     __stack_begin   = 0x00805ff8;
}

使用特权

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

本版积分规则

个人签名:1、博客:http://blog.csdn.net/feilusia 2、QQ群:STM8/STM32群(164311667);职场交流群(450154342);CC2640R2F群(557278427) 3、淘宝店:https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

135

主题

1956

帖子

94

粉丝