历史上的今天
返回首页

历史上的今天

今天是: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 , STARTUP.OBJ

; 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

推荐阅读

史海拾趣

Cretex Companies Inc公司的发展小趣事

随着公司实力的增强,Cretex开始将目光投向国际市场。他们积极参与国际电子展会,与全球各地的合作伙伴建立联系。通过引进国外先进的技术和管理经验,Cretex的产品质量和服务水平得到了进一步提升。同时,公司还针对不同国家和地区的市场需求,推出定制化的电子产品,赢得了更多客户的青睐。

Hisetec Electronic Co Ltd公司的发展小趣事

背景:随着全球化进程的加速,电子产品的供应链越来越复杂,国际合作成为必然趋势。Hisetec Electronic Co Ltd公司敏锐地洞察到这一点,开始实施国际化战略。

发展:公司首先在欧洲设立研发中心,与当地高校和科研机构合作,共同开发新技术。随后,又在亚洲多个国家和地区建立生产基地和销售网络,实现了全球范围内的资源配置和市场覆盖。通过这一系列举措,Hisetec公司不仅降低了生产成本,还提升了品牌知名度,实现了业务的高速增长。

Fractus公司的发展小趣事

为了加速技术的商业化进程,Fractus积极寻求与全球领先企业的合作。自2000年以来,公司陆续与多家知名手机厂商、电信运营商以及设备制造商建立了战略合作关系。这些合作不仅为Fractus带来了稳定的收入来源,也促进了其技术的广泛应用和持续改进。同时,Fractus还通过签订全球许可协议和建立战略伙伴关系,进一步拓展了其业务范围和市场影响力。

Astec [Astec America, Inc]公司的发展小趣事

面对数字化转型的大趋势,Astec也积极拥抱变革。公司加大了对信息技术和智能制造的投入,通过引入先进的生产管理系统和数据分析工具,提高了生产效率和产品质量。同时,Astec还积极探索新的商业模式和销售渠道,以适应数字化时代的市场需求。展望未来,Astec将继续坚持创新驱动的发展理念,不断推动公司在电子行业中的持续发展。

这五个故事基于Astec America, Inc在电子行业发展的主要阶段和事件进行编写,旨在客观描述公司的发展历程和重要成就。请注意,这些故事可能无法涵盖公司发展的所有细节,但能够提供一个大致的框架。

Corex Intervest Inc公司的发展小趣事

Corex Intervest Inc公司的创立,标志着电子行业中一颗新星的诞生。公司创始人凭借对电子技术的深刻理解和市场需求的敏锐洞察,决定投身于电子产品的研发和生产。在创立初期,公司面临着资金短缺、技术难题和市场竞争等多重挑战。然而,创始人凭借坚定的信念和不懈的努力,带领团队攻克了一个又一个难关,逐步在市场中站稳了脚跟。

Elpida Memory公司的发展小趣事

为了挽救Elpida Memory,日本政府采取了积极的援助措施。2009年,日本政府通过《产业再生法》修正案,向Elpida Memory提供了数百亿日元的公共资金和融资支持。这些资金帮助Elpida Memory度过了最困难的时期,并为其后续的重组和发展提供了有力的支持。

问答坊 | AI 解惑

Altium Designer:看FPGA如何连结上PCB!FPGA与PCB的协同设计方案

FPGA 与 PCB 的协同设计方案: 我们知道在 FPGA 功\\能开发完成后还须开发对应的功\\能电路板。在 PCB 设计中常常为了减少绕线、脚位互换并且能够与 FPGA 讯号脚位重新配置的相互配合而花费不少重复工作。到底要如何降低开发成本,减少设计时间与 ...…

查看全部问答>

求救: 如何做dock window??

请问如何在EVC中实现dock window。。即在窗口上停靠一个TAB CONTROL。。…

查看全部问答>

急!菜鸟询问有关pc端访问和复制ActiveSync同步下的文件?请各位高手帮帮忙啊!!

客户要求我写一个pc端访问ActiveSync同步下的My Picture 文件夹下的最新文件,并将其copy到pc端上,我是个初学者,有好多函数都不知道怎麽用,请各位高手指点一下本人,这个程序该如何下手阿…

查看全部问答>

嵌入式学习,嵌入式学习有哪些要素呢

学习,老师是非常关键的环节。对于嵌入式的学习当然也不例外。所以,在嵌入式的学习中,老师是很重要的要素之一。 嵌入式学习,挑选什么样的老师? 双师型老师。具体的来说,一方面,具备嵌入式的研发经验,有独立开发的项目和作品,在嵌入式行 ...…

查看全部问答>

求教:利用dos命令制作bat文件控制com口输出

各位朋友,鄙人急需用dos命令控制com输入输出的方法,还望不赐吝教。具体情况如下:     用于测试方面,欲在现有一批处理文件(误码率测定等)中追加信号发生器的控制信息,已知信号发生器的com口可用及相关命令,原考虑在其他界面语言 ...…

查看全部问答>

北京汽车研究总院有限公司诚招汽车电子相关领域人才

北京汽车研究总院有限公司是立足自主品牌汽车技术研发的企业,因项目需要,现急招汽车电子相关领域人才,基本要求如下: 1、本科及以上学历,汽车、电子、及其他专业有过相关项目经验,有工作经验优先。 2、熟悉基于飞思卡尔8位/16位单片机的软 ...…

查看全部问答>

资料寻找TW8817

不知哪位大哥有关于车载LCD芯片TW8817的资料可否发我邮箱一份,非常感谢!!!小弟邮箱:tangsx1984@126.com…

查看全部问答>

问一个51经485和电脑通信的问题

c51经过485-232口和pc连接   第一次调试   弄不出来 要求电脑上发一个数字   单片机返回一个数字   用的是串口助手    帮看看程序该怎么写吧 水平实在太差    没接触过  &nb ...…

查看全部问答>

SDRAM

                                 请问版主,ST会出支持SDRAM的M3 MCU吗?…

查看全部问答>