<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 嵌入式系統中程序代碼必須從FLASH搬到RAM中運行嗎?

嵌入式系統中程序代碼必須從FLASH搬到RAM中運行嗎?

發(fā)布人:美男子玩編程 時(shí)間:2024-12-23 來(lái)源:工程師 發(fā)布文章

來(lái)源于小伙伴提問(wèn)。


以下是我的一些看法。

MCU中的程序通??梢灾苯釉贔LASH中運行,但在對性能有特殊需求或需要動(dòng)態(tài)修改代碼的情況下,可以將程序搬到RAM中執行。

同時(shí),片內與片外存儲器在速度和訪(fǎng)問(wèn)延遲上確實(shí)存在明顯差異,這會(huì )影響系統的設計決策。


1


程序從FLASH執行還是搬到RAM執行?

一般情況下,嵌入式系統的程序代碼是存儲在片內的FLASH中的。

在MCU上電復位后,系統的啟動(dòng)過(guò)程大致如下:

  • 上電復位(Power-on Reset):MCU會(huì )進(jìn)入復位狀態(tài),內部電路開(kāi)始初始化。

  • 啟動(dòng)代碼(Boot Code):上電后,芯片的啟動(dòng)代碼會(huì )被執行。這個(gè)啟動(dòng)代碼可能是由芯片廠(chǎng)家提供的ROM引導代碼,負責初始化時(shí)鐘、棧指針等關(guān)鍵硬件資源,并將程序計數器(PC指針)指向FLASH中預定的入口點(diǎn)(通常是復位向量)。

  • 執行用戶(hù)代碼: 此時(shí),程序開(kāi)始從FLASH中讀取指令,并由處理器逐條執行。

2

FLASH中的代碼是如何運行的?

當程序計數器(PC)指向FLASH中某個(gè)地址時(shí),處理器會(huì )從該地址讀取指令,解碼后執行。也就是說(shuō),程序實(shí)際上可以直接從FLASH中運行,不一定需要搬到RAM。

對于絕大多數嵌入式應用來(lái)說(shuō),這是最常見(jiàn)的做法,因為這樣可以節省寶貴的RAM空間。

在大多數ARM或PowerPC架構的MCU中,啟動(dòng)流程是:

  • 復位向量:通常是FLASH的起始地址或者某個(gè)固定位置,用于存放初始PC值(也就是程序入口地址)。

  • 程序計數器(PC)的設置:上電時(shí),PC由啟動(dòng)代碼或復位向量設定為FLASH中的起始地址,之后按順序讀取FLASH中的指令。

3

必須搬到RAM中才能運行嗎?不這樣做有什么不妥?

雖然代碼可以直接從FLASH中執行,但有時(shí)搬到RAM中運行更具優(yōu)勢,主要有以下幾種原因:

  • 執行速度:RAM的訪(fǎng)問(wèn)速度通常比FLASH更快。如果對性能要求較高,可以將部分代碼(如關(guān)鍵中斷服務(wù)程序)加載到RAM中運行,能顯著(zhù)提升執行效率。

  • 寫(xiě)入或擦除FLASH的限制:在執行寫(xiě)入或擦除FLASH操作時(shí),往往會(huì )阻塞對FLASH的讀訪(fǎng)問(wèn)。因此,為了避免程序運行中出現問(wèn)題,有時(shí)需要將代碼搬到RAM中執行,以便在對FLASH進(jìn)行操作時(shí)仍能正常運行。

  • 代碼自修改:某些高級應用中,程序可能會(huì )修改自身的指令。這種情況下,代碼必須位于可寫(xiě)的存儲器(如RAM)中,因為FLASH不支持動(dòng)態(tài)修改。

4

片內和片外存儲的區別

片內RAM/FLASH:通常片內存儲器的訪(fǎng)問(wèn)速度更快,延遲更低,因為它們直接與處理器內核集成在一起。片內RAM通常用于高速緩存或需要高頻訪(fǎng)問(wèn)的數據,而片內FLASH用于存儲穩定的程序代碼。

片外RAM/FLASH:片外存儲器通過(guò)外部總線(xiàn)連接,訪(fǎng)問(wèn)速度和片內相比會(huì )稍慢,尤其在使用串行總線(xiàn)(如SPI FLASH)時(shí)延遲更大。如果程序和數據需要頻繁訪(fǎng)問(wèn)片外存儲器,性能會(huì )明顯下降。

因此,一般情況下,片外存儲更多是作為數據存儲或者大容量擴展,而不是執行的主要位置。

5

如果程序大小超過(guò)RAM怎么辦?

在程序代碼超過(guò)RAM可用空間時(shí),通常不會(huì )整個(gè)搬移,而是采用分段加載或“XIP”(Execute In Place,原地執行)技術(shù):

  • XIP(原地執行): 直接從FLASH中讀取和執行指令,不需要搬到RAM。絕大多數MCU都支持這種方式。

  • 分頁(yè)加載或分段執行:在一些高級系統(如操作系統驅動(dòng)的系統)中,可以將程序分割為多個(gè)段,按需加載到RAM中執行。但這對于資源受限的MCU來(lái)說(shuō),通常不會(huì )這么復雜。

6

片外FLASH和SRAM的速度差異

片外FLASH和SRAM相對片內存儲器,訪(fǎng)問(wèn)速度會(huì )更慢。

主要原因包括:

  • 訪(fǎng)問(wèn)延遲:片外存儲器需要通過(guò)總線(xiàn)協(xié)議進(jìn)行數據傳輸,可能涉及地址解碼和等待周期。

  • 帶寬限制:外部存儲器的讀寫(xiě)帶寬通常不如片內存儲器高,如果是串行接口(如SPI FLASH),帶寬瓶頸會(huì )更明顯。

  • 內存控制器的影響:外部存儲器訪(fǎng)問(wèn)可能還依賴(lài)于內存控制器的配置,訪(fǎng)問(wèn)速度受限于控制器的性能。

*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: 嵌入式系統

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>