|
txms0dyki4464012697142.gif (60.41 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
txms0dyki4464012697142.gif
2024-10-18 21:58 上傳
; y9 i' x1 ^* V; M點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
' O# C1 e+ u2 |% v2 x- [" ]' l% m* N8 h
以下是我的一些看法。
7 o- T+ a% T- a" q {, x& n7 m z" R2 B2 u
MCU中的程序通常可以直接在FLASH中運(yùn)行,但在對(duì)性能有特殊需求或需要?jiǎng)討B(tài)修改代碼的情況下,可以將程序搬到RAM中執(zhí)行。
4 Z1 Y* o4 @ Z6 f7 d
. H9 z/ R1 o+ z/ O9 b4 |4 L同時(shí),片內(nèi)與片外存儲(chǔ)器在速度和訪問延遲上確實(shí)存在明顯差異,這會(huì)影響系統(tǒng)的設(shè)計(jì)決策。
- r& H: k7 U/ g. n& W/ b+ g" p1( E) P5 \6 p% m8 l
程序從FLASH執(zhí)行還是搬到RAM執(zhí)行?/ H4 H, \! K, e8 U8 } s: T
一般情況下,嵌入式系統(tǒng)的程序代碼是存儲(chǔ)在片內(nèi)的FLASH中的。
/ ]# \" ^! [* ?' T0 d7 S: G, J: C. z* C' F: r
在MCU上電復(fù)位后,系統(tǒng)的啟動(dòng)過程大致如下:" P: m5 P8 p/ q1 [8 r
上電復(fù)位(Power-on Reset):MCU會(huì)進(jìn)入復(fù)位狀態(tài),內(nè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í),程序開始從FLASH中讀取指令,并由處理器逐條執(zhí)行。
$ l# ]6 a; \; z$ e. q
6 x; G1 S5 I0 n2
7 w% R; z" d" D6 t" h7 B1 m$ YFLASH中的代碼是如何運(yùn)行的?
, G. E/ Y4 f, ^7 G |, i當(dāng)程序計(jì)數(shù)器(PC)指向FLASH中某個(gè)地址時(shí),處理器會(huì)從該地址讀取指令,解碼后執(zhí)行。也就是說,程序?qū)嶋H上可以直接從FLASH中運(yùn)行,不一定需要搬到RAM。. Y2 b3 c% i" l9 ?
9 v+ y- i8 e" c* r3 {# e8 c+ Z, T
對(duì)于絕大多數(shù)嵌入式應(yīng)用來說,這是最常見的做法,因?yàn)檫@樣可以節(jié)省寶貴的RAM空間。
6 z% G- A8 P* ?" o- S0 l) h' ]8 [. k4 | J8 w! i: |
在大多數(shù)ARM或PowerPC架構(gòu)的MCU中,啟動(dòng)流程是:
; V5 [" S$ Z' P3 }4 A+ [復(fù)位向量:通常是FLASH的起始地址或者某個(gè)固定位置,用于存放初始PC值(也就是程序入口地址)。程序計(jì)數(shù)器(PC)的設(shè)置:上電時(shí),PC由啟動(dòng)代碼或復(fù)位向量設(shè)定為FLASH中的起始地址,之后按順序讀取FLASH中的指令。: U, U5 @! b7 m% B# h K) j
1 E! f3 D; C* j/ e( t& q$ l36 h5 M# q" `6 l( B; c! h" v
必須搬到RAM中才能運(yùn)行嗎?不這樣做有什么不妥?
' j6 `! Z! s) |7 o) `雖然代碼可以直接從FLASH中執(zhí)行,但有時(shí)搬到RAM中運(yùn)行更具優(yōu)勢(shì),主要有以下幾種原因:
& z R( ]% _8 ~# e7 h9 @. b* |1 n執(zhí)行速度:RAM的訪問速度通常比FLASH更快。如果對(duì)性能要求較高,可以將部分代碼(如關(guān)鍵中斷服務(wù)程序)加載到RAM中運(yùn)行,能顯著提升執(zhí)行效率。寫入或擦除FLASH的限制:在執(zhí)行寫入或擦除FLASH操作時(shí),往往會(huì)阻塞對(duì)FLASH的讀訪問。因此,為了避免程序運(yùn)行中出現(xiàn)問題,有時(shí)需要將代碼搬到RAM中執(zhí)行,以便在對(duì)FLASH進(jìn)行操作時(shí)仍能正常運(yùn)行。代碼自修改:某些高級(jí)應(yīng)用中,程序可能會(huì)修改自身的指令。這種情況下,代碼必須位于可寫的存儲(chǔ)器(如RAM)中,因?yàn)镕LASH不支持動(dòng)態(tài)修改。
9 |* t2 R/ P. H3 {! r* F6 T
! H# j$ h0 r* |, O9 M; o! _47 d8 q g9 C# D. J! Y- L" C
片內(nèi)和片外存儲(chǔ)的區(qū)別# U0 x" X0 W& n4 k3 Y) N) j" o& @
片內(nèi)RAM/FLASH:通常片內(nèi)存儲(chǔ)器的訪問速度更快,延遲更低,因?yàn)樗鼈冎苯优c處理器內(nèi)核集成在一起。片內(nèi)RAM通常用于高速緩存或需要高頻訪問的數(shù)據(jù),而片內(nèi)FLASH用于存儲(chǔ)穩(wěn)定的程序代碼。" F- h; r) s3 V/ v Z
) ]: w* i$ p6 h' A- E1 r
片外RAM/FLASH:片外存儲(chǔ)器通過外部總線連接,訪問速度和片內(nèi)相比會(huì)稍慢,尤其在使用串行總線(如SPI FLASH)時(shí)延遲更大。如果程序和數(shù)據(jù)需要頻繁訪問片外存儲(chǔ)器,性能會(huì)明顯下降。
, ~' s6 p' S r3 N, w
& u5 s! B# n8 b( R# I% K* A因此,一般情況下,片外存儲(chǔ)更多是作為數(shù)據(jù)存儲(chǔ)或者大容量擴(kuò)展,而不是執(zhí)行的主要位置。4 a' ^ ^& B; e
54 P+ e0 @3 b: y1 A. O; h
如果程序大小超過RAM怎么辦?
" l6 X9 L6 G$ i+ Q1 z在程序代碼超過RAM可用空間時(shí),通常不會(huì)整個(gè)搬移,而是采用分段加載或“XIP”(Execute In Place,原地執(zhí)行)技術(shù):
/ o1 S7 u6 e) vXIP(原地執(zhí)行): 直接從FLASH中讀取和執(zhí)行指令,不需要搬到RAM。絕大多數(shù)MCU都支持這種方式。分頁加載或分段執(zhí)行:在一些高級(jí)系統(tǒng)(如操作系統(tǒng)驅(qū)動(dòng)的系統(tǒng))中,可以將程序分割為多個(gè)段,按需加載到RAM中執(zhí)行。但這對(duì)于資源受限的MCU來說,通常不會(huì)這么復(fù)雜。% V6 m) X7 y0 c5 n6 ?8 D
# l z% V, z9 b% x0 @6
5 ~+ L7 p( f" o o: L4 Y9 v+ |片外FLASH和SRAM的速度差異
/ Q; k0 f3 k" ?% y' v% \5 [0 \片外FLASH和SRAM相對(duì)片內(nèi)存儲(chǔ)器,訪問速度會(huì)更慢。1 I9 u* w/ d% g% a: A
2 g; b0 k! F4 A8 I& o+ t4 K" m' _3 @主要原因包括:
% A2 o' C( g3 e訪問延遲:片外存儲(chǔ)器需要通過總線協(xié)議進(jìn)行數(shù)據(jù)傳輸,可能涉及地址解碼和等待周期。帶寬限制:外部存儲(chǔ)器的讀寫帶寬通常不如片內(nèi)存儲(chǔ)器高,如果是串行接口(如SPI FLASH),帶寬瓶頸會(huì)更明顯。內(nèi)存控制器的影響:外部存儲(chǔ)器訪問可能還依賴于內(nèi)存控制器的配置,訪問速度受限于控制器的性能。
5 J Z9 c- D' g
% g8 E" u1 L# m3 w3 v0 g9 Q& G$ L ]0 M* G
v0qhdpmel3264012697242.jpg (71.14 KB, 下載次數(shù): 9)
下載附件
保存到相冊(cè)
v0qhdpmel3264012697242.jpg
2024-10-18 21:58 上傳
`- X/ @: v7 i) ^- a
m00exvkrk5f64012697342.gif (45.46 KB, 下載次數(shù): 6)
下載附件
保存到相冊(cè)
m00exvkrk5f64012697342.gif
2024-10-18 21:58 上傳
7 F" ^8 u7 p% `4 Y+ H, o4 o
點(diǎn)擊閱讀原文,更精彩~ |
|