Keil C51高级编程第四章.docx
- 文档编号:8828893
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:7
- 大小:19.10KB
Keil C51高级编程第四章.docx
《Keil C51高级编程第四章.docx》由会员分享,可在线阅读,更多相关《Keil C51高级编程第四章.docx(7页珍藏版)》请在冰豆网上搜索。
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,而且连接时必须如下:
L51
以下是STARTUP.A51代码片断,红色是经常可能需要修改的地方:
;------------------------------------------------------------------
;ThisfileispartoftheC51Compilerpackage
;CopyrightKEILELEKTRONIKGmbH1990
;------------------------------------------------------------------
;STARTUP.A51:
Thiscodeisexecutedafterprocessorreset.
;
;TotranslatethisfileuseA51withthefollowinginvocation:
;
;A51STARTUP.A51
;
;TolinkthemodifiedSTARTUP.OBJfiletoyourapplicationusethefollowing
;L51invocation:
;
;L51
;
;------------------------------------------------------------------
;
;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)。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Keil C51高级编程第四章 C51 高级 编程 第四