【散文诗】单片机运行下和非运行下的 ROM 和 RAM

news2024/12/23 4:37:36

目录

  • 一、两种处理器的结构体系
    • 1. 哈佛结构体系
    • 2. 冯·诺依曼结构体系
    • 3. 两种结构的总结
  • 二、单片机运行下和非运行下的内存分配
    • 1. 非运行时的单片机程序在ROM内的分布
    • 2. 运行时的单片机程序在RAM内的分布
  • 三、单片机程序和操作系统应用程序的对比
  • 四、编译流程

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

1. 哈佛结构体系

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。

在这里插入图片描述

  中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如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. 两种结构的总结

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

  • 冯·诺依曼结构的计算机程序和数据区域在同一个存储器上它们物理上是连续的,即程序空间不封闭,程序空间的数据在运行时理论上是可以被修改,此外程序一旦跑飞也有可能运行到数据区,虽然都是一些不常见的特殊情况下。
  • 哈佛结构的芯片内部程序空间和数据空间是分开的,这就允许同时取指和取操作数,从而大大提高了运算能力。哈佛总线技术应用是以DSP和ARM为代表的。

DSP芯片硬件结构有冯·诺依曼结构和哈佛结构,两者区别是地址空间和数据空间分开与否。一般DSP都是采用改进型哈佛结构,就是分开的数据空间和地址空间都不只是一条,而是有多条,这根据不同的生产厂商的DSP芯片有所不同。在对外寻址方面从逻辑上来说也是一样,因为外部引脚的原因,一般来说都是通过相应的空间选取来实现的。本质上是同样的道理。


改进型的哈佛结构与哈佛体系结构差别

与冯.诺曼结构处理器比较,哈佛结构处理器有两个明显的特点:

  1. 使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
  2. 使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。

后来,又提出了改进的哈佛结构,其结构特点为:

  1. 使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存;
  2. 具有一条独立的地址总线和一条独立的数据总线,利用公用地址总线访问两个存储模块(程序存储模块和数据存储模块),公用数据总线则被用来完成程序存储模块或数据存储模块与CPU之间的数据传输;
  3. 两条总线由程序存储器和数据存储器分时共用。
    在这里插入图片描述

二、单片机运行下和非运行下的内存分配

运行时:单片机程序运行起来以后,代码是在ROM(Nor Flash)上面跑的,数据是在RAM上面的,描述的就是ROM和RAM两个层面。

非运行:单片机程序没有运行时(没有上电),针对的描述是单片机程序(bin)文件在ROM(Flash)上的分布

在这里插入图片描述
注意:当前市面上的单片机根本就没有一个统一的运行时和非运行时的程序模型,这里都是简略、大概差不多的描述。

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

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

1. 非运行时的单片机程序在ROM内的分布

通过单片机下载工具烧录到单片机Flash里面去之后的Flash空间区域分布图:

在这里插入图片描述

  • Flash:
    • Code:为程序代码部分
    • Ro-data: 表示程序定义的常量(const修饰的常量、#define 宏定义等),也有Ro-data放在Code区域
    • Rw-data:
      • Stack:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也就是单片机的sram中。
      • Heap:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。可以理解,这些也是被包含在单片机的sram中的。
      • Global/Static:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,被包含在RAM中。

        注:Stack 和 Heap 是取决于烧入编译器
  • RAM:
    • Zi-data:表示未初始化的全局变量(Zi-data可以表示RAM未上电时整个区域的状态,或者上电初始化之后未被使用的区域,上表仅仅描述的是ROM区域的空间分布)

2. 运行时的单片机程序在RAM内的分布

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

初始化的时候会由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,如此这般两个区域就是物理上的分开的–经典的哈佛模型。


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

由于单片机应用领域是极端成本为导向的,所以单片机程序和跑在操作系统上的应用程序没有可比性!

类型操作系统应用程序单片机程序
代码RAMROM(支持XIP的Nor Flash)
数据RAMRAM(SRAM)

单片机的代码是在ROM即支持XIP的Nor Flash上面跑,数据是在RAM上面的,而操作系统应用程序的代码、数据是完全加载到RAM里面运行的(这里不考虑分页、虚拟内存)

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

四、编译流程

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



此文章来自:liefyuan


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 8 中使用 Lambda 表达式和 Stream API 解决 LeetCode 的两数之和问题

Java 8 中使用 Lambda 表达式和 Stream API 解决 LeetCode 的两数之和问题 当我们在面对一个数列,需要查找其中两个元素的和为给定目标值时,可以使用两数之和(Two Sum)问题来解决。这个问题在 LeetCode 上有很高的重要性和普遍性&…

入行IC| 数字IC设计和验证哪个好?(内含薪资对比)

网上有一个很火的问题那就是数字IC设计和验证哪个好?接下来我们从以下几个维度来对比一下这两个岗位。 入行门槛 从上述对比就可以看出,IC设计要比验证门槛高。 具体工作内容有哪些? 数字IC前端设计 1.配合芯片架构的设计;一…

技术干货|直流电源自动测试系统功能介绍

直流电源是一种将交流电转换为恒定电压或电流输出的电子设备。在实际生产生活中,直流电源被广泛应用于各种场合。但由于各种原因,包括工艺、质量等因素,直流电源存在一定的出厂偏差。为了确保直流电源的精度和稳定性,在生产过程中…

layui框架学习(23:代码文本修饰模块)

Layui中的代码文本修饰模块layui.code主要用于修饰代码区域或文本行,其基本用法是使用预设类layui-code标识包含代码或文本的元素,然后调用layui.code函数渲染样式。Layui官网教程及示例中主要使用pre元素包含带修饰的代码或文本(pre元素可定…

Myslq架构和原理

这里写自定义目录标题 Myslq体系架构连接层存储引擎 MYSQL原理单表访问连接查询(原理) Myslq体系架构 连接层 存储引擎 查看日志文件:show variables like ‘log_error’\G; BIN LOG 日志: show variables like ‘log_bin’; MYS…

Leetcode 622. 设计循环队列

文章目录 1.题目描述2.原题链接3.思路分析4.接口实现 :FrontRearenQueue(value):deQueue():isEmpty(): 检查循环队列是否为空isFull():myCircularQueueFree 5.代码实现 1.题目描述 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FI…

16.泛型

泛型 一、什么是泛型 泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。 二…

【ONE·C++ || 模板进阶】

总言 主要介绍模板相关内容:非类型模板参数、类模板特化、模板的分离编译。 文章目录 总言1、非类型模板参数1.1、主要介绍1.2、std::array 简要说明 2、模板的特化2.1、基本介绍2.2、函数模板特化2.3、类模板特化2.3.1、基本说明2.3.2、用途举例2.3.3、分类&#…

统信UOS 20 安装达梦数据库V8

统信UOS 20 安装达梦数据库V8 1、安装教程2、启动数据库实例服务失败解决方法3、使用dm管理工具连接数据库 1、安装教程 https://blog.csdn.net/OceanWaves1993/article/details/129936878 此教程进行到启动数据库实例步骤时 使用下面命令启动数据库实例服务时,报…

找高清图片素材,这8个网站就够了

相信很多设计师、自媒体都为找素材而烦恼,很多朋友不知道去哪里找图片素材,找到了版权还不明确,怕造成侵权,今天我就把我独家珍藏的8个图片素材网站分享给大家,免费下载,还可以商用,建议收藏起来…

APIs -- DOM浏览器

1. Window对象 1.1 BOM(浏览器对象模型) BOM(Browser Object Model)是浏览器对象模型 window对象是一个全局对象,也可以说是JavaScript中的顶级对象像document、alert()、console.log()这些都是window的属性,基本BOM的属性和方…

crackme例子1

样本 jadx 静态分析 其中v2为查v5表得到,v3为用户输入index 下面就分别分析这几个值是啥 abcdefghddddd 得到v5和v4 解压assets下abcdefghddddd 拖入010 editor查看,实际是一个带相关数据的png文件 v5为图片位置89473开始,长度768字节&am…

Web安全 SQL注入漏洞测试.(可以 防止恶意用户利用漏洞)

Web安全 SQL注入漏洞测试 SQL注入就是 有些恶意用户在提交查询请求的过程中 将SQL语句插入到请求内容中,同时程序的本身对用户输入的内容过于相信,没有对用户插入的SQL语句进行任何的过滤,从而直接被SQL语句直接被服务端执行,导致…

AutoSAR软件组件开发的两类工作流程(Matlab/Simulink)

目录 前面 自顶向下 导入arxml文件 生成模型框架 搭建算法模型 生成代码 自下向上 前面 如何在Matlab进行AutoSAR软件组件SWC的开发?也就是下图红框标识出来的部分。 常规的有两种方式自顶向下与自下而上: 从上往下:从软件组件描述文…

改bug神器ChatGPT AI测试将取代人工吗?

最近ChatGPT大火,各大论坛中都会出现它的关键词。 机器和人对话本不是什么新鲜事,而ChatGPT上线仅5天,用户数量就超百万,之所以能在短时间吸引到这么多用户尝鲜,是因为它比“人工智障”的AI前辈们聪明多了~ 玩了一会…

Vue 3 组件通信

本文采用<script setup />的写法&#xff0c;比options API更自由。那么我们就来说说以下七种组件通信方式&#xff1a; props emit v-model refs provide/inject eventBus vuex/pinia 举个例子 本文将使用下面的演示&#xff0c;如下图所示&#xff1a; 上图中…

继承下的类型转换

一、私有/保护继承下的向上类型转换 示例&#xff1a; 图中蓝色、黄色代码均不允许使用&#xff0c;原因是在私有继承下&#xff0c;派生类和基类的public接口完全不搭界&#xff08;所实现的功能没有重叠&#xff09;&#xff0c;因此不允许强制转换&#xff0c;也无任何意义…

04-waf绕过权限控制

WAF绕过-权限控制之代码混淆及行为造轮子 思维导图 后门工具介绍: 菜刀&#xff0c;蚁剑&#xff0c;冰蝎优缺点 菜刀&#xff1a;未更新状态&#xff0c;无插件&#xff0c;单向加密传输 蚁剑&#xff1a;更新状态&#xff0c;有插件&#xff0c;拓展性强&#xff0c;单向加…

远程虚拟桌面解决方案 OpenText™ Exceed™ TurboX(ETX)的优势有哪些?

远程虚拟桌面解决方案 OpenText™ Exceed™ TurboX&#xff08;ETX&#xff09;的优势有哪些&#xff1f; 为 Windows、Linux 和 UNIX 实施精益、经济高效的虚拟化&#xff1b;提供完整的远程 Windows 可用性&#xff1b;以类似本地的性能远程工作&#xff1b;安全地保护系统和…

【Redis7】 Redis7 哨兵(重点:哨兵运行流程和选举原理)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Redis7 哨兵&#xff0c;重点&#xff1a;哨兵运行流程和选举原理。 后续会继续分享Redis7和其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文…