【Zephyr開發實踐系列】09_LittleFs文件系統操作

文章目錄

  • 前言
    • 編寫目的
    • 術語和縮寫詞
    • 方案選擇
  • 一、Littlefs介紹
  • 二、Littlefs搭建步驟
    • 1.設備樹構建
    • 2.自動掛載流程(二選一)
      • 2.1設備樹啟用自動掛載
      • 2.2 在 littlefs_fs.c 中,設備樹宏會被展開
      • 2.3 模塊注冊初始化
      • 2.4 初始化階段
        • 2.4.1注冊Littlefs文件系統到總文件系統
        • 2.4.2 檢查自動掛載標志
      • 2.5 掛載函數調用
    • 3.手動掛載流程(二選一)
      • 3.1設備樹注釋自動掛載
      • 3.2 外部聲明掛載結構
      • 3.3 基礎方式掛載
    • 4. 基礎應用
  • 總結


前言

編寫目的

?本文檔旨在為開發者介紹Littlef’s文件系統相關配置使用指南。通過本文檔,開發者可以了解系統支持的文件系統類型、文件系統的掛載與使用方法、文件操作接口以及文件系統相關的配置選項,幫助開發者在嵌入式環境中高效、安全地使用文件系統功能,實現數據的持久化存儲和管理。

術語和縮寫詞

術語和縮寫詞解釋
文件系統用于組織和存儲數據的方法,管理文件的創建、讀取、寫入、刪除等操作,提供數據持久化存儲能力
littlefs為閃存設計的輕量級文件系統,具有掉電保護和磨損均衡功能,適用于資源受限的嵌入式設備
fatfs一種廣泛使用的文件系統格式,兼容性好,支持長文件名,適用于SD卡、U盤等可移動存儲設備

方案選擇

?Zephyr 操作系統支持 fatfs 和 littlefs,因為 SPINAND 存在壞塊,而 littlefs 支持壞塊管理,所以選擇 littlefs 作為外部NAND-Flash文件系統。

一、Littlefs介紹

請參考優秀博客:
Little介紹
單片機移植操作

二、Littlefs搭建步驟

Littlefs系統原函數文件路徑:zephyr/subsys/fs/littlefs_fs.c
該文件作用說明:

  • LittleFS 文件系統驅動原函數實現
  • 雙存儲后端支持
  • 設備樹驅動的自動掛載(若設備樹啟動:autonount屬性)
  • 內存管理和線程安全
  • 通過 SYS_INIT 在系統啟動時自動初始化(注冊文件系統框架)

1.設備樹構建

/ {fstab {compatible = "zephyr,fstab";lfs1: lfs1 {compatible = "zephyr,fstab,littlefs"; //標識符read-size = <1>; // 數據塊讀取的最小大小,所有讀取都將是此值的倍數prog-size = <16>; // 數據塊寫入的最小大小,所有寫入都將是此值的倍數cache-size = <256>; //緩存的大小,必須是 flash page size 的倍數lookahead-size = <32>; //lookahead 緩沖區大小,必須是8的倍數block-cycles = <512>; //用于動態磨損均衡,將數據移動到另一個塊之前的擦除次數partition = <&lfs1_partition>; //掛載分區mount-point = "/lfs1"; //掛載點automount; //啟用自動掛載(自動:littlefs_fs.c掛載。手動:fs_mount函數掛載)};};
};&flash0 {partitions {compatible = "fixed-partitions";#address-cells = <1>;#size-cells = <1>;/* Use second half of flash for the filesystem. */lfs1_partition: partition@100000 {label = "storage";reg = <0x100000 DT_SIZE_K(1024)>;};};
};

易錯點:若重復掛載會返回錯誤
可使用**fs_statvfs()**檢查后再掛載。

2.自動掛載流程(二選一)

2.1設備樹啟用自動掛載

fstab {compatible = "zephyr,fstab";lfs1: lfs1 {.......automount;  // 啟用自動掛載.......};
};

2.2 在 littlefs_fs.c 中,設備樹宏會被展開

//匹配設備樹:
#define DT_DRV_COMPAT zephyr_fstab_littlefs
// DT_INST_FOREACH_STATUS_OKAY(DEFINE_FS) 展開為:
#define DEFINE_FS(inst) \
static struct fs_littlefs fs_data_0 = { \.cfg = { \.read_size = 1, \.prog_size = 16, \.cache_size = 256, \.lookahead_size = 32, \.read_buffer = read_buffer_0, \.prog_buffer = prog_buffer_0, \.lookahead_buffer = lookahead_buffer_0, \}, \
}; \
struct fs_mount_t z_fsmp_lfs1 = { \.type = FS_LITTLEFS, \.mnt_point = "/lfs1", \.fs_data = &fs_data_0, \.storage_dev = (void *)0, \.flags = FS_MOUNT_FLAG_AUTOMOUNT, \
};

2.3 模塊注冊初始化

// 文件系統初始化優先級:CONFIG_FILE_SYSTEM_INIT_PRIORITY
// littlefs_fs.c 中的 SYS_INIT 宏
SYS_INIT(littlefs_init, POST_KERNEL, CONFIG_FILE_SYSTEM_INIT_PRIORITY);// 系統啟動時自動調用 littlefs_init()

2.4 初始化階段

2.4.1注冊Littlefs文件系統到總文件系統
    // 注冊 LittleFS 文件系統驅動int rc = fs_register(FS_LITTLEFS, &littlefs_fs);if (rc != 0) {LOG_ERR("Failed to register LittleFS driver: %d", rc);return rc;}
2.4.2 檢查自動掛載標志
if ((mp->flags & FS_MOUNT_FLAG_AUTOMOUNT) != 0) {// 執行自動掛載int rc = fs_mount(mp);if (rc < 0) {LOG_ERR("Automount %s failed: %d", mp->mnt_point, rc);} else {LOG_INF("Automount %s succeeded", mp->mnt_point);}}// 如果沒有 automount 標志,直接返回,不執行掛載

2.5 掛載函數調用

int fs_mount(struct fs_mount_t *mp)
{......// 檢查是否已經掛載if (mp->fs != NULL) {return -EBUSY;  // 已經掛載}// 調用文件系統特定的掛載函數int rc = fs->mount(mp);if (rc == 0) {// 5. 掛載成功,更新掛載點信息mp->fs = fs;mp->mountp_len = strlen(mp->mnt_point);}.......
}

3.手動掛載流程(二選一)

3.1設備樹注釋自動掛載

fstab {compatible = "zephyr,fstab";lfs1: lfs1 {.......//automount;  //注釋關閉掉.......};
};

3.2 外部聲明掛載結構

// 在應用程序中聲明外部掛載結構
FS_FSTAB_DECLARE_ENTRY(FS_PARTITION_NODE);
// 展開為:extern struct fs_mount_t z_fsmp_lfs1;

3.3 基礎方式掛載

#include <zephyr/fs/fs.h>
#include <zephyr/fs/littlefs.h>void basic_mount_example(void)
{// 1. 獲取掛載結構指針struct fs_mount_t *mp = &FS_FSTAB_ENTRY(FS_PARTITION_NODE);// 2. 執行掛載int rc = fs_mount(mp);if (rc < 0) {printk("Mount failed: %d\n", rc);return;}printk("Mount succeeded at %s\n", mp->mnt_point);
}

4. 基礎應用

簡化版Demo:

/** 最簡 LittleFS 測試*/#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/fs/fs.h>
#include <zephyr/fs/littlefs.h>int main(void)
{struct fs_file_t file;char buffer[64];int res;printk("Simple LittleFS Test\n");// 掛載文件系統FS_LITTLEFS_DECLARE_DEFAULT_CONFIG(storage);static struct fs_mount_t lfs_mount = {.type = FS_LITTLEFS,.fs_data = &storage,.storage_dev = (void *)FIXED_PARTITION_ID(storage_partition),.mnt_point = "/lfs",};res = fs_mount(&lfs_mount);if (res != 0) {printk("Mount failed: %d\n", res);return 0;}printk("Mounted successfully\n");// 寫入文件fs_file_t_init(&file);res = fs_open(&file, "/lfs/hello.txt", FS_O_CREATE | FS_O_WRITE);if (res == 0) {fs_write(&file, "Hello LittleFS!", 15);fs_close(&file);printk("File written\n");}// 讀取文件res = fs_open(&file, "/lfs/hello.txt", FS_O_READ);if (res == 0) {res = fs_read(&file, buffer, sizeof(buffer) - 1);if (res > 0) {buffer[res] = '\0';printk("Read: %s\n", buffer);}fs_close(&file);}// 卸載fs_unmount(&lfs_mount);printk("Test completed\n");return 0;
}

更完善Demo請參考官方Littlefs例程:Littlefs_demo

總結

無論使用自動掛載還是使用手動掛載,Littlefs_Moudle都會在啟動階段進行初始化。手動掛載具有搭配(條件掛載、錯誤處理、狀態檢測、性能監控的優勢),提供了更大的靈活性和控制力,具體可通過Shell進行測試與體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90338.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90338.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90338.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

保護板測試儀:守護電池安全的“幕后衛士”

在現代科技飛速發展的今天&#xff0c;電池作為各類電子設備和新能源系統的核心動力源&#xff0c;其安全性與穩定性直接關系到設備的正常運行和使用者的安全。而保護板作為電池的“安全衛士”&#xff0c;承擔著過充保護、過放保護、短路保護等關鍵功能。保護板測試儀則是專門…

【unitrix】 6.11 二進制數字標準化模塊(normalize.rs)

一、源碼 這個模塊實現了類型級別的二進制數標準化處理&#xff0c;確保二進制數在組合時保持最簡形式。 //! 二進制數字標準化模塊 //! //! 提供二進制數字(B<H, L>)的組合前標準化功能&#xff0c;確保數字以最簡形式表示&#xff0c; //! 避免同一數值有不同表示形式。…

解決OpenHarmony中找不到pthread_cancel和pthread_setcanceltype等libc符號的問題

筆者在移植三方庫到OpenHarmony時遇到了pthread_cancel和pthread_setcanceltype函數找不到的問題&#xff0c;將解決辦法分享如下&#xff1a; OpenHarmony的使用的c庫musl中注釋了這些函數的導出&#xff0c;在third_party/musl/libc.map.txt將屏蔽的函數中取消注釋即可

Python編程進階知識之第五課處理數據(matplotlib)

簡介matplotlib 是 Python 中最流行的數據可視化庫之一&#xff0c;它可以創建各種高質量的圖表。無論是簡單的折線圖&#xff0c;還是復雜的 3D 圖形&#xff0c;matplotlib 都能輕松應對。它提供了類似 MATLAB 的繪圖接口&#xff0c;使得用戶可以非常方便地進行圖表的創建和…

rust-所有權

什么是所有權 所有權是一組規則&#xff0c;它決定了 Rust 程序如何管理內存。所有運行中的程序都必須管理它們對計算機內存的使用方式。某些語言使用垃圾回收&#xff08;GC&#xff09;&#xff0c;在程序運行時定期查找不再使用的內存&#xff1b;另一些語言則要求程序員顯式…

破解哈希極化:基于主動路徑規劃的智算網絡負載均衡方案

如今人工智能&#xff08;AI&#xff09;和大模型訓練的蓬勃發展&#xff0c;大規模AI算力集群&#xff08;智算集群&#xff09;已成為關鍵基礎設施。這類集群對網絡性能&#xff0c;特別是高吞吐、低延遲和無損特性有著嚴苛要求&#xff0c;RoCE因此被廣泛應用。然而&#xf…

Vue工程化 ElementPlus

一、Vue工程化1、環境準備create-vue是Vue官方提供的最新的腳手架工具&#xff0c;用于快速生成一個工程化的Vue項目。提供了以下功能&#xff1a;統一的目錄結構本地調試熱部署單元測試集成打包上線依賴環境&#xff1a;Node JS 是一個免費、開源、跨平臺的JavaScript運行時環…

深入解析TCP:可靠傳輸的核心機制與實現邏輯

Linux 系列 文章目錄Linux 系列前言一、TCP協議的概念1.1 TCP協議的特點1.2 TCP又叫做傳輸控制協議二、TCP協議段格式2.1、TCP的流量控制----------窗口大小&#xff08;16位&#xff09;2.2 TCP的確認應答機制2.2.1 什么是確認應答機制2.2.2 確認應答機制的優化2.3 超時重傳機…

通縮浪潮中的 “測量防線”:新啟航如何用國產 3D 白光干涉儀筑牢半導體成本護城河?

一、通縮浪潮下半導體行業的成本困局在通縮浪潮沖擊下&#xff0c;半導體行業面臨市場需求疲軟、產品價格下滑的嚴峻挑戰。為維持競爭力&#xff0c;降低生產成本成為企業生存發展的關鍵。而 3D 白光干涉儀作為半導體晶圓檢測、制程監控的核心設備&#xff0c;傳統進口產品價格…

[網安工具] 自動化威脅檢測工具 —— D 盾 · 使用手冊

&#x1f31f;想了解其它網安工具&#xff1f;看看這個&#xff1a;[網安工具] 網絡安全工具管理 —— 工具倉庫 管理手冊 D盾防火墻D盾,D盾_防火墻,D盾_IIS防火墻,D盾_web查殺,IIS防火墻,webshell查殺,https://www.d99net.net/ 0x01&#xff1a;D 盾 —— 工具簡介 D 盾防火…

Spring AI 系列之二十二 - ImageModel

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

Redis集群高可用與性能優化實戰指南

Redis集群高可用與性能優化實戰指南 一、業務場景描述 在大型分布式系統中&#xff0c;Redis不僅承擔緩存職責&#xff0c;還常用于限流、排行榜、會話管理等高并發場景。隨著訪問量的激增和集群規模的擴展&#xff0c;如何保證Redis服務的高可用性與高性能&#xff0c;成為后端…

基于SpringBoot+Vue的高校特長互助系統(WebSocket實時聊天、協同過濾算法、ECharts圖形化分析)

“ &#x1f388;系統亮點&#xff1a;WebSocket實時聊天、協同過濾算法、ECharts圖形化分析”01系統開發工具與環境搭建前后端分離架構項目架構&#xff1a;B/S架構運行環境&#xff1a;win10/win11、jdk17前端&#xff1a;技術&#xff1a;框架Vue.js&#xff1b;UI庫&#x…

于縱橫交錯的矩陣間:二維數組與多維數據的默契和鳴

大家好啊,我是小象?(?ω?)? 我的博客:Xiao Xiangζ????? 很高興見到大家,希望能夠和大家一起交流學習,共同進步。* 接著上節課的內容,這一節我們來學習二維數組,學習二維數組的概念和創建,明白二維數組的初始化,學會不完全初始化,完全初始化,按照行初始化的…

SHA-3算法詳解

SHA-3&#xff08;Secure Hash Algorithm 3&#xff09;是美國國家標準與技術研究院&#xff08;NIST&#xff09;于 2015 年發布的新一代密碼哈希算法標準&#xff0c;其核心基于比利時密碼學家團隊設計的Keccak 算法。SHA-3 的誕生旨在應對 SHA-1 和 SHA-2 系列算法可能面臨的…

前端筆記:同源策略、跨域問題

只有前端才會有跨域問題后端不受限制 一、什么是“同源策略”&#xff08;Same-Origin Policy&#xff09; ? 定義&#xff1a; 瀏覽器的 同源策略 是一種 安全機制&#xff0c;限制一個源的 JavaScript 訪問另一個源的資源&#xff0c;以防止惡意網站竊取用戶敏感信息。 ? “…

java通過com進行pdf轉換docx丟失

使用&#xff0c;通過com調用&#xff0c;發現pdf轉換成docx后&#xff0c;沒有看到docx輸出到指定目錄。直接說解決方案:關閉的保護模式即可&#xff0c;打開工具&#xff0c;編輯->首選項 找到安全性(增強)&#xff0c;關閉啟動時啟用保護模式關閉后&#xff0c;docx正常輸…

SQL基礎? | 視圖篇

0 序言 本文將系統講解數據庫中視圖的相關知識&#xff0c;包括視圖的定義、作用、創建&#xff08;單表、多表、基于視圖創建&#xff09;、查看、更新、修改與刪除操作&#xff0c;以及視圖的優缺點。 通過學習&#xff0c;你能夠掌握視圖的基本概念&#xff0c;理解何時及如…

移動云×華為昇騰:“大EP+PD分離”架構實現單卡吞吐量跨越式提升!

在面向下一代AI基礎設施的關鍵技術攻關中&#xff0c;移動云與華為昇騰計算團隊深度協同&#xff0c;實現了大模型推理引擎的架構級突破。雙方基于昇騰AI基礎軟硬件平臺&#xff0c;針對DeepSeek大模型完成了大規模專家并行&#xff08;Expert Parallelism&#xff0c;簡稱“大…

配電自動化終端中電源模塊的設計

配電自動化終端中電源模塊的設計 引言 配電終端設備的可靠性和自動化程度,直接影響到整個配電自動化系統的可靠性和自動化水平。由于配電終端設備一般安裝于戶外或比較偏僻的地方,不可能有直流電源提供,因此,配電網終端設備的直流供電方式成為各配網自動化改造中必須要研究…