搜索
bottom↓
回复: 6

keil生成map文件不明白的地方,求解

[复制链接]

出0入0汤圆

发表于 2014-11-12 14:51:38 | 显示全部楼层 |阅读模式
本帖最后由 caiwei_cs 于 2014-11-12 14:54 编辑

1.
guidev_writealpha.o(.text) refers to lcd_getpixelcolor.o(.text) for LCD_GetPixelColor

    .text                                    0x0000017a   Section        0  strlen.o(.text)
    .text                                    0x0000018a   Section        0  fadd.o(.text)

这里面text什么意思?我知道bss,data,heap,stack。但是这个没有查到。

2.
libinit5.o(.ARM.Collect$$libinit$$00000004) refers to libinit5.o(.ARM.Collect$$libinit$$00002715) for __lit__00000000
exit.o(.text) refers to rtexit.o(.ARM.Collect$$rtexit$$00000000) for __rt_exit

这里面的$$libinit$$00000004什么意思?我看到很多此类含有“$$”的表达,不知道是什么意思?、

3.
    printf7.o(i.__0printf$7) refers to printf7.o(i._printf_core) for _printf_core
    printf7.o(i.__0printf$7) refers to fputc.o(i.fputc) for fputc
    printf7.o(i.__0printf$7) refers to stdout.o(.data) for __stdout
很多符号,有前面一个“i.”这个是什么意思?还有就是有很多以“_“为前缀的符号比如”_printf_core“这些符号是哪里来的?

4.
==============================================================================

Adding Veneers to the image

    Adding AT veneer (8 bytes, Inline) for call to '_printf_int_dec' from _printf_d.o(.ARM.Collect$$_printf_percent$$00000009).
    Adding AT veneer (8 bytes, Inline) for call to '_printf_int_hex' from _printf_x.o(.ARM.Collect$$_printf_percent$$0000000C).
    Adding AT veneer (8 bytes, Inline) for call to '__set_errno' from sqrt.o(i.sqrt).
    Adding AT veneer (8 bytes, Inline) for call to '_printf_char' from _printf_c.o(.ARM.Collect$$_printf_percent$$00000013).
    Adding AT veneer (8 bytes, Long) for call to '_printf_string' from _printf_s.o(.ARM.Collect$$_printf_percent$$00000014).

5 Veneer(s) (total 40 bytes) added to the image.

一个9g45的map文件里面有这个部分,但是一个lpc1788就没有,这个是什么?

5.
Image Symbol Table
里面 symbol 的类型有几种
../../microlib/fpflt.c                   0x00000000   Number         0  ffltui.o ABSOLUTE
    ../../microlib/malloc/malloc.c           0x00000000   Number         0  mallocra.o ABSOLUTE
    ../../microlib/malloc/mvars.c            0x00000000   Number         0  mvars.o ABSOLUTE
    ../../microlib/printf/printf.c           0x00000000   Number         0  printf2.o ABSOLUTE
    ../../microlib/printf/printf.c           0x00000000   Number         0  printf4.o ABSOLUTE
    ../../microlib/printf/printf.c           0x00000000   Number         0  printf5.o ABSOLUTE
    ../../microlib/printf/printf.c           0x00000000   Number         0  printf7.o ABSOLUTE

Number         是什么?为什么大小是0? 后面的”ABSOLUTE“是什么?
我查到:Number是指它并不占据程序空间,而只是一个具有一定数值的符号,类似于程序中用define和EQU定义的。但还是不理解。比如:../../microlib/printf/printf.c  怎么会不占空间呢?难道这里给的是一个跳转?

    VECTOR                                   0x00300000   Section      112  board_cstartup_keil.o(VECTOR)
    cstartup                                 0x70000000   Section      148  board_cstartup_keil.o(cstartup)
    label                                    0x70000004   ARM Code       0  board_cstartup_keil.o(cstartup)
    !!!main                                  0x70000094   Section        8  __main.o(!!!main)
    !!!scatter                               0x7000009c   Section       60  __scatter.o(!!!scatter)
    !!handler_copy                           0x700000d8   Section       40  __scatter_copy.o(!!handler_copy)
    !!handler_zi                             0x70000100   Section       44  __scatter_zi.o(!!handler_zi)
    .ARM.Collect$$_printf_percent$$00000000  0x7000012c   Section        0  _printf_percent.o(.ARM.Collect$$_printf_percent$$00000000)
    .ARM.Collect$$_printf_percent$$00000009  0x7000012c   Section        8  _printf_d.o(.ARM.Collect$$_printf_percent$$00000009)
    .ARM.Collect$$_printf_percent$$0000000A  0x70000134   Section        8  _printf_u.o(.ARM.Collect$$_printf_percent$$0000000A)

"Section"是什么?      "VECTOR"是什么?      "cstartup"是什么?       "!!!main"是什么?       ".ARM.Collect$$_printf_percent$$00000000"是什么?      

目前我碰到的问题是:

keil编译完了以后,link时显示ram不够,不能连接,我要从哪方面开始精简,是要从类型为Data里面精简么?
例如:SD_Buf                                   0x100054e4   Data        1620  persistence.o(.bss)

6.
Image component sizes


      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name

         0          0          0          0          0       1184   ac97c.o
       532         48         12          0          0       1910   adc.o

里面“Debug”是什么意思,还占空间?
前面几个知道

7.
      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Library Member Name

        76          0          0          0          0          0   sqrt.o
        92          0          0          0          0          0   __dczerorl2.o
         0          0          0          0          0          0   entry.o
         8          4          0          0          0          0   entry2.o
         4          0          0          0          0          0   entry5.o
         8          4          0          0          0          0   entry7.o
        12          6          0          4          0          0   errno.o
        18          0          0          0          0          0   fputc.o
        30          0          0          0          0          0   handlers.o

这里面的“Library Member Name”和“Object Name”的区别是不是:Object Name是我们自己写的程序生成的o文件,而Library Member Name是系统自动的库文件生成的大小?


8.
在最后部分有:

    Total RO  Size (Code + RO Data)                42544 (  41.55kB)
    Total RW  Size (RW Data + ZI Data)             24304 (  23.73kB)
    Total ROM Size (Code + RO Data + RW Data)      42616 (  41.62kB)

我这里对ro,rw和rom的理解是:
rom是在flash中固态的,程序运行的时候ram中存在的是ro和rw。ro不可改动,rw和zi可以变动。
那么就是说这个map对应的程序运行需要。ro size + rw size 大小的ram来运行程序: 41.55+23.73k  
还是 (ro size + rw size )- Code size 就是说运行的时候不需要加载code到ram,只要保留在rom里面了?我觉得是前者。

但是看scf文件介绍里面是这样的:(见附图)
里面加载以后把ro部分还是存在rom里面,rw和zi部分加载到了ram里面。和我之前的理解不符。我理解是就算是代码也需要加载到内存中运行。难道是代码存放在flashrom里面?还是两种都可以。根据需要决定?

另:
romsize的flashrom是需要来来烧录 bin文件(41.62kB)就是说mcu的flashrom至少要这么大?

问题较多,把不懂得地方都列出来了,还请大家不理赐教。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-11-12 22:49:27 | 显示全部楼层
楼主研究的好深啊 , 不会帮顶 !

出0入0汤圆

 楼主| 发表于 2014-11-17 13:40:15 | 显示全部楼层
自己顶一下吧。

出0入0汤圆

发表于 2014-11-17 14:08:42 | 显示全部楼层
你看看内存地址范围是多少,然后在里面找起始地址在这个范围的变量  占用内存较大的优化看看

出0入0汤圆

发表于 2017-4-20 18:45:57 | 显示全部楼层
最近在看map,有点晕,同问

出0入0汤圆

发表于 2017-9-26 11:54:13 | 显示全部楼层
我也不会,希望有高手解答

出0入0汤圆

发表于 2017-9-27 16:11:44 | 显示全部楼层
这个是keil编译器自动生成的,楼主如果用过TI的DSP的话就会明白了,因为ccs里面的地址需要自己定义的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 14:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表