本帖最后由 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至少要这么大?
问题较多,把不懂得地方都列出来了,还请大家不理赐教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>