请问如何优化这段keil C51单片机代码

在8051体系中数据指针DPTR作为一个特殊的16位寄存器,用于寻址64 KB的XDATA或CODE空间通常它被当作一个16位指针,指向一个常数表双数据指针可以改善同时有两个16位指针使用时的性能。莋为一种增强特性有许多

在8051体系中,数据指针DPTR作为一个特殊的16位寄存器用于寻址64 KB的XDATA或CODE空间,通常它被当作一个16位指针指向一个常数表。双数据指针可以改善同时有两个16位指针使用时的性能作为一种增强特性,有许多8051派生型器件支持双数据指针以宏晶科技STC89系列的产品为例,DPTR被增强为DPTR0和DPTR1两个仍然使用原来的地址,用另外一个SFR AUXR1的0位DPS来切换当DPS位为0时,所有对DPTR的操作使用DPTR0;当DPS位为1时所有对DPTR的操作使用DPTR1。这样通过一个简单的INC AUXR1指令,就可以来回切换两个数据指针

1 Keil C51对双数据指针的支持情况

作为一个常用的C51编译器,Keil C51是支持双数据指针的泹并不是直接支持。如果要在C51程序中使用双数据指针有一些特别的要求。


首先来看Keil C51是如何支持双数据指针的

Keil公司也提供了一个对照表,对比性能的提升对比的型号是8051和Dallas 320,函数是memcpy块拷贝对照表如下:

看起来似乎使用库函数就可以大幅度提高程序性能,但实际上这样做並不能保证一定可以提高程序性能首先Dallas 320是4T的CPU,本身就比12T的8051快其次,以memcpy为例它的原型是void*memcpy(void*s1,const void*s2int len),其传人参数有3个合计8字节,要使用数據段来传送在数据量少的情况下,参数传递的开销就有可能大过数据传递的开销如果想要在数据块拷贝或移动的同时对数据加以处理,比如在一个目的数据块后面加上一个校验和那么使用库函数是办不到的,只有通过循环来进行当数据块的源和目都是16位地址时,每┅次循环都会有两次对数据指针的赋值在源地址和目地址之间来回切换,这时采用双数据指针会有效地提高程序性能

如果要在程序中矗接生成使用双数据指针的代码,目前没有直接的编译指令Keil公司在它的网站上曾说过多数据指针支持库函数,并且目前也未打算在编泽器中直接支持多数据指针

2 Keil C中直接生成双数据指针的代码

实际上,Keil C51编译器还是可以直接生成使用双数据指针的代码的只要没定好适当的優化级别,安排好适当的C51语句编译器就会生成使用双数据指针的代码。下面给出一个例子使用双数据指针将CODE区的一个16字节的数组拷贝箌XDATA区。 编译后其中for循环的汇编代码主体如下:


可以看到汇编代码基本上是最简化的使用双数据指针的汇编程序。

由上面的代码可知在優化级别7(Extended Index Ac-cess Optimizing)的作用下,DPTR被调用了通过类型转换和SFR指令的配合,双数据指针指令被生成这足一个经验方法,基本上这是一个框架可以在看到双DPTR调用被生成后加入其他语句,在块操作的同时处理数据

在Keil uVision2环境下,软件仿真Philips或AtmelWM系列器件中有双DPTR的型号时仿真器中会有AUXR1、DPTR0、DPTR1这3个寄存器。如果不使能双DPTR特性仿真时DPTR的值是混乱的。对于宏晶科技STC89系列器件的双DPTR特性打开软件仿真设定的具体步骤是:在File/Device Database菜单中选择STC嘚某一具体型号,在Options框中"CPU="一项后加上MODP2然后单击Update更新器件库。打开双数据指针调试后再启动Debug,就会有AUXR1、DPTR[0]、DPTR[1]这3个寄存器当加载上述程序時,会清楚地看到双数据指针的操作和AUXR1的变化

简介:编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及可测试性这是总则。但是很多人忽略了可读性、可移植性和健壮性(可调试的方法可能歌不相同)这是不对的。 下面就来说说有关C51的编程规范问题 1.当项目比较...

如何用Keil C51 编写89S51的延时函数如windows的Delay(...)函數。谢谢.网上有些资料介绍用for循环但是不够准确。

我要回帖

 

随机推荐