0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

51单片机的启动文件内容

Q4MP_gh_c472c21 来源:老马识途单片机 作者:老马识途单片机 2022-04-24 09:49 次阅读

在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示:

57708142-c2f5-11ec-bce3-dac502259ad0.jpg

keil创建新项目时,提示是否添加启动文件

一般情况下,需要选择“是”。当然,也可以选择不加。那么,这个启动文件的作用是什么?什么情况下需要加,什么情况下可以不加?

今天我们就来详细了解一下这个启动文件的内容,看明白这个内容后,我们就会有种恍然大悟的感觉:“哦,原来是这样啊!”

启动代码第一段

▼以下是启动代码原文第一段:

$NOMOD51;------------------------------------------------------------------------------;  This file is part of the C51 Compiler package;  Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.;  Version 8.01;;  *** <<< Use Configuration Wizard in Context Menu >>> ***;------------------------------------------------------------------------------;  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;  Lx51 invocation:;;     Lx51 your object file list, STARTUP.OBJ  controls;;------------------------------------------------------------------------------;;  User-defined  Power-On Initialization of Memory;;  With the following EQU statements the initialization of memory;  at processor reset can be defined:;;  IDATALEN: IDATA memory size <0x0-0x100>;      Note: The absolute start-address of IDATA memory is always 0;            The IDATA space overlaps physically the DATA and BIT areas.IDATALEN        EQU     80H;;  XDATASTART: XDATA memory start address <0x0-0xFFFF> ;      The absolute start address of XDATA memoryXDATASTART      EQU     0     ;;  XDATALEN: XDATA memory size <0x0-0xFFFF> ;      The length of XDATA memory in bytes.XDATALEN        EQU     0      ;;  PDATASTART: PDATA memory start address <0x0-0xFFFF> ;      The absolute start address of PDATA memoryPDATASTART      EQU     0H;;  PDATALEN: PDATA memory size <0x0-0xFF> ;      The length of PDATA memory in bytes.PDATALEN        EQU     0H;;

以下是启动代码第一段的翻译:

不使用预先定义的SFR。就是告诉汇编器不使用预定义的寄存器名,因为汇编器内部定义了51的寄存器名,但在实际使用时会用51的扩展芯片例如52之类的,如果包含了52的头文件就会出现重复定义所以要先声明一下不适用汇编器内部定义的寄存器名。

这个文件是C51编译器包的一部分

版权所有(c) 1988-2005 Keil Elektronik GmbH和Keil Software, Inc。

版本8.01

*** <<使用上下文菜单中的配置向导>>> ***

----------------------------------------------------

STARTUP.A51里面的代码在处理器复位后执行

用下面的命令行语句调用A51进行编译产生目标文件,

A51 STARTUP.A51

用下面的命令行语句调用BL51连接器把STARTUP.OBJ目标文件连接到程序代码中,

Lx51 invocation:

Lx51调用

---------------------------------------------------

Lx51 调用目标文件列表, 由STARTUP.OBJ 目标文件控制

用户自定义上电后需要初始化的储存区域(初始化RAM区的数据)

在处理器复位时通过下列EQU伪指令来初始化内存(RAM单元)

IDATALEN:IDATA存储区的大小<0-256>,可以根据自己的选择修改

IDATA绝对的起始地址总是0

IDATA区涵盖DATA和BIT区(DATA区(直接寻址区)以及 BIT区 (位寻址区)),;至少要保证与C51编译器运行库有关的存储器的空间进行0初始化

XDATA存储区的起始地址<0x0-0xFFFF>

XDATA内存的绝对起始地址。

XDATA存储器空间的绝对起始地址为0,

XDATA空间的大小

XDATA空间的长度以字节为单位

说明xdata的字节数清0,该值默认为0

PDATA空间的大小

PDATA存储器的空间的绝对起始地址

需用0进行初始化的PDATA存储器的空间字节数

在51系列中data、idata、xdata、pdata的区别:

  • data:固定指前面0x00-0x7f的128个RAM。

  • idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。

  • xdata:外部扩展RAM,一般指外部0x0000-0xffff空间。

  • pdata:外部扩展RAM的低256个字节。

57893700-c2f5-11ec-bce3-dac502259ad0.jpg

需用0进行初始化的IDATA存储器空间的字节数,IDATALEN只是一个标号(与IDATA不一样哦),EQU只是做宏一样的替换,类似于C语言中的#define uint (unsigned int),以上的代码使得程序以后在碰到IDATALEN时替换成80H。

IDATALEN可以定义为你自己喜欢的名字如MyDataLen等。之所以用IDATALEN,一是为了好记,二是为了表明和IDATA有关。

579e528e-c2f5-11ec-bce3-dac502259ad0.jpg

各种常数名及其含义

启动代码第二段

我们继续来看看51单片机的启动代码里面都有哪些东西。

下面先列出51单片机启动代码第二部分的原文:


;------------------------------------------------------------------------------;; Reentrant Stack Initialization;;  The following EQU statements define the stack pointer for reentrant;  functions and initialized it:;;  Stack Space for reentrant functions in the SMALL model.;   IBPSTACK: Enable SMALL model reentrant stack;      Stack space for reentrant functions in the SMALL model.IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.;   IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>;      Set the top of the stack to the highest location.IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  ; ;;  Stack Space for reentrant functions in the LARGE model.      ;   XBPSTACK: Enable LARGE model reentrant stack;      Stack space for reentrant functions in the LARGE model.XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.;   XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>;      Set the top of the stack to the highest location.XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 ; ;;  Stack Space for reentrant functions in the COMPACT model.    ;   PBPSTACK: Enable COMPACT model reentrant stack;      Stack space for reentrant functions in the COMPACT model.PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.;;    PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>;      Set the top of the stack to the highest location.PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  ; ;

原文全是伪指令、宏定义这些东东,看起来确实很头疼啊。我们简单的翻译一下吧。

以下是第二段启动代码翻译:

再入函数模拟初始化;

以下用EQU指令定义了再入函数模拟堆栈指针的初始化;

使用SMALL存储器模式时再入函数的堆栈空间;

IBPSTACK EQU 0 ; 使用SMALL存储器模式再入函数时将其设置成1;

IBPSTACKTOP EQU 0FFH+1 ; 将堆栈顶设置为最高地址+1;

使用LARGE存储器模式时再入函数的堆栈空间;

XBPSTACK EQU 0 ; 使用LARGE存储器模式再入函数时将其设置成1;

XBPSTACKTOP EQU 0FFFFH+1; 将堆栈顶设置为最高地址+1;

使用COMPACT存储器模式时再入函数的堆栈空间;

PBPSTACK EQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1;

PBPSTACKTOP EQU 0FFFFH+1; 将堆栈顶设置为最高地址+1。

三种模式解析

这里提到了SMALL,LARGE,COMPACT三种模式。这三种模式究竟有什么含义呢?我们下面就来了解一下。

不同内存模式下的堆栈。Keil 编译器中有三种模式设置。这是由51处理器繁多的寻址模式导致的,不同的寻址模式有不同的效率。

small模式:在small模式中,所有默认变量均装入单片机内部的RAM中,51单片机默认内部RAM只有128B;52单片机默认256B。该模式下的优点是访问速度快,缺点是空间有限。

compact模式:在compact模式中,所有默认变量均位于单片机的256B RAM中,和在small模式中使用关键字 pdata来定义数据变量的效果一样,在该模式下程序总变量空间不能超过256B。

large模式:在large模式中,所有默认变量可放在多达64KB的RAM中,包括内部RAM和外部RAM,这和使用关键字xdata 来定义变量的效果一样。

  • small:变量存储在内部ram里。

  • compact:变量存储在外部ram里,使用页8位间接寻址。

  • large:变量存储在外部Ram里,使用16位间接寻址。

我们一般使用small来存储变量,就是说单片机优先把变量存储在内部ram里,如果内部ram不够了,才会存到外部去。

compact的方式要自己通过程序来指定页的高位地址,编程比较复杂,如果外部ram很少,只有256个字节,那么对该256个字节的读取就比较快。如果超过256字节,那么要不断地进行切换的话,就比较麻烦。compact模式适用于比较少的外部ram的情况。

large模式,是指变量会优先分配到外部ram里。

3种存储方式都支持内部256字节和外部64k字节的ram。区别是变量的优先(或默认)存储在哪里的区别。除非你不想把变量存储在内部ram,才使用后面的compact、large模式。因为变量存储在内部ram里,运算速度比存储在外部ram要快的多,大部分的应用都是选择Small的模式。

END

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 51单片机
    +关注

    关注

    269

    文章

    5648

    浏览量

    120638
  • 编译器
    +关注

    关注

    1

    文章

    1569

    浏览量

    48598
  • 变量
    +关注

    关注

    0

    文章

    593

    浏览量

    28103

原文标题:51单片机的启动代码里面都有啥?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    stm32和51单片机的区别

    stm32和51单片机的区别 随着单片机的发展,市场上出现了很多种类和品牌的单片机,其中STM32和51
    发表于 11-20 13:18

    32单片机51单片机的功能差异是什么?

    32单片机51单片机功能差在哪些方面
    发表于 10-31 06:19

    51单片机可以加文件系统吗?

    51单片机可以加文件系统么
    发表于 10-13 07:46

    单片机原理及应用详解

    单片机应用系统设计中的抗干扰技术以及各种新器件也作了详细的介绍。本文件突出了选取内容的实用性、典型性。文件中的应用实例,大多来自科研工作及教学实践,且经过检验,
    发表于 09-25 07:02

    51单片机可以读取nandflash内容吗?

    请问单片机可以软件读取这个flash内容
    发表于 09-25 06:39

    51单片机怎么使用文件系统?

    有没有适合51单片机文件系统,用sd卡读取根目录下一个文件就行
    发表于 09-21 08:22

    浅析STM32单片机启动文件

    今天来总结的stm32基础知识是启动文件相关。要想对是stm32单片机有个深入的理解,那么启动文件就是一个绕不过去的坎。
    发表于 06-12 16:49 964次阅读
    浅析STM32<b class='flag-5'>单片机</b>的<b class='flag-5'>启动</b><b class='flag-5'>文件</b>

    单片机启动文件.s有什么作用?

    在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示。
    发表于 06-05 12:24 607次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>启动</b><b class='flag-5'>文件</b>.s有什么作用?

    基于AT89C51单片机按键发音仿真及代码文件

    基于AT89C51单片机按键发音仿真及代码文件
    发表于 05-04 15:43 3次下载

    51单片机计时器#单片机

    单片机51单片机
    jf_51133201
    发布于 :2023年04月28日 22:26:24

    基于51单片机的1602遥控解码设计资料源程序文件

    基于51单片机的1602遥控解码设计资料源程序文件
    发表于 04-27 15:21 2次下载

    基于51单片机的LED左右闪灯实验设计资料源程序文件

    基于51单片机的LED左右闪灯实验设计资料源程序文件
    发表于 04-27 15:10 0次下载

    基于51单片机的串口测试程序设计资料源程序文件

    基于51单片机的串口测试程序设计资料源程序文件
    发表于 04-27 15:05 0次下载

    基于51单片机的串口通讯测试设计资料源程序文件

    基于51单片机的串口通讯测试设计资料源程序文件
    发表于 04-26 18:19 1次下载

    基于51单片机的继电器控制设计资料源程序文件

    基于51单片机的继电器控制设计资料源程序文件
    发表于 04-26 15:29 4次下载