您的位置 首页 新品

STARTUP.A51注解

$NOMOD51;使编译器不使能预定义的8051符号,避免产生重复定义的错误。;————————————————————

$NOMOD51;使编译器不使能预界说的8051符号,防止发生重复界说的过错。

;——————————————————————————

;This file is part of the C51 Compiler package

;Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.

;——————————————————————————

;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

;BL51 invocation:

;

;BL51 , STARTUP.OBJ

;BL51是Keil运用的链接器(Linker),这是命令行的运用格局,一般不必

;实际运用IDE环境,用project办理,有相应的按钮能够完成该功用.

;——————————————————————————

;

;User-defined Power-On Initialization of Memory—初始化RAM单元

;

;With the following EQU statements the initialization of memory

;at processor reset can be defined:

;

;

; the absolute start-address of IDATA memory is always 0

IDATALENEQU80H; the length of IDATA memory in bytes.–依据你选用的芯片能够适

;当的修正这些值。

;(例如所用的是52系列,该值修正为100H,即可初始化时将悉数IDATA清0。如不更改,初始化时默许只清RAM的前128个字节,高128字节中的值满是0xff)

XDATASTARTEQU0H; the absolute start-address of XDATA memory–以下

;两项依据方针体系的外设装备和衔接自己修正

XDATALENEQU0H; the length of XDATA memory in bytes.

PDATASTARTEQU0H; the absolute start-address of PDATA memory

PDATALENEQU0H; 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–留意仓库的方向:其他芯片自带的仓库的成长方

;式是自顶向下成长的!而51的SP是自底向上的!(但51的再入仓库也是自顶向下成长的)

;–且再入仓库是由编译器自己办理的,一般不必去关怀,仅仅在有再入函数的时分,依据

;函数的存储器形式运用相应的RAM空间做为再入仓库。

;The following EQU statements define the stack pointer for reentrant

;functions and initialized it:

;Keil C默许状况不是用仓库来传递参数的,所以形成函数不行重入,Keil要求用户显现声

;明函数是否具有可重入特点,以便为C函数调用初始化栈。

;Stack Space for reentrant functions in the SMALL model.

IBPSTACKEQU0; set to 1 if small reentrant is used.

IBPSTACKTOPEQU0FFH+1; set top of stack to highest location+1.

;

;Stack Space for reentrant functions in the LARGE model.

XBPSTACKEQU0; set to 1 if large reentrant is used.

XBPSTACKTOPEQU0FFFFH+1; set top of stack to highest location+1.

;

;Stack Space for reentrant functions in the COMPACT model.

PBPSTACKEQU0; set to 1 if compact reentrant is used.

PBPSTACKTOPEQU0FFFFH+1; set top of stack to highest location+1.

;不同内存形式下的变量方位。Keil编译器中有三种形式设置:

;Small:一切的变量都放在内部RAM区

;Compact:一切变量在默许状况下都会放在外部RAM的低256字节中(可由R0寻址)

;Large:一切变量都放在外部RAM中(DPTR寻址)

;这是由51处理器繁复的寻址形式导致的,不同的寻址形式有不同的功率

;

;——————————————————————————

;

;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.

;

PPAGEENABLEEQU0; set to 1 if pdata object are used.

;

PPAGEEQU0; define PPAGE number.

;

PPAGE_SFRDATA0A0H; SFR that supplies uppermost address byte

;(most 8051 variants use P2 as uppermost address byte)许多的外部页面寻址以P2

;口为高位地址的数值,有运用外部页面RAM的状况

;对PPAGEENABLE设置为1,依据硬件衔接修正PPAGE的值。

;——————————————————————————

; Standard SFR Symbols

ACCDATA0E0H;关键字DATA是A51伪指令界说单片机内部数据存储器字节地址的符号

BDATA0F0H

SPDATA81H

DPLDATA82H

DPHDATA83H

NAME?C_STARTUP;界说当时程序模块的方针模块名

?C_C51STARTUPSEGMENTCODE;界说一个可再定位的段符号名和段地点的

;存储空间,汇编器发生的这个段符号名在BL51/L51衔接定位时用

?STACKSEGMENTIDATA;界说一个IDATA段,段名?STACK契合

;C51编译器的命名规矩

RSEG?STACK;声明当时段是IDATA段,段中保留空间。

DS1

EXTRNCODE (?C_START);声明本模块引证的外部大局符号,

;用于和C相衔接,在.src文件中能够看到这个符号

PUBLIC?C_STARTUP;声明可被其他模块运用的大局符号

;由.src文件中能够看出这个符号的效果。

CSEGAT0;完毕当时的IDATA段,发生一个坐落

;CODE中新段,开始地址是0000H。代码段的开始点

?C_STARTUP:LJMPSTARTUP1;C编译器编译源程序后,芯片复位之

;后的复位代码第一个便是履行这条句子。

RSEG?C_C51STARTUP;挑选段名为?C_C51STARTUP

;的CODE段为当时段,存储程序代码。

STARTUP1:

IF IDATALEN <> 0;条件汇编指令,有IDATA区的话,清IDATA区。(<>是不等号)

MOVR0,#IDATALEN – 1

CLRA

IDATALOOP:MOV@R0,A

DJNZR0,IDATALOOP

ENDIF

IF XDATALEN <> 0;假如有外部数据区,则把外部数据区中从XDATASTART到

;XDATASTART+ XDATALEN的区域清零

MOVDPTR,#XDATASTART

MOVR7,#LOW (XDATALEN)

IF (LOW (XDATALEN)) <> 0

MOVR6,#(HIGH (XDATALEN)) +1;假如低地址是零,一个

;高地址就代表256字节

ELSE

MOVR6,#HIGH (XDATALEN)

ENDIF

CLRA

XDATALOOP:MOVX@DPTR,A

INCDPTR

DJNZR7,XDATALOOP

DJNZR6,XDATALOOP

ENDIF

IF PPAGEENABLE <> 0;清外部页RAM区域

MOVPPAGE_SFR,#PPAGE;给P2口赋相应的值,依据用

;户自己的方针体系。

ENDIF

IF PDATALEN <> 0;清外部页RAM区域

MOVR0,#LOW (PDATASTART)

MOVR7,#LOW (PDATALEN)

CLRA

PDATALOOP:MOVX@R0,A

INCR0

DJNZR7,PDATALOOP

ENDIF

IF IBPSTACK <> 0;运用再入仓库的状况,用户自己在程序中界说函数的存储形式。

; C51界说了三个大局变量,?C_IBP,?C_XBP,?C_PBP来存储再入仓库的栈顶地址

EXTRN DATA (?C_IBP);声明本模块运用的外部大局符号,符号的段类型约束了符号

;的运用范围,而符号自身则代表的是一个RAM单元的地址

MOV?C_IBP,#LOW IBPSTACKTOP

ENDIF

IF XBPSTACK <> 0;函数是Large存储形式的时分,存储再入仓库的区域。

EXTRN DATA (?C_XBP);

MOV?C_XBP,#HIGH XBPSTACKTOP

MOV?C_XBP+1,#LOW XBPSTACKTOP

ENDIF

IF PBPSTACK <> 0;函数是Compact形式的时分,存储再入仓库栈顶地址的存储单元

;和栈的使用空间

EXTRN DATA (?C_PBP)

MOV?C_PBP,#LOW PBPSTACKTOP

ENDIF

MOVSP,#?STACK-1;界说的硬件栈的常数。差异再入堆

;栈和硬件栈。界说的段符号代表该段的首地址

; This code is required if you use L51_BANK.A51 with Banking Mode 4

#if0

EXTRN CODE (?B_SWITCH0)

CALL?B_SWITCH0; init bank mechanism to code bank 0

#endif

LJMP?C_START;把履行的权利交给C主函数。

END

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/258121.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部