DSP

程序是运行在flash中还是RAM中?

2019-07-13 20:17发布

class="markdown_views prism-dracula">
前言
最近在做项目中遇到一些疑虑,包括OTA升级时会不会阻塞到其他工作线程、select原理和正确用法、如何快速正确理解产品到软件框架构建、嵌入式应用的代码优化方法。本篇文章主要针对第一个问题,请教外援,他解释:正常情况下代码是在OTA1中运行的,当OTA时程序下载固件到OTA2成功后从flash中OTA2对应地址启动。当时觉得不对劲,程序怎么会在flash中运行?查了下,对于x86的pc机和单片机等嵌入式开发系统程序的存储是截然相反的。
x86cpu和单片机读取程序的具体途径
x86的PC机cpu在运行时程序是存储在RAM中,而单片机等嵌入式系统则是存在flash中的。
pc机在运行程序的时候将程序从外存(硬盘)中,调入到RAM中运行,cpu从RAM中读取程序和数据;而单片机的程序则是固化在flash中,cpu运行时直接从flash中读取程序,从RAM中读取数据 。
原因分析
x86构架的cpu是基于冯.诺依曼体系的,即数据和程序存储在一起,而且pc机的RAM资源相当丰富,从几十M到几百M甚至是几个G,客观上能够承受大量的程序数据。
单片机的构架大多是哈弗体系的,即程序和数据分开存储,而且单片的片内RAM资源是相当有限的,内部的RAM过大会带来成本的大幅度提高。
冯.诺依曼体系与哈佛体系的区别:
二者的区别就是程序空间和数据空间是否是一体的。 早期的微处理器大多采用冯诺依曼结构,典型代表是Intel公司的X86微处理器。取指令和取操作数都在同一总线上,通过分时复用的方式进行的。缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。
哈佛总线技术应用是以DSP和ARM为代表的。采用哈佛总线体系结构的芯片内部程序空间和数据空间是分开的,这就允许同时取指令和取操作数,从而大大提高了运算能力。
例如STM320LF240x系列DSP是增强型的哈佛结构通过三组并行的总线访问多个存储空间。它们分别是:程序地址总线(PAB),数据地址读总线(DRAB)和数据地址写总线(DWRB)。
小结
STM32支持两种方式,它是由两个引脚来控制启动方式的,通常是下载到flash启动;用jlink在线仿真,则是下载到SRAM中,无需改变启动方式SRAM掉电后程序会自动消失。可参考下述理解的更详细,后续嵌入式代码优化、框架设计也积累到一些经验后续再分享。
参考 :
cpu运行时程序是在flash中还是在RAM呢?
讨论:程序是运行在flash中还是Ram中呢?
程序在flash中还是ram中运行