不同内存空间(data xdata bdata)定义变量注意事项
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、data 区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到 data 区内,比
如 for 循环中的计数值。
2、 data 区内最好放局部变量。
因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;
3、确保你的程序中没有未调用的函数。
在 Keil C 里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点 Keil C 做得很愚蠢,但也没办法。
4、程序中遇到的逻辑标志变量可以定义到 bdata 中,可以大大降低内存占用空间。
在 51 系列芯片中有 16 个字节位寻址区 bdata ,其中可以定义 8*16=128 个逻辑变量。定义方法是:bdata bit LedState;但位类型不能用在数组和结构体中。
5、其他不频繁用到和对运算速度要求不高的变量都放到 xdata 区。
6、如果想节省 data 空间就必须用 large 模式,将未定义内存位置的变量全放到 xdata 区。当然最好对所有变量都要指定内存类型。
7、当使用到指针时,要指定指针指向的内存类型。
在 C51 中未定义指向内存类型的通用指针占用 3 个字节;而指定指向 data 区的指针只
占 1 个字节;指定指向 xdata 区的指针占 2 个字节。如指针 p 是指向 data 区,则应定义
为: char data *p; 。还可指定指针本身的存放内存类型,如: char data * xdata p; 。其含义是指针 p 指向 data 区变量,而其本身存放在 xdata 区。
单片机初学者一般对c51语言里的DATA ,XDATA ,BDATA,IDATA,CODE,不是很清楚,因为在微机的c语言里根本没有这些东西,一下子出来难以让人接受,特别是没有硬件基本的朋友们.这也是写程序的时候经常犯错误的地方。请看下表
单片机中关键字data ,idata,xdata ,pdata的区别data :
固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:
固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)
xdata :
外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的优点,具体用法属于中级问题,这里不提。
startup.a51的作用
和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char data xxx="100";,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51 ==变量的初始化)。这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。
有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比
如掉电保护的时候想保存一些变量, 但改startup.a51来实现是很笨的方法 ,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性