Code Size

来源:互联网 发布:python做数据分析应用 编辑:程序博客网 时间:2024/06/05 15:26
RO,RW,ZI 和scatter file详解(转载) 
http://blog.chinaunix.net/uid-24460251-id-2606775.html
http://blog.chinaunix.net/uid-9185047-id-445087.html


bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小。
data(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中。


数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。


.c -> .o  目标文件一般很大,.a文件是目标文件的ar集合
而elf, bin, axf可以只link用到的code


gcc---objsize .o
   text   data   bss   dec   hexfilename
   4576      9  2081  6666  1a0atest.o

RO, RW, ZI
RO是程序中的指令和常量,readonly
RW是程序中的已初始化变量,read/write
ZI是程序中的未初始化的变量(static or global),zero


stack/heap variable都是runtime在RAM中分配,不算code size



整体的ROM=Text+Data (+RODATA), RAM=Data+Bss
RODATA来自test.elf.map文件,其中


Flash EEPROM Memory
Nor Flash 上可以直接run Text部分code
Nand Flash


flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。
Nor Flash的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除 速度大大影响了它的性能。
通常读取NOR的速度比NAND稍快一些,而NAND的写入速度比NOR快很多。


Nand-flash内存是flash内存的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用,如嵌入式产品中包括数码相机、MP3随身听记忆卡、体积小巧的U盘等。


TCM---紧耦合内存(TCM: Tightly Coupled Memories)
静态ram成本高,速度快,断电内容不消失,用作cpu的缓存即cache


动态ram成本低,速度慢,要不断充电,断电内容消失,用作内存


某些chip另外一块TCM, 96KB 其中有32KB 给到cache用了
看下mem.c 中, 在声明后面加上
__attribute__((section(".tcmBSS")))



NVRAM 非易失性随机访问存储器 (Non-Volatile Random Access Memory),是指断电后仍能保持数据的一种RAM。
Larkspur   nvram set common AP 1


armar -sizes libsong.a
Code    RO Data    RW Data    ZI Data      Debug   Object Name
 292         96              2615         40             168   test.o


.rodata.p05.5281 
0x100eff40 0xc /gcc-arm-none-eabi/4_8-2014q3/bin/../lib/gcc/arm-none-eabi/4.8.4/../../../../arm-none-eabi/lib/armv7e-m/fpu/libg_s.a(lib_a-mprec.o)
0x100eff4c _text_end = .
0x100eff4c __etext = .


New Method:
根据elf.map文件来计算
Note:elf.bin中并不一定会真正call到lib.a中的所有public method/variable,所以不能count它们;
.data.字段既是RAM,也算在ROM中;


Common symbol       size              file


__

Discarded input sections

.text           0x1007c000    0x9a38c
                0x1007c000                _text_start = .
 *(.init)
 .init         
 *(.fini)
 *(.text*)
 .text._cli_supp
   
 *(.text)
 *(.rodata*)
 .rodata     
 .rodata.__FUNCTION__.7293
          
.data           0x20000000     0x2d60 load address 0x1011638c
                0x20000000                __data_start__ = .
                0x20000000                _data_start = .

 *(.data)
 *(.data*)
 
 *(.bss*)




 *(.tcmBSS)
 

ld文件
MEMORY
{
ROM_CODE        (arx) : ORIGIN = 0x0,           LENGTH = 0x00005000/* 20k  */
TCMRAM          (arw) : ORIGIN = 0x00100000,LENGTH = 0x00010000/* 64k  */
XIP_CODE        (arx) : ORIGIN = 0x1007C000,    LENGTH = 0x000BF000/* 
SYSRAM          (arw) : ORIGIN = 0x20000000,    LENGTH = 0x00040000/* 
}
ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")



将RAM Data(一般是global variable)->TCM BSS上
__attribute__ ((__section__(".tcmBSS")))






将XIP (一般是method)->RAM上运行
ramTEXT
#define TEXT_IN_RAM __attribute__ ((__section__(".ramTEXT")))
static void TEXT_IN_RAM flash_reset(void)


 Nand Flash,Nor Flash,CFI Flash,SPI Flash 之间的关系 

http://blog.chinaunix.net/uid-28458801-id-4421734.html




http://bbs.ednchina.com/BLOG_ARTICLE_3027768.HTM



 
.text
.rodata
.data
.ramTEXT
.tcmBSS
.bss
.heap
.stack_dummy
Others
40846
21911
2666
376
464
7157
2048
3072


.stack_dummy


—— MSP stack 空间 for ISR 和 system init阶段使用的stack 空间
msp应该是指_ASM void __set_MSP(uint32_t mainStackPointer 
.heap——这个是for C-LIB reserve的一块空间,如果call到 c-lib 的malloc, 就用的这块空间, target user是C-LIB 自身的一些func, e.g. printf
app 用的heap 都是在FREERTOS 的heap区域, 应该是在ramTEXT里面
原创粉丝点击