6、确保程序中没有未调用的函数 。
在Keil C里遇到未调用函数 , 编译器就将其认为可能是中断函数 。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理 。这一点Keil做得很愚蠢,但也没办法 。
7、如果想节省data空间就必须用large模式 。
将未定义内存位置的变量全放到xdata区 。当然最好对所有变量都要指定内存类型 。
8、使用指针时 , 要指定指针指向的内存类型 。
在C51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节 。如指针p是指向data区,则应定义为:char data *p; 。还可指定指针本身的存放内存类型,如:char data * xdata p; 。其含义是指针p指向data区变量 , 而其本身存放在xdata区 。
以前没搞过C51,大学时代跟单片机老师的时候也是捣鼓下汇编,现在重新搞单片机,因为手头资料不多,找到一些C51的程序,发现里面有这些关键字,不甚明了,没办法只好找了下,发现如下描述:
从数据存储类型来说,8051系列有片内、片外程序存储器 , 片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时 , 最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述) 。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式 , 各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果 。
在51系列中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,建议少用 。但也有他的优点,具体用法属于中级问题 , 这里不提 。
三、有关单片机ALE引脚的问题
"单片机不访问外部锁存器时ALE端有正脉冲信号输出,此频率约为时钟振荡频率的1/6.每当访问
外部数据存储器是,在两个机器周期中ALE只出现一次,即丢失一个ALE脉冲."这句话是不是有毛
病.我觉得按这种说法,应该丢失3个ALE脉冲才对,我一直想不通是怎么回事,希望大虾们帮帮我.
小弟感激涕零.
答:
其他所有指令每6个机器周期发出一个ALE,而MOVX指令占用12个机器周期只发出一个ALE
四、如何将一个INT型数据转换成2个CHAR型数据?
经keil优化后,char1=int1/256,char2=int1%256或char1=int18,char2=int10x00ff效率是一样的 。
五、在KEIL C51上仿真完了,怎样生成HEX文件去烧写??
右键点项目中Target 1 , 选第二个 , 在OUTPUT中选中CREAT HEX
六、typedef 和 #define 有何不同??
typedef 和 #define 有何不同》》》 如
typedef unsigned char UCHAR ;
#define unsigned char UCHAR ;
typedef命名一个新的数据类型,但实际上这个新的数据类型是已经存在的,只不过是定义了
一个新的名字.
#define只是一个标号的定义.
你举的例子两者没有区别,但是#define还可以这样用
推荐阅读
- 开放世界沙盒养成游戏下载,开放世界沙盒游戏推荐
- 如何看待国内跨境电商,如何看待国内跨境电商发展
- 电源硬盘怎么连接手机,电源硬盘怎么连接手机上
- 精细动作游戏关于小动物,精细动作训练游戏动物
- vb.net做文件树 vbnet writeline
- 主播直播混响,主播直播混响怎么设置
- go语言写一个小应用 go语言程序
- 进度条设计html5,进度条设计加文字
- 华为g5500服务器内存,华为服务器内存插法