logo资料库

C51启动文件--STARTUp.A51--详细注释.docx

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
C51启动文件--STARTUp.A51--详细注释  
2006-06-03 | C51启动文件详细注释----绝对的原创,详细的不能再详细了
C51 启动文件--STARTUp.A51--详细注释 2009-12-04 16:51:35| 分类: 引用 | 标签: |字号大中小 订阅 搜狐博客 > Amala_Inter > 日志 > C51 和 A51 学习 http://amalainter.blog.sohu.com/3908879.html 2006-06-03 | C51 启动文件详细注释----绝对的原创,详细的不能再详细 了 ;使编译器不使能预定义的 8051 符号,避免产生重复定义的错误。 BL51 , STARTUP.OBJ BL51 是 Keil 使用的链接器(Linker),这是命令行的使用格式,一般不用,使用 IDE 环境,用 project 管理,有相应的按钮 A51 STARTUP.A51 $NOMOD51 ;------------------------------------------------------------------------------ ; 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: ; ; ; ; To link the modified STARTUP.OBJ file to your application use the following ; BL51 invocation: ; ; ; 可以实现该功能. ;------------------------------------------------------------------------------ ; ; User-defined Power-On Initialization of Memory --- 初始化 RAM 单元 ; ; With the following EQU statements the initialization of memory ; at processor reset can be defined: ; ; IDATALEN ; XDATASTART ; the absolute start-address of IDATA memory is always 0 EQU 0H 和连接自己修改 XDATALEN EQU 0H ; the length of XDATA memory in bytes. EQU 80H ; the length of IDATA memory in bytes.---根据你选用的芯片可以适当的修改这些值 ; the absolute start-address of XDATA memory--以下两项根据目标系统的外设配置
0H 0H EQU EQU ; the length of PDATA memory in bytes. ; the absolute start-address of PDATA memory ; PDATASTART PDATALEN ; ; Notes: The IDATA space overlaps physically the DATA and BIT areas of the ; ; ;------------------------------------------------------------------------------ ; ; Reentrant Stack Initilization --注意的再入堆栈的方向区别的芯片自带的堆栈的生长方式,自顶向下生长的!而 SP 8051 CPU. At minimum the memory space occupied from the C51 run-time routines must be set to zero. 是是自底向上的! EQU EQU 0 EQU EQU 0 EQU EQU 0 functions and initialized it: ; set to 1 if large reentrant is used. ; set to 1 if small reentrant is used. 0FFH+1 ; set top of stack to highest location+1. 0FFFFH+1; set top of stack to highest location+1. --且再入堆栈是由编译器自己管理的,一般不必去关心,只是在有再入函数的时候,根据函数的存储器模式使用相应 ; 的 RAM 空间做为再入堆栈。 ; The following EQU statements define the stack pointer for reentrant ; ;Keil C 默认情况不是用堆栈来传递参数的,所以造成函数不可重入,Keil 要求用户显示声明函数是否具有可重入属性, 以便为 C 函数调用初始化栈。 ; Stack Space for reentrant functions in the SMALL model. IBPSTACK IBPSTACKTOP ; ; Stack Space for reentrant functions in the LARGE model. XBPSTACK XBPSTACKTOP ; ; Stack Space for reentrant functions in the COMPACT model. PBPSTACK PBPSTACKTOP ;不同内存模式下的堆栈。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 ; ; PPAGEENABLE ; 0FFFFH+1; set top of stack to highest location+1. ; set to 1 if compact reentrant is used. ; set to 1 if pdata object are used. in the linker invocation. EQU 0
EQU 0 DATA 0A0H ; SFR that supplies uppermost address byte ; define PPAGE number. PPAGE ; PPAGE_SFR ; 外部页面 RAM 的情况 ; 对 PPAGEENABLE 设置为 1 ,根据硬件连接修改 PPAGE 的值。 ;------------------------------------------------------------------------------ (most 8051 variants use P2 as uppermost address byte) 很多的外部页面寻址以 P2 口为高位地址的数值,有使用 ;关键字 DATA A51 伪指令定义单片机内部数据存储器字节地址的符号 DATA 0E0H ; Standard SFR Symbols ACC B SP DPL DPH DATA 0F0H DATA 81H DATA 82H DATA 83H NAME ?C_STARTUP ;定义当前程序模块的目标模块名 ?C_C51STARTUP SEGMENT CODE 段符号名在 BL51/L51 连接定位时用 ?STACK SEGMENT IDATA ;定义一个可再定位的段符号名和段所在的存储空间,汇编器产生的这个 ;定义一个 IDATA 段,段名?STACK ,符合 C51 编译器的命名规则 RSEG ?STACK DS 1 ;声明当前段是 IDATA 段,段中保留空间。 EXTRN CODE (?C_START) ;声明本模块引用的外部全局符号,用于和 C 相连接在.src 文件中可以看到这 PUBLIC ?C_STARTUP ;声明可被其他模块使用的全局符号,由.src 文件中可以看出这个符号的作用。 CSEG AT 0 ;结束当前的 IDATA 段,产生一个位于 CODE 中新段,起始地址是 0000H。代码段的 个符号 起始点 ?C_STARTUP: LJMP STARTUP1 ;C 编译器编译源程序后,芯片复位之后的复位代码第一个就是执行这条语 句。 RSEG ?C_C51STARTUP ;选择段名为?C_C51STARTUP 的 CODE 段为当前段,存储程序代码。 STARTUP1: IF IDATALEN <> 0 ;条件汇编指令,有 IDATA 区的话,清 IDATA 区。 MOV CLR IDATALOOP: R0,#IDATALEN - 1 A MOV @R0,A DJNZ R0,IDATALOOP ENDIF IF XDATALEN <> 0 XDATALEN 的区域清零 ;如果有外部数据区,则把外部数据区中从 XDATASTART 到 XDATASTART+ MOV MOV DPTR,#XDATASTART R7,#LOW (XDATALEN) IF (LOW (XDATALEN)) <> 0
MOV R6,#(HIGH (XDATALEN)) +1 ;如果低地址是零,一个高地址就代表 256 字节 ELSE ENDIF MOV R6,#HIGH (XDATALEN) A MOVX @DPTR,A DPTR CLR XDATALOOP: INC DJNZ R7,XDATALOOP DJNZ R6,XDATALOOP ENDIF IF PPAGEENABLE <> 0 ;清外部页 RAM 区域 MOV PPAGE_SFR,#PPAGE ;给 P2 口赋相应的值,根据用户自己的目标系统。 ENDIF IF PDATALEN <> 0 ;清外部页 RAM 区域 MOV MOV CLR PDATALOOP: INC DJNZ R7,PDATALOOP R0,#LOW (PDATASTART) R7,#LOW (PDATALEN) A MOVX @R0,A R0 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 EXTRN DATA (?C_XBP) ;函数是 Large 存储模式的时候,存储再入堆栈的区域。 ; MOV MOV ?C_XBP,#HIGH XBPSTACKTOP ?C_XBP+1,#LOW XBPSTACKTOP ENDIF IF PBPSTACK <> 0 EXTRN DATA (?C_PBP) ;函数是 Compact 模式的时候,存储再入堆栈栈顶地址的存储单元和栈的利用空间 ; MOV ?C_PBP,#LOW PBPSTACKTOP ENDIF MOV SP,#?STACK-1 ;定义的硬件栈的常数。区别再入堆栈和硬件栈。定义的段符号代表该段的首地址 ; This code is required if you use L51_BANK.A51 with Banking Mode 4 ; EXTRN CODE (?B_SWITCH0) ?B_SWITCH0 ; ; init bank mechanism to code bank 0 CALL LJMP ?C_START ;把执行的权力交给 C 主函数。
END
分享到:
收藏