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

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

3天内不再提示

单片机里的程序是如何运行?

汽车电子技术 来源:嵌入式悦翔园 作者: JamesBin 2023-02-17 10:47 次阅读

前言

我们想要理解单片机是如何运行程序的,我们首先需要了解单片机的组成,我们这里以80C51单片机为例来理解程序在单片机中是如何运行的。

单片机的组成

8051单片机的内部硬件结构包括:

  • 中央处理器CPU:它是单片机内部的核心部件,决定了单片机的主要功能特性,由运算器和控制器两大部分组成。
  • 存储器:8051单片机在系统结构上采用了哈佛型,将程序和数据分别存放在两个存储器内,一个称为程序存储器,另一个为数据存储器在物理结构上分程序存储器和数据存储器,有四个物理上相互独立的存储空间,即片内ROM和片外ROM,片内RAM和片外RAM。
  • 定时器/计数器(T/C):8051单片机内有两个16位的定时器/计数器,每个T/C既可以设置成计数方式,也可以设置成定时方式,并以其定时计数结果对计算机进行控制。
  • 并行I/O口:8051有四个8位并行I/O接口(P0~P3),以实现数据的并行输入输出。
  • 串行口:8051单片机有一个全双工的串行口,可实现单片机和单片机或其他设备间的串行通信
  • 中断控制系统:8051共有5个中断源,非为高级和低级两个级别它可以接收外部中断申请、定时器/计数器申请和串行口申请,常用于实时控制、故障自动处理、计算机与外设间传送数据及人机对话等。

单片机启动过程

单片机的启动过程是加电后,先运行芯片内部固有程序(这个程序是用户访问不到也改写不了的),即启动代码。启动代码程序建立完运行环境后,会去读串口状态,就是用户下载程序用到的各个端口,判断用户是否正在使用端口准备下载程序。

如果是,就按用户要求,把用户程序下载到指定地址上。如果不是,就跳转到已经下载过的用户程序入口,从而把芯片控制权交给用户程序。如果是新的芯片还没有下载过,那么就停留在读取串口状态的循环中。

启动代码通常都烧写在flash中,它是系统一上电就执行的一段程序,它运行在任何用户C代码之前。上电后,arm处理器处于arm态,运行于管理模式,同时系统所有中断被禁止,PC到地址0处取指令执行。

一个可执行映像文件必须有个入口点,而能放在rom起始处的映像文件的入口地址也必须设置为0。在汇编语言中,可以自行定义定义一个程序的入口点,当工程中有多个入口点时,需要在连接器中使用-entry指出程序的入口点。

如果用户创建的程序中,包含了main函数,则与C库初始化代码对应的也会有个入口点。总的来说,启动代码主要完成两方面的工作,一是初始化执行环境,例如中断向量表、堆栈、I/O等;二是初始化c库和用户应用程序。

在第一阶段,启动代码的过程可以描述为:

  • 建立中断向量表;
  • 初始化存储器;
  • 初始化堆栈寄存器
  • 初始化i/o以及其他必要的设备;
  • 根据需要改变处理器的状态。

PC电脑这些带系统的设备在上电时,和单片机处理过程差不多,只不过他们是读取的BIOS,有它完成了很多初始化操作,最后,调用系统的初始化函数,将控制权交给了操作系统,于是我们看到了Windows,Linux系统启动了。

如果将操作系统看作是在处理器上跑的一个很大的裸机程序(就是直接在硬件上跑的程序,因为操作系统就是直接跑在CPU上的),那么操作系统的启动很像MCU程序的启动。前者有一个很大的初始化程序完成很复杂的初始化,后者有一段不长的汇编代码完成一些简单的初始化。

如果是系统上的程序启动呢?它们是由系统来决定的,Linux上在shell下输入./p后,首先检查是否是一个内建的shell命令;如果不是,则shell假设他是一个可执行文件(Linux上一般是elf格式),然后调用一些相关的函数,将在硬盘上的p文件的内容拷贝到内存(DDR RAM)中,并建立一个它的运行环境(当然这里边还有内存映射,虚拟内存,连接与加载,等一些其他东西),准备执行。

由以上可知,单片机上的程序和平时在系统上运行的程序,在启动时差异是很大的,如果将程序调用main以前的动作,都抽象为初始化的话,程序的启动可以简化为:建立运行环境+调用main函数,这样程序的执行差异是不大的。

因为单片机上跑的程序(裸机程序),是和操作系统一样跑在硬件上的,它们属于一个层次的。过去之所以没有区分出单片机上的程序和PC机上的程序的一些差异,就是没有弄明白这一点。

程序的执行

关于程序在执行时,从哪里读取指令,哪里读取数据,也曾因为没有弄清楚系统上的程序和裸机程序之间的区别,而疑惑了很久。

单片机中一个程序的运行过程分为取指令,分析指令和执行指令几个步骤。

  • 取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。
  • 分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。
  • 计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。

虽然在《微型计算机原理》课上知道程序运行时,从内存中读取指令和数据进行执行和回写。但是单片机上只有几K的RAM,而flash一般有几十K甚至1M,这个时候指令和数据都在内存中吗?

这里指的内存仅指RAM,因为PC上我们常说的内存就是DDR RAM memory,先入为主以至于认为单片机上也是这样,还没有明白其实RAM和Flash都是内存。

这不可能,因为课上老师只说内存,但是PC上内存一般就是DDR RAM,不会是硬盘,硬盘是保存数据的地方;由此类比时,自己把自己弄晕菜了,单片机的RAM对应于DDR RAM,那Flash是不是就对应于硬盘了呢?在CSAPP上明白了,PC上之所以都在DDR RAM上,是速度的因素。

硬盘的速度太慢,即使是即将到来的SSD比起DDRRAM,还是差着几个数量级,所以拷贝到DDRRAM中。这时,一个程序的代码和数据是连续存放的,其中代码段是只读区域,数据段是可读写区域(这是由操作系统的内存管理机制决定的)。

运行时,再将它们拷贝到速度更快的SRAM中,以得到更快的执行速度。而对于,单片机而言工作频率也就几M,几十M,从Flash中与从RAM中读的差异可能并不明显,不会成为程序执行的瓶颈(而对于PC而言,Flash的速度太慢,DDRRAM的速度也是很慢,即使是SRAM也是慢了不少,于是再提高工作频率也提高不了程序的执行速度,所以现在CPU工作频率最快是在2003左右,一个瓶颈出现了。

举个例子

开机时,程序计算器PC变为0000H。然后单片机在时序电路作用下自动进入执行程序过程。执行过程实际上就是取出指令(取出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。

例如执行指令:MOV A,#0E0H,其机器码为74H E0H,该指令的功能是把操作数E0H送入累加器,0000H单元中已存放74H0001H单元中已存放E0H。当单片机开始运行时,首先是进入取指阶段,其次序是:

  • 程序计数器的内容(这时是0000H)送到地址寄存器;
  • 程序计数器的内容自动加1(变为0001H);
  • 地址寄存器的内容(0000H)通过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中;
  • CPU使读控制线有效;
  • 在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总线被送到指令寄存器。

多线程执行程序

为了提高CPU的使用率,换个角度想一下,既然不能减少一段程序的执行时间,就在同样的时间执行更多的程序,一个核执行一段程序,两个核就可以执行两段程序,于是多核CPU成为了现在的主流)。

所以裸机程序指令就在Flash(Flash memory)中存放,而数据就放在了RAM中(flash的写入次数有限制,同时它的速度和RAM还是差很多)。更广泛说,在单片机上RAM存放data段,bss段,堆栈段;ROM(EPROM,EEPROM,Flash等非易失性存储设备)存放代码,只读数据段。

本质上说,这和PC上程序都在RAM中存放是一样的,PC 上是操作系统规定了可读与可写,而单片机上是依靠不同的存储设备区分了可读与可写(当然现在的Flash是可读写的,如果Flash没有写入次数限制,速度又可以和RAM相差不多,单片机上是不是只要Flash就可以了呢(直接相当于PC上的DDRRAM)?这样成本也会比一个RAM,一个Flash低,更节省成本,对于生产商更划算)。

数据的存放与读取

对于单片机的程序执行时指令和数据的存放与读取,理解如下:

单片机编程后,程序的代码段,data段,bss段,rodata段等都存放在Flash中。当单片机上电后,初始化汇编代码将data段,bss段,复制到RAM中,并建立好堆栈,开始调用程序的main函数。

之后,便有了程序存储器,和数据存储器之分,运行时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据。RAM存在的意义就在于速度更快。

无论是单片机也好,PC也罢,存在的存储器金字塔都是一致的,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。应该说,对于它们的理解,就是存储器金字塔的理解。图片

结语

关于单片机程序的执行过程就给大家分享到这里,相信大家读了这篇文章后肯定会有一定的收获,如果这篇文章让你对程序的运行更深的理解,记得一键三连哦!

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

    关注

    6032

    文章

    44513

    浏览量

    632689
  • 程序
    +关注

    关注

    116

    文章

    3773

    浏览量

    80830
  • 80C51单片机
    +关注

    关注

    4

    文章

    34

    浏览量

    18306
收藏 人收藏

    评论

    相关推荐

    单片机程序设计(上)

    受到单片机可应对各种要求的能力。但是,如果要有效地运行单片机程序是不可或缺的,那么程序到底是如何运行
    发表于 09-12 10:58 3848次阅读
    <b class='flag-5'>单片机</b>与<b class='flag-5'>程序</b>设计(上)

    51单片机程序在proteus运行正常,下载到单片机无法运行怎么回事呢?

    51单片机程序在proteus运行正常,下载到单片机无法运行怎么回事呢?
    发表于 03-15 17:51

    单片机程序是如何运行的?

    我们在之前的四期中对利用单片机的功能进行程序设计进行了说明。单片机内置了非常便于使用的外设功能,大家一定也能感受到单片机可应对各种要求的能力。但是,如果要有效地
    发表于 02-24 07:53

    单片机音乐程序设计(含源程序)

    单片机音乐程序设计   随便找一个仿真或者什么单片机实验板,只要能工作的就行,将程序输入,
    发表于 05-15 23:25 1368次阅读
    <b class='flag-5'>单片机</b>音乐<b class='flag-5'>程序</b>设计(含源<b class='flag-5'>程序</b>)

    单片机程序的动态加密措施

    单片机的加密还要在程序运行上进行加密处理, 也就是程序的动态加密措施。
    发表于 06-01 14:59 2465次阅读

    单片机程序烧录工具集合

    单片机程序烧录工具集合单片机程序烧录工具集合单片机程序烧录工具集合
    发表于 12-28 15:34 101次下载

    详解单片机程序运行过程

    单片机上的程序和平时在系统上运行程序,在启动时差异是很大的(如果将程序调用main以前的动作,都抽象为初始化的话,
    发表于 10-31 14:09 9634次阅读

    怎么读取单片机程序_单片机程序是如何执行的_如何读懂单片机程序

    单片机又叫芯片,里面是有程序的。芯片里面的程序都是经过加密的,一般是读不出来的。但是可以破解出来,有加密自然就有解密。如果你想解密你手里的单片机,只需要在百度
    发表于 02-02 11:32 7.5w次阅读

    为什么单片机程序必须是死循环

    为何单片机程序必须是死循环?!!这个问题困扰了我好久,然而答案却是这个样子的!单片机没有操作系统,不像电脑有Windows,程序运行与结束
    发表于 07-05 17:41 0次下载
    为什么<b class='flag-5'>单片机</b>的<b class='flag-5'>程序</b>必须是死循环

    单片机的中断程序如何运行

    单片机的中断就是类似的一个过程,发生中断时,就会打断正在执行的主程序,先处理完中断任务,返回主程序继续运行,当然在执行中断函数之前,单片机
    的头像 发表于 01-27 17:11 1.1w次阅读
    <b class='flag-5'>单片机</b>的中断<b class='flag-5'>程序</b>如何<b class='flag-5'>运行</b>

    单片机的主程序和中断程序是怎么样运行

    过程,发生中断时,就会打断正在执行的主程序,先处理完中断任务,返回主程序继续运行,当然在执行中断函数之前,单片机需要把关键的数据保存下来,中断函数执行完成后才可以正确的恢复主函数
    的头像 发表于 01-04 10:11 1.4w次阅读
    <b class='flag-5'>单片机</b>的主<b class='flag-5'>程序</b>和中断<b class='flag-5'>程序</b>是怎么样<b class='flag-5'>运行</b>的

    单片机按键使用程序 (51单片机

    单片机独立按键使用程序 (51单片机)独立按键是单片机中很重要的一个器件,在这篇文章,通过这个用独立按键控制LED灯的小
    发表于 11-11 18:36 108次下载
    <b class='flag-5'>单片机</b>按键使用<b class='flag-5'>程序</b> (51<b class='flag-5'>单片机</b>)

    单片机学习笔记————51单片机实现在串口接收中断即时解析数据头的特殊程序框架

    单片机学习笔记————51单片机实现在串口接收中断即时解析数据头的特殊程序框架
    发表于 11-23 17:06 16次下载
    <b class='flag-5'>单片机</b>学习笔记————51<b class='flag-5'>单片机</b>实现在串口接收中断<b class='flag-5'>里</b>即时解析数据头的特殊<b class='flag-5'>程序</b>框架

    关于单片机程序的执行过程

    我们想要理解单片机是如何运行程序的,我们首先需要了解单片机的组成,我们这里以80C51单片机为例来理解程序
    发表于 10-12 15:02 4124次阅读

    80C51单片机程序是如何运行

    中央处理器CPU:它是单片机内部的核心部件,决定了单片机的主要功能特性,由运算器和控制器两大部分组成。
    发表于 12-28 15:53 1381次阅读