您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 关于keil中STARTUPA51的研究
关于keil中STARTUP.A51的研究!blueiceman发表于2005-10-108:53:00让我们先来看看STARTUP.A51文件(默认设置)吧!根据源文件中的说明文字,我们很容易分析出STARTUP.A51文件的工作方式和作用!让我们把它先汉化一下看看!$NOMOD51;Ax51宏汇编器控制命令:禁止预定义的8051;------------------------------------------------------------------------------;ThisfileispartoftheC51Compilerpackage;Copyright(c)1988-2002KeilElektronikGmbHandKeilSoftware,Inc.;------------------------------------------------------------------------------;STARTUP.A51:Thiscodeisexecutedafterprocessorreset.;STARTUP.A51:STARTUP.A51文件所生成的代码将在单片机复位后被执行!;TotranslatethisfileuseA51withthefollowinginvocation:;将按照下面的命令行语句调用A51编译器进行编译产生目标文件;A51STARTUP.A51;;TolinkthemodifiedSTARTUP.OBJfiletoyourapplicationusethefollowing;BL51invocation:;将按照下面的命令行语句调用BL51连接器把STARTUP.OBJ定位连接到您的程序代码中;BL51yourobjectfilelist,STARTUP.OBJcontrols;;------------------------------------------------------------------------------;;User-definedPower-OnInitializationofMemory;自定义上电后需要初始化的储存区域;WiththefollowingEQUstatementstheinitializationofmemory;atprocessorresetcanbedefined:;使用下列EQU伪指令定义初始化的存储区域在单片机复位后定义生效;;theabsolutestart-addressofIDATAmemoryisalways0IDATALENEQU80H;thelengthofIDATAmemoryinbytes.;IDATA(间接寻址区)其起始地址固定为0;IDATALEN用于指定需要初始化;的IDATA区长度(以字节为单位)*XDATASTARTEQU0H;theabsolutestart-addressofXDATAmemoryXDATALENEQU0H;thelengthofXDATAmemoryinbytes.;XDATA(外部直接寻址区)XDATASTART用于指定需要初始化的XDATA区起始地;址XDATALEN用于指定需要初始化的XDATA区长度(以字节为单位)*PDATASTARTEQU0H;theabsolutestart-addressofPDATAmemoryPDATALENEQU0H;thelengthofPDATAmemoryinbytes.;PDATA(页寻址区)PDATASTART用于指定需要初始化的PDATA区起始地址;PDATALEN用于指定需要初始化的;PDATA区长度(以字节为单位)*;Notes:TheIDATAspaceoverlapsphysicallytheDATAandBITareasofthe;8051CPU.AtminimumthememoryspaceoccupiedfromtheC51;run-timeroutinesmustbesettozero.;注释:8051中IDATA区物理上已经包括了DATA区(直接寻址区)以及BIT区(位寻址区)。C51(库)占用了最小;化内存空间,运行时程序需要把它设为0;------------------------------------------------------------------------------;;ReentrantStackInitilization;重入堆栈初始化;ThefollowingEQUstatementsdefinethestackpointerforreentrant;functionsandinitializedit:;下面的EQU语句定义重入函数的堆栈指针并初始化它;StackSpaceforreentrantfunctionsintheSMALLmodel.;SMALL模式下的重入函数的堆栈空间IBPSTACKEQU0;setto1ifsmallreentrantisused.;如果再SMALL模式下使用重入则设为1IBPSTACKTOPEQU0FFH+1;settopofstacktohighestlocation+1.;设置堆栈顶最高位置+1;;StackSpaceforreentrantfunctionsintheLARGEmodel.;LARGE模式下的重入函数的堆栈空间XBPSTACKEQU0;setto1iflargereentrantisused.;如果再LARGE模式下使用重入则设为1XBPSTACKTOPEQU0FFFFH+1;settopofstacktohighestlocation+1.;设置堆栈顶最高位置+1;;StackSpaceforreentrantfunctionsintheCOMPACTmodel.;COMPACT模式下的重入函数的堆栈空间PBPSTACKEQU0;setto1ifcompactreentrantisused.;如果再COMPACT模式下使用重入则设为1PBPSTACKTOPEQU0FFFFH+1;settopofstacktohighestlocation+1.;设置堆栈顶最高位置+1;;------------------------------------------------------------------------------;;PageDefinitionforUsingtheCompactModelwith64KBytexdataRAM;使用COMPACT模式时为64KB的XDATARAM定义页;ThefollowingEQUstatementsdefinethexdatapageusedforpdata;variables.TheEQUPPAGEmustconformwiththePPAGEcontrolused;inthelinkerinvocation.;下面的EQU语句定义PDATA变量的使用了XDATA页PPAGEENABLEEQU0;setto1ifpdataobjectareused.;如果使用PDATA页则设为1;PPAGEEQU0;definePPAGEnumber.;定义页号;PPAGE_SFRDATA0A0H;SFRthatsuppliesuppermostaddressbyte;SFR的最高地址字节;(most8051variantsuseP2asuppermostaddressbyte);(大多数8051变量要用P2的最高地址字节);------------------------------------------------------------------------------;StandardSFRSymbols;标准SFR符号ACCDATA0E0HBDATA0F0HSPDATA81HDPLDATA82HDPHDATA83HNAME?C_STARTUP?C_C51STARTUPSEGMENTCODE?STACKSEGMENTIDATARSEG?STACKDS1EXTRNCODE(?C_START);外部代码(这个标号将代表用户程序的启始地址)PUBLIC?C_STARTUP;给外部使用的符号CSEGAT0;在code段的0地址处放以下代码(使用AT指令进行绝对地址的定位)?C_STARTUP:LJMPSTARTUP1RSEG?C_C51STARTUPSTARTUP1:IFIDATALEN0;如果长度大于1则初始化IDATAMOVR0,#IDATALEN-1CLRAIDATALOOP:MOV@R0,ADJNZR0,IDATALOOPENDIFIFXDATALEN0;如果长度大于1则初始化XDATAMOVDPTR,#XDATASTARTMOVR7,#LOW(XDATALEN)IF(LOW(XDATALEN))0;预置初始化时的外循环次数到R6MOVR6,#(HIGH(XDATALEN))+1ELSEMOVR6,#HIGH(XDATALEN)ENDIFCLRAXDATALOOP:MOVX@DPTR,AINCDPTRDJNZR7,XDATALOOPDJNZR6,XDATALOOPENDIFIFPPAGEENABLE0MOVPPAGE_SFR,#PPAGEENDIFIFPDATALEN0;如果长度大于1则初始化PDATAMOVR0,#LOW(PDATASTART)MOVR7,#LOW(PDATALEN)CLRAPDATALOOP:MOVX@R0,AINCR0DJNZR7,PDATALOOPENDIFIFIBPSTACK0;SMALL模式下使用重入函数时要设置的堆栈EXTRNDATA(?C_IBP)MOV?C_IBP,#LOWIBPSTACKTOPENDIFIFXBPSTACK0;COMPACT模式下使用重入函数时要设置的堆栈EXTRNDATA(?C_XBP)MOV?C_XBP,#HIGHXBPSTACKTOPMOV?C_XBP+1,#LOWXBPSTACKTOPENDIFIFPBPSTACK0;LARGE模式下使用重入函数时要设置的堆栈EXTRNDATA(?C_PBP)MOV?C_PBP,#LOWPBPSTACKTOPENDIFMOVSP,#?STACK-1;ThiscodeisrequiredifyouuseL51_BANK.A51withBankingMode4;如果你的程序使用了Mode4程序分组技术(BANKING)请启用下面的程序代码;EXTRNCODE(?B_SWITCH0);CALL?B_SWITCH0;initbankmechanismtocodebank0;程序从第一个块(bank0)开始执行LJMP?C_START;从这里跳到你的程序入口END
本文标题:关于keil中STARTUPA51的研究
链接地址:https://www.777doc.com/doc-27051 .html