txms0dyki4464012697142.gif
* w# j+ f$ m0 H( w
点击上方蓝色字体,关注我们
2 A* N* S4 H' C9 r: ]+ U( x! y
. V$ K* ]+ i$ c( |8 _4 P! C8 h以下是我的一些看法。8 U4 z7 t/ q. W0 x' R
& o n1 R6 s! v& WMCU中的程序通常可以直接在FLASH中运行,但在对性能有特殊需求或需要动态修改代码的情况下,可以将程序搬到RAM中执行。3 J4 s+ ~; j* N+ n/ H
8 T' A. B( R3 `5 L
同时,片内与片外存储器在速度和访问延迟上确实存在明显差异,这会影响系统的设计决策。
* H) H y, r/ l! T9 X4 [, m5 L# S1
# f) s0 g, W* E: u程序从FLASH执行还是搬到RAM执行?
- _7 J, C7 W0 Y! v' | }+ |) |一般情况下,嵌入式系统的程序代码是存储在片内的FLASH中的。
! O( a& M* m" U2 x2 m9 k2 f) ]* c! f
+ O$ X$ K. |5 Z+ i4 L4 U6 b2 z7 y% H3 K在MCU上电复位后,系统的启动过程大致如下:6 a- S1 v! D3 Q9 W! m
上电复位(Power-on Reset):MCU会进入复位状态,内部电路开始初始化。启动代码(Boot Code):上电后,芯片的启动代码会被执行。这个启动代码可能是由芯片厂家提供的ROM引导代码,负责初始化时钟、栈指针等关键硬件资源,并将程序计数器(PC指针)指向FLASH中预定的入口点(通常是复位向量)。执行用户代码: 此时,程序开始从FLASH中读取指令,并由处理器逐条执行。" z( u8 {6 t8 s$ K1 I
8 d6 g- L4 N5 n' x" L: }$ H, S
2
2 E1 Q3 m& r5 l( C! m+ A" bFLASH中的代码是如何运行的?
8 S, A0 X4 f; Q* F ~当程序计数器(PC)指向FLASH中某个地址时,处理器会从该地址读取指令,解码后执行。也就是说,程序实际上可以直接从FLASH中运行,不一定需要搬到RAM。
. N) L; S+ J9 c' N! v# @8 V9 \4 C; S* m a2 }# J) w
对于绝大多数嵌入式应用来说,这是最常见的做法,因为这样可以节省宝贵的RAM空间。' j- l8 v5 f5 w6 X" g# |, ^) J, U" V
. `3 b2 ?. L* \( ?* S
在大多数ARM或PowerPC架构的MCU中,启动流程是:
. ]" r% d1 i" S( G复位向量:通常是FLASH的起始地址或者某个固定位置,用于存放初始PC值(也就是程序入口地址)。程序计数器(PC)的设置:上电时,PC由启动代码或复位向量设定为FLASH中的起始地址,之后按顺序读取FLASH中的指令。
1 }9 v6 ~' Q, d" w+ _# J4 I0 z8 S
, a( ^' L% g0 f3; A6 s, ~4 X: A/ U0 V
必须搬到RAM中才能运行吗?不这样做有什么不妥?
y5 m6 |5 _ G2 m% C& N' {* K$ c虽然代码可以直接从FLASH中执行,但有时搬到RAM中运行更具优势,主要有以下几种原因:
& M: J( t; X: @/ w$ s; S2 r执行速度:RAM的访问速度通常比FLASH更快。如果对性能要求较高,可以将部分代码(如关键中断服务程序)加载到RAM中运行,能显著提升执行效率。写入或擦除FLASH的限制:在执行写入或擦除FLASH操作时,往往会阻塞对FLASH的读访问。因此,为了避免程序运行中出现问题,有时需要将代码搬到RAM中执行,以便在对FLASH进行操作时仍能正常运行。代码自修改:某些高级应用中,程序可能会修改自身的指令。这种情况下,代码必须位于可写的存储器(如RAM)中,因为FLASH不支持动态修改。
3 [3 s- B' n+ b; T* g q: W& q* C+ ]" B ^, r& j0 Q
46 h1 A* W) W8 u; Q# N! b
片内和片外存储的区别7 H3 {8 ~- e* F5 T9 q
片内RAM/FLASH:通常片内存储器的访问速度更快,延迟更低,因为它们直接与处理器内核集成在一起。片内RAM通常用于高速缓存或需要高频访问的数据,而片内FLASH用于存储稳定的程序代码。/ `9 M+ j# b0 `! {1 z( F
1 M* M( e @- k& }( P
片外RAM/FLASH:片外存储器通过外部总线连接,访问速度和片内相比会稍慢,尤其在使用串行总线(如SPI FLASH)时延迟更大。如果程序和数据需要频繁访问片外存储器,性能会明显下降。7 M% i* {2 d% R( p
4 E. P3 J4 x/ e
因此,一般情况下,片外存储更多是作为数据存储或者大容量扩展,而不是执行的主要位置。
. v" W+ E9 B) Q, A/ |; c* e- J0 x5
3 ^' x6 w! y/ K8 V' L8 e如果程序大小超过RAM怎么办?/ V% V) g7 S' e# v* R! V" b$ P
在程序代码超过RAM可用空间时,通常不会整个搬移,而是采用分段加载或“XIP”(Execute In Place,原地执行)技术:2 e* @& m; O1 }( O o" ?% N
XIP(原地执行): 直接从FLASH中读取和执行指令,不需要搬到RAM。绝大多数MCU都支持这种方式。分页加载或分段执行:在一些高级系统(如操作系统驱动的系统)中,可以将程序分割为多个段,按需加载到RAM中执行。但这对于资源受限的MCU来说,通常不会这么复杂。4 l2 x4 n5 q& ~; ?- Q, f: v) e
% W% C7 e3 H, j9 K
66 u( V3 j; S- V! A& f) L
片外FLASH和SRAM的速度差异
5 p0 p4 f7 e- X. H片外FLASH和SRAM相对片内存储器,访问速度会更慢。
" U- ^6 q0 T9 q6 C4 Z1 R$ ]
$ A+ k- B6 }1 `! I主要原因包括:
" j$ k- v4 @* r5 z, J( M访问延迟:片外存储器需要通过总线协议进行数据传输,可能涉及地址解码和等待周期。带宽限制:外部存储器的读写带宽通常不如片内存储器高,如果是串行接口(如SPI FLASH),带宽瓶颈会更明显。内存控制器的影响:外部存储器访问可能还依赖于内存控制器的配置,访问速度受限于控制器的性能。- i9 A7 [; ?8 j u
: ~/ g( {2 c5 A7 ]9 @# j# B
& C$ y' K: F# A7 b
v0qhdpmel3264012697242.jpg
! l) W! h" w$ Q1 K" n
m00exvkrk5f64012697342.gif
& c# q" Q4 c: Q8 q% w% b2 u
点击阅读原文,更精彩~ |