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
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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