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有什么作用

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

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

    关注

    6032

    文章

    44514

    浏览量

    632929
  • 启动代码
    +关注

    关注

    0

    文章

    13

    浏览量

    9368
  • keil
    +关注

    关注

    68

    文章

    1211

    浏览量

    166677
  • 启动文件
    +关注

    关注

    0

    文章

    15

    浏览量

    2216

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

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

收藏 人收藏

    评论

    相关推荐

    51单片机应用实例及源代码

    51单片机应用实例及源代码
    发表于 12-16 12:15 107次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>应用实例及源<b class='flag-5'>代码</b>

    51单片机与串口通信代码

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

    基于51单片机的IIC 程序源代码

    基于51单片机的,IIC 程序,源代码
    发表于 11-16 19:04 62次下载

    基于STC51单片机的串口使用的程序源代码

    基于STC51单片机的串口使用的程序源代码
    发表于 11-16 19:12 50次下载

    基于STC51单片机的串口收发的源代码

    基于 STC51单片机的串口收发的源代码
    发表于 11-16 19:14 56次下载

    51单片机应用实例运用及源代码

    51单片机应用实例运用及源代码
    发表于 09-20 14:23 54次下载
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b>应用实例运用及源<b class='flag-5'>代码</b>

    入门51单片机需要准备什么东西

    本文档的主要内容详细介绍的是入门51单片机需要准备什么东西
    发表于 08-26 17:30 1次下载
    入门<b class='flag-5'>51</b><b class='flag-5'>单片机</b>需要准备什么<b class='flag-5'>东西</b>

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

    在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示:   keil创建新项目时,提示是否添加启动文件   一般情况下,需要选择“是”。当然,也可以选择不加。那么,这
    的头像 发表于 09-22 10:15 2061次阅读
    <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>写了什么

    C51单片机流水灯C代码

    C51单片机流水灯C代码
    发表于 11-05 15:20 34次下载
    C<b class='flag-5'>51</b><b class='flag-5'>单片机</b>流水灯C<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>都写了啥?

    基于51单片机的红外遥控舵机例程源代码

    基于51单片机的红外遥控舵机例程源代码
    发表于 05-16 11:16 14次下载

    基于51单片机的交通灯例程源代码

    基于51单片机的交通灯例程源代码
    发表于 05-16 11:14 20次下载

    基于51单片机的抢答器设计例程源代码

    基于51单片机的抢答器设计例程源代码
    发表于 05-12 16:24 30次下载