Keil C51高级编程第四章.docx

上传人:b****6 文档编号:8828893 上传时间:2023-02-02 格式:DOCX 页数:7 大小:19.10KB
下载 相关 举报
Keil C51高级编程第四章.docx_第1页
第1页 / 共7页
Keil C51高级编程第四章.docx_第2页
第2页 / 共7页
Keil C51高级编程第四章.docx_第3页
第3页 / 共7页
Keil C51高级编程第四章.docx_第4页
第4页 / 共7页
Keil C51高级编程第四章.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

Keil C51高级编程第四章.docx

《Keil C51高级编程第四章.docx》由会员分享,可在线阅读,更多相关《Keil C51高级编程第四章.docx(7页珍藏版)》请在冰豆网上搜索。

Keil C51高级编程第四章.docx

KeilC51高级编程第四章

第一节绝对地址访问

C51提供了三种访问绝对地址的方法:

1.绝对宏:

在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括:

CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD

具体使用可看一看absacc.h便知

例如:

rval=CBYTE[0x0002];指向程序存贮器的0002h地址

rval=XWORD[0x0002];指向外RAM的0004h地址

2._at_关键字

直接在数据定义后加上_at_const即可,但是注意:

(1)绝对变量不能被初使化;

(2)bit型函数及变量不能用_at_指定。

例如:

idatastructlinklist_at_0x40;指定list结构从40h开始。

xdatachartext[25b]_at_0xE000;指定text数组从0E000H开始

提示:

如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。

3.连接定位控制

此法是利用连接控制指令codexdatapdata\databdata对“段”地址进行,如要指定某具体变量地址,则很有局限性,不作详细讨论。

第二节KeilC51与汇编的接口

1.模块内接口

方法是用#pragma语句具体结构是:

#pragmaasm

汇编行

#pragmaendasm

这种方法实质是通过asm与ndasm告诉C51编译器中间行不用编译为汇编行,因而在编译控制指令中有SRC以控制将这些不用编译的行存入其中。

2.模块间接口

C模块与汇编模块的接口较简单,分别用C51与A51对源文件进行编译,然后用L51将obj文件连接即可,关键问题在于C函数与汇编函数之间的参数传递问题,C51中有两种参数传递方法。

(1)通过寄存器传递函数参数

最多只能有3个参数通过寄存器传递,规律如下表:

参数数目

char

int

long,float

一般指针

1

R7

R6&R7

R4~R7

R1~R3

2

R5

R4&R5

R4~R7

R1~R3

3

R3

R2&R3

 

R1~R3

2)通过固定存储区传递(fixedmemory)

这种方法将bit型参数传给一个存储段中:

function_name?

BIT

将其它类型参数均传给下面的段:

function_name?

BYTE,且按照预选顺序存放。

至于这个固定存储区本身在何处,则由存储模式默认。

(3)函数的返回值

函数返回值一律放于寄存器中,有如下规律:

returntype

Registev

说明

bit

标志位

由具体标志位返回

char/unsignedchar1_byte指针

R7

单字节由R7返回

int/unsignedint2_byte指针

R6&R7

双字节由R6和R7返回,MSB在R6

long&unsignedlong

R4~R7

MSB在R4,LSB在R7

float

R4~R7

32BitIEEE格式

一般指针

R1~R3

存储类型在R3高位R2低R1

(4)SRC控制

该控制指令将C文件编译生成汇编文件(.SRC),该汇编文件可改名后,生成汇编.ASM文件,再用A51进行编译。

第三节C51软件包中的通用文件

在C51\LiB目录下有几个C源文件,这几个C源文件有非常重要的作用,对它们稍事修改,就可以用在自己的专用系统中。

1.动态内存分配

init_mem.C:

此文件是初始化动态内存区的程序源代码。

它可以指定动态内存的位置及大小,只有使用了init_mem()才可以调回其它函数,诸如malloccalloc,realloc等。

calloc.c:

此文件是给数组分配内存的源代码,它可以指定单位数据类型及该单元数目。

malloc.c:

此文件是malloc的源代码,分配一段固定大小的内存。

realloc.c:

此文件是realloc.c源代码,其功能是调整当前分配动态内存的大小。

2.C51启动文件STARTUP.A51

启动文件STARTUP.A51中包含目标板启动代码,可在每个project中加入这个文件,只要复位,则该文件立即执行,其功能包括:

*定义内部RAM大小、外部RAM大小、可重入堆栈位置

*清除内部、外部或者以此页为单元的外部存储器

*按存储模式初使化重入堆栈及堆栈指针

*初始化8051硬件堆栈指针

*向main()函数交权

开发人员可修改以下数据从而对系统初始化

常数名意义

IDATALEN待清内部RAM长度

XDATASTART指定待清外部RAM起始地址

XDATALEN待清外部RAM长度

IBPSTACK是否小模式重入堆栈指针需初始化标志,1为需要。

缺省为0

IBPSTACKTOP指定小模式重入堆栈顶部地址

XBPSTACK是否大模式重入堆栈指针需初始化标志,缺省为0

XBPSTACKTOP指定大模式重入堆栈顶部地址

PBPSTACK是否Compact重入堆栈指针,需初始化标志,缺省为0

PBPSTACKTOP指定Compact模式重入堆栈顶部地址

PPAGEENABLEP2初始化允许开关

PPAGE指定P2值

PDATASTART待清外部RAM页首址

PDATALEN待清外部RAM页长度

提示:

如果要初始化P2作为紧凑模式高端地址,必须:

PPAGEENAGLE=1,PPAGE为P2值,例如指定某页1000H-10FFH,则PPAGE=10H,而且连接时必须如下:

L51PDATA(1080H),其中1080H是1000H-10FFH中的任一个值。

以下是STARTUP.A51代码片断,红色是经常可能需要修改的地方:

;------------------------------------------------------------------

;ThisfileispartoftheC51Compilerpackage

;CopyrightKEILELEKTRONIKGmbH1990

;------------------------------------------------------------------

;STARTUP.A51:

Thiscodeisexecutedafterprocessorreset.

;

;TotranslatethisfileuseA51withthefollowinginvocation:

;

;A51STARTUP.A51

;

;TolinkthemodifiedSTARTUP.OBJfiletoyourapplicationusethefollowing

;L51invocation:

;

;L51,STARTUP.OBJ

;

;------------------------------------------------------------------

;

;User-definedPower-OnInitializationofMemory

;

;WiththefollowingEQUstatementstheinitializationofmemory

;atprocessorresetcanbedefined:

;

;;theabsolutestart-addressofIDATAmemoryisalways0

IDATALENEQU80H;thelengthofIDATAmemoryinbytes.

;

XDATASTARTEQU0H;theabsolutestart-addressofXDATAmemory

XDATALENEQU0H;thelengthofXDATAmemoryinbytes.

;

PDATASTARTEQU0H;theabsolutestart-addressofPDATAmemory

PDATALENEQU0H;thelengthofPDATAmemoryinbytes.

;

;Notes:

TheIDATAspaceoverlapsphysicallytheDATAandBITareasofthe

;8051CPU.AtminimumthememoryspaceoccupiedfromtheC51

;run-timeroutinesmustbesettozero.

;-------------------------------------------------------------------

;

;ReentrantStackInitilization

;

;ThefollowingEQUstatementsdefinethestackpointerforreentrant

;functionsandinitializedit:

;

;StackSpaceforreentrantfunctionsintheSMALLmodel.

IBPSTACKEQU0;setto1ifsmallreentrantisused.

IBPSTACKTOPEQU0FFH+1;settopofstacktohighestlocation+1.

;

;StackSpaceforreentrantfunctionsintheLARGEmodel.

XBPSTACKEQU0;setto1iflargereentrantisused.

XBPSTACKTOPEQU0FFFFH+1;settopofstacktohighestlocation+1.

;

;StackSpaceforreentrantfunctionsintheCOMPACTmodel.

PBPSTACKEQU0;setto1ifcompactreentrantisused.

PBPSTACKTOPEQU0FFFFH+1;settopofstacktohighestlocation+1.

;

;-----------------------------------------------------------------

;

;PageDefinitionforUsingtheCompactModelwith64KBytexdataRAM

;

;ThefollowingEQUstatementsdefinethexdatapageusedforpdata

;variables.TheEQUPPAGEmustconformwiththePPAGEcontrolused

;inthelinkerinvocation.

;

PPAGEENABLEEQU0;setto1ifpdataobjectareused.

PPAGEEQU0;definePPAGEnumber.

;

;-----------------------------------------------------------------

3.标准输入输出文件

putchar.c

putchar.c是一个低级字符输出子程,开发人员可修改后应用到自己的硬件系统上,例如向CLD或LEN输出字符。

缺省:

putchar.c是向串口输出一个字符XON|XOFF是流控标志,换行符“\*n”自动转化为回车/换行“\r\n”。

getkey.c

getkey函数是一个低级字符输入子程,该程序可用到自己硬件系统,如矩阵键盘输入中,缺省时通过串口输入字符。

4.其它文件

还包括对Watch-Dog有独特功能的INIT.A51函数以及对8×C751适用的函数,可参考源代码。

第四节段名转换与程序优化

1.段名协定(SegmentNamingConventions)

C51编译器生成的目标文件存放于许多段中,这些段是代码空间或数据空间的一些单元,一个段可以是可重定位的,也可以是绝对段,每一个可重定位的段都有一个类型和名字,C51段名有以下规定:

每个段名包括前缀与模块名两部分,前缀表示存储类型,模块名则是被编译的模块的名字,例如:

CO?

main1:

表示main1模块中的代码段中的常数部分

PR?

function1?

module表module模块中函数function1的可执行段,具体规定参阅手册。

2.程序优化

C51编译器是一个具有优化功能的编译器,它共提供六级优化功能。

确保生成目标代码的最高效率(代码最少,运行速度最快)。

具体六级优化的内容可参考帮助。

在C51中提供以下编译控制指令控制代码优化:

OPTIMIZE(SJXE):

尽量采用子程序,使程序代码减少。

NOAREGS:

不使用绝对寄存器访问,程序代码与寄存器段独立。

NOREGPARMS:

参数传递总是在局部数据段实现,程序代码与低版本C51兼容。

OPTIMIZE(SIZE)AKOPTIMIZE(speed)提供6级优化功能,缺省为:

OPTIMIZE(6,SPEED)。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1