keil提供的启动代码解析(STARTUP.A51)
程序清单1.1 AT89C51启动代码
$NOMOD51 //不使用51默认的特殊功能寄存器
;
; 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
; BL51是Keil使用的链接器(Linker),这是命令行的使用格式
;
;
; User-defined Power-On Initialization of Memory
; 下面将定义一些与存储器初始化相关的符号常量,与ICCAVR相比,Keil把符号常量显式声明出来更容易理解。
; 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
IDATALEN EQU 80H ; the length of IDATA memory in bytes.
;IDDATALEN指片内128字节RAM,I指internal
XDATASTART EQU 0H ; the absolute start-address of XDATA memory
XDATALEN EQU 0H ; the length of XDATA memory in bytes.
; XDATA指片外SRAM空间,X指external
PDATASTART EQU 0H ; the absolute start-address of PDATA memory
PDATALEN EQU 0H ; the length of PDATA memory in bytes.
; PDATA指程序存储器,p指program
; 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.
; 注意:8051 CPU的寄存器空间和存储器空间并不是统一编址的,而是通过指令来区分,所以不同的存储区的地址可能重叠(overlap)
;
;
; Reentrant Stack Initilization
;
; 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.
IBPSTACK EQU 0 ; set to 1 if small reentrant is used.
IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1.
;
; Stack Space for reentrant functions in the LARGE model.
XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.
;
; Stack Space for reentrant functions in the COMPACT model.
PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.
PBPSTACKTOP EQU 0FFFFH+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.
;
PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.
;
PPAGE EQU 0 ; define PPAGE number.
;
PPAGE_SFR DATA 0A0H ; SFR that supplies uppermost address byte
; (most 8051 variants use P2 as uppermost address byte)
;
;
; Standard SFR Symbols
ACC DATA 0E0H
B DATA 0F0H
SP DATA 81H
DPL DATA 82H
DPH DATA 83H
NAME ?C_STARTUP
?C_C51STARTUP SEGMENT CODE
?STACK SEGMENT IDATA
RSEG ?STACK
DS 1
EXTRN CODE (?C_START)
PUBLIC ?C_STARTUP
CSEG AT 0 //代码段的起始点
?C_STARTUP: LJMP STARTUP1 //转跳到STARTUP1程序区中去。
RSEG ?C_C51STARTUP
STARTUP1:
//IF ENDIF是条件编译命令,只有当条件为真时,才编译代码
IF IDATALEN <> 0 //如果有IDATA,则把IDATA区的数据清零,类似于清BSS区
MOV R0,#IDATALEN - 1
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
keil启动代 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)