電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 71|回復: 0
收起左側

嵌入式系統(tǒng)中程序代碼必須從FLASH搬到RAM中運行嗎?

[復制鏈接]

544

主題

544

帖子

3210

積分

四級會員

Rank: 4

積分
3210
跳轉到指定樓層
樓主
發(fā)表于 2024-10-18 08:01:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
; ?. P) B: B# ]* M) z# z( H
點擊上方藍色字體,關注我們
: s' [: w: G& K6 l2 o& \# z& _6 _8 m/ p& x% \  t
以下是我的一些看法。
/ \8 n# V9 x! `. [" h( P$ y& ?7 l; y" U& H3 i
MCU中的程序通?梢灾苯釉贔LASH中運行,但在對性能有特殊需求或需要動態(tài)修改代碼的情況下,可以將程序搬到RAM中執(zhí)行。( `( q/ m* j6 a: i+ e
, }1 J) x$ M+ o* V! o4 n8 V
同時,片內與片外存儲器在速度和訪問延遲上確實存在明顯差異,這會影響系統(tǒng)的設計決策。! B( O( @+ K$ L+ n* H4 l( q
16 a5 s3 n9 ~: n% x
程序從FLASH執(zhí)行還是搬到RAM執(zhí)行?6 ]4 u$ ^- {4 B/ r0 U& Y
一般情況下,嵌入式系統(tǒng)的程序代碼是存儲在片內的FLASH中的。9 N* b' t4 p; v- {) L) @7 B9 R% S% h
( }( i% [' |& @! S  ?
在MCU上電復位后,系統(tǒng)的啟動過程大致如下:
# }% w/ ^( Y1 H; D5 \
  • 上電復位(Power-on Reset):MCU會進入復位狀態(tài),內部電路開始初始化。
  • 啟動代碼(Boot Code):上電后,芯片的啟動代碼會被執(zhí)行。這個啟動代碼可能是由芯片廠家提供的ROM引導代碼,負責初始化時鐘、棧指針等關鍵硬件資源,并將程序計數(shù)器(PC指針)指向FLASH中預定的入口點(通常是復位向量)。
  • 執(zhí)行用戶代碼: 此時,程序開始從FLASH中讀取指令,并由處理器逐條執(zhí)行。
    8 W# V/ ]; O/ O5 h
    : a3 d% [% `. {" p  G
    23 t) s$ |- ^8 `" Y. H* P( n
    FLASH中的代碼是如何運行的?
    + ?) K5 [1 o" t1 m7 p* f當程序計數(shù)器(PC)指向FLASH中某個地址時,處理器會從該地址讀取指令,解碼后執(zhí)行。也就是說,程序實際上可以直接從FLASH中運行,不一定需要搬到RAM。# x4 M  E; `/ e! T2 _8 ]/ X! k

    0 O6 r2 P' U; ^  G& B對于絕大多數(shù)嵌入式應用來說,這是最常見的做法,因為這樣可以節(jié)省寶貴的RAM空間。
    4 Z/ q2 h) y7 T7 i9 e9 Q+ m3 e# m9 ]6 D+ W/ z# }
    在大多數(shù)ARM或PowerPC架構的MCU中,啟動流程是:4 o: d, x; b6 [( z7 r5 c' i
  • 復位向量:通常是FLASH的起始地址或者某個固定位置,用于存放初始PC值(也就是程序入口地址)。
  • 程序計數(shù)器(PC)的設置:上電時,PC由啟動代碼或復位向量設定為FLASH中的起始地址,之后按順序讀取FLASH中的指令。
    7 X$ \+ ]7 L( h8 K

    6 s/ P* O3 J8 u  v/ d" I) f3
    " U& B( ^, S1 {$ f6 A必須搬到RAM中才能運行嗎?不這樣做有什么不妥?
    % s  C& r% }6 c7 b' @雖然代碼可以直接從FLASH中執(zhí)行,但有時搬到RAM中運行更具優(yōu)勢,主要有以下幾種原因:! a+ h9 }6 ~: `+ F' ]8 s: Y3 _
  • 執(zhí)行速度:RAM的訪問速度通常比FLASH更快。如果對性能要求較高,可以將部分代碼(如關鍵中斷服務程序)加載到RAM中運行,能顯著提升執(zhí)行效率。
  • 寫入或擦除FLASH的限制:在執(zhí)行寫入或擦除FLASH操作時,往往會阻塞對FLASH的讀訪問。因此,為了避免程序運行中出現(xiàn)問題,有時需要將代碼搬到RAM中執(zhí)行,以便在對FLASH進行操作時仍能正常運行。
  • 代碼自修改:某些高級應用中,程序可能會修改自身的指令。這種情況下,代碼必須位于可寫的存儲器(如RAM)中,因為FLASH不支持動態(tài)修改。1 P3 o: h# }: H

    3 i, z) t6 ^% R" j4 Q/ [6 H4
    5 {+ T3 V, f7 q5 V& a1 D8 I2 G片內和片外存儲的區(qū)別
    : V: j6 O) K, Y. H2 N片內RAM/FLASH:通常片內存儲器的訪問速度更快,延遲更低,因為它們直接與處理器內核集成在一起。片內RAM通常用于高速緩存或需要高頻訪問的數(shù)據(jù),而片內FLASH用于存儲穩(wěn)定的程序代碼。
    9 B3 c" V, E; M0 W# }; r
    ) h- a" W/ q  d4 {片外RAM/FLASH:片外存儲器通過外部總線連接,訪問速度和片內相比會稍慢,尤其在使用串行總線(如SPI FLASH)時延遲更大。如果程序和數(shù)據(jù)需要頻繁訪問片外存儲器,性能會明顯下降。& f! p: [+ b+ i4 u

    $ Q5 I2 b6 Q7 e; Y3 @( j" k" ?因此,一般情況下,片外存儲更多是作為數(shù)據(jù)存儲或者大容量擴展,而不是執(zhí)行的主要位置。/ a" j3 O+ `' w
    5
    2 L/ W$ F& E1 c3 f& W如果程序大小超過RAM怎么辦?
    - }5 s( q! [& {, c3 h" u在程序代碼超過RAM可用空間時,通常不會整個搬移,而是采用分段加載或“XIP”(Execute In Place,原地執(zhí)行)技術:
    1 w! P1 m$ O! f
  • XIP(原地執(zhí)行): 直接從FLASH中讀取和執(zhí)行指令,不需要搬到RAM。絕大多數(shù)MCU都支持這種方式。
  • 分頁加載或分段執(zhí)行:在一些高級系統(tǒng)(如操作系統(tǒng)驅動的系統(tǒng))中,可以將程序分割為多個段,按需加載到RAM中執(zhí)行。但這對于資源受限的MCU來說,通常不會這么復雜。! p; J4 n5 i) P9 f

    ; D0 }+ G+ a3 K3 m" d9 b5 @6+ Y  x3 Q: |' r
    片外FLASH和SRAM的速度差異
    2 N3 M$ T! g5 v9 U$ B2 \* S8 G& k片外FLASH和SRAM相對片內存儲器,訪問速度會更慢。, q$ K1 @& d- G* t9 x8 |- i# y4 B1 e
    $ u2 ]& j, p; \( V0 z; Q# }
    主要原因包括:8 k* u0 E# m% F) ~5 |! F+ M. e
  • 訪問延遲:片外存儲器需要通過總線協(xié)議進行數(shù)據(jù)傳輸,可能涉及地址解碼和等待周期。
  • 帶寬限制:外部存儲器的讀寫帶寬通常不如片內存儲器高,如果是串行接口(如SPI FLASH),帶寬瓶頸會更明顯。
  • 內存控制器的影響:外部存儲器訪問可能還依賴于內存控制器的配置,訪問速度受限于控制器的性能。7 B- F2 O* p" E3 n

    & p- P0 i. G5 a/ X! D  Q& K8 f5 u, {/ D

    ) K/ e+ q% R; F( A
    ( m7 l0 t' g) G/ |$ U點擊閱讀原文,更精彩~
  • 回復

    使用道具 舉報

    發(fā)表回復

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則

    關閉

    站長推薦上一條 /1 下一條


    聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表