如何将51单片机进行内存优化
对51单片机内存的认识,很多人有误解,最常见的是以下两种
①超过变量128后必须使用compact模式编译
实际的情况是只要内存占用量不超过256.0 就可以用small 模式编译
②128以上的某些地址为特殊寄存器使用,不能给程序用
与PC机不同,51单片机不使用线性编址,特殊寄存器与RAM 使用重复的重复的地址。但访问时采用不同的指令,所以并不会占用RAM 空间。
由于内存比较小,一般要进行内存优化,尽量提高内存的使用效率。
以Keil C 编译器为例,small 模式下未指存储类型的变量默认为data型,即直接寻址,只能访问低128 个字节,但这128 个字节也不是全为我们的程序所用,寄存器R0-R7必须映射到低RAM,要占去8 个字节,如果使用寄存组切换,占用的更多。
所以可以使用data 区最大为120 字节,超出120 个字节则必须用idata 显式的指定为间接寻址,另外堆栈至少要占用一个字节,所以极限情况下可以定义的变量可占247 个字节。当然,实际应用中堆栈为一个字节肯定是不够用的,但如果嵌套调用层数不深,有十几个字节也够有了。
为了验上面的观点,写了个例子
#define LEN 120
data UCHAR tt1[LEN];
idata UCHAR tt2[127];
void main()
{
UCHAR i,j;
for(i = 0; i 《LEN; ++i )
{
j = i;
tt1[j]= 0x55;