易恒 武柯安



摘? 要:NOR Flash用于存儲運行程序和應用數據,在嵌入式系統中應用廣泛。針對NOR Flash的文件系統較為臃腫,在內存較小的嵌入式系統中無法正常工作,導致NOR Flash的讀寫方式為直接地址訪問,人為地分配地址空間,管理數據不方便且容易出錯。為解決這一問題,設計了一套針對NOR Flash的低內存占有率的存儲訪問分區管理方法,滿足嵌入式系統中原始數據、靜態數據和動態數據的管理要求。
關鍵詞:NOR Flash;分區管理;文件系統;單片機
中圖分類號:TP333? 文獻標識碼:A? 文章編號:2096-4706(2023)23-0079-04
Implementation of Low Cost Partition Management Based on NOR Flash
YI Heng, WU Kean
(No.30 Institute of CETC, Chengdu? 610041, China)
Abstract: NOR Flash is used to store running programs and application data, and is widely used in embedded systems. The file system for NOR Flash is relatively bulky and cannot function properly in embedded systems with small memory. It causes that the reading and writing method of NOR Flash is direct address access, address space is artificially allocated, and data management is inconvenient and prone to errors. To solve this problem, this paper designs a set of storage access partition management method with low memory usage for NOR Flash, which meets the management requirements of raw data, static data and dynamic data in embedded systems.
Keywords: NOR Flash; partition management; file system; Single-Chip Microcomputer
0? 引? 言
NOR Flash是一種非易失閃存技術,是Intel在1988年創建。它是市場上兩種主要的非易失閃存技術之一。主要特點是芯片內執行(eXecute In Place, XIP),這樣應用程序可以直接在NOR Flash閃存內運行,不必再把代碼讀到系統ram中。NOR Flash的傳輸效率很高,在1~4 MB的小容量時具有很高的成本效益。根據NOR Flash中常存放的數據類型,提煉出三種類型的數據,同種類型的數據存放在一個區域,每個區域使用一種管理方法。
1? 系統設計
嵌入式系統的NOR Flash驅動支持讀寫和擦除。將NOR Flash分為三個管理區,分別為原始數據管理區、靜態數據管理區和動態數據管理區,每個管理區擁有自有的初始化、打開、讀、寫、擦除操作,且每個管理區均按最小擦除塊對齊,相同大小擦除塊的區域需劃分到一個管理區。每個管理區均含地址邊界管理,防止數據越界,確保讀寫數據的安全可靠。管理區示意圖如圖1所示。
每個管理區如圖2所示,起始頁地址和結束頁地址,均需要整除最小擦除塊,即n =頁起始地址/最小擦除塊大小,k =頁結束地址/最小擦除塊大小n,k = {0,1,2,3,…}。
管理區頭信息定義如表1所示。
1.1? 原始數據管理區
針對NOR Flash中存放原始數據的需求,該管理區的存儲區域全部用于存放數據。管理區頭信息中序號4和序號5中指定的區域即為該區可使用的存儲空間大小。邏輯區參數數據定義如表2所示。該管理區占用的管理內存開銷如表2所示。
表2中序號1~3,根據表1中序號4和5指定的地址,在讀寫擦除操作時進行邊界控制,表2中序號3根據表1中序號3指定大小,進行擦除操作。
一次完整的原始數據管理區讀寫流程如圖3所示。
(a)讀流程
(b)寫流程
1.2? 靜態數據管理區
針對NOR Flash中存放已知大小數據,且該區域數據不能再被保存到其他存儲區域,擦除時整塊擦除。最小管理單元為靜態節點,在使用前先分配NOR Flash空間,且分配空間需要按擦除塊對齊,后期對同一靜態節點的讀寫擦除都需要在分配的空間內進行,每一個靜態節點的字符串描述通過crc16計算后的結果保存在節點校驗碼位置,在檢索同一靜態節點時通過crc16結果碼進行快速查找。初始化靜態數據管理區時,動態計算出該區最大的靜態節點個數及需要使用多少個擦除頁來存放和備份靜態節點信息。邏輯區參數數據定義如表3所示。該管理區占用的管理內存開銷為表3所示內容加上靜態節點個數乘表4所示內容。
計算單個擦除塊可以存放的靜態節點個數k,k = 擦除塊大小/靜態節點描述信息大小,k為向下取整后的值,得出一個擦除塊可以存放的靜態節點個數。
靜態數據管理區需要使用的靜態節點描述個數j,j =(邏輯頁結束地址-邏輯頁開始地址)/擦除頁大小,其中j必然是正整數。
計算最多需要的靜態管理節點個數占用的擦除塊個數m,當k≥j - 1,m = 1;當k<j - 1,m>j / (K + 1),m向上取整。實際應用中,需要用的擦除塊個數為2×m。靜態節點和可使用最小擦除塊在靜態管理區中的分布如圖4所示。
其中,j1 + j2 + j3 + … + jn = j。
當k≥j - 1,m = j1,2m = j1 + j2,可用于存儲數據的最小擦除塊個數為j - 2。
當k<j - 1,m≥j1 + j2,可用于存儲數據的最小擦除塊個數為j - 2m。
靜態節點初始化,靜態節點在m區為順序排列,首先掃描擦除區m和m + 1,根據表4所示內容,找到節點起始地址位于表1中序號4和序號5指定的地址區間,并做統計,比較m和m + 1中的統計結果,當且僅當m和m + 1中的統計結果都不為0時,表示有異常斷電發生,使用統計結果計數大的為當前靜態節點區,并擦除另一區。當兩個區統計結果都為0時,表示該靜態管理區第一次使用,選擇m作為當前靜態節點區,當一個區為0,另一區不為0時,選擇不為0的區作為當前節點靜態節點區。然后,掃描當前靜態節點區,根據表4中描述,節點回收為0x55的節點放到刪除節點鏈表,節點回收為0xff且節點初始化為0xaa的放到使用節點鏈表,并記錄最大的靜態節點的結束地址,最后,計算可以分配的最小擦除塊個數。
靜態節點打開,在靜態節點初始化完成后,根據靜態節點的名稱,計算crc16值,遍歷使用節點鏈表,成功,則返回節點信息,沒有匹配到,則判斷該節點所分配的最小擦除塊個數能否滿足,如果滿足,則創建該節點信息,追加到靜態節點區中,并將該節點插入使用節點鏈表尾部,否則,遍歷刪除節點鏈表,選擇條件滿足的擦除次數最少的靜態節點,將其從刪除鏈表中取出,更新節點校驗碼,設置節點回收為0xff,設置節點初始化為0xaa,將該靜態節點插入到使用節點鏈表,將使用節點鏈表和刪除節點鏈表上的靜態節點寫入另一個m區,寫入完成后,擦除當前m區,設置更新后的m區為當前靜態節點區,記錄最大的靜態節點結束地址;找不到匹配的管理節點,打開失敗。靜態節點和最小可擦除頁的映射關系如圖5所示。
在靜態節點打開成功以后,方可進行靜態節點讀/寫/擦除/刪除操作。
靜態節點讀取/寫入:靜態數管理區讀操作方法/寫操作方法根據靜態節點中的節點起始地址和節點結束地址,任意讀取/寫入該區域的內容。
靜態節點擦除:靜態數據管理區擦除操作方法根據靜態節點中節點起始地址和節點結束地址,進行整塊擦除,并更新RAM中該靜態節點信息中的擦除次數。
靜態節點刪除:先使用靜態管理區擦除方法,將該區域數據擦除,然后將節點回收寫為0x55,最后,將該節點從使用節點鏈表刪除,并加入刪除節點鏈表。
1.3? 動態數據管理區
針對NOR Flash中存放未知大小且支持讀寫、更新和擦除的數據。最小管理單元為動態節點,大小為4 096字節,包含動態節點信息和可寫入數據區。根據系統自身內存容量,可以設置動態節點為4 096字節的整數倍,典型值為8 192字節。每一個動態節點的字符串描述通過crc16計算后,將結果保存于表6中的節點校驗碼字段。在檢索同一動態節點時通過crc16結果碼進行快速查找。設置節點回收閾值,即最小擦除塊回收節點占整個擦除塊的比例,典型為70%。節點回收緩存區位于整個動態管理區的最后位置,典型為4個最小擦除區,根據自身NOR Flash大小,調節回收緩存區大小,因此,動態數據管理區在分區時,至少要大于節點緩存區。邏輯區參數數據如表5所示。該管理區占用的管理內存開銷為表5所示加上最小管理區大小,典型為8 192字節。
動態節點初始化:回收緩存區只有在異常斷電的時候,才會有數據。首先掃描回收緩存區,統計上面的使用動態節點個數,如果大于零,則根據動態節點信息中的節點起始地址,找到原始可擦除塊并進行掃描,如果原始可擦除塊上數據不全是0xff,則統計其使用動態節點個數,與回收緩存區中的統計結果做比較,如果大于回收緩存區中的結果,則擦除對應回收緩存區,選擇另一個回收緩存區備份,然后擦除該塊,如果小于等于回收緩存區中的結果,則擦除該塊,將回收緩存區中的非回收動態節點回寫到原位置,完成后擦除該回收緩存區。然后,掃描動態管理區有效數據區域,以動態節點大小為步長,將動態節點地址為0xffffffff的節點設置為其現在的地址,不合法的動態節點地址或者節點校驗碼為非0xffff且節點屬性為非法的,將其及其子節點設置為回收。
動態節點打開:在動態節點初始化完成后,根據動態節點名稱,計算節點名稱crc16值,掃描動態管理區內的所有動態節點,找到節點校驗碼匹配的節點,且節點屬性為0xee且節點回收為0xff,記錄該節點信息。如果沒有找到,則隨機查找一個初始化的空閑動態節點信息,設置節點校驗碼,將節點屬性設置為0xee,記錄該節點信息。
動態節點讀取:根據打開的動態節點信息,讀取動態節點鏈上的數據。
動態節點寫入:如果動態節點是全新節點,寫入數據在動態管理節點大小以內,直接寫入數據,如果數據大于動態管理節點大小,則寫滿一個動態管理節點后,隨機分配一個未使用的動態管理節點,將該動態管理節點的子節點地址設置為新分配的動態管理節點的子節點起始地址,并將該節點crc16的值寫入子節點中的節點校驗碼,設置子節點屬性為0x77,將待寫入數據寫入子節點,同理,子節點寫完還不夠,則繼續分配子節點,子節點分配失敗,則啟動動態節點回收,回收完成后,再進行子節點分配,仍然不成功,則寫入失敗;如果動態管理節點是已經有數據的,根據寫入數據,找到需要寫入的管理節點區域,如果該區域的數據區為全0xff,則直接寫入數據,否則,將該區備份到回收緩存區中,將需要寫的動態節點整個區更新到內存,然后擦除原可擦除區,將備份的數據除了需要更新的都回寫到原區域。最后,將更新到內存中的數據塊寫入原區域。
動態節點刪除:將打開的動態節點及其子節點中的節點回收設置為0x55。
2? 結? 論
常用的文件系統臃腫,在嵌入式系統中有些無法工作,且功能強大,其中很多功能在應用中用不到。相對于復雜的文件系統,本文提出的方法,適用于低內存的嵌入式系統中,為NOR Flash訪問隱藏地址信息,讓操作更容易,其中三個不同的管理區,適用于不同的使用場景,為此類系統提供一種讀寫訪問NOR Flash的方法。
參考文獻:
[1] 朱海東,王新社.基于扇區映射的NOR flash磁盤模擬方法 [J].計算機工程與設計,2007(24):5899-5902.
[2] 陳桂生,李志剛.嵌入式Flash文件系統的設計與實現 [J].計算機系統應用,2010,19(5):36-40+62.
[3] 杜偉慶,蘇凱雄.嵌入式系統中NOR Flash的分塊管理與實現 [J].計算機與數字工程,2009,37(12):80-82.
[4] 馬資道,魏貴鵬,謝演.一種基于FLASH的智能卡文件系統的實現方法 [J].通信技術,2019,52(4):1020-1024.
[5] 張明磊,尚利宏.幾種源碼開放的嵌入式文件系統分析與比較 [J].單片機與嵌入式系統應用,2007(11):15-18.
作者簡介:易恒(1990—),男,漢族,四川蒲江人,工程師,本科,研究方向:嵌入式系統應用。