• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 博客專欄

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

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

    發布人:美男子玩編程 時間:2024-12-23 來源:工程師 發布文章

    來源于小伙伴提問。


    以下是我的一些看法。

    MCU中的程序通常可以直接在FLASH中運行,但在對性能有特殊需求或需要動態修改代碼的情況下,可以將程序搬到RAM中執行。

    同時,片內與片外存儲器在速度和訪問延遲上確實存在明顯差異,這會影響系統的設計決策。


    1


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

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

    在MCU上電復位后,系統的啟動過程大致如下:

    • 上電復位(Power-on Reset):MCU會進入復位狀態,內部電路開始初始化。

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

    • 執行用戶代碼: 此時,程序開始從FLASH中讀取指令,并由處理器逐條執行。

    2

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

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

    對于絕大多數嵌入式應用來說,這是最常見的做法,因為這樣可以節省寶貴的RAM空間。

    在大多數ARM或PowerPC架構的MCU中,啟動流程是:

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

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

    3

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

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

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

    • 寫入或擦除FLASH的限制:在執行寫入或擦除FLASH操作時,往往會阻塞對FLASH的讀訪問。因此,為了避免程序運行中出現問題,有時需要將代碼搬到RAM中執行,以便在對FLASH進行操作時仍能正常運行。

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

    4

    片內和片外存儲的區別

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

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

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

    5

    如果程序大小超過RAM怎么辦?

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

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

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

    6

    片外FLASH和SRAM的速度差異

    片外FLASH和SRAM相對片內存儲器,訪問速度會更慢。

    主要原因包括:

    • 訪問延遲:片外存儲器需要通過總線協議進行數據傳輸,可能涉及地址解碼和等待周期。

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

    • 內存控制器的影響:外部存儲器訪問可能還依賴于內存控制器的配置,訪問速度受限于控制器的性能。

    *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



    關鍵詞: 嵌入式系統

    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 安新县| 永川市| 旬邑县| 荣成市| 包头市| 灌南县| 阿拉善右旗| 抚松县| 望谟县| 陆河县| 莫力| 淮北市| 航空| 麻江县| 五河县| 神池县| 宝清县| 兴义市| 方正县| 宁国市| 三亚市| 紫阳县| 特克斯县| 呈贡县| 乐山市| 绥阳县| 象山县| 隆化县| 天全县| 三亚市| 大同市| 七台河市| 盱眙县| 阿勒泰市| 阿克苏市| 特克斯县| 即墨市| 西林县| 宝山区| 三门县| 长乐市|