新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > STARTUP.A51注解

STARTUP.A51注解

作者: 时间:2016-11-26 来源:网络 收藏
$NOMOD51;使编译器不使能预定义的8051符号,避免产生重复定义的错误。

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

本文引用地址:https://www.eepw.com.cn/article/201611/321753.htm

;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



关键词: STARTUPA51注

评论


技术专区

关闭