程序在单片机中是如何运行程序的?|星标

要想理解单片机是如何运行程序的,首先需要了解单片机的组成。因为单片机上跑的程序(裸机程序),是和操作系统一样跑在硬件上的,它们属于一个层次的。然后单片机在时序电路作用下自动进入执行程序过程。对单片机编程后,程序的代码段,data段,bss段,rodata段等都存放在Flash中。

您想了解的人工智能资讯第一时间传递

程序在单片机中是如何运行程序的?|星标

1 简介

要了解微控制器如何运行程序,首先需要了解微控制器的组成。 本文以80C51单片机为例,告诉大家程序在单片机中是如何运行的。

程序在单片机中是如何运行程序的?|星标

2、单片机的组成

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

3 单片机启动流程

单片机的启动过程是,上电后,首先运行芯片内部的固有程序(该程序用户无法访问或改写),即启动代码。 启动代码程序建立运行环境后,会读取串口状态,即用户下载程序所使用的各个端口,以确定用户是否正在使用该端口准备下载程序。

如果有,则根据用户的请求将用户程序下载到指定地址。 如果没有,则跳转到下载的用户程序入口,从而将芯片控制权交给用户程序。 如果新芯片还没有下载,则一直停留在读取串口状态的循环中。

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

一个可执行的映像文件必须有一个入口点,并且可以放在rom开头的映像文件的入口地址也必须设置为0。在汇编语言中,可以自己定义程序的入口点。 当项目中有多个入口点时,需要在连接器中使用-entry来表示程序的入口点。

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

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

PC等带有系统的设备在开机时,处理过程与微控制器类似,只是读取BIOS并完成许多初始化操作。 最后,调用系统的初始化函数,并将控制权交给操作员。 系统,于是我们看到Windows和Linux系统都启动了。

如果把操作系统想象成一个运行在处理器上的大型裸机程序(也就是直接运行在硬件上的程序,因为操作系统直接运行在CPU上),那么操作系统的启动就是很像MCU的启动程序。 前者有庞大的初始化程序来完成非常复杂的初始化,后者有简短的汇编代码来完成一些简单的初始化。

如果系统上的某个程序启动了怎么办? 它们是由系统决定的。 Linux的shell中输入./p后,首先检查是否是shell内置命令; 如果不是,shell就假定它是一个可执行文件(Linux上一般为elf格式),然后调用一些相关函数将硬盘上的p文件内容复制到内存(DDR RAM),并建立运行环境对于它(当然还有内存映射、虚拟内存、连接和加载等等其他东西),准备执行。

从上面可以看出,单片机上的程序和平时系统上运行的程序在启动时有很大的不同。 如果将程序调用main之前的动作抽象为初始化,则程序的启动可以简化为:设置并运行环境+调用main函数,程序的执行没有太大区别。

由于单片机上运行的程序(裸机程序)与操作系统运行在同一硬件上,因此属于同一级别。 以前我们之所以没有区分单片机上的程序和PC上的程序的一些区别,就是因为不了解这一点。

4. 程序执行

关于程序执行时从哪里读取指令、从哪里读取数据,我困惑了很长一段时间,因为我不明白系统上的程序和裸机程序的区别。

程序在单片机中的运行过程分为几个步骤:取指令、分析指令和执行指令:

虽然我们在《微机原理》课上知道,程序运行时,会从内存中读取指令和数据来执行并写回。 但单片机上的RAM只有几K,而flash通常有几十K甚至1M。 这时,指令和数据都在内存中了吗?

这里所说的内存仅指RAM,因为我们在PC上常指的内存就是DDR RAM内存。 我们先入为主地认为微控制器也是如此,我们还没有理解RAM和Flash都是存储器。

这是不可能的,因为老师在课堂上只讲内存,但PC上的内存通常是DDR RAM,而不是保存数据的硬盘。 当进行这种比较时,我很困惑。 单片机的RAM对应DDR RAM,那么Flash对应硬盘吗? 我在CSAPP上找到了答案。 PC 使用 DDR RAM 的原因是速度。

硬盘速度太慢。 即便是即将推出的SSD,仍然落后DDRRAM几个数量级,因此被复制到DDRRAM上。 此时,程序的代码和数据是连续存储的,代码段为只读区域,数据段为读写区域(这是由操作系统的内存管理机制决定的)。

运行时,它们被复制到更快的SRAM以获得更快的执行速度。 对于微控制器来说,工作频率只有几Mbit或几十Mbit。 从Flash读取和从RAM读取的区别可能并不明显,也不会成为程序执行的瓶颈。 对于PC来说,Flash太慢了,DDRRAM也很慢,甚至SRAM也慢得多。 因此,提高工作频率并不能提高程序的执行速度。 因此,现在最快的CPU工作频率是在2003年左右,出现了瓶颈。

5 举个例子

打开后,程序计算器 PC 变为 0000H。 然后单片机在时序电路的作用下自动进入执行程序过程。 执行过程实际上是一个取指令(取之前存储在内存中的指令)和执行指令(分析并执行指令)的循环过程。

例如,执行指令:MOV A,#0E0H,其机器码为74H E0H。 该指令的作用是将操作数E0H送至累加器。 74H已存储在单元0000H中,E0H已存储在单元0001H中。 当单片机开始运行时,首先进入取指令阶段,其顺序为:

6 多线程执行程序

为了提高CPU的使用率,就要从另一个角度来思考。 由于程序的执行时间无法减少,因此可以同时执行更多的程序。 一个核心执行一个程序,两个核心可以执行两个程序。 所以多核CPU已经成为现在的主流。

因此,裸机程序指令存放在Flash(闪存)中,数据则放在RAM中(Flash的写入次数有限,其速度与RAM还是有很大差距)。 更广泛地说,在微控制器上,RAM存储数据段、bss段和堆栈段; ROM(EPROM、EEPROM、Flash等非易失性存储器件)存储代码和只读数据段。

本质上,这与 PC 上的程序存储在 RAM 中相同。 在PC上,操作系统规定了可读性和可写性,而在微控制器上,则通过不同的存储设备来区分可读性和可写性。

当然,今天的Flash是可读写的。 如果Flash没有写入次数限制,而且速度可以和RAM差不多,那么单片机是不是就只需要Flash了(直接相当于PC上的DDRRAM)? 这样成本会比RAM或者Flash更低,对厂商来说更划算,更划算。

7 数据存储与读取

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

对单片机进行编程后,程序的代码段、数据段、bss段、rodata段等都存储在Flash中。 当单片机上电时,初始化汇编代码将数据段和bss段复制到RAM,建立堆栈,并开始调用程序的主函数。

之后是程序存储器和数据存储器。 在运行时,从Flash(即指令存储器、代码存储器)读取指令,从RAM读取和写入数据。 RAM 的目的是更快。

无论是微控制器还是PC,现有的内存金字塔都是一样的。 速度因素和成本限制导致一级更快的存储器速度更快,成本更高。 应该说,对它们的理解就是对记忆金字塔的理解。

程序在单片机中是如何运行程序的?|星标

单片机

使用单片机如何实现~10V的信号输出?

2024-2-10 11:03:55

单片机

单片机最小系统原理图是什么?单片机的IO口寄存器

2024-2-10 12:01:46

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索