文章目录
- NAND FLASH 和 NOR FLASH 的异同
- 相同点
- CPU,MPU,MCU,SOC,SOPC
- 关键点总结:
- 交叉编译
- 什么是交叉编译?
- 交叉编译的基本概念
- 为什么需要交叉编译?
- 交叉编译的工作原理
- 举例说明
- 交叉编译工具链
- 嵌入式系统基于ROM和基于RAM的运行方式区别
- 基于RAM的运行方式
- 基于ROM的运行方式
- 总结对比表格
- 总结
- 哈佛结构与冯诺依曼结构
- 冯诺依曼结构(Von Neumann Architecture)
- 2哈佛结构(Harvard Architecture)
- 冯诺依曼结构与哈佛结构对比表格
- 总结
- ARM 流水线技术
- ARM7与ARM9流水线设计
- 流水线的三个阶段
- PC 与指令地址的关系
- 中断处理与返回
- 流水线技术的表格展示
- 流水线工作示例
- 总结
NAND FLASH 和 NOR FLASH 的异同
类别 | NOR FLASH | NAND FLASH |
---|---|---|
读 | 快,像访问 SRAM 一样,可以随机访问任意地址的数据。 | 快,有严格的时序要求,需通过函数读取数据,步骤:发送读命令 -> 发送地址 -> 判断是否就绪 -> 读取数据。 |
写 | 慢,写之前需要擦除,只能将 1 写为 0,擦除可将 0 写为 1。 | 快,写之前也需要擦除,只能将 1 写为 0,擦除可将 0 写为 1。 |
擦除 | 非常慢,约 5 秒。 | 快,约 3 毫秒。 |
XIP | 代码可以直接在 NOR FLASH 上运行。 | 不支持 XIP(执行直接映射)。 |
可靠性 | 比较高,位反转的比例小于 NAND FLASH 的 10%。 | 比较低,位反转较为常见,必须有校验措施。 |
接口 | 与 RAM 接口相同,地址和数据总线分开。 | I/O 接口。 |
可擦除次数 | 10,000 ~ 100,000 次 | 100,000 ~ 1,000,000 次 |
容量 | 小,1MB ~ 32MB | 大,16MB ~ 512MB |
主要用途 | 常用于保存代码和关键数据 | 常用于保存数据 |
价格 | 高 | 低 |
相同点
- 擦除和写操作:在这两种存储介质中,写操作都必须先执行擦除,因为它们的写操作只能将 1 写为 0,而擦除动作则可以将 0 写为 1。
- 擦除单元:擦除操作是按块为单位进行的。
CPU,MPU,MCU,SOC,SOPC
类别 | 定义 | 主要区别 |
---|---|---|
CPU | 中央处理单元,计算机的运算核心和控制核心,执行指令,管理数据和控制信息。 | 主要关注计算和控制,所有的不同于其他类别的芯片,CPU 不集成内存等外部组件。 |
MPU | 微处理器,是增强版的 CPU,功能更强大。常用于个人计算机和高端工作站。 | 不为特定任务设计,通常用于通用计算。MPU 本身不包括内存,外部需要添加 RAM、ROM 等硬件。 |
MCU | 微控制器,集成了 CPU、RAM、ROM、定时计数器和 I/O 接口等多种功能。 | 相较于 MPU,MCU 内部包含内存,能够直接运行代码。广泛用于嵌入式系统。 |
SOC | 片上系统,集成了 CPU、内存、外设接口等多个功能模块,可以运行完整的操作系统。系统级别芯片 | 结合了 MCU 和 MPU 的优点,既有内置的 RAM、ROM,又有强大的计算能力。适用于复杂系统,如手机和嵌入式设备。 |
SOPC | 可编程片上系统,基于 FPGA 等技术,可以根据需求动态配置硬件和软件。 | 与前四者不同,SOPC 允许在硬件和软件上进行配置,硬件部分可以根据需求重新构建,可以动态更改为不同的硬件系统。 |
关键点总结:
- CPU 主要负责计算和控制,不集成内存,依赖外部硬件。
- MPU 是功能更强大的 CPU,通常需要外部内存才能运行代码。
- MCU 集成了 CPU、RAM 和 ROM,适合嵌入式应用,最主要的区别能独立运行代码。MCU有内部的RAM ROM,而MPU是增强版的CPU,需要添加外部RAM ROM才可以运行代码。
- SOC 是集成了更多功能的芯片,能够运行完整操作系统,具有更强的处理能力。将就认为是MCU集成化与MPU强处理力各优点二合一
- SOPC 允许硬件和软件的灵活配置,适合定制化的硬件需求,如 FPGA。
交叉编译
什么是交叉编译?
交叉编译是指在一种计算机环境中运行的编译器,用来编译在另一种环境下运行的代码。换句话说,交叉编译允许你在一个平台上生成可以在另一个平台上执行的程序。这个过程对于开发和构建跨平台的应用非常重要。
交叉编译的基本概念
- 平台(Platform):在这个上下文中,平台通常由两个部分组成:体系结构和操作系统。
- 体系结构(Architecture):如 Intel x86、ARM 等,它定义了计算机硬件的指令集和架构。
- 操作系统(Operating System):如 Linux、Windows、Android 等,它定义了硬件和软件之间的交互方式。
举个例子,我们常听说的 “x86 Linux” 平台,实际上是指 Intel x86 体系结构 和 Linux 操作系统 结合在一起的一个平台。同理,“x86 WinNT” 平台则是 Intel x86 体系结构 和 Windows NT 操作系统 的组合。
为什么需要交叉编译?
交叉编译的需求通常源于以下几个原因:
-
目标平台无法安装编译器:
- 有些设备(例如嵌入式系统)由于硬件限制,可能没有足够的资源来运行编译器。为了开发这些设备上的应用,我们可以在更强大的计算机上进行编译,然后将生成的可执行代码移到目标平台上运行。
-
目标平台资源有限:
- 目标平台可能计算能力有限,无法运行传统的编译器。例如,一些嵌入式设备可能不具备足够的内存和处理能力来运行完整的编译过程,所以我们会选择在性能更强的机器上编译程序。
-
跨平台开发:
- 当我们需要在不同平台之间共享代码时,交叉编译非常有用。比如,我们可能在 Windows 上开发程序,但希望它能够在 Linux、macOS 或嵌入式系统(如 ARM)上运行。这时,交叉编译器可以将代码编译为不同平台所需的格式。
-
开发工作流程的便利性:
- 在一些情况下,开发人员希望在自己熟悉的开发环境中进行工作,而目标平台可能并不支持这种环境。使用交叉编译器,开发人员可以在一个平台上编译代码,最终将其部署到目标平台上。
交叉编译的工作原理
-
交叉编译工具链:
交叉编译需要特殊的工具链(toolchain),它包括:- 交叉编译器(Cross Compiler):这是一种能够在一个平台上编译出能够在另一个平台上运行的程序的编译器。比如,使用一个运行在 x86 计算机上的交叉编译器来为 ARM 架构生成可执行代码。
- 交叉链接器(Cross Linker):链接器负责将编译后的代码和所需的库进行链接,生成最终的可执行文件。
- 交叉调试器(Cross Debugger):用于调试目标平台上运行的程序。
-
编译过程:
交叉编译过程一般如下:- 在主机(开发平台)上使用交叉编译器对源代码进行编译。
- 生成的中间文件(例如目标代码)会被链接器链接成目标平台的可执行文件。
- 将最终的可执行文件上传到目标平台(例如嵌入式设备)。
- 在目标平台上运行该程序。
举例说明
假设我们要为一款使用 ARM 处理器的嵌入式设备开发一个应用,但我们没有该设备的编译环境。我们可以在一台普通的 x86 计算机上使用交叉编译器,生成 ARM 架构的可执行文件。编译步骤如下:
- 在 x86 计算机上安装 ARM 交叉编译器。
- 将代码编写好后,通过 ARM 交叉编译器进行编译。
- 生成 ARM 可执行文件后,上传到 ARM 设备中运行。
交叉编译工具链
通常情况下,交叉编译工具链由如下几个部分组成:
- GCC:GNU Compiler Collection,适用于多种体系结构的编译器。
- Binutils:用于处理目标平台的二进制文件,如汇编和链接等。
- C库:例如 glibc 或 uClibc,适用于目标平台的 C 库。
- 调试工具:如 GDB,用于调试目标平台上的程序。
嵌入式系统基于ROM和基于RAM的运行方式区别
基于RAM的运行方式
-
代码加载:
- 在基于RAM的运行方式中,程序的代码需要首先从 硬盘 或 Flash 存储器 中加载到 RAM 中。这一过程通常包括 重定位(Relocation) 操作,即修改代码中的地址引用,使其适应在RAM中运行。
-
速度:
- 基于RAM的运行方式比基于ROM的运行方式要快。这是因为RAM的访问速度比ROM快得多,且直接从RAM运行代码消除了ROM到RAM的中间搬移过程。
-
RAM资源:
- 由于所有的代码和数据都需要存储在RAM中,基于RAM的运行方式通常 占用更多的RAM资源。这就意味着可用的RAM空间有限,尤其是在资源受限的嵌入式系统中,可能需要更加精细地管理内存。
-
灵活性:
- 基于RAM的运行方式具有较高的灵活性,因为代码和数据可以在RAM中动态加载、卸载或修改。因此,在某些应用场景下,可以进行更复杂的操作和更新。
基于ROM的运行方式
-
代码加载:
- 基于ROM的运行方式中,程序的代码存储在 ROM 或 Flash 存储器 中,在系统启动时,部分代码和数据可能需要从ROM搬移到RAM中执行。ROM中存储的代码不需要像RAM那样进行重定位。
-
速度:
- 基于ROM的方式较基于RAM的方式要慢。因为代码并不是直接在RAM中执行的,而需要从ROM中读取,并搬移到RAM中执行。这个过程会涉及到一定的延迟。
-
RAM资源:
- 基于ROM的系统中,代码和数据大部分存储在ROM中,因此使用的RAM资源较少。这使得系统可以 保留更多的RAM空间 用于运行时的数据存储和临时计算。
-
稳定性:
- ROM是只读存储器,其内容在系统运行期间不会改变。因此,基于ROM的运行方式在某些应用中可以提供更高的稳定性,尤其是在嵌入式系统中,需要确保固件和程序不被意外修改的情况下,ROM是一个理想的存储介质。
总结对比表格
特性 | 基于RAM的运行方式 | 基于ROM的运行方式 |
---|---|---|
代码加载 | 需要将代码从硬盘或Flash加载到RAM中,并进行重定位 | 代码一般直接从ROM中运行,可能需要部分搬移到RAM中 |
执行速度 | 执行速度较快,因为RAM访问速度快 | 执行速度较慢,因为需要从ROM搬移代码到RAM |
RAM资源使用 | 占用较多的RAM,因为所有代码和数据都需要存储在RAM中 | 占用较少的RAM,大部分数据存储在ROM中 |
灵活性 | 代码和数据可以在RAM中动态加载、修改或卸载 | 代码和数据较为固定,不易修改 |
稳定性 | 相对灵活但可能更容易出现错误 | 稳定性高,代码和数据不可修改 |
总结
- 基于RAM的运行方式适合那些需要高速度和灵活性的应用,但由于资源限制,特别是在嵌入式系统中,需要合理管理RAM的使用。
- 基于ROM的运行方式适合对稳定性要求高的场景,尤其是嵌入式系统中的固件存储。它的速度较慢,但节省了RAM资源,且在ROM中存储的内容稳定不可修改。
哈佛结构与冯诺依曼结构
在计算机体系结构中,哈佛结构(Harvard Architecture)和冯诺依曼结构(Von Neumann Architecture)是两种基本的架构设计。它们在数据存取和指令处理的方式上有所不同,适用于不同的应用场景。
冯诺依曼结构(Von Neumann Architecture)
定义:
冯诺依曼结构是一种 指令和数据共享同一存储空间 的计算机架构,CPU通过 同一条总线 访问存储器中的指令和数据。由于指令和数据的存储在同一内存区域,所以 CPU 无法同时执行指令和读写数据。也就是说,指令的读取和数据的读取是 串行进行 的。
特点:
- 统一的存储结构:程序代码和数据存储在同一个内存中,CPU通过统一的总线访问存储器。
- 存储器读写不可重叠:指令和数据的存取需要轮流进行,不能同时进行。
优点:
- 灵活性高:指令和数据存储在同一内存中,便于程序的修改与更新。
- 资源节约:只有一条数据总线,可以节省硬件资源。
缺点:
- 性能瓶颈:指令和数据共享同一总线,导致 CPU 需要频繁等待,导致 瓶颈,无法进行指令和数据并行处理。
- 存取冲突:同一条总线传输指令和数据,可能会造成冲突,影响计算效率。
应用:
冯诺依曼结构主要用于 通用计算机,尤其是需要频繁修改存储器中的代码和数据的应用。
2哈佛结构(Harvard Architecture)
定义:
哈佛结构则采用 指令和数据分开存储,并使用 两条独立的总线 来分别传输指令和数据。由于指令和数据存储在不同的内存区域,CPU可以在同一时刻同时读取指令和数据,因此 指令的读取和数据的读取可以并行 进行。
特点:
- 独立的存储结构:指令存储在一块内存中,数据存储在另一块内存中,分别通过不同的总线进行访问。
- 并行处理:由于指令和数据有独立的存储空间和传输通道,CPU能够 并行读取指令和数据,提高了系统的运行速度。
优点:
- 高性能:由于指令和数据的存取可以并行进行,大大提高了处理效率和吞吐量。
- 更高的可靠性:通常用于嵌入式系统,其中程序代码是固化在硬件中的,不会改变,因此系统稳定性较高。
缺点:
- 硬件复杂性:需要更多的硬件资源,例如两条总线和两块内存,硬件设计相对复杂。
- 灵活性较低:由于指令和数据分开存储,程序的更新和修改不如冯诺依曼结构方便。
应用:
哈佛结构常见于 嵌入式计算机 和 数字信号处理器(DSP),特别是在程序固化、稳定性要求较高的系统中。
冯诺依曼结构与哈佛结构对比表格
特性 | 冯诺依曼结构 | 哈佛结构 |
---|---|---|
存储结构 | 指令和数据共享同一存储空间,使用同一条总线传输 | 指令和数据分别存储在不同的存储空间,使用独立的总线传输 |
存取方式 | 指令和数据不能同时访问,串行存取 | 指令和数据可以同时访问,支持并行存取 |
硬件复杂性 | 硬件设计简单,只需一条总线和共享的存储器 | 硬件设计复杂,需要两条总线和独立的存储器 |
性能 | 受限于存储器和总线的共享,性能相对较低 | 能够并行访问指令和数据,性能较高 |
适用场景 | 通用计算机,需频繁修改代码和数据的应用 | 嵌入式系统,程序固化、高可靠性要求的应用 |
灵活性 | 灵活,便于修改代码和数据 | 较低,不易修改存储的程序和数据 |
稳定性 | 不如哈佛结构稳定,程序代码可能会被修改 | 高稳定性,适合固化程序代码 |
总结
- 冯诺依曼结构适合通用计算机,需要频繁修改代码和数据的场景,但它的性能受到存储器访问瓶颈的影响。
- 哈佛结构适合嵌入式系统和需要高性能的场景,尤其是在程序固化并要求高可靠性的应用中,尽管它在硬件实现上更加复杂。
ARM 流水线技术
ARM 流水线技术是一种通过多个功能部件并行工作来加速程序执行的技术。流水线的主要目的是将指令的执行过程分解为多个阶段,并在每个阶段执行不同的操作。每个阶段的操作都可以并行进行,从而缩短整体的执行时间,提高处理器的效率和吞吐量。流水线技术是现代微处理器设计中不可或缺的一部分。
ARM7与ARM9流水线设计
- ARM7:采用典型的 三级流水线,并使用 冯·诺伊曼结构。三级流水线的执行过程包括三个阶段:取指、译码、执行。
- ARM9:采用 五级流水线,并采用 哈佛结构。通过增加流水线级数,简化了每个级别的逻辑,进一步提升了处理器的性能。
流水线的三个阶段
ARM 处理器的流水线设计主要分为三个阶段,分别是:
- 取指(Fetch):从存储器中加载指令到指令寄存器。
- 译码(Decode):对指令进行解码,识别出将要执行的操作。
- 执行(Execute):执行译码后的指令,并将结果写回到寄存器中。
在 ARM 体系结构中,程序计数器 PC(Program Counter)指向的是 正在取指的指令,即下一条即将被执行的指令地址。而 R15(PC)是程序计数器的寄存器,它的值会始终指向 正在取指 的地址,而不是指向 正在执行 或 正在译码 的指令。
PC 与指令地址的关系
- 在 ARM 状态下,每条指令的长度为 4 字节。
- 因此,PC 的值总是指向正在取指的指令的地址,再加上 8 字节,也就是:
PC = 当前程序执行位置 + 8 \text{PC} = \text{当前程序执行位置} + 8 PC=当前程序执行位置+8 - 在流水线中:
- 当前正在执行的指令的地址:为 PC - 8。
- 正在译码的指令的地址:为 PC - 4。
中断处理与返回
在 ARM 处理器中,当发生中断时,通常需要保存当前的 PC 地址,以便中断返回时恢复执行位置。由于在流水线的设计中,指令的执行和取指是并行的,因此在处理中断时,保存的是 PC - 4(即下一条指令的地址)。为了确保恢复时没有遗漏指令,使用了指令:
KaTeX parse error: Expected 'EOF', got '#' at position 20: …xt{SUB PC, LR, #̲4}
其中,LR
是链接寄存器,保存了中断发生时的返回地址。
流水线技术的表格展示
流水线阶段 | 描述 | 指令地址关系 |
---|---|---|
取指(Fetch) | 从存储器加载指令到指令寄存器。 | PC指向当前即将取指的地址。 |
译码(Decode) | 对指令进行解码,识别指令操作。 | CPU正在译码的指令地址为PC - 4。 |
执行(Execute) | 执行解码后的指令,结果写回寄存器。 | CPU正在执行的指令地址为PC - 8。 |
流水线工作示例
假设正在执行的程序包含三条指令,分别为 I1、I2 和 I3。在流水线中,它们将按以下方式执行:
- I1:取指 → 译码 → 执行
- I2:取指 → 译码 → 执行
- I3:取指 → 译码 → 执行
此时,程序计数器 PC 指向正在取指的地址,而 R15(PC)会存储当前的指令地址,以便追踪下一条即将执行的指令。
总结
- ARM处理器通过流水线技术将指令分为多个阶段执行,从而提高了指令执行的效率和吞吐量。
- 三级流水线和五级流水线的区别在于流水线的阶段数量,五级流水线能进一步提升处理器的性能。
- PC 总是指向正在取指的指令地址,而执行中的指令地址是 PC - 8。
- 中断发生时,保存的 PC - 4 确保在恢复时没有漏掉任何指令。