微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Keil C51内存分配与优化

Keil C51内存分配与优化

时间:11-28 来源:互联网 点击:

参数通过分配空间地址的方式来访问。但是分配的内存空间包含了寄存器传递的3个参数在内 的所有参数的空间。详见《Parameter And Local Variable 》和《Parameter and Register》)和栈中(程序7),但是如果参数或局部变量过多,则情况就完全不同(程序6)。

再看下面的程序

*******************************************************************

//程序5

#include

#define uint unsigned int

#define uchar unsigned char

uchar a;

uint b;

uint sum(uint c)

{

uint d;

}

void main()

{

}

Program Size: data=16.0 xdata=0 code=21

TYPEBASELENGTHRELOCATIONSEGMENT NAME

-----------------------------------------------------

* * * * * * *D A T AM E M O R Y* * * * * * *

REG0000H0008HABSOLUTE"REG BANK 0"

DATA0008H0004HUNIT?DT?_SUM?MAIN

DATA000CH0003HUNIT?DT?MAIN

IDATA000FH0001HUNIT?STACK

* * * * * * *C O D EM E M O R Y* * * * * * *

CODE0000H0003HABSOLUTE

CODE0003H000CHUNIT?C_C51STARTUP

CODE000FH0005HUNIT?PR?_SUM?MAIN

CODE0014H0001HUNIT?PR?MAIN?MAIN

******************************************************************

同样的程序,内部RAM的使用情况又发生了变化。函数未被调用,且参数与局部变量都没有使用。

源文件经过编译后形成obj文件,各个obj文件就是一个模块,每个模块中都含有代码段和数据段,也就是,代码在ROM占有多少CODE空间,数据在RAM里占用多少空间等信息。

obj(lib)文件然后经过l51.exe(bl51.exe),就是说把可执行代码模块根据连接定位参数地址上连接在一起();数据段也连接在 一起,在ram空间中分配.对ram空间的分配中就有一个连接过程"覆盖分析".调用一个c函数,就会为这个函数所使用的ram空间进行分配(一些局部变 量),这个函数返回时再回收分配给他的ram空间,根据函数互相之间的调用前后关系,编译器就可以时实的知道ram空间的使用情况(其中就存在一个函数重 入的问题),作为连接时ram空间分配的参数. 如果源文件中的函数(模块)从来没有被任何函数显示的调用(所谓非显示调用就是这段代码,连接器目前还不知道这段代码什么时候会被调用或是否会被调用), 连接时就会为它分配永远有效的ram空间(就象全局变量),不会被回收。

(http://blog.sina.com.cn/s/blog_74ee88b80100pqed.html)

*******************************************************************

//程序6

#include

#define uint unsigned int

#define uchar unsigned char

uchar a;

uint b;

uint sum2(uint e,uint f,uint g,uint j)

{

uint i;

i = e+f+g+j;

return i;

}

void main()

{

b = sum2(1,2,3,4);

}

Program Size: data=20.0 xdata=0 code=58

TYPEBASELENGTHRELOCATIONSEGMENT NAME

-----------------------------------------------------

* * * * * * *D A T AM E M O R Y* * * * * * *

REG0000H0008HABSOLUTE"REG BANK 0"

DATA0008H0008HUNIT_DATA_GROUP_

DATA0010H0003HUNIT?DT?MAIN

IDATA0013H0001HUNIT?STACK

**************************************************************

在上面的程序中如果将sum2中的j去掉,那么data = 12.0。

通过程序5和6可以看到,两个程序的M51文件中的蓝色部分的segement name的名称有很大的区别。_DATA_GROUP_是一个OVERALY GROUPS(覆盖组)。它是链接器产生的可覆盖的一个数据段。而上面的程序5中的?DT?_SUM?MAIN,则是一个函数段。

在Keil中对OVERALY GROUPS的解释为:

When performing overlay analysis, the linker creates groups of segments that are overlaid. The group name indicates the memory type of the variables that it includes.

Group Name

Segment
Prefix

Memory
Model

Description

_BIT_GROUP_

?BI?

All

Variables and arguments of typebit.

_DATA_GROUP_

?DT?

SMALL

Variables and arguments other thanbit.

_PDATA_GROUP_

?PD?

COMPACT

Variables and arguments other thanbit.

_XDATA_GROUP_

?XD?

LARGE

Variables and arguments other thanbit.

When the linker overlays function data memory and creates a group, that groups appears in the linker map files memory map section.

STARTSTOPLENGTHALIGNRELOCMEMORY CLASSSEGMENT NAME
======================================================================
* * * * * * * * * * *D A T AM E M O R Y* * * * * * * * * * * * *
000000H000007H000008H---AT..DATA"REG BANK 0"
000008H00001AH000013HBYTEUNITDATA_DATA_GROUP_
00001BH00001BH000001HBYTEUNITIDATA?STACK

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top