即:
x86的pc機cpu在運行的時候程序是存儲在RAM中的,而單片機等嵌入式系統則是存於flash中
x86cpu和單片機讀取程序的具體途徑
pc機在運行程序的時候將程序從外存(硬盤)中,調入到RAM中運行,cpu從RAM中讀取程序和數據
而單片機的程序則是固化在flash中,cpu運行時直接從flash中讀取程序,從RAM中讀取數據
造成這種差別的具體原因分析
x86構架的cpu是基於馮.諾依曼體系的,即數據和程序存儲在一起,而且pc機的RAM資源相當豐富,從幾十M到幾百M甚至是幾個G,客觀上能夠承受大量的程序數據。
單片機的構架大多是哈弗體系的,即程序和數據分開存儲,而且單片的片內RAM資源是相當有限的,內部的RAM過大會帶來成本的大幅度提高。
單片機的程序能存儲在RAM中嗎 ?
通過上面的分析可得知:單片機的程序能存儲於flash中是基於兩點考慮,即體系結構和RAM資源的多少。因此,在技術不但進步片內RAM容量不斷增多的今天,RAM資源已經不再是制約這種差別的主要因素,而對於體系機構我們只要更改cpu讀取程序的方式就可以。
將嵌入式系統的程序存於RAM中的具體做法
“對於很多的嵌入式系統,其代碼很多都存儲在nor flash中,運行也是直接在flash中運行.我最近了解到我新公司的軟件中的一段代碼當時爲了提高運行速度被加載到ram中運行.當時他們是花了很多時間來解決這個問題的.
我仔細研究了一下鏈接腳本,用的是gnu的linux的交叉工具鏈.地址分配是寫在一個ld腳本中的.
他們是這樣實現的:
1,將你需要在ram中運行的代碼寫在單獨的一個c文件中,然後在腳本中設置其運行地址與存放地址分開.設置好必要的代碼起始和結束的標誌變量.
2,在代碼中將存放地址處的代碼拷貝到運行地址中.
這段代碼倒是沒什麼問題,只是我有個更簡單的辦法:
還記得全局變量是怎麼初始化的嗎? .data段是一個自動初始化的段(內核代碼處理),我只需要將這個c文件產生的代碼放置在.data段中,這段代碼就可以被加載到ram運行了.我測試了一下運行良好.
馮.諾依曼體系與哈佛體系的區別
二者的區別就是程序空間和數據空間是否是一體的。 早期的微處理器大多采用馮諾依曼結構,典型代表是Intel公司的X86微處理器。取指令和取操作數都在同一總線上,通過分時複用的方式進行的。缺點是在高速運行時,不能達到同時取指令和取操作數,從而形成了傳輸過程的瓶頸。
哈佛總線技術應用是以DSP和ARM爲代表的。採用哈佛總線體系結構的芯片內部程序空間和數據空間是分開的,這就允許同時取指令和取操作數,從而大大提高了運算能力。
例如STM320LF240x系列DSP是增強型的哈佛結構通過三組並行的總線訪問多個存儲空間。它們分別是:程序地址總線(PAB),數據地址讀總線(DRAB)和數據地址寫總線(DWRB)。