當今嵌入式系統的復雜性和伴隨的內存子系統有時可能會給新手工程師帶來學習曲線。內存包括作為臨時(易失性)或持久性(非易失性)存儲“容器”運行的硬件組件。這些帶電電路的神奇金塊存儲信息狀態并用于指令(二進制代碼)并將數據組織為可尋址字節(8 位)、雙字節(16 位)和四字節(32 位)。
與控制內存子系統等資源的嵌入式操作系統 (OS) 相結合,軟件會指示處理器 (CPU) 沿地址線發送電流脈沖,以識別芯片中存儲數據的轉換位置。該脈沖可以打開或關閉連接到數據線的晶體管。當電脈沖到達地址線時,脈沖流過一個閉合的晶體管并為存儲相當于 1(開啟)位的電容器充電,相反,未充電的電容器代表 0(關閉)位。
1. 存儲信息位數組(部分顯示)。
易失性存儲器用作隨機存取存儲器(RAM)。其內容僅在通電時保持不變。為了補充 RAM 的使用,在早期的嵌入式系統中,通常使用只讀存儲器 (ROM) 來運行操作系統和應用程序。可以以字節(8 位)信息為單位訪問任一內存源。
非易失性存儲器保留數據。對于傳統的 PC、Mac 和服務器,持久內存存儲已用于存儲更大的可尋址字節容器——通常基于底層分組(稱為扇區)進行組織。物理尺寸和低功耗要求通常不是固定磁盤或固態設備 (SSD) 等存儲系統的優先事項。對于尺寸和低功耗至關重要的小型嵌入式系統,情況并非如此。這種持久性存儲介質要么是可移動的(SD 或 CF 卡,或 USB 閃存驅動器),要么是不可移動的,無論是否有電源,都應保留其內容。512 和 4192 KB 的塊是這些小型設備的常用大小。鑒于許多嵌入式系統的小尺寸,
易失性存儲器基礎知識
易失性內存可用于讀取 CPU 執行的指令,從而導致執行某些操作時有時會將數據寫回內存。當今強大的嵌入式 CPU 可以處理和訪問 32 位(甚至 64 位)值的信息。8 位計算的日子已經一去不復返了。
RAM 被組織在一個或多個芯片中,并且可以與 CPU 和 I/O 端口一起駐留在同一封裝基板中,稱為片上系統 (SoC),這在小型設備(如無人機、家庭傳感器)中很常見等),可用的電路板空間有限。
非易失性存儲器基礎知識
最初稱為閃存 RAM,閃存正在成為首選的永久存儲介質,取代旋轉磁盤。Fujio Masuoka 博士于 1984 年在東芝工作時發明了閃存。他的同事 Shoji Ariizumi 先生想出了閃光燈這個名字,因為從細胞中擦除數據的過程讓他想起了相機閃光燈。
閃存是一種非易失性存儲器,經過電氣編程以實現長期存儲。最初的電可擦可編程只讀存儲器 (EEPROM) 設備由列和行的網格組成,每個交叉點都有晶體管。一層薄薄的氧化物將每個晶體管與其他晶體管隔開。如果一個晶體管(浮動柵極)與另一個(控制柵極)鏈接,則單元的值為 1。如果此鏈接斷開,則該值變為 0。要將單元的值更改為 0,需要一個過程發生稱為 Fowler-Nordheim 的隧道效應,它改變了電池的電荷水平。斷電時,單元應保持其最后設置(如已編程或已擦除)。
認為閃存僅適用于相機和智能手機等消費類移動設備的看法是不正確的。在任何外形尺寸受限且需要永久數據存儲的系統中,經常使用閃存。閃存既可以是常駐的(焊接到板上),也可以是非常駐的(通過 SD 和 USB 等行業標準端口的可移動設備)。閃存的美妙之處在于沒有可能對可靠性產生負面影響的移動部件,但與任何技術一樣,也有優缺點,如表所示。
市面上有兩種基本類型的閃存——NOR 和 NAND。NOR 最初旨在取代 ROM、EPROM 和 EEPROM 非易失性存儲器。它有一套完整的地址線,允許讀取單個字節。事實上,讀取速度通常與 DRAM 一樣快,允許程序直接從 NOR 內存運行 XIP(就地執行)。然而,擦除非常慢并且只要不經常執行擦除操作就不是問題。NOR 最初用于可移動緊湊型閃存 (CF) 卡,是存儲操作系統映像、系統引導加載程序和系統配置信息的不錯選擇。
與 NOR 相比,NAND 的開發旨在實現更高的容量、更小的占地面積和更低的成本。但是,它僅限于串行接口。因此,不能直接訪問單個字節;讀取、寫入和擦除必須以塊(或塊)的形式執行。該技術不適合替代 ROM,但非常適合替代硬盤驅動器。NAND 已成為可移動和常駐介質的標準閃存技術,因此,它適用于需要低成本、高密度和快速擦除的應用。
注意塊和頁面之間的區別。每個塊由多個頁面組成,其中頁面大小通常是小塊(512 字節)或大塊(2048、4096 字節等)。塊大小很重要,因為如果記錄大小是閃存介質上使用的底層塊大小的偶數部分,您通常會獲得最佳結果。對于所有 NAND,數據以頁的形式寫入,但頁必須已經被擦除(全為 1),并且只能擦除塊。
2. 頁面和塊。
如果我們不提及存儲單元是如何組織存儲信息位的,那么關于 NAND 的討論就不會完整。單級單元 (SLC) 每個單元存儲一位信息。隨著存儲容量的增加,已開發出多級單元 (MLC) 和三級單元 (TLC) 以在每個單元中存儲多個位。但是這種增加的容量有一些缺點。MLC 的寫入性能通常約為 SLC 的三分之一到二分之一。其增加的復雜性也會產生更多的位錯誤,需要更復雜的糾錯碼 (ECC) 來防止常見的數據錯誤情況。TLC 比其 SLC 和 MLC 同類產品具有更慢的傳輸速度、更高的錯誤率,需要更大的 ECC 以及更低的耐用性。當塊被寫入最少次數時,耐久性更好。
典型的 NAND 需要一個控制器來處理主機和閃存之間的命令和數據移動。控制器提供了執行塊讀取、寫入和擦除等基本操作的機制。許多設計包括一個僅提供這些功能的分立控制器,而將其他閃存管理活動(例如更換壞塊并確保均勻磨損)留給驅動程序軟件。一些芯片設計人員發現,可以通過在稱為托管 NAND 的同一物理封裝中包含帶有 NAND 閃存的內置控制器來提高效率。這些復雜的控制器以較高的芯片成本為代價,卸載了一些計算密集型軟件管理,如圖 3 所示。
3. NAND 閃存與托管 NAND
這有效地使該部件能夠像典型的塊設備一樣運行,具有更簡單的主機文件系統接口。由于托管 NAND 的價格與 NAND 本身的價格不相上下,難怪嵌入式主板將常駐托管 NAND 作為嵌入式多媒體存儲卡 ( eMMC ) 而不是閃存和控制器。
盡管它代表了在馴服 NAND 特性方面的巨大飛躍,但 eMMC 并不是一項完美的技術。在對 eMMC 4.3 部件運行一系列性能基準測試后,Datalight 的工程團隊發現某些部件的性能表現不佳,尤其是隨機讀取。對于一個特定的 eMMC 部件,在大于 16 MB 的文件上執行的隨機 I/O 會減慢到 200 字節/秒的傳輸速率——比順序 I/O 常見的數兆字節速率要低很多。
歸根結底,最適合您的系統設計的閃存歸結為對其用例最重要的部分。沒有一個閃存部件能以最低的價格提供高質量、大存儲容量、非凡的耐用性和“殺手級”性能。總會有權衡,應為特定應用選擇正確的內存部分。
界面
常駐閃存在閃存、數據和地址總線之間具有直接接口。為了避免系統設計人員和閃存供應商之間出現混亂,通用閃存接口 (CFI) 定義了一個開放接口標準,該標準得到大多數供應商的支持,并得到聯合電子設備工程委員會 (JEDEC) 的非易失性存儲器小組委員會的認可。因此,可移動閃存符合物理、電氣和命令接口標準。這有效地允許各種不同的存儲器供應商選擇相似的部件。
這些標準已遷移到小型嵌入式系統。例如,第一個 EIDE/ATA 連接替代了最大吞吐量為 133 Mbytes/s 的串行 AT 附件 (SATA) 接口標準。另一個流行的接口是小型計算機系統接口 (SCSI),由于使用 16 條并行線路,速度高達 40 Mbytes/s,它可以在比 EIDE 更短的時間內移動更多數據。為了獲得更快的結果,Ultra-640 SCSI 可以以 640 Mbytes/s 的速度傳輸數據。
令人驚訝的是,對于小型嵌入式板數據表,您可能不得不四處尋找,以確定持久性存儲是否駐留在板上。例如,Raspberry Pi 3 具有可用于可移動媒體的 microSD 和 USB 端口。
軟件數據存儲棧
對于非易失性持久閃存,需要系統軟件來驅動其運行。該系統軟件提供了軟件服務的邏輯分離,使應用程序能夠將文件系統請求作為結構化數據元素發出,這些數據元素又被轉換為塊請求,讓人想起傳統的基于塊的硬盤驅動器中存在的內容。圖 4 將這種軟件數據存儲堆棧關系顯示為互連軟件組件的層次結構。
4.軟件數據存儲棧。
將軟件數據存儲堆棧表示為組件的層次結構,可以讓文件系統和塊驅動程序取代有時作為嵌入式操作系統的一部分提供的那些。Datalight 的 Reliance Nitro 嵌入式文件系統實際上是一組相關的軟件模塊,每個軟件模塊都有定義明確的軟件接口(稱為應用程序編程接口或 API),用于服務來自應用程序的請求,即使斷電也能確保可靠性。Reliance Nitro 的可配置事務模型在數據實際寫入閃存時提供了微調的靈活性。
Reliance Nitro 是一種電源故障安全文件系統,可插入各種工業嵌入式實時操作系統,如 VxWorks、Linux、Android 和 Windows Embedded。對于物聯網設備,可以使用內存占用少的物聯網文件系統 Reliance Edge,該系統可與 FreeRTOS 和 MQX 等小型嵌入式操作系統配合使用。
塊設備驅動程序從文件系統獲取塊請求,并作為閃存轉換層 (FTL) 工作。根據嵌入式系統上使用的閃存和接口,FTL 執行最初由文件系統執行的請求。例如,Datalight 的 FlashFX Tera 與 NAND 或 NOR 內存一起工作,并向系統的閃存控制器發出命令。
閃存驅動程序不僅負責為基本的閃存操作(讀、寫和擦除)提供支持,還負責優化內存的性能。由于閃存的壽命有限,連續重寫同一塊會導致部件過早磨損。為了防止這種情況,發明了磨損均衡算法,將磨損均勻地分布在閃存中。事實上,設計不佳的文件系統和塊驅動程序軟件可以從根本上破壞良好的閃存。例如,標準 FAT 文件系統不斷地在媒體的開頭寫入和重寫文件分配表 (FAT)。如果沒有不斷地重新定位塊,訪問這些塊可能會很快耗盡閃存。
由于單個塊確實會隨著時間的推移而磨損,因此壞塊管理 (BBM) 軟件是塊驅動程序的另一個重要部分。BBM 驗證寫入數據,當檢測到寫入失敗時,將壞塊重新映射到專門為壞塊分配保留的備用塊。
您會認為使用托管 NAND 設備,您將不需要閃存塊驅動程序。Datalight 的 FlashFXe 適用于托管 NAND 設備。因為隨機磁盤 I/O 很重要,特別是對于 Android 嵌入式系統,FlashFXe 以將實際隨機讀取和寫入調度為順序 I/O 塊的方式線性化隨機 I/O 請求。因此,隨機 I/O 性能可以顯著提高。通過減少正在執行的寫入次數,可以提高某些用例的閃存耐用性。
數據生命周期
總而言之,重要信息基于系統狀態駐留在內存中。首先是啟動時啟動。從非易失性閃存中,將包含整個系統(RTOS、驅動程序、應用程序等)的靜態副本的引導映像加載到 RAM 中。易失性存儲器被刷新,閃存中的非易失性數據再次可用。
接下來是正常操作。系統運行后,必須執行日常任務。對于基于傳感器的物聯網設備,應用程序使用本地閃存執行工作并依賴文件系統中的持久數據存儲(和檢索)。這通常包括打開文件、讀取和寫入數據以及可選地執行文件夾和其他文件系統操作。
但是存儲在設備上的數據很可能最終會在企業的其他地方——私人的或公共的。趨勢是在嵌入式設備上本地執行和保存更多的數據收集、處理和分析。平臺正在不斷發展,以滿足為這些連接設備提供安全、設備管理、數據分析、軟件更新和連接服務的需求。
最后一步是關機和系統恢復:當系統需要關機時,有序關機很重要。如果有電源完成對閃存的所有剩余 I/O 請求,則文件系統應有序關閉,并將數據信息正確保存到介質中。
對軟件數據系統堆棧健壯性的真正測試是在意外斷電的情況下重建文件結構所需的時間,這使得有序關閉變得不可能。基于日志的文件系統,如 ext4,可能需要一些時間來重播日志以重建文件系統。
審核編輯:郭婷
評論
查看更多