电子产业一站式赋能平台

PCB联盟网

搜索
查看: 103|回复: 0
收起左侧

嵌入式系统中程序代码必须从FLASH搬到RAM中运行吗?

[复制链接]

563

主题

563

帖子

3387

积分

四级会员

Rank: 4

积分
3387
发表于 2024-10-18 08:01:00 | 显示全部楼层 |阅读模式

txms0dyki4464012697142.gif

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

    v0qhdpmel3264012697242.jpg

    ! l) W! h" w$ Q1 K" n

    m00exvkrk5f64012697342.gif

    m00exvkrk5f64012697342.gif
    & c# q" Q4 c: Q8 q% w% b2 u
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表