一、簡介
LittleFS是一個小型的Flash文件系統(tǒng),它結(jié)合日志結(jié)構(gòu)(log-structured)文件系統(tǒng)和COW(copy-on-write)文件系統(tǒng)的思想,以日志結(jié)構(gòu)存儲元數(shù)據(jù),以COW結(jié)構(gòu)存儲數(shù)據(jù)。這種特殊的存儲方式,使LittleFS具有強大的掉電恢復(fù)能力(power-loss resilience)。分配COW數(shù)據(jù)塊時LittleFS采用了名為統(tǒng)計損耗均衡的動態(tài)損耗均衡算法,使Flash設(shè)備的壽命得到有效保障。同時LittleFS針對資源緊缺的小型設(shè)備進行設(shè)計,具有極其有限的ROM和RAM占用,并且所有RAM的使用都通過一個可配置的固定大小緩沖區(qū)進行分配,不會隨文件系統(tǒng)的擴大占據(jù)更多的系統(tǒng)資源。當在一個資源非常緊缺的小型設(shè)備上,尋找一個具有掉電恢復(fù)能力并支持損耗均衡的Flash文件系統(tǒng)時,LittleFS是一個比較好的選擇。
LittleFS在嵌入式開發(fā)過程中經(jīng)常遇到,但是如何在OpenHarmony中使用呢?本文基于OpenHarmony 3.1Release + 小凌派-RK2206開發(fā)板做LittleFS文件系統(tǒng)移植,現(xiàn)將相關(guān)移植經(jīng)驗發(fā)布,分享給大家。文中如有問題,請大家?guī)兔χ刚?/p>
二、LittleFS移植過程
本文基于OpenHarmony3.1Release做LittleFS移植,小凌派-RK2206開發(fā)板內(nèi)部Flash有8MB大小,其中4~8MB區(qū)間為空閑區(qū)域。我將4M~5M作為LittleFS文件系統(tǒng)的/data目錄掛載硬件設(shè)備。具體移植過程主要如下所示:
1、hcs配置
1.1、hdf.hcs
創(chuàng)建/device/soc/rockchip/rk2206/hcs_config/hdf.hcs文件,具體如下:
如上所述,我將在device_info/device_info.hcs添加LittleFS設(shè)備,并在fs/fs_config.hcs添加LittleFS具體信息。
1.2、BUILD.gn
新建//device/soc/rockchip/rk2206/hdf_config/BUILD.gn,具體代碼如下所示:
上述代碼將在編譯OpenHarmony3.1Rlease時,將編譯hdf.hcs。
1.3、device_info.hcs
創(chuàng)建/device/soc/rockchip/rk2206/hcs_config/device_info/device_info.hcs文件,在文件中添加LittleFS設(shè)備,具體代碼如下所示:
上述代碼表示建設(shè)一個設(shè)備驅(qū)動,該驅(qū)動的模塊名稱(即moduleName)為“HDF_PLATFORM_FS_LITTLEFS”,OpenHamrony系統(tǒng)依據(jù)該名稱匹配驅(qū)動程序;設(shè)備匹配信息(即deviceMatchAttr)添加小凌派開發(fā)板Flash特殊信息(比如:分區(qū)信息,掛載目錄名、起始地址、結(jié)束地址等)。
1.4、fs_config.hcs
新建//device/soc/rockchip/rk2206/hdf_config/fs/fs_config.hcs文件,該文件主要寫清楚設(shè)備掛載信息,具體如下:
如上所述,我將LittleFS移植所需的Flash信息分為4個:
(1)mount_points:掛載目錄。
(2)block_size:Flash的擦除塊大小。
(3)block_start:該掛載Flash區(qū)域的起始塊地址,實際Flash地址為block_size * block_start。
(4)block_count:該掛載Flash區(qū)域的存儲塊總數(shù)。
注意:match_attr所表示的字符串要與device_info.hcs所表示的字符串要一致。
2、hdf驅(qū)動
新建//device/soc/rockchip/rk2206/hdf_driver/fs文件夾,文件夾下創(chuàng)建2個文件,具體如下所示:
2.1、fs_driver.c
2.1.1、添加必要的頭文件
2.1.2、添加HDF驅(qū)動
添加LittleFS匹配的hdf驅(qū)動,具體代碼如下所示:
HDF_INIT(g_fsDriverEntry);
其中,moduleName必須要與device_info.hcs中的moduleName保持一致。
2.1.3、fs_driver_init函數(shù)
fs_driver_init為hdf驅(qū)動加載函數(shù)。OpenHarmony啟動時,將根據(jù)hcs的編寫匹配對應(yīng)的驅(qū)動程序,并運行fs_driver_init函數(shù)。該函數(shù)負責(zé):
(1)讀取hcs文件的配置參數(shù)。
(2)初始化Flash。
(3)適配LittleFS對應(yīng)的read、write、erase和sync函數(shù),并適配LittleFS相關(guān)參數(shù)。
(4)掛載LittleFS。
具體代碼如下所示:
2.2、BUILD.gn
BUILD.gn負責(zé)將fs_driver.c編譯到內(nèi)核中,具體源代碼如下所示:
3、測試程序
我在main函數(shù)中添加一個任務(wù),負責(zé)每隔5秒讀寫文件。具體代碼如下所示:
/* 文件系統(tǒng)測試 */
三、實驗結(jié)果
程序編譯燒寫到開發(fā)板后,按下開發(fā)板的RESET按鍵,通過串口軟件查看日志如下:
-
開發(fā)板
+關(guān)注
關(guān)注
25文章
5679瀏覽量
104633 -
存儲數(shù)據(jù)
+關(guān)注
關(guān)注
0文章
90瀏覽量
14326 -
OpenHarmony
+關(guān)注
關(guān)注
29文章
3853瀏覽量
18597
發(fā)布評論請先 登錄
基于OpenHarmony3.1的LittleFS文件系統(tǒng)hdf驅(qū)動實現(xiàn)
基于OpenHarmony3.1的LittleFS文件系統(tǒng)hdf驅(qū)動實現(xiàn)
如何在OpenHarmony上開發(fā)服務(wù)卡片
基于OpenHarmony3.1的LittleFS文件系統(tǒng)hdf驅(qū)動實現(xiàn)

評論