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

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

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

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

[復(fù)制鏈接]

544

主題

544

帖子

3210

積分

四級(jí)會(huì)員

Rank: 4

積分
3210
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-10-18 08:01:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1 E( P- }6 H+ c4 D& n
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
) W/ V- w" ]  d+ ]8 e, _2 e! G! ^6 T" ]  W# ^
以下是我的一些看法。6 C5 R# i7 k' T2 ?

0 `  r6 X( ]0 V5 L- e- bMCU中的程序通?梢灾苯釉贔LASH中運(yùn)行,但在對(duì)性能有特殊需求或需要?jiǎng)討B(tài)修改代碼的情況下,可以將程序搬到RAM中執(zhí)行。2 \) y) f# d5 j6 e4 j) {
; t$ Y0 q) R9 B9 X7 ~  C- T
同時(shí),片內(nèi)與片外存儲(chǔ)器在速度和訪問(wèn)延遲上確實(shí)存在明顯差異,這會(huì)影響系統(tǒng)的設(shè)計(jì)決策。* {$ P: N* q8 e
1! q, T" D1 n# ~+ n8 y& M8 ?$ U
程序從FLASH執(zhí)行還是搬到RAM執(zhí)行?9 t& i: n3 x! V- z0 C+ o
一般情況下,嵌入式系統(tǒng)的程序代碼是存儲(chǔ)在片內(nèi)的FLASH中的。
1 Q" W( f7 z* @# C) U  G9 H* j1 q) |
在MCU上電復(fù)位后,系統(tǒng)的啟動(dòng)過(guò)程大致如下:
" b% Y" ?/ @7 t, V9 E/ r/ \
  • 上電復(fù)位(Power-on Reset):MCU會(huì)進(jìn)入復(fù)位狀態(tài),內(nèi)部電路開(kāi)始初始化。
  • 啟動(dòng)代碼(Boot Code):上電后,芯片的啟動(dòng)代碼會(huì)被執(zhí)行。這個(gè)啟動(dòng)代碼可能是由芯片廠家提供的ROM引導(dǎo)代碼,負(fù)責(zé)初始化時(shí)鐘、棧指針等關(guān)鍵硬件資源,并將程序計(jì)數(shù)器(PC指針)指向FLASH中預(yù)定的入口點(diǎn)(通常是復(fù)位向量)。
  • 執(zhí)行用戶代碼: 此時(shí),程序開(kāi)始從FLASH中讀取指令,并由處理器逐條執(zhí)行。2 c0 b3 h2 F# B# J

    & D1 M2 V3 K% j8 z# ~6 O1 O2
    4 I- j" l4 S6 z1 E# X- J& qFLASH中的代碼是如何運(yùn)行的?
    , M0 s, j$ d# E$ E+ j- e當(dāng)程序計(jì)數(shù)器(PC)指向FLASH中某個(gè)地址時(shí),處理器會(huì)從該地址讀取指令,解碼后執(zhí)行。也就是說(shuō),程序?qū)嶋H上可以直接從FLASH中運(yùn)行,不一定需要搬到RAM。
    * G- K! v5 Z/ M8 C9 l* k  S" C
    ' S4 c' x: A; T- r. [% f' K/ P* i對(duì)于絕大多數(shù)嵌入式應(yīng)用來(lái)說(shuō),這是最常見(jiàn)的做法,因?yàn)檫@樣可以節(jié)省寶貴的RAM空間。: A' f3 f4 }( U% h
    8 K3 o* D# A! u, `
    在大多數(shù)ARM或PowerPC架構(gòu)的MCU中,啟動(dòng)流程是:% c+ k1 l% O1 I5 @# Y
  • 復(fù)位向量:通常是FLASH的起始地址或者某個(gè)固定位置,用于存放初始PC值(也就是程序入口地址)。
  • 程序計(jì)數(shù)器(PC)的設(shè)置:上電時(shí),PC由啟動(dòng)代碼或復(fù)位向量設(shè)定為FLASH中的起始地址,之后按順序讀取FLASH中的指令。6 I- A* s9 ]: H3 z& _  j# V
    + P$ @' G- a% D! z
    3
    0 ^! @* [2 `$ Z- `- w必須搬到RAM中才能運(yùn)行嗎?不這樣做有什么不妥?' b6 I. s* ^- Z, P1 @- m' v# a# i
    雖然代碼可以直接從FLASH中執(zhí)行,但有時(shí)搬到RAM中運(yùn)行更具優(yōu)勢(shì),主要有以下幾種原因:
    & ~4 ~- g: c. r; V
  • 執(zhí)行速度:RAM的訪問(wèn)速度通常比FLASH更快。如果對(duì)性能要求較高,可以將部分代碼(如關(guān)鍵中斷服務(wù)程序)加載到RAM中運(yùn)行,能顯著提升執(zhí)行效率。
  • 寫(xiě)入或擦除FLASH的限制:在執(zhí)行寫(xiě)入或擦除FLASH操作時(shí),往往會(huì)阻塞對(duì)FLASH的讀訪問(wèn)。因此,為了避免程序運(yùn)行中出現(xiàn)問(wèn)題,有時(shí)需要將代碼搬到RAM中執(zhí)行,以便在對(duì)FLASH進(jìn)行操作時(shí)仍能正常運(yùn)行。
  • 代碼自修改:某些高級(jí)應(yīng)用中,程序可能會(huì)修改自身的指令。這種情況下,代碼必須位于可寫(xiě)的存儲(chǔ)器(如RAM)中,因?yàn)镕LASH不支持動(dòng)態(tài)修改。7 _9 {9 k! _6 ^

    : c6 w- u. D$ P7 F2 R) |: b4
    - ]+ M$ O+ s% v; Y/ b. Y3 v3 a9 U% x片內(nèi)和片外存儲(chǔ)的區(qū)別) _1 z4 P. l' D! Q
    片內(nèi)RAM/FLASH:通常片內(nèi)存儲(chǔ)器的訪問(wèn)速度更快,延遲更低,因?yàn)樗鼈冎苯优c處理器內(nèi)核集成在一起。片內(nèi)RAM通常用于高速緩存或需要高頻訪問(wèn)的數(shù)據(jù),而片內(nèi)FLASH用于存儲(chǔ)穩(wěn)定的程序代碼。
    ) h# S) w' Y$ i) J* [) m& K& Q& ?' z& L+ q! c2 D
    片外RAM/FLASH:片外存儲(chǔ)器通過(guò)外部總線連接,訪問(wèn)速度和片內(nèi)相比會(huì)稍慢,尤其在使用串行總線(如SPI FLASH)時(shí)延遲更大。如果程序和數(shù)據(jù)需要頻繁訪問(wèn)片外存儲(chǔ)器,性能會(huì)明顯下降。
    - C: S" ]9 W4 ?5 @2 g
    / ^$ R/ T4 [0 q% v1 ^因此,一般情況下,片外存儲(chǔ)更多是作為數(shù)據(jù)存儲(chǔ)或者大容量擴(kuò)展,而不是執(zhí)行的主要位置。+ f, a* Z+ M' S) e- \1 D1 p2 f
    56 g$ n0 {1 C& _0 [, k7 r
    如果程序大小超過(guò)RAM怎么辦?
    4 ^3 b7 a7 {) B2 D5 g9 l( N0 O在程序代碼超過(guò)RAM可用空間時(shí),通常不會(huì)整個(gè)搬移,而是采用分段加載或“XIP”(Execute In Place,原地執(zhí)行)技術(shù):! m+ ]3 |! ^8 p) m
  • XIP(原地執(zhí)行): 直接從FLASH中讀取和執(zhí)行指令,不需要搬到RAM。絕大多數(shù)MCU都支持這種方式。
  • 分頁(yè)加載或分段執(zhí)行:在一些高級(jí)系統(tǒng)(如操作系統(tǒng)驅(qū)動(dòng)的系統(tǒng))中,可以將程序分割為多個(gè)段,按需加載到RAM中執(zhí)行。但這對(duì)于資源受限的MCU來(lái)說(shuō),通常不會(huì)這么復(fù)雜。
    . Q3 Y- F7 ^. U) s

    + d! A2 W  T8 _' C1 v9 v, i62 p: V. s* g0 W$ _- {! z8 `
    片外FLASH和SRAM的速度差異
    7 ]; K- B6 F6 z0 c7 _$ {片外FLASH和SRAM相對(duì)片內(nèi)存儲(chǔ)器,訪問(wèn)速度會(huì)更慢。3 ^- b( s* o( O1 X$ B4 l

    ) J! C6 j/ M- M" \, X& j7 P0 t主要原因包括:
    $ E8 }$ A$ X+ Y% s
  • 訪問(wèn)延遲:片外存儲(chǔ)器需要通過(guò)總線協(xié)議進(jìn)行數(shù)據(jù)傳輸,可能涉及地址解碼和等待周期。
  • 帶寬限制:外部存儲(chǔ)器的讀寫(xiě)帶寬通常不如片內(nèi)存儲(chǔ)器高,如果是串行接口(如SPI FLASH),帶寬瓶頸會(huì)更明顯。
  • 內(nèi)存控制器的影響:外部存儲(chǔ)器訪問(wèn)可能還依賴于內(nèi)存控制器的配置,訪問(wèn)速度受限于控制器的性能。, l' T5 F6 d; j0 P- u3 ^! e2 b

    / T# M, f! W9 b
    + p6 Q  m& z8 u. F$ F% S* V ' r; v7 n8 y- T+ n: Y( a
    - D8 H: l. c* `
    點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則

    關(guān)閉

    站長(zhǎng)推薦上一條 /1 下一條


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