SPIFFS檔案系統移植 基於STM32F407

2021-09-24 21:16:43 字數 3361 閱讀 5828

本帖最後由 huangxuejia-29212 於 2018-6-3 22:47 編輯

spiffs檔案系統,有什麼特別呢?

從名字就可知,這是乙個用於spi flash的file system。

現在好像在esp8266上用的很多,感覺慢慢有的人氣了。

從特性上說,這個檔案系統用很少的ram資源。

但是,我最後會吐槽吐槽這個特性的。

網路上資源不多,好在github上說明文件挺全。

github

最新版本是0.3.7.

目錄結構如下:

新增到工程的檔案如下:

在github上有wiki說明如何移植

認真讀完這個wiki,基本就知道如何使用spiffs。

對於spiffs的設計,有乙個**可做參考, spiffs技術手冊。

移植概述

下面我們說說移植的過程。

1. 配置

spiffs-0.3.7\src\default下有乙個預設的配置檔案,spiffs_config.h。

為了方便,拷貝乙個到spiffs-0.3.7\src。

在工程中,標頭檔案搜尋路徑,只包含src路徑,不要包含\src\default。

spiffs_config.h頭部包含的標頭檔案修改如下。

在這裡也定義了變數名。

//#include

#include

#include

#include

#include "stm32f4xx.h"

typedef u32  u32_t;

typedef u16 u16_t;

typedef u8  u8_t;

typedef s32  s32_t;

typedef s16 s16_t;

typedef s8  s8_t;

複製**

修改幾個巨集定義

#ifndef spiffs_use_magic

#define spiffs_use_magic                (1)

#endif

#ifndef spiffs_use_magic_length

#define spiffs_use_magic_length         (1)

#endif

#endif

複製**

在spiffs-0.3.7\src\spiffs_nucleus.**件中定義的聯合用了乙個gcc特性,在mdk編譯會報錯。

在聯合前增加一句**#pragma anon_unions 即可。

#pragma anon_unions 

union ;

#if spiffs_cache_wr

// type write cache

struct ;

#endif

};} spiffs_cache_page;

複製**

2 應用

首先,要實現spi flash操作函式,spiffs需要的函式格式如下

s32_t core_spiflash_spiffs_read(u32_t addr, u32_t size, u8_t *dst);

static s32_t core_spiflash_spiffs_write(u32_t addr, u32_t size, u8_t *src);

static s32_t core_spiflash_spiffs_erase(u32_t addr, u32_t size);

複製**

第二,定義檔案系統相關引數 /*

檔案系統配置

#define spiffs_singleton (0) 這個巨集配置為0,也就是支援多個spiffs

*/spiffs_config cfg=

;複製**

第三,掛載檔案系統,如果是第一次掛載會失敗,需要解除安裝檔案系統再格式化檔案系統,最後重新掛載即可。

/*檔案系統結構體*/

static spiffs fs;

/*頁定義*/

#define log_page_size                256

static u8_t spiffs_work_buf[log_page_size*2];

static u8_t spiffs_fds[32*4];

static u8_t spiffs_cache_buf[(log_page_size+32)*4];

/***@brief:     

*@details: 格式化檔案系統

*@param[in]    

*@param[out]  

*@retval:     

*/void sys_spiffs_format(void)

/***@brief:     

*@details: 掛載spiffs檔案系統

*@param[in]    

*@param[out]  

*@retval:     

*/void sys_spiffs_mount_coreflash(void) 

}複製**

然後,就可以進行基本讀寫測試啦。

吐槽1

如果要好好用這個檔案系統,需要多次測試找乙個設定平衡點。

什麼意思呢?也就是你這個檔案系統如何配置。

也就是spiffs_config中的:邏輯塊多大,頁設定多大。不同的設定會嚴重影響效能。

因為這個檔案系統為了省記憶體,沒有任何索引。

具體細節大家自己分析,我就說乙個事實:

開啟乙個檔案,很可能要輪詢所有block的第一頁。

當你block跟頁設定小,數量就多,操作檔案就會很慢很慢,,,,。

為什麼這麼慢?作者在wiki上有說明。

2

目前還沒有認真使用這個檔案系統,但是總感覺它有點上不成下不就的感覺。

是的,嵌入式ram緊張,但是嵌入式對速度也敏感啊!

想起以前公司用的檔案系統,速度不慢,ram用得也不算多。

怎麼做到呢?

限制其他效能,例如,最多只能建立100個檔案,檔案系統最大只能到1m。

這樣的限制對於微控制器系統來說,其實是能用的。

(帶這個檔案系統的產品估計出貨也1000萬台了吧)

移植原始碼

在開源stm32**上有這個檔案系統的移植,需要請參觀:

這個倉庫是個人寫的一些**,主要是按照經驗進行了一些程式設計,自認為比大部分教程的例程**要好。

後續會慢慢新增各種外設驅動。大家拿來用即可。

歡迎商用,後果自負

系統移植 檔案系統移植

設定驅動選項 解壓原始碼 tar xvf busybox 1.22.1.tar.bz2 進入原始碼目錄配置原始碼 make menuconfig busybox settings build options build busybox as a static binary no shared lib...

根檔案系統移植

centos7系統 一.嵌入式linux系統 引導引導程式 環境變數引數 linux核心 根檔案系統 使用者應用程式 bootloader boot paramerers kernel root fliesystem 二.根檔案系統製作 tar jxvf busybox 1.26.2.tar.bz2...

基於stm32移植FATFS檔案系統

2.ff14a source 下就是需要的檔案。ff.c fatfs模組。ffconf.h fatfs模組的配置檔案。ff.h fatfs和應用程式模組的通用包含檔案。diskio.h fatfs 和disk i o模組的公用包含檔案。diskio.c 將現有disk i o模組連線到fatfs的粘...