不同内存空间(data xdata bdata)定义变量在51单片机编程中的注意事项
2011-03-15 10:59
411 查看
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语言里根本没有这些东西,一下子出来难以让人接受,特别是没有硬件基本的朋友们.这也是写程序的时候经常犯错误的地方。请看下表
普通
51系列
[b]单片机
存储空间资源分配情况
[/b]
下表是新型
80C51
[b]单片机
扩展空间的分配情况
[/b]
单片机
中关键字
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,如果你明白它的特性
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语言里根本没有这些东西,一下子出来难以让人接受,特别是没有硬件基本的朋友们.这也是写程序的时候经常犯错误的地方。请看下表
普通
51系列
[b]单片机
存储空间资源分配情况
[/b]
空间名称 | 地址范围 | 说明 |
DATA | D:00H~7FH | 片内RAM直接寻址区 |
BDATA | D:20H~2FH | 片内RAM位寻址区 |
IDATA | I:00H~FFH | 片内RAM间接寻址区 |
XDATA | X:0000H~FFFFH | 64K片外RAM数据区 |
CODE | C:0000H~FFFFH | 64K片内外ROM代码 区 |
BANK0~BANK31 | B0:0000H~FFFFH : : B31:0000H~FFFFH | 分组代码区,最大可扩展32X64KB ROM |
80C51
[b]单片机
扩展空间的分配情况
[/b]
空间名称 | 地址范围 | 说明 |
DATA | D:00H~7FH | 片内RAM直接寻址区 |
BDATA | D:20H~2FH | 片内RAM位寻址区 |
IDATA | I:00H~FFH | 片内RAM间接寻址区 |
XDATA | X:0000H~FFFFH | 64KB常规片外RAM数据区 |
HDATA | X:0000H~FFFFFFH | 16MB扩展片外RAM数据区 |
CODE | C:0000H~FFFFH | 64K常规片内外ROM代码区 |
HCONST(ECODE) | C:0000H~FFFFFFH | 16MB扩展片外ROM常数区(对Dallas390可用作代码区) |
BANK0~BANK31 | B0:0000H~FFFFH : : B31:0000H~FFFFH | 分组代码区,最大可扩展32X64KB ROM |
中关键字
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,如果你明白它的特性
相关文章推荐
- 不同内存空间(data xdata bdata)定义变量在51单片机编程中的注意事项
- 51单片机编程在不同内存空间(data xdata bdata)定义变量的注意事项
- C51编程在不同内存空间(data xdata bdata)定义变量的注意事项
- C51编程在不同内存空间(data xdata bdata)定义变量的注意事项
- C51编程中根据不同情况在不同空间(data xdata bdata)定义变量的注意事项
- C编程中使用全局变量应注意的事项
- 腾讯2016研发工程师在线模拟笔试题----32位系统中,定义**a[3][4],则变量占用内存空间为()。
- PowerBuilder编程变量命名规范及开发注意事项
- Java 变量定义的时候注意事项
- c语言中定义结构体指针并指向一片内存空间和直接定义一个结构体变量的区别 Node *p=(Node *)malloc(sizeof(Node)); 和 Node p 两个有什么区别??? Node是一
- Shell变量的定义与赋值操作注意事项
- 有如下CAT_s结构体定义,回答: 1) 在一台64位的机器上,使用32位编译,Garfield变量占用多少内存空间?64位编译又是如何?
- 在C51及C251中变量空间分配的方法及注意事项
- 【C++注意事项】2 变量声明和定义
- 使用malloc函数申请内存空间注意事项
- java语言基础(26)——面向对象(类的设计及成员变量定义注意事项)
- 关于Interface中定义变量的注意事项
- servlet 变量定义注意事项
- 对于程序中变量定义的注意事项
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配