51单片机code的问题(RAM和ROM)+50

来源:百度知道 编辑:UC知道 时间:2024/06/02 09:53:40
#include<REG52.h>
#include<stdio.h>
#include <intrins.h>
sbit SDA=P1^0;
sbit CLK=P1^1;
sbit KD_KEY=P1^2;
unsigned char m=0xff;
unsigned char t[5]={0xbf,0x02,0x03,0x05,0x09};
unsigned char data display_bit;
unsigned char code led[20]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x89,0x8C}; // 断码表
main()
{
......
}
1.我知道CODE是把数组放到ROM里,因为是断码表,所以不需要改变,但是如果是把改变的数组放ROM里,会出现什么现象呢?(ROM读取慢?好像不是吧)
2.单片机编写好程序时,要烧写程序,那么main()之前的程序时完全烧入ROM中吗?不是说不定义CODE的变量时烧入RAM?我想知道到底是烧入RAM还是ROM啊?
3.还有就是MAIN程序里也有局部变量,那也是烧入RAM还是在ROM?如果烧入ROM,那还可以赋予新值吗?(ROM只可以读,不可以写,比如for(i=1;i<9;i++),程序是烧入ROM的吧,但是I的值可以变化啊)。
4.我的理解:程序完全烧入ROM,包括MAIN前面的定义,只是当cpu读ROM的时候,会在RAM分配内存空间,全局变量一直占用着RAM内存,而局部变量在使用完后会自动清除RAM空间,而把不变的数组放到ROM中可以节省RAM空间,如果把变量放入ROM,则会读取速度变慢。但是烧入ROM的数组不可以改变(是这样吗,和for循环那个i有什么区别啊)。
望高手赐教,如果好,加分50!

1,把段码放在code里,是为了节省RAM。如果放在前256字节内,查表时只要八位地址即可,所以会快些。ROM读取不会慢。单片机执行的每一条指令都是从ROM区读取的。
ROM区的内容是只读的,所以你不能将改变(程序运行中改变)的数组放进去。

2,单片机源程序首先要经过编译,生成机器码,下载到单片机中才可以运行,编译C程序时,从main()开始编译,如果main()程序中用到main()前面的程序,就会编译进去。然后下载到单片机ROM区。也就是烧到ROM区,在单片机运行中用到的变量,会放在RAM区。

3,局部就量或全局就量,都是放在RAM区的,因为RAM区可以读写,这样才可以保存临时数据。for(i=1;i<9;i++)前面肯定会有定义i,如 char i;单片机碰到char i;就会在RAM区分配一个字节,8bit给i用。然后再执行for(i=1;i<9;i++),这时i是可变的,因为执行的是RAM区的i地址内放的数据。

4,你理解的对,补充一下。全局变量一般占用RAM区较高位,如从32H开始,根据编译器不同而不同。且所占用RAM一直占用。局部变量一般临时存放在REGISTER中,执行速度较快。且当子程序执行完毕,资源回收。

上例是那个for循环就是用的局部变量,存放在寄存器中的,子程序执行完毕,寄存器可用作他用。

希望能回答你的问题。