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

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

搜索
查看: 126|回復: 0
收起左側(cè)

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

[復制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-10-18 08:01:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

, {" ?: z2 K* X. N" q$ K. B點擊上方藍色字體,關(guān)注我們3 y9 a$ n: y2 c/ @7 r9 d$ o+ K

# Z' A$ X8 E% j以下是我的一些看法。
% u# G8 w$ ?# c9 M2 L+ @  D6 e7 k: y
0 K' B6 v4 w* D6 i! A) y- E) cMCU中的程序通常可以直接在FLASH中運行,但在對性能有特殊需求或需要動態(tài)修改代碼的情況下,可以將程序搬到RAM中執(zhí)行。! o4 k* p* k+ P; J* H1 F

% p6 Z1 u5 r) j, ]; t& A5 ~同時,片內(nèi)與片外存儲器在速度和訪問延遲上確實存在明顯差異,這會影響系統(tǒng)的設(shè)計決策。1 s: X+ b0 m9 N2 c; S& v4 F. [
1$ M1 J" G* R- i
程序從FLASH執(zhí)行還是搬到RAM執(zhí)行?
* N) ^0 {" @2 x- @一般情況下,嵌入式系統(tǒng)的程序代碼是存儲在片內(nèi)的FLASH中的。. ^7 W& u! j, i2 p8 i+ ^

3 W! ?/ B2 d; h0 N: ~在MCU上電復位后,系統(tǒng)的啟動過程大致如下:
, Y7 L- H3 N6 N) h( V/ |* m
  • 上電復位(Power-on Reset):MCU會進入復位狀態(tài),內(nèi)部電路開始初始化。
  • 啟動代碼(Boot Code):上電后,芯片的啟動代碼會被執(zhí)行。這個啟動代碼可能是由芯片廠家提供的ROM引導代碼,負責初始化時鐘、棧指針等關(guān)鍵硬件資源,并將程序計數(shù)器(PC指針)指向FLASH中預定的入口點(通常是復位向量)。
  • 執(zhí)行用戶代碼: 此時,程序開始從FLASH中讀取指令,并由處理器逐條執(zhí)行。
    # E4 l! \; g' u# S
    , y0 v+ n7 @. p
    2( H: I+ g) ^8 ~2 Y5 z9 F  p
    FLASH中的代碼是如何運行的?
    7 l$ {7 I4 G% C; ^當程序計數(shù)器(PC)指向FLASH中某個地址時,處理器會從該地址讀取指令,解碼后執(zhí)行。也就是說,程序?qū)嶋H上可以直接從FLASH中運行,不一定需要搬到RAM。* G- Y$ J+ d9 x0 b1 ?

    2 L# G7 O7 `8 Z* G& z# a對于絕大多數(shù)嵌入式應用來說,這是最常見的做法,因為這樣可以節(jié)省寶貴的RAM空間。# R" Y& y5 F( R% v* a& F# W
      H' k/ e0 Z( ]' d5 f- y& \
    在大多數(shù)ARM或PowerPC架構(gòu)的MCU中,啟動流程是:
    , [. }. T1 u8 i- O9 U. U
  • 復位向量:通常是FLASH的起始地址或者某個固定位置,用于存放初始PC值(也就是程序入口地址)。
  • 程序計數(shù)器(PC)的設(shè)置:上電時,PC由啟動代碼或復位向量設(shè)定為FLASH中的起始地址,之后按順序讀取FLASH中的指令。
    ' H7 l7 f9 X2 E* H
    5 }2 d: {% ~% e1 m* |0 |
    3
    % g! G2 E+ L  K, e! A5 J必須搬到RAM中才能運行嗎?不這樣做有什么不妥?' j: l" h* z; \9 {3 I. y' c  U2 e
    雖然代碼可以直接從FLASH中執(zhí)行,但有時搬到RAM中運行更具優(yōu)勢,主要有以下幾種原因:
    / A( E' D7 I; Z* D( t5 B2 @" e
  • 執(zhí)行速度:RAM的訪問速度通常比FLASH更快。如果對性能要求較高,可以將部分代碼(如關(guān)鍵中斷服務程序)加載到RAM中運行,能顯著提升執(zhí)行效率。
  • 寫入或擦除FLASH的限制:在執(zhí)行寫入或擦除FLASH操作時,往往會阻塞對FLASH的讀訪問。因此,為了避免程序運行中出現(xiàn)問題,有時需要將代碼搬到RAM中執(zhí)行,以便在對FLASH進行操作時仍能正常運行。
  • 代碼自修改:某些高級應用中,程序可能會修改自身的指令。這種情況下,代碼必須位于可寫的存儲器(如RAM)中,因為FLASH不支持動態(tài)修改。
    ) S# D! Q: W' ~

    6 ]( u$ S6 Z% ]& A- }' p! c, O$ F4: Q6 S/ L5 ]) E/ S8 H) o- s
    片內(nèi)和片外存儲的區(qū)別6 A- q8 y1 h6 F; V2 m7 x
    片內(nèi)RAM/FLASH:通常片內(nèi)存儲器的訪問速度更快,延遲更低,因為它們直接與處理器內(nèi)核集成在一起。片內(nèi)RAM通常用于高速緩存或需要高頻訪問的數(shù)據(jù),而片內(nèi)FLASH用于存儲穩(wěn)定的程序代碼。
    1 Q  Y* j4 Q- V! w6 T5 f. d
    ; E2 L3 w+ ^' U- p/ P9 |片外RAM/FLASH:片外存儲器通過外部總線連接,訪問速度和片內(nèi)相比會稍慢,尤其在使用串行總線(如SPI FLASH)時延遲更大。如果程序和數(shù)據(jù)需要頻繁訪問片外存儲器,性能會明顯下降。1 ~9 t$ n. O7 {. P1 ~; i# E
    # j; J; ]( l- H; o- [  f3 D
    因此,一般情況下,片外存儲更多是作為數(shù)據(jù)存儲或者大容量擴展,而不是執(zhí)行的主要位置。  [: `6 H, C- r- s! z# f0 }
    5; S6 o/ D" ?! k* `" }, n1 u6 N/ X
    如果程序大小超過RAM怎么辦?$ _* H( _& b. r  d/ z( ?
    在程序代碼超過RAM可用空間時,通常不會整個搬移,而是采用分段加載或“XIP”(Execute In Place,原地執(zhí)行)技術(shù):
    ' E9 o# ]9 E9 ?' a6 M  q
  • XIP(原地執(zhí)行): 直接從FLASH中讀取和執(zhí)行指令,不需要搬到RAM。絕大多數(shù)MCU都支持這種方式。
  • 分頁加載或分段執(zhí)行:在一些高級系統(tǒng)(如操作系統(tǒng)驅(qū)動的系統(tǒng))中,可以將程序分割為多個段,按需加載到RAM中執(zhí)行。但這對于資源受限的MCU來說,通常不會這么復雜。
    , ^4 l1 l2 |. s/ E

    2 s7 t: S* l8 a% X4 ^6
    - N7 J6 N5 W4 G1 X片外FLASH和SRAM的速度差異6 y3 T& H* P- ]3 q
    片外FLASH和SRAM相對片內(nèi)存儲器,訪問速度會更慢。
    ' m3 _# R: ?7 u& K! c6 @7 M, v, _
    * ^7 i9 n4 F. q$ G主要原因包括:
    $ x; R  C& x- }3 U8 ]% c
  • 訪問延遲:片外存儲器需要通過總線協(xié)議進行數(shù)據(jù)傳輸,可能涉及地址解碼和等待周期。
  • 帶寬限制:外部存儲器的讀寫帶寬通常不如片內(nèi)存儲器高,如果是串行接口(如SPI FLASH),帶寬瓶頸會更明顯。
  • 內(nèi)存控制器的影響:外部存儲器訪問可能還依賴于內(nèi)存控制器的配置,訪問速度受限于控制器的性能。
    ) J/ d9 ?% d- o1 |
      C2 i  ~5 H6 d; y: ]

    * e& G& h+ n5 k
    * l$ T$ H+ b; t" `* j- a ; s9 E3 p! Z5 O5 y" b" q# s" |
    點擊閱讀原文,更精彩~
  • 回復

    使用道具 舉報

    發(fā)表回復

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

    本版積分規(guī)則


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