历史上的今天
今天是:2024年09月23日(星期一)
2020年09月23日 | 51单片机keil提供的启动代码解析(STARTUP.A51)
2020-09-23 来源:eefocus
1.由Keil C生成的启动代码
程序清单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 //如果有外部数据区,则把外部数据区中从XDATASTART到XDATASTART+ XDATALEN的区域清零 //由于51的储存区类型和编译模型比较多,下面的代码就是根据不同的配置把相应的区域清零 IF XDATALEN <> 0 MOV DPTR,#XDATASTART MOV R7,#LOW (XDATALEN) IF (LOW (XDATALEN)) <> 0 MOV R6,#(HIGH (XDATALEN)) +1 ELSE MOV R6,#HIGH (XDATALEN) ENDIF CLR A XDATALOOP: MOVX @DPTR,A INC DPTR DJNZ R7,XDATALOOP DJNZ R6,XDATALOOP ENDIF IF PPAGEENABLE <> 0 MOV PPAGE_SFR,#PPAGE ENDIF IF PDATALEN <> 0 MOV R0,#LOW (PDATASTART) MOV R7,#LOW (PDATALEN) CLR A PDATALOOP: MOVX @R0,A INC R0 DJNZ R7,PDATALOOP ENDIF IF IBPSTACK <> 0 EXTRN DATA (?C_IBP) MOV ?C_IBP,#LOW IBPSTACKTOP ENDIF IF XBPSTACK <> 0 EXTRN DATA (?C_XBP) MOV ?C_XBP,#HIGH XBPSTACKTOP MOV ?C_XBP+1,#LOW XBPSTACKTOP ENDIF IF PBPSTACK <> 0 EXTRN DATA (?C_PBP) 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) ; CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
上一篇:51单片机堆栈的分析
下一篇:串口的工作方式
史海拾趣
|
Altium Designer:看FPGA如何连结上PCB!FPGA与PCB的协同设计方案 FPGA 与 PCB 的协同设计方案: 我们知道在 FPGA 功\\能开发完成后还须开发对应的功\\能电路板。在 PCB 设计中常常为了减少绕线、脚位互换并且能够与 FPGA 讯号脚位重新配置的相互配合而花费不少重复工作。到底要如何降低开发成本,减少设计时间与 ...… 查看全部问答> |
|
急!菜鸟询问有关pc端访问和复制ActiveSync同步下的文件?请各位高手帮帮忙啊!! 客户要求我写一个pc端访问ActiveSync同步下的My Picture 文件夹下的最新文件,并将其copy到pc端上,我是个初学者,有好多函数都不知道怎麽用,请各位高手指点一下本人,这个程序该如何下手阿… 查看全部问答> |
|
学习,老师是非常关键的环节。对于嵌入式的学习当然也不例外。所以,在嵌入式的学习中,老师是很重要的要素之一。 嵌入式学习,挑选什么样的老师? 双师型老师。具体的来说,一方面,具备嵌入式的研发经验,有独立开发的项目和作品,在嵌入式行 ...… 查看全部问答> |
|
各位朋友,鄙人急需用dos命令控制com输入输出的方法,还望不赐吝教。具体情况如下: 用于测试方面,欲在现有一批处理文件(误码率测定等)中追加信号发生器的控制信息,已知信号发生器的com口可用及相关命令,原考虑在其他界面语言 ...… 查看全部问答> |
|
北京汽车研究总院有限公司是立足自主品牌汽车技术研发的企业,因项目需要,现急招汽车电子相关领域人才,基本要求如下: 1、本科及以上学历,汽车、电子、及其他专业有过相关项目经验,有工作经验优先。 2、熟悉基于飞思卡尔8位/16位单片机的软 ...… 查看全部问答> |
|
c51经过485-232口和pc连接 第一次调试 弄不出来 要求电脑上发一个数字 单片机返回一个数字 用的是串口助手 帮看看程序该怎么写吧 水平实在太差 没接触过 &nb ...… 查看全部问答> |




