2021-05-28

article/2025/8/30 6:43:09

嵌入式--深入理解单片机(一)单片机程序是如何运行起来的以及单片机的ROM和RAM

目录

  • 一、两种处理器的结构体系
    • 1、哈佛结构体系(Harvard architecture)
    • 2、冯·诺依曼结构体系
    • 3、两种结构的总结
        • 哈佛结构的优势
        • 冯·诺依曼结构的优势
        • 当前很多芯片都是混合结构
  • 二、单片机程序的内存分配
  • 三、单片机程序和操作系统应用程序的对比
  • 四、单片机程序使用其他语言编写写:Python,lua

一、两种处理器的结构体系

1、哈佛结构体系(Harvard architecture)

在这里插入图片描述

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。

 目前使用哈佛结构的中央处理器和微控制器有很多,除了上面提到的Microchip公司的PIC系列芯片,还有:

  • ATMEL:AVR系列
  • ARM:ARM9、ARM10和ARM11,Cortex-M3系列,Cortex-M4系列
  • Interl:51系列内核
  • Microchip:PIC系列

2、冯·诺依曼结构体系

在这里插入图片描述

冯·诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。

 目前使用冯·诺伊曼结构的中央处理器和微控制器有很多。除了上面提到的英特尔公司的8086,还有:

  • Interl:其他中央处理器
  • ARM:Cortex-A、Cortex-M0和ARM7
  • MIPS:MIPS处理器
  • Ti:MSP430系列

3、两种结构的总结

哈佛结构和冯.诺依曼结构都是一种存储器结构。哈佛结构是将指令存储器和数据存储器分开的一种存储器结构;而冯.诺依曼结构将指令存储器和数据存储器合在一起的存储器结构。

哈佛结构的优势

 使用冯·诺依曼结构的计算机–程序和数据区域在同一个存储器上它们物理上是连续的,即程序空间不封闭,程序空间的数据在运行时理论上是可以被修改,此外程序一旦跑飞也有可能运行到数据区,虽然都是一些不常见的特殊情况下。

 但是哈佛结构的计算机在这些情况下是怎样的呢?基于哈佛结构的处理器入MCS-51,不需要可以对代码段进行写操作的指令,所以不会有代码区被改写的问题;程序只能在封闭的代码区中运行,不可能跑到数据区,这也是跑飞的几率减少并且跑飞后的行为有规律(数据区的数据是不断变化的而代码区是不变的)。所以,相对于冯·诺依曼结构,哈佛结构更加适合于那些程序固化、任务相对简单的控制系统。

 哈佛结构采用数据存储器与程序代码存储器分开,各自有自己的数据总线与地址总线。但这是需要CPU提供大量的数据线,因而很少使用哈佛结构作为CPU外部构架来使用。但是对于CPU内部,通过使用不同的数据和指令cache,可以有效的提高指令执行的效率,因而目前大部分计算机体系都是CPU内部的哈弗结构+CPU外部的冯·诺伊曼的结构。

冯·诺依曼结构的优势

待续

当前很多芯片都是混合结构

二、单片机程序的内存分配

统称具体实际的硬件器件
ROMFlash、EEPROM、NANDFlash、EMMC、SD卡、TF卡
RAMSRAM、DRAM、SDRAM、DDR、DDR2、DDR3、DDR4

 单片机程序在编译、链接之后会生成hex文件,通过下载工具烧录到芯片内部的ROM里面去,由于单片机的工作特性,所以一般单片机内部ROM都是NOR Flash,NOR Flash具有寻址功能可以在上面运行程序。下图就是通过单片机下载工具烧录到单片机Flash里面去之后的Flash空间区域分布图:

单片机hex文件在Flash上的数据区域分布其中:

  • Code:为程序代码部分
  • Ro-data: 表示程序定义的常量(const修饰的常量、#define 宏定义等);
  • Rw-data: 表示已初始化的全局变量
  • Zi-data: 表示未初始化的全局变量(Zi-data可以表示RAM未上电时整个区域的状态,或者上电初始化之后未被使用的区域,上表仅仅描述的是ROM区域的空间分布)

而栈区(stack)、堆区(heap)、全局区(静态区)(static)、文字常量区和程序代码区和上面所介绍的Code、Ro-data等的关系。

  • 1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也就是单片机的sram中。
  • 2、堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。可以理解,这些也是被包含在单片机的sram中的。
  • 3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,和stack、heap一样,被包含在RAM中。
  • 4、文字常量区:常量字符串就是放在这里的。这些数据是只读的,分配在Ro-data(只读数据存储区),则被包含在flash中。
  • 5、程序代码区:存放函数体的二进制代码,可以想象也是被包含在flash,因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中。

下图是初始化之前的ROM和RAM中的数据分布:

  • 1、未初始化之前的RAM里面所有区域都是随机的值即:Zi-data
    在这里插入图片描述

下图是初始化之后的ROM和RAM中的数据分布:

  • 1、初始化的时候会由Boot程序(进入main函数之前)拷贝Flash里面的Rw-data区域到RAM
    在这里插入图片描述

下图是初始化之后正常运行时,单片机内ROM和RAM区域分布图:

  • 上电初始化之后Flash的Rw-data就不会再使用了,除非重新上电、复位了boot才会重新从ROM(Flash)中拷贝Rw-data区域到RAM中去。
  • 运行时,根据上一节对哈佛模型的描述(51内核、Cortex-M3、Cortex-M4是哈佛模型),程序存储区对应ROM(Flash)数据存储区对应RAM,如此这般两个区域就是物理上的分开的–经典的哈佛模型。

在这里插入图片描述

三、单片机程序和操作系统应用程序的对比

操作系统应用程序描述对应单片机程序
BSS段–.bss未初始化的全局变量、静态变量,一旦初始化就回收,并转存到数据段之中Zi-data
代码段–.code代码,程序结束的时候系统会自动回收存储在代码段中的数据,内存区域较小Code
数据段–.data已经初始化的全局变量、静态变量,直到程序结束的时候才会被回收Rw-data (global/static)
堆–.heap动态分配内存,alloc出来的对象,需要程序员进行内存管理Rw-data (heap)
栈–.stack局部变量,自动分配内存,当局部变量的作用域执行完毕之后就会被系统立即回收Rw-data (stack)

四、单片机程序使用其他语言编写写:Python,lua

 很多有精力的开发者似乎不喜欢C语言开发单片机程序,或者是觉得使用C语言不够酷吧,所以开发了很多使用语法简单的编程语言如:Python、lua等脚本语言来编写单片机程序的项目:

  • Python:MicroPython(STM32F4,ESP32,K210)
  • Lua:NodeMCU(ESP8266)

C源程序-->预编译处理(.c)-->编译、优化程序(.s、.asm)-->汇编程序(.obj、.o、.a、.ko)-->链接程序(.exe、.elf、.axf等)


http://chatgpt.dhexx.cn/article/PGsNKNEK.shtml

相关文章

冯诺依曼结构和哈佛结构

参考资料: 全面理解冯诺依曼结构和哈佛结构 CPU采用的是哈佛结构还是冯诺依曼结构? 0. 前言 哈佛结构和冯诺依曼结构都是针对于CPU来说的。 1. 冯诺依曼结构 冯诺伊曼结构又称为普林斯顿体系结构,是一种将程序存储器和数据存储器合并在一起…

哈佛结构和冯·诺依曼结构的区别

哈佛结构 (英语:Harvard architecture)是一种将程序指令储存和数据储存分开的存储器结构。中央处理器首先到程序指令储存器中读取程序指令内容,解码后得到数据地址,再到相应的数据储存器中读取数据,并进行下一步的操作&#xff08…

~isnan函数

一直不明白~的意思,现在实现一把 才知道表示非的意思

isNaN函数的使用方法

isNaN() 函数用于检查其参数是否是非数字值。

c 语言isnan函数,_isnan, _isnanl

_isnan, _isnanl:判断浮点数为 NAN (不是数,Not a Number) int _isnan(double x); int _isnanl(long double x); #include std x:浮点数 ≠0: 参数 x 是 NAN 0: 参数 x 不是 NAN void __fastcall TForm1::Button1Click(TObject *Sender) { d…

JavaScript中的isNaN函数

在ECMAScript中有一个isNaN()函数,再说这个函数之前,会先说一下NaN: (1)NaN:非数值(not a number),是一个特殊的数值,用来表示本来要返回数值的操作数未返回数值的情况。在ECMAScript中&#xf…

Spring学习---(一)原理理解-llt

Spring学习—(一)原理理解-llt 1.IOC控制反转: ​ 由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴…

matlab lltsa函数,【每日一策】Matlab量化交易策略之 LLT原始

策略思路: LLT择时模型,低延迟趋势线,利用最近20个LLT指标数值,大部分LLT呈现上涨(斜率为正),做多;大部分下跌(斜率为负),做空;反向出场。 回测曲线(由Auto-Trader提供回测报告)&…

matlab lltsa函数,带平方根的(LLT)Cholesky算法分解对称正定矩阵 c语言实现 - 数学 - 小木虫 - 学术 科研 互动社区...

xiuyouxu 建议找一本数值分析的书看一下,里面有具体的算法,我以前实现过,其他语言的,没有用c语言做过. 舒马诺 引用回帖: xiuyouxu at 2012-05-03 21:28:11: 建议找一本数值分析的书看一下,里面有具体的算法,我以前实现过,其他语言的,没有用c语言做过. # include # include v…

python 趋势线计算式_LLT指标-低延迟趋势线对中证500的python复现过程

大家好,我是上海大侠 看了半个小时的研报和视频,对具体实现过程含糊其辞,表述不清,模糊重点,甚至还有多处写错 本着知识开源的想法,我将我的探索过程公开,以期给同样在这条路上摸索的朋友节省一点走弯路的力气 废话先不多讲,我是个喜欢在本地数据上运行代码的男人,因为…

根据《LLT低延迟趋势线与交易性择时 短线择时策略研究》的python模型 策略开发

《低延迟趋势线与交易性择时短线择时策略研究》  传统移动平均线(MA)的缺点 移动平均线(MA)是技术分析中常用的一类趋势跟踪指标,其可以在一定程度上刻画股票价格或指数的变动方向。MA 的计算天数越多,平…

解方程AX=b与矩阵分解:奇异值分解(SVD分解) 特征值分解 QR分解 三角分解 LLT分解

目录 1. 前言 1.1 为什么要进行矩阵分解? 1.2 矩阵与矩阵分解的几何意义? 2. LU三角分解 3. Cholesky分解 — LDLT分解 4. Cholesky分解 — LLT分解 5. QR分解 6. 奇异值分解 7. 特征值分解 本文转自大佬博客:https://blog.csdn.ne…

基于gtest、mockcpp写C++LLT测试入门级教程

一、googletest 下载地址:https://github.com/google/googletest 编译googletest: 在根目录下执行 cmake . make 编译出的libgtest.a后面用 注意:有可能编译会失败,是gtest需要C11以上 可以在顶级的CMakeList.txt里加入 set(CMAKE_CXX_STA…

量化策略分享 | MA超进化:LLT低延迟趋势线

移动平均线(MA)是我们技术分析中常用的一种趋势跟踪指标,但在使用的时候你是否也会有这样的烦恼:交易信号延迟太久,或者交易信号太频繁了!延迟性和平滑性问题似乎是不可兼得的“鱼和熊掌”。 针对这个问题&…

LLT-发现股市中的“大浪”

引言: 股市中小的波动经常干扰股票投资人对大趋势的判断,倘若股市的波动同信号波动类似,那是不是可以用处理信号的方式处理股票波动发现大的波动呢?我们知道通信领域在处理信号波动时也常会遇到被噪音干扰的问题,这些噪…

HDU2544 最短路dij

纯最短路。 1 ///HDU 2544堆优化的最短路2 #include <cstdio>3 #include <iostream>4 #include <sstream>5 #include <cmath>6 #include <cstring>7 #include <cstdlib>8 #include <string>9 #include <vector>10 #include &l…

dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少(示例代码)...

算法实现步骤&#xff1a; a.初始时&#xff0c;只包括源点&#xff0c;即S {v}&#xff0c;v的距离为0。U包含除v以外的其他顶点&#xff0c;即&#xff1a;U {其余顶点}&#xff0c;若v与U中顶点u有边&#xff0c;则(u,v)为正常权值&#xff0c;若u不是v的出边邻接点,则(u,v…

dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

算法实现步骤&#xff1a; a.初始时&#xff0c;只包括源点&#xff0c;即S {v}&#xff0c;v的距离为0。U包含除v以外的其他顶点&#xff0c;即&#xff1a;U {其余顶点}&#xff0c;若v与U中顶点u有边&#xff0c;则(u,v)为正常权值&#xff0c;若u不是v的出边邻接点,则(u,v…

图的最短路径——DIJ算法,有向图的矩阵实现,图的基本操作

图是一种非常重要的数据结构&#xff0c;在研究从一点出发到各个顶点的最短距离。 实验目的 1. 掌握图的基本概念、表示方法、遍历方法。 2. 掌握图的最短路径算法。 实验要求 1&#xff0e; 输入图的顶点数n&#xff08;不超过10个&#xff09;、边数m&#xff0c;顶点分…

堆优化dij

模板 【算法介绍】 用一个优先级队列来记录点和dis值&#xff0c;按照顺序进行边的松弛即可 1.农场派对 【题意】 有向图&#xff0c;求1-n所有点中到x点一去一回的最短路的最大值 【分析】 建立原图和反图&#xff0c;以x为源点跑两次dijkstra&#xff0c;对于1-n每个点…