先做一个实验,对比一下。
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字节,
EG: