基於ARM Cortex-M的SoC存儲體系結構和實戰

基於ARM Cortex-M的SoC存儲體系結構和實戰

System on Chip Architecture Tutorial Memory Architecture for ARM Cortex-M based SoC-Aviral Mittal

Memory Architecture for Cortex-M bases System on Chip.

一旦你完成了處理器的選擇(即在ARM Cortex-M家族中),內存架構可能是SoC架構的第二個最重要的方面。內存結構取決於處理器的選擇。

例如,如果選擇Cortex-M7,則處理器中內置指令緩存和數據緩存作爲選項,因此內存系統可能沒有任何緩存。

Cortex-M7還具有緊密耦合存儲器(TCMs),它提供非常快速的代碼執行(來自指令TCMs)和非常快速的數據訪問(來自數據TCMs)。

NVM Memory choice for code storage.

現在,由於這項技術是關於無主機SoC的,即一個自給自足的SoC,並且是系統的主要SoC,它應該有非易失性存儲器(NVM)用於代碼存儲,而不像“託管”SoC,它通常從“主機”接收其代碼,並且代碼最終在SoC的RAM中。

Flash or R-RAM as NVM for code storage.

一個流行的選擇是NAND Flash。對於28nm以上的幾何圖形,您也可以使用e-Flash,即嵌入式Flash,即集成在SoC中的閃存,但對於28nm以下的幾何圖形,由於技術限制,e-Flash通常不可用,因此您可能需要選擇外部Flash設備,通常通過SPI接口、四SPI接口(QSPI)或八進制SPI接口。(OSPI)。但是,如果您想讓NVM在SoC上實現更精細的幾何結構,可以選擇R-RAM(電阻RAM)或M-RAM(磁RAM)。然而,您必須記住,R-RAM是一個昂貴的事情,可以大大增加SoC的成本。

ROM for code storage

你可以用ROM,它比Flash或者R-RAM速度快,成本低,功耗低,但是ROM的問題是,它不是很靈活。它不能被覆蓋,所以如果你想在後期更新你的系統,ROM不會讓它發生。然而,ROM是最“安全”的內存,一般不需要驗證或解密等。因此,如果您的系統足夠穩定,如果您的代碼在系統生命週期內不需要更新,ROM是一種方法。有時,在開發過程中,SoC可能有flash或R-RAM,SoCs的初始版本用flash/R-RAM發佈,並且隨着代碼的成熟,flash/R-RAM被ROM取代。

OnChip R-RAM Vs Flash:
在這裏插入圖片描述
重要的是要考慮到Flash中的代碼存儲通常是在nandflash中,因爲它提供隨機訪問,而不像NOR Flash那樣隨機訪問是不可能的。

從上表中可以很明顯地看出,R-RAM在大多數情況下都是勝出的,因此如果成本允許,並且您的SoC需要更多的性能來降低功耗,R-RAM將是NVM的選擇。

然而,R-R a M是一項非常新的技術,並且目前非常昂貴,因此,大多數使用ARM Cortex-M類處理器的soc仍然具有e-Flash或片外Flash。

注:需要注意的是,R-RAM不能替代片上RAM。它仍然有有限的寫入週期~10000,因此不能像在SoC上使用普通RAM那樣使用。

從安全角度看片內與片外NVM:

片上NVM可以被認爲是更安全的,因爲您不需要“認證”NVM,因爲它是片上的。然而,片外NVM至少在每次系統啓動時都需要“身份驗證”,以確保片外設備是真正的設備。

XIP vs No XIP.

在考慮NVM時,如果它是Flash或R-RAM(而不是ROM,ROM通常總是XIP),您可能還需要考慮是否需要XIP。XIP執行到位。你可以在這裏找到更多關於XIP的信息。
如果您的系統沒有高性能要求,XIP可能是一個非常好的建議。它非常經濟有效,因爲它比片上RAM便宜得多,而且您的代碼直接從這個內存執行。即使NVM是片外閃存,使用cache存儲器也可以縮小性能差距,爲各種應用提供足夠的性能。

然而,從片外閃存使用XIP的缺點是高功耗。在片外XIP過程中,您將消耗比將代碼一次複製到片上RAM並從片上RAM執行多得多的能量。因此,這些是作爲SoC架構師必須做出的權衡。成本/功率/性能。沒有對錯之路。這取決於你的SoC的用例是什麼。

然後不使用XIP意味着代碼需要從NVM複製到RAM,這意味着需要更多的內存來存儲代碼,因爲有代碼複製。但是在這些情況下,代碼在NVM中被壓縮,然後解壓縮到RAM中,這樣可以節省一些內存,但是沒有XIP意味着比XIP更多的系統內存。

The Security Aspect of XIP vs no XIP

從安全的角度來看,XIP將需要所謂的內聯解密,因爲代碼在執行時將被解密,因爲代碼通常將從NVM中的隨機位置獲取。但是,如果沒有XIP,則解密方法將是“塊”解密,即在將整個圖像複製到系統RAM時對其進行一次解密。

Execute In Place (XIP)

當嵌入式系統在沒有電源的情況下啓動時,它將執行的第一個代碼必須來自非易失性存儲器源,例如Flash或ROM。

通常應該有一個“bootloader”程序,它將盡可能少地啓動和運行系統。

當系統啓動時,它沒有可用的ram,因此沒有可用的堆棧,因此沒有可用的內存來存儲程序變量。因此,處理器運行的第一個代碼必須完全使用處理器寄存器。處理器執行的第一個代碼也從它所在的位置執行。也就是說,它是“就地執行”(XIP)。它不能試圖修改程序本身的任何內容,因爲這段代碼可能在ROM中,並且代碼不能自我修改。

由於上述考慮,處理器通電後執行的第一個程序通常用匯編語言編寫,因爲c程序的執行幾乎總是需要在讀/寫存儲器(RAM)中設置一個“堆棧”來存儲變量,並且在啓動或通電時RAM可能不可用。

引導加載程序要做的一件事是使系統RAM可用。然後,它可以將代碼從flash重新定位到這個ram中,然後跳到ram來執行這個複製或重新定位的代碼。

是的,對於所有的XIP代碼,load region=execution region,也就是說,XIP代碼存儲在根區域中。記住“根區域”的定義是加載地址爲=執行地址的區域。

Other applications of XIP:

除了引導加載程序代碼之外,XIP在嵌入式世界中也越來越流行,它可以直接從Flash中執行引導代碼以外的程序。NOR flash可以像NAND那樣隨機訪問,因此NOR flash顯然是這樣的XIP存儲和就地執行代碼的選擇。這有助於節省片上ram區域,而這反過來又可以節省成本。當然,執行速度會比RAM執行慢,但是對於許多嵌入式應用程序來說,它帶來了成本優勢,並提供了足夠的性能。

Load Region Vs Execute Region:

在典型的嵌入式系統中,當系統斷電時,所有的程序和數據都存儲在非易失性存儲器中。然而,當系統通電時,一些數據或代碼可以在執行前(如果是代碼)或在使用前(如果是數據)移動到系統SRAM(volatile mem)中。

當用戶編譯並“鏈接”程序時,會生成該程序的“圖像”。這是系統可以執行的二進制可執行文件。

二進制“image”通常分爲“Read Only”段(包含代碼和只讀數據)和“Read Write”段(包含可以初始化或零初始化甚至未初始化的數據)。

通常“只讀”段甚至可以放入ROM(與flash相反),並且不需要從內存中的位置移動。它是“從它所在的地方執行”即它是在適當的地方執行的。

而“讀寫”段必須在執行開始前移入系統的讀/寫存儲器,例如SRAM。

因此,對於代碼的某些部分,系統關機時該部分所在的內存位置與系統開機時相同。

但是

對於代碼的某些部分,當系統處於關機狀態時,該部分所在的內存位置與開機時該部分移動到的內存位置不同。

那麼誰來移動代碼呢?

鏈接器將把代碼添加到處理器將要執行的程序中,並移動代碼中需要在通電時移動到系統SRAM中的那些部分。

現在,這些代碼段在“加載”時有不同的地址,這是在NVM中,而在“執行”時,通常是在SRAM中的某個地方。

因此,程序映像可以有“加載區域=執行區域”的部分,並且這部分代碼是“就地執行”XIP。

對於代碼的某些其他部分,“加載區域不等於執行區域”,並且這部分代碼沒有在適當的位置執行。

Example:

用戶有它的應用程序代碼,他編譯並鏈接它以生成名爲’圖像.bin’. '圖像.bin’是14246字節。

這意味着系統必須至少有該數量的NVM可供用戶在系統中匹配其二進制圖像。

然後,系統將具有一些SRAM(比如16KB,在本例中相當慷慨),這是在0x2000_0000和0x2000_3FFF位置。

現在是圖像文件的永久地址’圖像.bin’將在NVM中,並將佔用系統中的內存地址0x0000_0000到0x0000_37A6。

因此,整個二進制文件的加載地址是從0x0000_0000到0x0000_37A6。這可以是一個NVM(閃存),甚至可以是ROM。

但在執行之前,作爲最低要求

應設置堆棧內存。

r/w數據(如變量)必須移動到r/w存儲器

系統的R/W內存(假設系統中總共有16KB的SRAM可用)位於內存映射中的其他位置,並假設它是從0x2000_0000到0x2000_3FFF(16KB)。

因此image.bin’將被移動到位於0x2000_和0x2000_3FFF之間的內存位置。堆棧指針將被設置爲爲爲“stack”保留一些內存,這些內存也將位於0x2000_0000和0x2000_3FFF之間。

因此,對於圖像.bin’文件,加載地址=執行地址,並且它保持永久性,並且在0x0000_0000和0x0000_37A6之間。這也是XIP,在圖像.bin’.

鑑於圖像.bin’文件,加載地址在0x00000x000037A6之間,執行地址在0x20000x20003FFF之間。i、 e.對於這些部分,加載地址不等於它們的執行地址。

Let us take another example where the Load address is not the same as execution address:

用戶有一個用C編寫的關鍵函數。包含此函數的圖像文件放在NVM中。但是,用戶希望將此函數移到離處理器非常近的SRAM中,以便快速執行。

現在這個函數有兩個內存地址。

  1. 加載地址:當系統關機時,該函數在NVM內存中的位置

2.執行地址:當系統啓動並運行時,函數在SRAM內存中的位置。

同樣,對於這個函數,加載地址與其執行地址不同。

因此,此代碼將不是XIP(就地執行)。

Conclusion:

二進制圖像中的某些代碼可以從內存中的位置執行。此代碼永遠不會“移動”到內存的另一個區域,並且具有永久地址。當執行此代碼時,它是從它所在的位置執行的,這稱爲就地執行(XIP)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章