Keil C51中对双数据指针的直接利用

发布者:DreamyEclipse最新更新时间:2011-05-20 来源: 单片机与嵌入式系统应用关键字:Keil  C51  双数据指针 手机看文章 扫描二维码
随时随地手机看文章

    在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 C51的编译器手册中指出:#pragma modp2可以打开Philips或Atmel WM系列器件中有双DPTR的型号,并且可以提 
升以下库函数的性能,包括:memcpy,memmove,memcmp,strcpy,strcmp。

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

对照表

  看起来似乎使用库函数就可以大幅度提高程序性能,但实际上这样做并不能保证一定可以提高程序性能。首先Dallas 320是4T的CPU,本身就比12T的8051快。其次,以memcpy为例,它的原型是void*memcpy(void*s1,const void*s2,int len),其传人参数有3个,合计8字节,要使用数据段来传送。在数据量少的情况下,参数传递的开销就有可能大过数据传递的开销。如果想要在数据块拷贝或移动的同时对数据加以处理,比如在一个目的数据块后面加上一个校验和,那么使用库函数是办不到的,只有通过循环来进行。当数据块的源和目都是16位地址时,每一次循环都会有两次对数据指针的赋值,在源地址和目地址之间来回切换,这时采用双数据指针会有效地提高程序性能。如果要在程序中直接生成使用双数据指针的代码,目前没有直接的编译指令。Keil公司在它的网站上曾说过多数据指针支持库函数,并且目前也未打算在编泽器中直接支持多数据指针。

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

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

程序

程序

程序

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

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

  3 调试环境的设定

  在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的变化。

关键字:Keil  C51  双数据指针 引用地址:Keil C51中对双数据指针的直接利用

上一篇:采用AT89C51的大屏幕LED点阵显示系统设计
下一篇:基于C51单片机的MP3播放器设计

推荐阅读最新更新时间:2024-03-16 12:35

C51编程24-应用篇(ESP-01S WIFI模块与电脑端通讯)
为了实现电脑端与单片机透传之前,我们先要了解下wifi模块。 测试wifi模块的是否正常 使用串口线连接到wifi模块串口。CH340G串口线TX与wifi模块的RX连接,CH340G串口线RX与wifi模块的TX连接。如下表 注:wifi模块不可以用5V供电,wifi模块是3.3V供电的。引脚图如下 连接串口调试助手(可以使用安信可助手,或者其他串口调试助手),通过串口发送数据给wifi模块进行设置。 注:在使用友善串口助手发送命令时,需要按回车键后,再点击发送否则命令会识别失败 建议使用安信可串口调试,里面自带命令,链接如下。 AiThinker_Serial_Tool.rar-嵌入式文档类资源-
[单片机]
<font color='red'>C51</font>编程24-应用篇(ESP-01S WIFI模块与电脑端通讯)
基于C51的X25045/X5045标准函数集
网上流传比较多的C51版本是庞波的《25045操作标准子程序集41.c》,但是经我实际使用过后发现有一些错误,如&和&&的区别及一些逻辑的问题。还有总是有人问电路的接法,由于X25045的datasheet写的不清楚,的确很容易弄错,这次就把接法的说明也贴上来了。希望能够对大家有帮助。 分为两个文件:X25045.h和X25045.C内容如下 1、X25045.h #ifndef __X25045_H__ #define __X25045_H__ /* ;软 件 标 题:25045操作标准子程序集 ;软 件 说 明:X25045已经停产,替代产品为X5045 ;___________________________________
[单片机]
C51单片机为核心的嵌入式系统实时控制设计
随着现代通信技术的发展,通信测试仪器不断推陈出新。各种新型设备对系统的实时响应能力的要求越来越高,一种通信测试仪器的实时响应性能,就成为系统设计能否成功的关键因素之一。笔者曾在多个通信测试仪器项目中,成功地应用ARM处理器、C51单片机等为主控芯片的嵌入式系统,实现了对仪器相关模块的实时控制功能。因此提出一种在某通信测试仪器中使用C51单片机来实现实时控制的设计方案。 1 硬件设计与实现 1.1 总体方案设计 在该通信测试仪器中,实时控制模块主要实现对射频接收频综、射频发生频综、滤波器组件、射频输入模块、射频输出模块等实时控制作用。对射频检波信号进行A/D转换以获取数据。与上位计算机进行通信等功能。 根据待实现的系统功能要
[单片机]
以<font color='red'>C51</font>单片机为核心的嵌入式系统实时控制设计
C51编程经验三则
C51编程经验三则 在单片机的开发应用中,已逐渐开始引入高级语言,C语言就是其中的一种。用惯了汇编的人,总觉得高级语言“可控性”不好,不如汇编那样随心所欲。以下是笔者在C51编程中的几点经验,希望对初学C51者有所帮助。 一、C51热启动代码的编制 工业控制计算机,往往设有看门狗电路,看门狗动作,计算机复位,这就是热启动。热启动时,一般不允许程序从头开始,因为这将使测量或计算值复位,导致系 统工作异常。故程序必须判断是热启动还是冷启动。常用的方法是:设定某内存单位为标志位(如0x7f位和0x7e位),启动时首先读该内存单元的内容,如 果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,否则就是冷启动
[单片机]
C51 串口收发,printf, 接收字符串
串口发送,接收 在while(1){printf(“xxx”); delay(100); //此处需要有delay函数;} #include reg51.h //stdio.h,string.h用于printf函数原型 #include stdio.h void delay(unsigned int z) { unsigned int x,y; for(x=z;x 0;x--) for(y=110;y 0;y--); } void uart_init(void) { TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2 TH1=0xe6;//设置波
[单片机]
基于C51程序设计中字节对齐对程序的影响
一。什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐。其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。比如有些
[单片机]
基于<font color='red'>C51</font>程序设计中字节对齐对程序的影响
KeilC51)介绍、下载、安装与注册
Ⅰ、写在前面 本文讲述的内容是Keil C51版的介绍、下载、安装与注册,如果需要了解Keil MDK-ARM版的文章,可以到我博客,或微信公众号查看并下载。 Keil(MDK-ARM)介绍、下载、安装与注册: http://blog.csdn.net/ybhuangfugui/article/details/51501781 针对于大部分初学者在使用国产STC89、STC11、STC12等系列芯片,还会讲述如何在Keil C51软件上增加STC系列芯片【Keil C51默认是不带STC器件】,也就是安装STC补丁。 本文内容已经整理成PDF文件,提供给大家下载: http://pan.bai
[单片机]
<font color='red'>Keil</font>(<font color='red'>C51</font>)介绍、下载、安装与注册
C51写的单片机音乐彩灯程序
#include AT89X51.H #define TLEDS 20//每个花样状态持续时间,以50mS为单位 #define NUM_OF_LED_S 4//每种模式LED花样数? typedef unsigned char uchar; typedef unsigned int uint; data uchar led_array_num;//当前模式下,LED花样状态序号 data uchar music_array_num;//音符的序号 data uchar i;//模式号 data uchar t_count_led;//用于LED状态持续时间计时 data uint t_count_music;// data
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved