ANSI C与C51.doc

上传人:丁** 文档编号:1545535 上传时间:2019-10-25 格式:DOC 页数:18 大小:74KB
返回 下载 相关 举报
ANSI C与C51.doc_第1页
第1页 / 共18页
ANSI C与C51.doc_第2页
第2页 / 共18页
ANSI C与C51.doc_第3页
第3页 / 共18页
点击查看更多>>
资源描述
KeilC51vs标准C1深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下8类:l 8051存储类型及存储区域l 存储模式l 存储器类型声明l 变量类型声明l 位变量与位寻址l 特殊功能寄存器(SFR)l C51指针l 函数属性具体说明如下(8031为缺省CPU)。1. 第一节 Keil C51扩展关键字C51 V4.0版本有以下扩展关键字(共19个):_at_idata sfr16 alien interrupt smallbdata large _task_ Code bit pdatausing reentrant xdata compact sbit data sfr2. 第二节 内存区域(Memory Areas):1. 1. Pragram Area:由Code说明可有多达64kBytes的程序存储器2. 2. Internal Data Memory:内部数据存储器可用以下关键字说明:data:直接寻址区,为内部RAM的低128字节 00H7FHidata:间接寻址区,包括整个内部RAM区 00HFFHbdata:可位寻址区, 20H2FH3. 3. External Data Memory外部RAM视使用情况可由以下关键字标识:xdata:可指定多达64KB的外部直接寻址区,地址范围0000H0FFFFHpdata:能访问1页(25bBytes)的外部RAM,主要用于紧凑模式(Compact Model)。4. 4. Speciac Function Register Memory8051提供128Bytes的SFR寻址区,这区域可位寻址、字节寻址或字寻址,用以控制定时器、计数器、串口、I/O及其它部件,可由以下几种关键字说明:sfr:字节寻址 比如 sfr P0=0x80;为PO口地址为80H,“”后HFFH之间的常数。sfr16:字寻址,如sfr16 T2=0xcc;指定Timer2口地址T2L=0xcc T2H=0xCDsbit:位寻址,如sbit EA=0xAF;指定第0xAF位为EA,即中断允许还可以有如下定义方法:sbit 0V=PSW2;(定义0V为PSW的第2位)sbit 0V0XDO2;(同上)或bit 0V-0xD2(同上)。. 第三节 存储模式存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:1. 1. Small模式所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。2. 2. Compact模式所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。3. 3. large模式所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。提示:存储模式在C51编译器选项中选择。4. 第四节 存储类型声明变量或参数的存储类型可由存储模式指定缺省类型,也可由关键字直接声明指定。各类型分别用:code,data,idata,xdata,pdata说明,例:data uar1char code array “hello!”;unsigned char xdata arr1044;5. 第五节 变量或数据类型C51提供以下几种扩展数据类型:bit 位变量值为0或1sbit 从字节中定义的位变量 0或1sfr sfr字节地址 0255sfr16 sfr字地址 065535其余数据类型如:char,enum,short,int,long,float等与ANSI C相同。6. 第六节 位变量与声明1. 1. bit型变量bit型变量可用变量类型,函数声明、函数返回值等,存贮于内部RAM20H2FH。注意:(1) 用pragma disable说明函数和用“usign”指定的函数,不能返回bit值。(2) 一个bit变量不能声明为指针,如bit *ptr;是错误的(3) 不能有bit数组如:bit arr5;错误。2. 2. 可位寻址区说明20H2FH可作如下定义:int bdata i;char bdata arr3,然后:sbit bitoin0;sbit bit15=I15;sbit arr07=arr07;sbit arr15=arri7;7. 第七节 Keil C51指针C51支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer).1. 1. 一般指针一般指针的声明和使用均与标准C相同,不过同时还可以说明指针的存储类型,例如:long * state;为一个指向long型整数的指针,而state本身则依存储模式存放。char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。2. 2. 存储器指针基于存储器的指针说明时即指定了存贮类型,例如:char data * str;str指向data区中char型数据int xdata * pow; pow指向外部RAM的int型整数。这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。3. 3. 指针转换即指针在上两种类型之间转化:l 当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。l 如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“include”说明所有函数原形。l 可以强行改变指针类型。8. 第八节 Keil C51函数C51函数声明对ANSI C作了扩展,具体包括:1. 1. 中断函数声明:中断声明方法如下:void serial_ISR () interrupt 4 using 1/* ISR */为提高代码的容错能力,在没用到的中断入口处生成iret语句,定义没用到的中断。/* define not used interrupt, so generate IRET in their entrance */void extern0_ISR() interrupt 0 /* not used */void timer0_ISR () interrupt 1 /* not used */void extern1_ISR() interrupt 2 /* not used */void timer1_ISR () interrupt 3 /* not used */void serial_ISR () interrupt 4 /* not used */2. 2. 通用存储工作区3. 3. 选通用存储工作区由using x声明,见上例。4. 4. 指定存储模式由small compact 及large说明,例如:void fun1(void) small 提示:small说明的函数内部变量全部使用内部RAM。关键的经常性的耗时的地方可以这样声明,以提高运行速度。5. 5. #pragma disable在函数前声明,只对一个函数有效。该函数调用过程中将不可被中断。6. 6. 递归或可重入函数指定在主程序和中断中都可调用的函数,容易产生问题。因为51和PC不同,PC使用堆栈传递参数,且静态变量以外的内部变量都在堆栈中;而51一般使用寄存器传递参数,内部变量一般在RAM中,函数重入时会破坏上次调用的数据。可以用以下两种方法解决函数重入:a、在相应的函数前使用前述“#pragma disable”声明,即只允许主程序或中断之一调用该函数;b、将该函数说明为可重入的。如下:void func(param.) reentrant;KeilC51编译后将生成一个可重入变量堆栈,然后就可以模拟通过堆栈传递变量的方法。由于一般可重入函数由主程序和中断调用,所以通常中断使用与主程序不同的R寄存器组。另外,对可重入函数,在相应的函数前面加上开关“#pragma noaregs”,以禁止编译器使用绝对寄存器寻址,可生成不依赖于寄存器组的代码。7. 7. 指定PL/M51函数由alien指定。4. 第四章 Keil C51高级编程本章讨论以下内容:l 绝对地址访问l C与汇编的接口l C51软件包中的通用文件l 段名转换与程序优化1. 第一节 绝对地址访问C51提供了三种访问绝对地址的方法:1. 1. 绝对宏:在程序中,用“include”即可使用其中定义的宏来访问绝对地址,包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD具体使用可看一看absacc.h便知例如:rval=CBYTE0x0002;指向程序存贮器的0002h地址rval=XWORD 0x0002;指向外RAM的0004h地址2. 2. _at_关键字直接在数据定义后加上_at_ const即可,但是注意:(1)绝对变量不能被初使化;(2)bit型函数及变量不能用_at_指定。例如:idata struct link list _at_ 0x40;指定list结构从40h开始。xdata char text25b _at_0xE000;指定text数组从0E000H开始提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。3. 3. 连接定位控制此法是利用连接控制指令code xdata pdata data bdata对“段”地址进行,如要指定某具体变量地址,则很有局限性,不作详细讨论。2. 第二节 Keil C51与汇编的接口1. 1. 模块内接口方法是用pragma语句具体结构是:#pragma asm汇编行#pragma endasm这种方法实质是通过asm与ndasm告诉C51编译器中间行不用编译为汇编行,因而在编译控制指令中有SRC以控制将这些不用编译的行存入其中。2. 2. 模块间接口C模块与汇编模块的接口较简单,分别用C51与A51对源文件进行编译,然后用L51将obj文件连接即可,关键问题在于C函数与汇编函数之间的参数传递问题,C51中有两种参数传递方法。(1) 通过寄存器传递函数参数最多只能有3个参数通过寄存器传递,规律如下表:参数数目 char int long,float 一般指针123 R7R5R3 R6 & R7R4 & R5R2 & R3 R4R7R4R7 R1R3R1R3R1R3(2) 通过固定存储区传递(fixed memory)这种方法将bit型参数传给一个存储段中:?function_name?BIT将其它类型参数均传给下面的段:?function_name?BYTE,且按照预选顺序存放。至于这个固定存储区本身在何处,则由存储模式默认。(3) 函数的返回值函数返回值一律放于寄存器中,有如下规律:return type Registev 说明bit 标志位 由具体标志位返回char/unsigned char 1_byte指针 R7 单字节由R7返回int/unsigned int 2_byte指针 R6 & R7 双字节由R6和R7返回,MSB在R6long&unsigned longR4R7 MSB在R4, LSB在R7float R4R7 32Bit IEEE格式一般指针 R1R3 存储类型在R3 高位R2 低R1(4) SRC控制该控制指令将C文件编译生成汇编文件(.SRC),该汇编文件可改名后,生成汇编.ASM文件,再用A51进行编译。3. 第三节 Keil C51软件包中的通用文件在C51LiB目录下有几个C源文件,这几个C源文件有非常重要的作用,对它们稍事修改,就可以用在自己的专用系统中。1. 1. 动态内存分配init_mem.C:此文件是初始化动态内存区的程序源代码。它可以指定动态内存的位置及大小,只有使用了init_mem( )才可以调回其它函数,诸如malloc calloc,realloc等。calloc.c:此文件是给数组分配内存的源代码,它可以指定单位数据类型及该单元数目。malloc.c:此文件是malloc的源代码,分配一段固定大小的内存。realloc.c:此文件是realloc.c源代码,其功能是调整当前分配动态内存的大小。2. 2. C51启动文件STARTUP.A51启动文件STARTUP.A51中包含目标板启动代码,可在每个project中加入这个文件,只要复位,则该文件立即执行,其功能包括:l 定义内部RAM大小、外部RAM大小、可重入堆栈位置l 清除内部、外部或者以此页为单元的外部存储器l 按存储模式初使化重入堆栈及堆栈指针l 初始化8051硬件堆栈指针l 向main( )函数交权开发人员可修改以下数据从而对系统初始化常数名意义IDATALEN 待清内部RAM长度XDATA START 指定待清外部RAM起始地址XDATALEN 待清外部RAM长度IBPSTACK 是否小模式重入堆栈指针需初始化标志,1为需要。缺省为0IBPSTACKTOP 指定小模式重入堆栈顶部地址XBPSTACK 是否大模式重入堆栈指针需初始化标志,缺省为0XBPSTACKTOP 指定大模式重入堆栈顶部地址PBPSTACK 是否Compact重入堆栈指针,需初始化标志,缺省为0PBPSTACKTOP 指定Compact模式重入堆栈顶部地址PPAGEENABLE P2初始化允许开关PPAGE指定P2值PDATASTART 待清外部RAM页首址PDATALEN 待清外部RAM页长度提示:如果要初始化P2作为紧凑模式高端地址,必须:PPAGEENAGLE1,PPAGE为P2值,例如指定某页1000H10FFH,则PPAGE10H,而且连接时必须如下:L51 PDATA(1080H),其中1080H是1000H10FFH中的任一个值。以下是STARTUP.A51代码片断,红色是经常可能需要修改的地方:;-; This file is part of the C51 Compiler package; Copyright KEIL ELEKTRONIK GmbH 1990;-; STARTUP.A51: This code is executed after processor reset.; To translate this file use A51 with the following invocation:; A51 STARTUP.A51; To link the modified STARTUP.OBJ file to your application use the following; L51 invocation:; L51 , STARTUP.OBJ ;-; User-defined Power-On Initialization of Memory; With the following EQU statements the initialization of memory; at processor reset can be defined:; the absolute start-address of IDATA memory is always 0IDATALEN EQU 80H ; the length of IDATA memory in bytes.;XDATASTART EQU 0H ; the absolute start-address of XDATA memoryXDATALEN EQU 0H ; the length of XDATA memory in bytes.;PDATASTART EQU 0H ; the absolute start-address of PDATA memoryPDATALEN EQU 0H ; the length of PDATA memory in bytes.; Notes: The IDATA space overlaps physically the DATA and BIT areas of the; 8051 CPU. At minimum the memory space occupied from the C51; run-time routines must be set to zero.;-; Reentrant Stack Initilization; The following EQU statements define the stack pointer for reentrant; functions and initialized it:; Stack Space for reentrant functions in the SMALL model.IBPSTACK EQU 0 ; set to 1 if small reentrant is used.IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1.; Stack Space for reentrant functions in the LARGE model.XBPSTACK EQU 0 ; set to 1 if large reentrant is used.XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.; Stack Space for reentrant functions in the COMPACT model.PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.;-; Page Definition for Using the Compact Model with 64 KByte xdata RAM; The following EQU statements define the xdata page used for pdata; variables. The EQU PPAGE must conform with the PPAGE control used; in the linker invocation.;PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.PPAGEEQU 0 ; define PPAGE number.;-3. 3. 标准输入输出文件putchar.cputchar.c是一个低级字符输出子程,开发人员可修改后应用到自己的硬件系统上,例如向CLD或LEN输出字符。缺省:putchar.c是向串口输出一个字符XON|XOFF是流控标志,换行符“*n”自动转化为回车/换行“rn”。getkey.cgetkey函数是一个低级字符输入子程,该程序可用到自己硬件系统,如矩阵键盘输入中,缺省时通过串口输入字符。4. 4. 其它文件还包括对Watch-Dog有独特功能的INIT.A51函数以及对8C751适用的函数,可参考源代码。4. 第四节 段名协定与程序优化1. 1. 段名协定(Segment Naming Conventions)C51编译器生成的目标文件存放于许多段中,这些段是代码空间或数据空间的一些单元,一个段可以是可重定位的,也可以是绝对段,每一个可重定位的段都有一个类型和名字,C51段名有以下规定:每个段名包括前缀与模块名两部分,前缀表示存储类型,模块名则是被编译的模块的名字,例如:?CO?main1 :表示main1模块中的代码段中的常数部分?PR?function1?module 表module模块中函数function1的可执行段,具体规定参阅手册。2. 2. 程序优化C51编译器是一个具有优化功能的编译器,它共提供六级优化功能。确保生成目标代码的最高效率(代码最少,运行速度最快)。具体六级优化的内容可参考帮助。在C51中提供以下编译控制指令控制代码优化:OPTIMIZE(SJXE):尽量采用子程序,使程序代码减少。NOAREGS:不使用绝对寄存器访问,程序代码与寄存器段独立。NOREGPARMS:参数传递总是在局部数据段实现,程序代码与低版本C51兼容。OPTIMIZE(SIZE)AK OPTIMIZE(speed)提供6级优化功能,缺省为: OPTIMIZE(6,SPEED)。5. 第五章 Keil C51库函数参考C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。1. 第一节 本征库函数(intrinsic routines)和非本征证库函数C51提供的本征函数是指编译时直接将固定的代码插入当前行,而不是用ACALL和LCALL语句来实现,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。C51的本征库函数只有9个,数目虽少,但都非常有用,列如下:_crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回_iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回_lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回_nop_: 相当于插入NOP_testbit_: 相当于JBC bitvar测试该位变量并跳转同时清除。_chkfloat_: 测试并返回源点数状态。使用时,必须包含#inclucle 一行。如不说明,下面谈到的库函数均指非本征库函数。2. 第二节 几类重要库函数1. 1. 专用寄存器include文件例如8031、8051均为REG51.h其中包括了所有8051的SFR及其位定义,一般系统都必须包括本文件。2. 2. 绝对地址include文件absacc.h该文件中实际只定义了几个宏,以确定各存储空间的绝对地址。3. 3. 动态内存分配函数,位于stdlib.h中4. 4. 缓冲区处理函数位于“string.h”中其中包括拷贝比较移动等函数如:memccpy memchr memcmp memcpy memmove memset这样很方便地对缓冲区进行处理。5. 5. 输入输出流函数,位于“stdio.h”中流函数通8051的串口或用户定义的I/O口读写数据,缺省为8051串口,如要修改,比如改为LCD显示,可修改lib目录中的getkey.c及putchar.c源文件,然后在库中替换它们即可。3. 第三节 Keil C51库函数原型列表1. 1. CTYPE.Hbit isalnum(char c);bit isalpha(char c);bit iscntrl(char c);bit isdigit(char c);bit isgraph(char c);bit islower(char c);bit isprint(char c);bit ispunct(char c);bit isspace(char c);bit isupper(char c);bit isxdigit(char c);bit toascii(char c);bit toint(char c);char tolower(char c);char _tolower(char c);char toupper(char c);char _toupper(char c);2. 2. INTRINS.Hunsigned char _crol_(unsigned char c,unsigned char b);unsigned char _cror_(unsigned char c,unsigned char b);unsigned char _chkfloat_(float ual);unsigned int _irol_(unsigned int i,unsigned char b);unsigned int _iror_(unsigned int i,unsigned char b);unsigned long _irol_(unsigned long l,unsigned char b);unsigned long _iror_(unsigned long L,unsigned char b);void _nop_(void);bit _testbit_(bit b);3. 3. STDIO.Hchar getchar(void);char _getkey(void);char *gets(char * string,int len);int printf(const char * fmtstr,argument);char putchar(char c);int puts (const char * string);int scanf(const char * fmtstr.,argument);int sprintf(char * buffer,const char *fmtstr;argument);int sscanf(char *buffer,const char * fmtstr,argument);char ungetchar(char c);void vprintf (const char *fmtstr,char * argptr);void vsprintf(char *buffer,const char * fmtstr,char * argptr);4. 4. STDLIB.Hfloat atof(void * string);int atoi(void * string);long atol(void * string);void * calloc(unsigned int num,unsigned int len);void free(void xdata *p);void init_mempool(void *data *p,unsigned int size);void *malloc (unsigned int size);int rand(void);void *realloc (void xdata *p,unsigned int size);void srand (int seed);5. 5. STRING.Hvoid *memccpy (void *dest,void *src,char c,int len);void *memchr (void *buf,char c,int len);char memcmp(void *buf1,void *buf2,int len);void *memcopy (void *dest,void *SRC,int len);void *memmove (void *dest,void *src,int len);void *memset (void *buf,char c,int len);char *strcat (char *dest,char *src);char *strchr (const char *string,char c);char strcmp (char *string1,char *string2);char *strcpy (char *dest,char *src);int strcspn(char *src,char * set);int strlen (char *src);char *strncat (char 8dest,char *src,int len);char strncmp(char *string1,char *string2,int len);char strncpy (char *dest,char *src,int len);char *strpbrk (char *string,char *set);int strpos (const char *string,char c);char *strrchr (const char *string,char c);char *strrpbrk (char *string,char *set);int strrpos (const char *string,char c);int strspn(char *string,char *set);6. 第六章 Keil C51例子:Hello.cHello位于C51excmplesHello目录,其功能是向串口输出“Hello,world”整个程序如下:pragma DB OE CD#indule i ncludevoid main(void)SCOn=0x50;TMOD=0x20TH1=0xf3;Tri=1;TI=1;printf(“Hello,world n”);while(1) 1. 第一节 uVision for Windows的使用步骤(1) file_new新建一个hello.c文件,输入如上内容或直接用目录下源文件。(2) file_save或工具栏将文件存盘。(3) project_new project创建一个project名为hello,并在其中加入hello.c。这时该project已是打开状态,或用open project打开已存在的project。(4) option_C51 compiler中选出至少包括两项DB OE。(5) option_dscope Debugger选中helloDS51.INI查看DS51.INI看其是否为:“loadBIN8051.DLLmap 0, 0xffff”否则修改。(6) 在option_make选make文件顺序。(7) project选Build project,看是否有语法错误,若无则生成HEX文件,若有则修改源文件后重复以上部分步骤。(8) run_dScope debugger进入dScope51后装入hello则可用go直接运行看serial窗口有无输出,正常每系统运行一次,serial窗口均出现一个“Hello,world”表明运行无误。2. 第二节 Ishell for Dos使用步骤(1) 进入Ishell 用Setup editer选择编辑器。然后单击Edit或用Edit命令编辑hello.c源文件,存盘,也可以在files窗口中直接选中hello.c。(2) 用cd改换project目录至hello目录。(3) 在setup_target一项目选8051。(4) 在setup_C51中输出DB OE。(5) 在setup_project输入project名hello。(6) 在setup_save保存Ishell.CFG文件。(7) 编辑一个Link文件hello.lin中有“hell.obj”一行。(8) 由光标落在files菜单中的Hello.c上,单击“translate”,如无语法错,再击“link”,则Hex文件生成。(9) 单击Simulate如在8051.CDF中选Simulate为dScope则进入dScope调试直接“Go”,看serial窗口输出为“Hello.world”。(10) 如程序有误修改源代码后不必再translate或link了,只要一步Amake即可。若project中包括不止一个文件,在DOS的Ishell中不能用Translate编译,而应建立bat文件,直接在命令窗编译,然后link连接。如还需用Translate则只能多个文件分别编译,然后连接。7. 第七章 Keil C51的代码效率C51程序编译生成汇编代码的效率,是由许多因素共同决定的,对于Keil C51,主要受以下两种因素影响:1. 第一节 存储模式的影响存储模式决定了缺省变量的存储空间,而访问各空间变量的汇编代码的繁简程度决定了代码率的高低。例如:一个整形变量i,如放于内存18H、19H空间,则+i的操作编译成四条语句:INC 0x19MOV A,0x19JNZ 0x272DINC 0x180x272D:而如果放于外存空间0000H、0001H则+i的操作编译成九条语句:MOV DPTR,0001MOVX A, DPTRINC AMOVX DPTR,AJNz #5MOV OPTR,#0000MOVX A,DPTRINC AMOVX DPTR,A就汇编之后的语句而言,对外部存储器的操作较内部存储器操作代码率要低得多,生成的语句为内存的两倍以上,而程序中有大量的这种操作,可见存储模式对代码率的响了。因此程序设计的原则是1、存储模式从small-Compact-large依次选择,实在是变量太多,才选large模式。2、即使选择了large模式,对一些常用的局部的或者可放于内存中的变量,最好放于内存中,以尽量提高程序的代码率。2. 第二节 程序结构的影响程序的结构单元包括模块、函数等等。同样的功能,如果结构越复杂,其所涉及的操作、变量、功能模块函数等就越多,较之结构性好,代码简单的程序其代码率自然就低得多。此外程序的运行控制语句,也是影响代码率的关键因素,例如:switch -case语句,许多编译器都把它们译得非常复杂,Keil C51也不例外,相对较为简易的Switch-case语句,编译成跳转指令形式,代码率较高,但对较为复杂的Switch-Case,则要调用一个系统库函数?C?ICASE进行处理,非常复杂。再如if( ),while( ),等语句也是代码相对较低的语句,但编译以后比switch-case要高得多。因此建议设计者尽量少用switch-case之类语句来控制程序结构,以提高代码率。除以上两点外,其它因素也会对代码率产生影响,例如:是否用寄存器传递参数 即NOAREGS选项是否有是否包括调试信息:即DEBUG选项是否包括扩展的调试信息:即BJECTEXTEND8. 第八章 dScope for Windows使用详解1. 第一节 概述1. 1. 主窗口(Mainframe Window)可设置其它各种调试窗口,设置断点、观察点,修改地址空间,加载文件等等;2. 2. 调试窗口(DEBUG Window)支持用户程序的各种显示方式,可连续运行,单步运行用户程序,并可在线汇编;3. 3. 命令窗口(Command Window)支持命令行的输入;4. 4. 观察窗口(Watch Window)可设置所要观察的变量、表达式等;5. 5. 寄存器窗口(Registe Window)显示内部寄存器的内容,程序运行次数等;6. 6. 串口窗口(Serical Windows)显示串口接收和发送的数据;7. 7. 性能分析窗口显示所要观察的各程序段占用CPU的空间;8. 8. 内存窗口(Memory Window)显示所选择的内存中的数据;9. 9. 符号浏览窗口(Symbol Browser Window)显示各种符号名称,包括专有符号,用户自定义符号(函数名、变量、标号)等;10. 10. 调用线窗口(CallStack Window)动态显示当前执行的程序段的函数调用关系;11. 11. 代码覆盖窗口提供当前模块内各程序段中被执行代码的比率;。12. 12. 外围设备窗口(peripherals)可显示I/O口,定时器,中断,串口等外围设备状态;2. 第二节 dScope for Windows基本操作1. 1. 指定初始化文件在uVision的Option菜单dScope Debugger中指定dScope的初始化文件,用uVision的RUN启动dScope将自动加载此初始化文件,自动执行其中命令;下面是一个例子,可以看出调入一个调试代码的过程。Ds51.ini:load 8051.dllload testslogtest.logxtal=11.0592define button go to main,g,mainws RevCounterws rm.rg,mainPA RESETPA serialPA timer02. 2. 观察变量方法1:命令行WS expression , numberbase LINE 其中numberbase为显示数制,10对应10进制,16对应16进制,缺省为16进制。LINE为单行显示,缺省为多行显示。方法2:setup-Watchpoints,在对话框中输入变量3. 3. 显示RAM的值d i(x,d):起始地址,终止地址d 变量名4. 4. 观察堆栈View-Call-stack-Show invocation,可以跟踪调用过程;5. 5. 中断处理程序调试在装入8051.dll后,在dScope的主菜单中将增加Peripherial,其有4个字菜单:I/0 port:Pi端口状态Interrupt:中断设置Timer:定时器中断状态Serial:串口中断状态设置相应的中断请求标志位即可产生中断。6. 6. 性能分析(Performance Analyzer:PA)PA用来分析一段代码执行占用CPU的百分比。定义:命令行 PA func_name3. 第三节 dScope for Windows命令文件的编制dScope除了用命令行的方式进行调试以外,还可将各种调试命令汇集于一个调试文件中,然后调用该文件,就可达到自动测试用户源代码的目的。dScope的命令文件支持C/PL/M的格式,因而编制调试命令文件与编制C语言程序有些类似。1. 1. 地址空间及地址空间类型1. (1) 地址空间分段dScope提供的最大可用空间为16M,实际上我们只用以下三段: 内部数据空间段(0X00段或D段)0X00:0X00000X00:0XFFFF(对MSC51而言为0X00:0X00FF) 外部数据空间段(0X01段式或X段)0X01:0X00000X010XFFFF 程序空间段(0XFF段或C段)0XFF:0X00000XFF:0XFFFF2. (2) 地址空间类型C:代码空间D:内部直接寻址空间I: 内部间接寻址空间X:外部数据空间B:位寻址空间P:I/O口EB:扩展的位寻址空间(MCS251专有)ED:扩展的数据空间(MCS251专有)CO:常数空间(MCS251专有)HC:正常数空间(MCS251专有)2. 2. 常量dScope支持十六进制、八进制、十进制、二进制常数,其后缀分别为H、Q(O)、T(或无)、Y;dScope不区分常量的大、小写。1. (1) 整型常量分为整型(int),无符号整型(uint,00rd),长整型(long),无符号长整型(Wlong、Word)。2. (2) 浮点型常量与ANSI C相同。3. (3) 字符串常量与ANSI C相同4. (4) 字符常量分为字符型(Char)和无符号字符型(Uchar)一种。5. (5) 行号常数指用户程序中的行号,实际上是个地址6. (6) 位常量(Bit):0和17. (7) 地址常数地址常数的种类很多,地址常数不同于行号常数,行号常数就是一个地址,而地址数被引用时,实际上是取该地址中的数据。C:代码地址常数,如C:0X0012或0XFF:0X0012D:内部直接寻址地址常数,如D:0X0068或0X00:0X0068I:内部间按寻址地址常数,如I:0X0010或0X00:0X0010X:外部数据空间地址常数,如X:0X0028或0X01:0X0028B:位地址常数,如B:0X20或B:0X24.0EB:扩展的位地址常数(MCS251专有),ED:扩展的数据空间地址常数(MCS251专有)CO:常数空间地址常数(MCS251专有)HC:正常数空间地址常数(MCS251专有)8. (8) 标识符常量即用户源程序中的标号、函数名等,实际上代表某一地址。9. (9) 用户源程序中定义的常数3. 3. 变量dScope所支持的变量名或标识符最多可由31个字符组成,第一个字母为AZ,az,下划线或问号,后续字符可为字母、数字、下划线和问号。除CPU变量和系统变量外,dScope不支持全局变量,但可视“define”命令定义的变量为全局变量。Dscope所支持的变量分为以下几种(变量名称不区分大、小写),支持类型转换:1. (1) 整型变量分为整型变量(int)、无符号整型变量(uint/word),长整型(Long)、无符号长整型(Ulong/dword)。2. (2) 浮点型变量(float)与ANSI C相同。3. (3) 字符型变量L分为字符型(char)变量和无符号字符型(Uchar)4. (4) 位变量(Bit)5. (5) 系统变量dScope自己定义了一系列内部变量,用户可对这些变量进行读或读/写操作,可被用户自定义数所引用。a. Cycles (Read Only)32位变量(Ulong),指示当前程序执行已花费的指令周期(cycle)。b. Ramsize(R/W)16位变量(Uint),指示内部可直接寻址的数据空间大小。c. Radix(R/N)8位变量(Uchar),决定输出的数制Radix=0X0A (10进制),Radix=0X10 (16进制)d. IIP(R/W)8位变量(Uchar),指示当前的中断嵌套数目。e. (R/W)32位变量(Ulong),指出PC值,通过对其进行写操作,可改变程序执行的流程。f. Itrace (R/W)8位变量(Uchar),决定是否对程序运行情况进行记录Itrace=1,使能记录操作Itrace=0,根本上记录操作g. _Break_(R/W)8位变量(Uchar) _Break_=1,中止程序的运行h. _Mode_和_Frame size_是MCS 251专有的变量。6. (6) CPU变量即R0R7、A、C(位变量)、B、DPTR及特殊功能寄存器变量,对这些变量均可进行读、写操作。7. (7) 用户源程序中定义的变量、数组、结构等4. 4. 运算符dScope支持ANSI C的运算符,包括算术运算符,逻辑运算符,关系运算符。5. 5. 表达式以运算符将dScope所支持的常量、变量、函数等连接在一起,就构成了dScope的表达式。6. 6. 数组dScope不支持在命令文件中定义数组,但可引用用户程序中的数组,引用方式如同C。7. 7. 结构和联合dScope不支持在命令文件中定义结构和联合,但可引用用户程序中的结构和联合,引用方式如同C,但如要输出整个结构或联合的结果,就要用命令“OBJ”。8. 8. 指针:不可自定义指针,但支持用户源程序中的指针变量。9. 9. dScope命令语句dScope提供了一系列调试命令。在命令文件中,dScope只支持这些语句及前述定义的表达式,C语言的语句均不被支持,但在命令文件所包含的用户自定
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 各类标准


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!