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

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

3天内不再提示

51单片机的启动代码里面都有哪些东西

GReq_mcu168 来源:头条号老马识途单片机 作者:头条号老马识途单 2022-05-31 17:08 次阅读

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

26cbb3de-de45-11ec-ba43-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个字节。

271f11a0-de45-11ec-ba43-dac502259ad0.jpg

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

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

273e8efe-de45-11ec-ba43-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的模式。

原文标题:单片机启动文件.s有什么作用

文章出处:【微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

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

    关注

    6001

    文章

    43973

    浏览量

    620804
  • 启动代码
    +关注

    关注

    0

    文章

    13

    浏览量

    9347
  • keil
    +关注

    关注

    68

    文章

    1196

    浏览量

    165290
  • 启动文件
    +关注

    关注

    0

    文章

    15

    浏览量

    2144

原文标题:单片机启动文件.s有什么作用

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    51单片机都有多少类型

    51单片机都有多少类型,怎么来学习?糊涂中,大神们 求解
    发表于 06-18 12:31

    PROTEUS 自带AD的51单片机

    PROTEUS里面有带AD的51单片机吗我在库里找不到自带AD的51单片机啊 AVR的就有最近想搞个东西
    发表于 02-06 09:43

    业余爱好,学51单片机还是STM32

    不是为了工作,我的工作和这个东西没有半毛钱关系,只是爱好而已,我有C的基础,网上买了个51单片机玩,看了一下LED灯的代码,后来又发挥了一些想象,觉得
    发表于 03-05 17:10

    51单片机代码改为PIC单片机代码

    51单片机代码如下:#include #define Gpbase0x7F00//感应模块地址 P2^7#define outportb(addr,d)XBYTE[addr]=d //写入addr
    发表于 08-21 20:36

    各位都用51单片机做过什么好玩的东西没?

    各位都用51单片机做过什么好玩的东西没。。给点建议,想在做的过程中更加的熟悉51单片机
    发表于 11-14 10:33

    单片机启动代码

    带你来看看单片机启动代码
    发表于 05-26 12:45

    探探51单片机的执行流程

    单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。若不是硬件特性已定的情况之下的其它流
    发表于 11-18 07:29

    stm32启动文件汇编代码相关指令都有哪些呢

    Stm32单片机启动文件到底做了什么呢?stm32启动文件汇编代码相关指令都有哪些呢?
    发表于 11-26 07:13

    2块51单片机之间的通信方式都有哪些?

    2块51单片机之间的通信方式都有哪些
    发表于 11-07 08:28

    51单片机与串口通信代码

    51单片机与串口通信的代码设计
    发表于 11-09 17:47 173次下载

    51单片机的程序执行流程是怎么样的

    单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。若不是硬件特性已定的情况之下的其它流
    发表于 08-19 17:31 2次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的程序执行流程是怎么样的

    51单片机启动代码究竟里面写了什么

    在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示:   keil创建新项目时,提示是否添加启动文件   一般情况下,需要选择“是”。当然,也可以选择不加。那么,这
    的头像 发表于 09-22 10:15 1785次阅读
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>启动</b><b class='flag-5'>代码</b>究竟<b class='flag-5'>里面</b>写了什么

    单片机启动代码

    。。。扯远了!其实电脑本身就是从单片机而来,那么单片机也是有启动代码的,只是我们绝大部分情况不去关心它。启动
    发表于 11-13 16:06 30次下载
    <b class='flag-5'>单片机</b>的<b class='flag-5'>启动</b><b class='flag-5'>代码</b>

    51单片机启动代码里面都有啥?

    关注+星标公众号,不错过精彩内容来源 |老马识途单片机在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示:keil创建新项目时,提示是否添加
    发表于 11-21 17:21 8次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>启动</b><b class='flag-5'>代码</b><b class='flag-5'>里面</b><b class='flag-5'>都有</b>啥?

    51单片机启动代码里面都写了啥?

    在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示:keil创建新项目时,提示是否添加启动文件一般情况下,需要选择“是”。当然,也可以选择不加。那么,这个
    发表于 11-23 18:06 16次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>的<b class='flag-5'>启动</b><b class='flag-5'>代码</b><b class='flag-5'>里面</b>都写了啥?