Data,XData

文章探讨了单片机编程中的内存模式,包括Small、Compact和Large,以及不同类型的内存如data、xdata、bdata的分配。通过编译实验,强调了检查RAM和ROM资源以及防止堆栈溢出的重要性。此外,提到了如何分析编译后的资源分配以确保程序需求得到满足。
摘要由CSDN通过智能技术生成

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

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:

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值