題:
為什麼要從RAM執行代碼?
tarabyte
2017-09-06 21:52:27 UTC
view on stackexchange narkive permalink

我剛剛遇到了一些宏,供我的微控制器編譯器強制(或建議)從RAM執行功能。

https://siliconlabs.github.io/Gecko_SDK_Doc/efr32mg1/html/group__RAMFUNC.html#gac6abbc7f869eec9fb47e57427587c556

http://processors.wiki.ti.com/index.php/Placing_functions_in_RAM

https://www.iar.com/support/tech-notes/linker/controlling-placement-of-the-section-where-__ramfunc-functions-reside-ewarm-5.x--6.x /

https://community.nxp.com/thread/389099

在什麼情況下有價值?如果好處只是提高速度,為什麼我不總是從RAM執行呢?通常會導致更高的電流消耗嗎?

從RAM執行代碼消耗的電流更少(我不確定所有CPU / SoC是否都適用)。我曾經做過一個項目,我們將大部分代碼存儲到RAM中,因為它是電池設備,並且我們希望其壽命盡可能長。如果您只能從RAM執行代碼,則您甚至可以關閉某些SoC上的閃存塊,從而節省更多電量。
@pipe-我想將其評論而不是答案的原因是它沒有回答實際的問題,這就是為什麼您不想*總是*使用RAM來執行代碼。
@Jules是的,我想它的意思是“有用的軼事”。出於非常充分的理由,Stack Exchange旨在防止發生這種情況。
因為您沒有足夠的寄存器才能從寄存器執行。(我有那個芯片。)
除了所有內容:從* dynamic * RAM執行代碼特別可能是精心設計的軟件黑客的一部分,以實現DRAM刷新。:)
速度(單週期訪問)很重要的一個具體示例是延遲循環。閃存等待狀態會影響延遲時間,具體取決於代碼在內存中的對齊方式。弄清楚可能很棘手,因此只說“從RAM運行”會容易得多。
對於具有哈佛架構的微控制器,從RAM執行代碼通常*慢得多*。Flash / ROM存儲器具有專用的單獨地址和數據總線,並且可以與數據訪問並行運行。馮·諾依曼體系結構只有一條總線,數據和程序訪問權限必須共享。現代的馮·諾依曼CPU嘗試通過使用緩存在某種程度上模仿哈佛體系結構。
九 答案:
brhans
2017-09-06 22:21:36 UTC
view on stackexchange narkive permalink

除了速度&以及其他人已經提到的其他功能之外,從RAM執行代碼在需要重新編程Micro Flash的引導加載程序中很有用-您無法從中間的Flash執行代碼刪除&重編程。

取決於您擁有多少個閃存塊以及允許修改引導加載程序的閃存塊,為下一個塊暫存數據而剩下的內存量等等,但是對於從閃存中蹦床來說是正確的,因此您可以修改閃存內存是很好...
這似乎只能回答一半的問題(標題部分)。OP還問“如果僅從提高速度中受益,為什麼我不總是從RAM中執行?”,此答案不能解釋為什麼人們可能*不*希望從RAM中執行。
到目前為止,一切都很好,但是,如果在重寫閃存的過程中斷電(進而導致RAM),會發生什麼情況?*可以*解決,但是就像其他任何引導加載程序設計一樣,必須予以考慮。
Olin Lathrop
2017-09-06 21:58:24 UTC
view on stackexchange narkive permalink

我沒看過那個微型相機的數據表。但是,在這種情況下,從RAM取數據通常比從程序存儲器的閃存取數據要快。

閃光燈的優點是大批量可以相對便宜。因此,微控制器製造商有時會在芯片上放置大量閃存,然後提供可以執行代碼的更有限的RAM空間。這樣可以將對時間要求嚴格的例程複製到RAM中,然後從那裡執行。

您所引用的編譯器開關可能與鏈接器配合使用,並標記將從復位開始運行的編譯器運行時代碼將該段閃存複製到RAM。不同的實現方式會有所不同。

pipe
2017-09-06 21:56:38 UTC
view on stackexchange narkive permalink

當您要在RAM中執行速度更快時,通常是因為該RAM是片上SRAM。這是一種稀缺資源,您可能需要用於需要讀/寫訪問權限的數據。

擁有 ROM /閃存中的代碼時,將其用作代碼意味著您需要X數量的閃存和X數量的RAM。

它在啟動時或您要運行它時還需要一個額外的複制階段,儘管它幾乎無關緊要。

傳統上,這是通過指令緩存解決的,但是在微控制器中,保持內部SRAM通用可能更有意義,因為您不使用微控制器,因為您想要最快的執行速度。

還有一個可靠性問題-在實際ROM中執行的代碼很難通過錯誤代碼進行修改。

Marko Buršič
2017-09-06 22:54:31 UTC
view on stackexchange narkive permalink

除了所有好的答案:

如果好處僅是為什麼我不總是從RAM中執行 提高速度?

因為在嵌入式系統中,通常您沒有所需的RAM量。例如,具有32kB或RAM和512kB EEPROM的STM32。為了能夠在RAM中執行整個程序,您需要一個大於EEPROM的RAM。

“因為在嵌入式系統中,通常您沒有所需的RAM數量。”-並且因為如果您*有*有足夠的RAM來執行此操作,那麼您幾乎可以肯定地通過切換到價格更低,價格更低的MCU來降低成本。內存。因為如果您問這個問題,總是有一個便宜的MCU,但RAM更少(最小和最便宜的MCU使用哈佛架構,因此無法從RAM中執行)
user
2017-09-07 15:17:05 UTC
view on stackexchange narkive permalink

其他答案似乎並沒有太多討論功耗,您特別詢問過。

答案是,它在某種程度上取決於微控制器,但是通常從RAM執行可以減少功耗,因為從RAM讀取指令所需的能量比從閃存讀取能量要低。

典型的用途是在RAM掉電的情況下從RAM運行低功耗的“睡眠”功能。不僅降低了功耗,而且如果微控制器需要快速喚醒(例如響應外部中斷),那麼在閃存再次加電時也沒有延遲。

某些零件(例如Atmel SAM系列的某些零件)具有特殊的超低功耗RAM,可用於此目的。這樣一來,就可以將少量代碼加載到特殊的RAM中,同時將大量可用RAM和所有其他存儲器都關閉電源,並使微控制器進入深度睡眠模式。

Trevor_G
2017-09-06 22:09:03 UTC
view on stackexchange narkive permalink

除了別人提到的潛在的速度優勢外,RAM代碼也是動態的,可以根據需要通過FLASH中的一些定制代碼即時修改。

這可以像更改幾個參數一樣簡單,也可以是整個處理程序例程遠程上傳。

或者可以從磁盤(例如SD)或網絡中加載RAM中的代碼
TwoThe
2017-09-07 15:50:20 UTC
view on stackexchange narkive permalink

從RAM中執行代碼比從閃存中執行代碼要快得多。大多數CPU經過嚴格優化,以實現最快的RAM訪問,甚至最快的閃存也僅達到RAM速度的一小部分。

但是請記住,將代碼從閃存移動到RAM也需要時間。如果代碼僅執行一次,則只需讀取一次,因此實際上會浪費時間將其首先複製到RAM中,而不是直接執行。如果偶爾執行代碼(因此將其複製到RAM會在第二次調用時增加執行),但是系統通常處於空閒狀態,那麼通過將其複製到RAM可以更快地執行該代碼,但是沒人在乎,因為系統有足夠的時間來度過。

因此,只有頻繁執行代碼,並且已將其視為系統的瓶頸,這種優化才值得付出努力。

另一方面,RAM需要主動保存數據,而閃存則不需要,因此如果RAM需要保持活動狀態,則總功耗會增加。但是,只有在根本不使用RAM的情況下,這才有意義,但是大多數現代系統將以一種或另一種方式使用可用的RAM,因此已經使其保持活動狀態。

Dave Nadler
2017-09-08 00:56:05 UTC
view on stackexchange narkive permalink

從RAM執行代碼有兩個很常見的原因:

  1. 某些微處理器無法在閃存編程期間從閃存執行-儘管許多代碼可以執行此操作,只要代碼位於與要寫入的閃存不同的塊中即可。Flash寫入可能正在重新編程應用程序(引導加載程序情況),或者當Flash用於存儲非易失性程序信息(配置,校準等)時

  2. 在許多微處理器上,RAM比閃存快得多。對於這些設備,可以從RAM中執行對速度有嚴格要求的小型例程,儘管通常RAM的供給要比閃存短得多。

  3. ol>
Tejas Kale
2017-09-08 18:25:49 UTC
view on stackexchange narkive permalink

針對隨機位翻轉的僅RAM執行安全性的另一個用例。我們在小型cubesat上使用此模型,因為主計算機板具有ECC ram,可以承受由於輻射引起的位翻轉。當啟動時的虛擬磁盤在ECC環境中完全運行時,整個OS都加載到ram中。

閃存不受ECC保護(標準的微型SD卡),但是我們還有其他方法來檢查損壞(多張圖像,校驗和等)

我本來以為像EEPROM或閃存之類的東西很難通過輻射進行位翻轉,即需要更多的能量。
確實如此,但是由於我們只使用沒有特殊ECC功能的標準閃存,因此使用ram更好。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...