【单片机】keil编译后的data\xdata\code

先做一个实验,对比一下。

1、第一次编译:

2、在main()函数中添加

char test1[10]={0};
xdata char test2[5]={0};

再次编译:

 

3、在其他函数中定义局部变量,编译后data和xdata是不会改变的,有兴趣可以验证。

4、keil memory mode是什么?

Small:变量存储在内部ram里;

Compact:变量存储在外部ram里,使用页8位间接寻址;

Large:变量存储在外部Ram里,使用16位间接寻址;

使用Small的模式:也不是说变量就不可以存储在外部,一样可以存储在外部,只是你要指定,比如:

unsigned char xdata a;//变量a存储在外部的ram。

unsigned char a;//变量a存储在内部ram

使用Large的模式

unsigned char xdata a;//变量a存储在外部的ram。

unsigned char a;//变量a存储在外部ram。

5、判断单片机的RAM、ROM能否满足代码需要的资源?

  编译工程,查看资源分配情况。stc15w4k32包含256字节RAM,3840字节XRAM(保存xdata)。

6、检查程序调用嵌套,是否会导致堆栈溢出

     下图是使用keil编译工程后,生成的.M51文件。

      其中,?STACK就是堆栈的分配。LENGTH虽为1,但不用担心因为长度不够,这个1并非真正的堆栈空间长度,它会自增,在bit和data分配完地址后,data区域(00H-7FH)内剩余空间都是堆栈区域。该担心的是BASE基地址,因为从007FH自增不可以超出00FFH(data的最大范围)。考虑中断程序和程序嵌套调用,需精确计算出来程序需要多少堆栈,再和.M51对比,是否能够保证堆栈不溢出。

      

      类型        基地址        长度          单位                 段名

  

 

7、data、idata、bdata地址分配?

type              base              length

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

data              0x0               0x7F           //直接寻址   

bdata            0x20              0x0F          //位寻址

idata             0x0                0xFF          //0x00-0x7F和data重合,间接寻址

xdata            0x0                0xFFFF       //外部扩展RAM,使用DPTR访问

pdata            0x0                0xFF          //外部扩展RAM低256字节,

 

posted @ 2017-03-23 13:29  Isha  阅读(1561)  评论(0编辑  收藏  举报