c语言使用函数的心得 c语言函数应用( 二 )


2、其他不频繁调用到和对运算速度要求不高的变量都放到xdata区 。
3、常量放到code区,如字库、修正系数 。
4、逻辑标志变量可以定义到bdata中 。
在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量 。这样可以大大降低内存占用空间 。定义方法是: bdata bit LedState;但位类型不能用在数组和结构体中 。
5、data区内最好放局部变量 。
因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖) , 可以提高内存利用率 。当然静态局部变量除外,其内存使用方式与全局变量相同;
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型数据?

推荐阅读