|
txms0dyki4464012697142.gif (60.41 KB, 下載次數(shù): 1)
下載附件
保存到相冊
txms0dyki4464012697142.gif
2024-10-18 21:58 上傳
" d( ^/ M, @; h8 }5 L點擊上方藍色字體,關注我們
# K9 d4 j0 M9 @" ]+ m6 t* x- k2 O @) Q; W7 i& { h
以下是我的一些看法。
1 C6 P1 v& F. g' }% |+ Q
* |7 Q7 f/ ~' P) Q: I8 jMCU中的程序通常可以直接在FLASH中運行,但在對性能有特殊需求或需要動態(tài)修改代碼的情況下,可以將程序搬到RAM中執(zhí)行。2 g! _" Y6 r$ T. s' S" |, m
4 H3 z i' ?9 t: U同時,片內(nèi)與片外存儲器在速度和訪問延遲上確實存在明顯差異,這會影響系統(tǒng)的設計決策。# {" Z' w3 `! E
11 A9 ~6 m8 n# r% K* k8 I" J2 f
程序從FLASH執(zhí)行還是搬到RAM執(zhí)行?; G. C# j% U$ T B
一般情況下,嵌入式系統(tǒng)的程序代碼是存儲在片內(nèi)的FLASH中的。
0 {4 e: \+ ]6 q( j& r
8 i! u+ F$ [9 @3 e/ i. `在MCU上電復位后,系統(tǒng)的啟動過程大致如下:
$ f$ y! K; @$ q上電復位(Power-on Reset):MCU會進入復位狀態(tài),內(nèi)部電路開始初始化。啟動代碼(Boot Code):上電后,芯片的啟動代碼會被執(zhí)行。這個啟動代碼可能是由芯片廠家提供的ROM引導代碼,負責初始化時鐘、棧指針等關鍵硬件資源,并將程序計數(shù)器(PC指針)指向FLASH中預定的入口點(通常是復位向量)。執(zhí)行用戶代碼: 此時,程序開始從FLASH中讀取指令,并由處理器逐條執(zhí)行。
- ?- f* @ K4 W! R+ ^* M( k% p% ^: K2 _0 U# b6 S7 F0 Q4 [
29 \% t8 V0 s# p( J# Y
FLASH中的代碼是如何運行的?
, X, b( J) e" S; n當程序計數(shù)器(PC)指向FLASH中某個地址時,處理器會從該地址讀取指令,解碼后執(zhí)行。也就是說,程序?qū)嶋H上可以直接從FLASH中運行,不一定需要搬到RAM。
# Q- J3 V% | G# B9 d
% r% i# A3 l, _' }% z對于絕大多數(shù)嵌入式應用來說,這是最常見的做法,因為這樣可以節(jié)省寶貴的RAM空間。3 a; ~5 b( e% Y" z& X
0 s4 a6 U' w0 I0 K在大多數(shù)ARM或PowerPC架構的MCU中,啟動流程是:
" K) Q7 P( W* H: z: E6 Z- C$ T2 Q4 @復位向量:通常是FLASH的起始地址或者某個固定位置,用于存放初始PC值(也就是程序入口地址)。程序計數(shù)器(PC)的設置:上電時,PC由啟動代碼或復位向量設定為FLASH中的起始地址,之后按順序讀取FLASH中的指令。
5 `( C7 S A# c- U6 x: p' n [! m! ^; a7 T$ J
3
. s/ C- z' P0 B. s& O必須搬到RAM中才能運行嗎?不這樣做有什么不妥?, O' t+ m; w3 X6 M& P& U" j: L
雖然代碼可以直接從FLASH中執(zhí)行,但有時搬到RAM中運行更具優(yōu)勢,主要有以下幾種原因:
' G. s1 P" H" M8 b: o執(zhí)行速度:RAM的訪問速度通常比FLASH更快。如果對性能要求較高,可以將部分代碼(如關鍵中斷服務程序)加載到RAM中運行,能顯著提升執(zhí)行效率。寫入或擦除FLASH的限制:在執(zhí)行寫入或擦除FLASH操作時,往往會阻塞對FLASH的讀訪問。因此,為了避免程序運行中出現(xiàn)問題,有時需要將代碼搬到RAM中執(zhí)行,以便在對FLASH進行操作時仍能正常運行。代碼自修改:某些高級應用中,程序可能會修改自身的指令。這種情況下,代碼必須位于可寫的存儲器(如RAM)中,因為FLASH不支持動態(tài)修改。
, y* ?+ Z! L* P( q8 t
0 ?, i, t; s; u+ Q1 _4
! L) G( [2 X& B- G% x; k G片內(nèi)和片外存儲的區(qū)別
3 D; X1 \, R$ x- `0 k1 d5 p" p片內(nèi)RAM/FLASH:通常片內(nèi)存儲器的訪問速度更快,延遲更低,因為它們直接與處理器內(nèi)核集成在一起。片內(nèi)RAM通常用于高速緩存或需要高頻訪問的數(shù)據(jù),而片內(nèi)FLASH用于存儲穩(wěn)定的程序代碼。
% L( y" r* [$ b9 u' q9 q" D4 n$ i% `! f' H# |8 u
片外RAM/FLASH:片外存儲器通過外部總線連接,訪問速度和片內(nèi)相比會稍慢,尤其在使用串行總線(如SPI FLASH)時延遲更大。如果程序和數(shù)據(jù)需要頻繁訪問片外存儲器,性能會明顯下降。6 J, M, C" \9 G8 |8 }
4 x4 D$ |, R; `/ S
因此,一般情況下,片外存儲更多是作為數(shù)據(jù)存儲或者大容量擴展,而不是執(zhí)行的主要位置。
& h; L- E: e3 ~50 b- F& a# G! U3 L
如果程序大小超過RAM怎么辦?
4 n6 V9 ?' Y" L$ z在程序代碼超過RAM可用空間時,通常不會整個搬移,而是采用分段加載或“XIP”(Execute In Place,原地執(zhí)行)技術:
4 w6 H V5 [" Y( GXIP(原地執(zhí)行): 直接從FLASH中讀取和執(zhí)行指令,不需要搬到RAM。絕大多數(shù)MCU都支持這種方式。分頁加載或分段執(zhí)行:在一些高級系統(tǒng)(如操作系統(tǒng)驅(qū)動的系統(tǒng))中,可以將程序分割為多個段,按需加載到RAM中執(zhí)行。但這對于資源受限的MCU來說,通常不會這么復雜。3 `& H' K# T7 W% Z" t
+ v6 Y+ D& @( d+ C6
0 m/ E# B) p. T5 {片外FLASH和SRAM的速度差異; ?. p) o$ {* f, ]5 M* {
片外FLASH和SRAM相對片內(nèi)存儲器,訪問速度會更慢。
: {+ m5 Q8 a; v2 O& Y- w$ X
/ A O6 y, Y0 [3 Z8 s主要原因包括:
& E* V% C/ e: ]* v' X6 d& U" Q訪問延遲:片外存儲器需要通過總線協(xié)議進行數(shù)據(jù)傳輸,可能涉及地址解碼和等待周期。帶寬限制:外部存儲器的讀寫帶寬通常不如片內(nèi)存儲器高,如果是串行接口(如SPI FLASH),帶寬瓶頸會更明顯。內(nèi)存控制器的影響:外部存儲器訪問可能還依賴于內(nèi)存控制器的配置,訪問速度受限于控制器的性能。" @5 }8 j( Z) X8 d
* Y6 h% R1 i, v
9 s. {: x/ p: j! N I( q
v0qhdpmel3264012697242.jpg (71.14 KB, 下載次數(shù): 10)
下載附件
保存到相冊
v0qhdpmel3264012697242.jpg
2024-10-18 21:58 上傳
^: ^8 l$ X4 {" e
m00exvkrk5f64012697342.gif (45.46 KB, 下載次數(shù): 6)
下載附件
保存到相冊
m00exvkrk5f64012697342.gif
2024-10-18 21:58 上傳
5 M$ A: L# a" I/ \7 L' k- @/ n
點擊閱讀原文,更精彩~ |
|