|
txms0dyki4464012697142.gif (60.41 KB, 下載次數(shù): 1)
下載附件
保存到相冊
txms0dyki4464012697142.gif
2024-10-18 21:58 上傳
- `$ S' P2 A) t( j" Z/ o- A
點擊上方藍(lán)色字體,關(guān)注我們3 I$ n b& s* {' Q
+ P0 N" A8 W1 C) e- C6 _- W: L! n3 K
以下是我的一些看法。
; m* P! a( P: p; w$ `4 }& {# T s7 k) d" {
MCU中的程序通常可以直接在FLASH中運行,但在對性能有特殊需求或需要動態(tài)修改代碼的情況下,可以將程序搬到RAM中執(zhí)行。
0 v& W4 G5 D, u. x, |
/ F, c6 y6 F3 [7 O0 t6 w7 D0 e同時,片內(nèi)與片外存儲器在速度和訪問延遲上確實存在明顯差異,這會影響系統(tǒng)的設(shè)計決策。
1 G& j; x; m1 u& F4 |, w1
/ R/ u2 Q3 n; {* `! n程序從FLASH執(zhí)行還是搬到RAM執(zhí)行?
) z, n7 H0 \1 w9 n- G" y/ e一般情況下,嵌入式系統(tǒng)的程序代碼是存儲在片內(nèi)的FLASH中的。% @( h9 M) P2 C6 W
; W$ H: p) y, i; N$ m
在MCU上電復(fù)位后,系統(tǒng)的啟動過程大致如下:
* s4 J7 `6 j( V3 E6 n3 e. Q& y上電復(fù)位(Power-on Reset):MCU會進(jìn)入復(fù)位狀態(tài),內(nèi)部電路開始初始化。啟動代碼(Boot Code):上電后,芯片的啟動代碼會被執(zhí)行。這個啟動代碼可能是由芯片廠家提供的ROM引導(dǎo)代碼,負(fù)責(zé)初始化時鐘、棧指針等關(guān)鍵硬件資源,并將程序計數(shù)器(PC指針)指向FLASH中預(yù)定的入口點(通常是復(fù)位向量)。執(zhí)行用戶代碼: 此時,程序開始從FLASH中讀取指令,并由處理器逐條執(zhí)行。% M. ?* s1 }$ g6 J" _. n
# K, k) S/ p5 V, e/ `% d( Y2
8 O( O/ o |& b8 C. |8 Q8 [FLASH中的代碼是如何運行的?
/ Q1 }) \# y5 S當(dāng)程序計數(shù)器(PC)指向FLASH中某個地址時,處理器會從該地址讀取指令,解碼后執(zhí)行。也就是說,程序?qū)嶋H上可以直接從FLASH中運行,不一定需要搬到RAM。/ t9 |5 z4 K+ A$ i, P
# Z- V8 R2 D/ s, W# d/ h) q# R
對于絕大多數(shù)嵌入式應(yīng)用來說,這是最常見的做法,因為這樣可以節(jié)省寶貴的RAM空間。" S1 m! X. F" k6 l; Q0 y) I7 j
2 x- Y% y' N( }0 |5 t在大多數(shù)ARM或PowerPC架構(gòu)的MCU中,啟動流程是:$ F5 k$ f+ |8 {& X) L u
復(fù)位向量:通常是FLASH的起始地址或者某個固定位置,用于存放初始PC值(也就是程序入口地址)。程序計數(shù)器(PC)的設(shè)置:上電時,PC由啟動代碼或復(fù)位向量設(shè)定為FLASH中的起始地址,之后按順序讀取FLASH中的指令。' \: x' K8 `: k$ c
+ e) w2 v; z' Y) {. h7 Q* @0 W7 d/ s# O
3
4 ?$ |* d+ z/ n必須搬到RAM中才能運行嗎?不這樣做有什么不妥?
* u+ J( q) T# K1 M雖然代碼可以直接從FLASH中執(zhí)行,但有時搬到RAM中運行更具優(yōu)勢,主要有以下幾種原因:
% l$ d) s7 z4 [1 S# m$ _執(zhí)行速度:RAM的訪問速度通常比FLASH更快。如果對性能要求較高,可以將部分代碼(如關(guān)鍵中斷服務(wù)程序)加載到RAM中運行,能顯著提升執(zhí)行效率。寫入或擦除FLASH的限制:在執(zhí)行寫入或擦除FLASH操作時,往往會阻塞對FLASH的讀訪問。因此,為了避免程序運行中出現(xiàn)問題,有時需要將代碼搬到RAM中執(zhí)行,以便在對FLASH進(jìn)行操作時仍能正常運行。代碼自修改:某些高級應(yīng)用中,程序可能會修改自身的指令。這種情況下,代碼必須位于可寫的存儲器(如RAM)中,因為FLASH不支持動態(tài)修改。. s( ?5 B8 \) o. R
/ x8 J4 m! t* S! |! O* x% ]
41 Y9 r* y8 v' p0 E; C
片內(nèi)和片外存儲的區(qū)別
n; m* q3 |0 U( E9 C' L* k5 p片內(nèi)RAM/FLASH:通常片內(nèi)存儲器的訪問速度更快,延遲更低,因為它們直接與處理器內(nèi)核集成在一起。片內(nèi)RAM通常用于高速緩存或需要高頻訪問的數(shù)據(jù),而片內(nèi)FLASH用于存儲穩(wěn)定的程序代碼。1 N! b: I( I' V6 R. h
$ Y/ A- F' n/ p' N片外RAM/FLASH:片外存儲器通過外部總線連接,訪問速度和片內(nèi)相比會稍慢,尤其在使用串行總線(如SPI FLASH)時延遲更大。如果程序和數(shù)據(jù)需要頻繁訪問片外存儲器,性能會明顯下降。
: U5 C7 r* k# ~6 z7 v9 q9 I# C- u6 z
因此,一般情況下,片外存儲更多是作為數(shù)據(jù)存儲或者大容量擴展,而不是執(zhí)行的主要位置。! g7 k% v! Z- y$ V$ a
5
; E. l/ A/ X& w) e) e+ c' l; Z! F如果程序大小超過RAM怎么辦?- A) X' Y6 ^7 ]$ D( _2 J( L
在程序代碼超過RAM可用空間時,通常不會整個搬移,而是采用分段加載或“XIP”(Execute In Place,原地執(zhí)行)技術(shù):
: z: ?* N/ f4 j0 F' FXIP(原地執(zhí)行): 直接從FLASH中讀取和執(zhí)行指令,不需要搬到RAM。絕大多數(shù)MCU都支持這種方式。分頁加載或分段執(zhí)行:在一些高級系統(tǒng)(如操作系統(tǒng)驅(qū)動的系統(tǒng))中,可以將程序分割為多個段,按需加載到RAM中執(zhí)行。但這對于資源受限的MCU來說,通常不會這么復(fù)雜。
) @$ Z( ~; q" N
+ E0 X' }3 t3 r# q1 W$ n2 F# l6$ }; L! E T" M* k" ]: h
片外FLASH和SRAM的速度差異
3 U, ^# p% |( O/ a7 W0 R S3 ^片外FLASH和SRAM相對片內(nèi)存儲器,訪問速度會更慢。$ C' ~1 R% y) W' b, l' W
4 v+ U! M6 o0 _6 R2 K2 I
主要原因包括:; V) E) M+ C. F \, y: t0 z' r
訪問延遲:片外存儲器需要通過總線協(xié)議進(jìn)行數(shù)據(jù)傳輸,可能涉及地址解碼和等待周期。帶寬限制:外部存儲器的讀寫帶寬通常不如片內(nèi)存儲器高,如果是串行接口(如SPI FLASH),帶寬瓶頸會更明顯。內(nèi)存控制器的影響:外部存儲器訪問可能還依賴于內(nèi)存控制器的配置,訪問速度受限于控制器的性能。
1 m$ i# L4 j7 N& O) K& j- Y3 n, m# |
! B+ l( W2 `2 G$ i, s" q
v0qhdpmel3264012697242.jpg (71.14 KB, 下載次數(shù): 7)
下載附件
保存到相冊
v0qhdpmel3264012697242.jpg
2024-10-18 21:58 上傳
9 c4 W( X3 I! I( V9 \. }7 K
m00exvkrk5f64012697342.gif (45.46 KB, 下載次數(shù): 5)
下載附件
保存到相冊
m00exvkrk5f64012697342.gif
2024-10-18 21:58 上傳
* l# ]9 O r% C5 m$ [3 z- {點擊閱讀原文,更精彩~ |
|