|
txms0dyki4464012697142.gif (60.41 KB, 下載次數: 0)
下載附件
保存到相冊
txms0dyki4464012697142.gif
2024-10-18 21:58 上傳
+ G5 }( `/ L ~' ^1 |
點擊上方藍色字體,關注我們2 \3 n( D; }' i+ D7 e4 ]
; F7 q9 R4 N3 [1 |0 m- x8 M7 s' c以下是我的一些看法。
5 t' R8 q$ l" [; u- N6 A M& n0 }8 ~+ ]
MCU中的程序通?梢灾苯釉贔LASH中運行,但在對性能有特殊需求或需要動態(tài)修改代碼的情況下,可以將程序搬到RAM中執(zhí)行。
* c* y' \' D+ m' l# m
* q3 f' j$ ]4 M同時,片內與片外存儲器在速度和訪問延遲上確實存在明顯差異,這會影響系統(tǒng)的設計決策。/ L6 a9 T ~& r
1
0 n( p% n7 b; T1 h程序從FLASH執(zhí)行還是搬到RAM執(zhí)行?9 }: Y5 O4 `7 m H& W
一般情況下,嵌入式系統(tǒng)的程序代碼是存儲在片內的FLASH中的。
1 z, D0 @, }/ ~) V2 m
. \- T7 a# K! {在MCU上電復位后,系統(tǒng)的啟動過程大致如下:
( x7 u) p; U# {. w+ {上電復位(Power-on Reset):MCU會進入復位狀態(tài),內部電路開始初始化。啟動代碼(Boot Code):上電后,芯片的啟動代碼會被執(zhí)行。這個啟動代碼可能是由芯片廠家提供的ROM引導代碼,負責初始化時鐘、棧指針等關鍵硬件資源,并將程序計數器(PC指針)指向FLASH中預定的入口點(通常是復位向量)。執(zhí)行用戶代碼: 此時,程序開始從FLASH中讀取指令,并由處理器逐條執(zhí)行。9 M; z( F$ W7 G) q7 @; e" e" C
4 t2 n5 s' m8 W$ C3 Z
26 x7 I" [* O8 z5 [4 r/ L
FLASH中的代碼是如何運行的?) G* u( i# N3 [
當程序計數器(PC)指向FLASH中某個地址時,處理器會從該地址讀取指令,解碼后執(zhí)行。也就是說,程序實際上可以直接從FLASH中運行,不一定需要搬到RAM。+ J3 D: I. C; h+ K" F% z4 t& b/ u
6 {+ L+ O+ b4 [7 y' {: h對于絕大多數嵌入式應用來說,這是最常見的做法,因為這樣可以節(jié)省寶貴的RAM空間。% A9 z8 `: @! ?- F5 W0 F
$ U2 ?9 F2 {8 l; e6 K) s在大多數ARM或PowerPC架構的MCU中,啟動流程是:3 n/ S! J" i3 k, V4 D( X1 m2 E
復位向量:通常是FLASH的起始地址或者某個固定位置,用于存放初始PC值(也就是程序入口地址)。程序計數器(PC)的設置:上電時,PC由啟動代碼或復位向量設定為FLASH中的起始地址,之后按順序讀取FLASH中的指令。* b/ Q) i' J4 f
) _) G2 g( l {) `/ x. ], @
3! a$ `; Z0 o3 W- ?: ^3 n# b3 ]
必須搬到RAM中才能運行嗎?不這樣做有什么不妥?/ \, E3 D0 X) f# U4 Z7 k
雖然代碼可以直接從FLASH中執(zhí)行,但有時搬到RAM中運行更具優(yōu)勢,主要有以下幾種原因:
' B8 V% o( V# j執(zhí)行速度:RAM的訪問速度通常比FLASH更快。如果對性能要求較高,可以將部分代碼(如關鍵中斷服務程序)加載到RAM中運行,能顯著提升執(zhí)行效率。寫入或擦除FLASH的限制:在執(zhí)行寫入或擦除FLASH操作時,往往會阻塞對FLASH的讀訪問。因此,為了避免程序運行中出現問題,有時需要將代碼搬到RAM中執(zhí)行,以便在對FLASH進行操作時仍能正常運行。代碼自修改:某些高級應用中,程序可能會修改自身的指令。這種情況下,代碼必須位于可寫的存儲器(如RAM)中,因為FLASH不支持動態(tài)修改。# M# A9 ?4 y+ K; g5 z
3 A8 G% K& ~/ @$ M4* P0 t( E# ^1 K0 l" U, x% d7 A
片內和片外存儲的區(qū)別
a9 R( s7 y* P- d& @. u$ `7 U片內RAM/FLASH:通常片內存儲器的訪問速度更快,延遲更低,因為它們直接與處理器內核集成在一起。片內RAM通常用于高速緩存或需要高頻訪問的數據,而片內FLASH用于存儲穩(wěn)定的程序代碼。
8 ~4 O8 m, Y, m0 s' i" a% W
* v# T6 K) v) T! B片外RAM/FLASH:片外存儲器通過外部總線連接,訪問速度和片內相比會稍慢,尤其在使用串行總線(如SPI FLASH)時延遲更大。如果程序和數據需要頻繁訪問片外存儲器,性能會明顯下降。
3 P g6 @/ R& |3 V1 o$ ~7 e$ u$ w5 H, x* U( w. F% T
因此,一般情況下,片外存儲更多是作為數據存儲或者大容量擴展,而不是執(zhí)行的主要位置。
' Z I- ~) g" w/ J5 N+ M5
3 p' d2 M8 Y- w" w/ m3 N7 h如果程序大小超過RAM怎么辦?
( O p+ `/ P% x) H5 T* s在程序代碼超過RAM可用空間時,通常不會整個搬移,而是采用分段加載或“XIP”(Execute In Place,原地執(zhí)行)技術:
- h' X. h) \" d* C/ E v" xXIP(原地執(zhí)行): 直接從FLASH中讀取和執(zhí)行指令,不需要搬到RAM。絕大多數MCU都支持這種方式。分頁加載或分段執(zhí)行:在一些高級系統(tǒng)(如操作系統(tǒng)驅動的系統(tǒng))中,可以將程序分割為多個段,按需加載到RAM中執(zhí)行。但這對于資源受限的MCU來說,通常不會這么復雜。
6 ? q# P% j+ ]0 Z9 e! \9 u! f& u; U6 _9 I- R" m4 S' N. Y
6
1 g( [( n) u& w/ I3 T7 K' {片外FLASH和SRAM的速度差異, Z* v6 U1 N# J
片外FLASH和SRAM相對片內存儲器,訪問速度會更慢。
4 `5 ~9 g2 ~5 y" l5 u6 r9 ]1 c: y# K( e0 _* y p) l+ Z( d
主要原因包括:7 w$ |: s6 \/ |$ o8 a% R. ?
訪問延遲:片外存儲器需要通過總線協(xié)議進行數據傳輸,可能涉及地址解碼和等待周期。帶寬限制:外部存儲器的讀寫帶寬通常不如片內存儲器高,如果是串行接口(如SPI FLASH),帶寬瓶頸會更明顯。內存控制器的影響:外部存儲器訪問可能還依賴于內存控制器的配置,訪問速度受限于控制器的性能。
- S7 G: Q6 n5 r$ k: S: y3 n4 m! c7 r, \9 x8 s' z
' A% \( o3 T- Z$ p# [1 b2 A2 R0 x7 K
v0qhdpmel3264012697242.jpg (71.14 KB, 下載次數: 0)
下載附件
保存到相冊
v0qhdpmel3264012697242.jpg
2024-10-18 21:58 上傳
! s$ t! ?- }, G! C
m00exvkrk5f64012697342.gif (45.46 KB, 下載次數: 1)
下載附件
保存到相冊
m00exvkrk5f64012697342.gif
2024-10-18 21:58 上傳
6 a1 ~7 Y8 X* r: M8 A. Y點擊閱讀原文,更精彩~ |
|