吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

片上flash使用文件系統筆記

冬至子 ? 來源:小號的高速 ? 作者:小號的高速 ? 2023-10-13 17:00 ? 次閱讀

由于之前需要使用片上的flash多余的部分來搭建文件系統,但是沒有找到使用片上的教程,都是利用片外的flash教程。后來發現能直接使用fal軟件包作為flash設備抽象層,向上可以提供文件系統的接口,向下可以驅動片內的flash。這里放上之前使用的筆記。

1.簡介

littlefs 在 RT-Thread 上運行的層級關系圖如下所示:

1.jpg

開發者使用的是 DFS 框架提供的統一的 POSIX API,DFS 框架會調用 littlefs 的 API,littlefs 會使用 MTD 設備的讀寫接口,開發者可以使用 RT-Thread 提供的 fal 組件和 SFUD 組件來完成對 FLASH 的讀寫任務,也可以自己實現 MTD 設備的驅動程序,使 littlefs 可以掛載到更多的存儲介質上。

2.FAL MCU Flash移植

2.1 FAL軟件包源碼獲取

打開bsp工程的ENV環境,運行menuconfig命令。

1.jpg

2.2 fal具體配置

1.jpg

FAL uses SFUD drivers:是用來驅動外置的flash設備,由于我們只使用內部flash,所以不需要選上。

每個功能的配置說明如下:

開啟調試日志輸出(默認開啟);
分區表是否在fal_cfg.h中定義(默認開啟)。如果關閉此選項,fal 將會自動去指定 Flash 的指定位置去檢索并裝載分區表,具體配置詳見下面兩個選項;
存放分區表的 Flash 設備;
分區表的 結束地址 位于 Flash 設備上的偏移。fal 將從此地址開始往回進行檢索分區表,直接讀取到 Flash 頂部。如果不確定分區表具體位置,這里也可以配置為 Flash 的結束地址,fal 將會檢索整個 Flash,檢索時間可能會增加。
啟用 FAL 針對 SFUD 的移植文件(默認關閉);
應輸入調用 rt_sfud_flash_probe 函數時傳入的 FLASH 設備名稱(也可以通過 list_device 命令查看 Block Device 的名字獲取)。該名稱與分區表中的 Flash 名稱對應,只有正確設置設備名字,才能完成對 FLASH 的讀寫操作。
關于分區表,下文還會提及并解釋。

2.3 pkgs —update

保存配置退出后,在env環境執行pkgs —update命令,會自動從FAL的github倉庫獲取FAL軟件包源碼到本地工程目錄,如下圖所示:

1.jpg

2.4 設備表和分區表
FAL組件初始化最重要的是維護兩個表:一個是flash設備表;另一個是FAL分區表,兩個表的元素分別是前面介紹過的fal_flash_dev結構體地址和fal_partition結構體對象。

fal_flash_dev設備表主要由底層的Flash驅動(包括MCU片內Flash和SFUD驅動的片外Flash)提供,也即FAL移植的重點就是在Flash驅動層向FAL提供fal_flash_dev設備表,每個flash設備提供設備表中的一個元素。

fal_partition分區表由用戶事先配置在fal_cfg.h頭文件中,FAL向上面的用戶層提供的分區訪問接口函數操作的內存區間就是從fal_partition分區表獲取的,最后對分區的訪問還是通過Flash驅動提供的接口函數(fal_flash_dev.ops)實現的。

設備表管理不同的flash設備,可以是片內的也可以是片外的。有點像管理不同的硬盤。分區表就是我們電腦上經常說的那個磁盤分區的意思。

2.5 復制文件

考慮到packages下面的軟件版本后續可能會升級覆蓋,我們不在packagesfal-latest目錄下直接進行移植修改,而是在packages目錄外新建一個文件夾ports專門保存軟件包的移植文件信息

(如果不擔心升級覆蓋問題,跳過2.5和2.6直接看2.9,再回來看2.7和2.8)
新建與packages軟件包同級的移植文件目錄ports,將packagesfal-latestsamplesporting目錄下的fal_cfg.h文件復制一份到portsfal目錄下,將packagesfal-latestSConscript復制一份到portsfal目錄下,將packagesSConscript復制一份到ports目錄下,復制文件后的目錄結構如下圖所示:

1.jpg

(注:圖片里多了fal_flash_sfud_port.c文件,是原博客圖片,但是我們不需要驅動外置的flash)

2.6 修改sconscript文件

由于portsfal目錄及下面的文件名有變化,所以需要修改編譯腳本portsfalSConscript,主要是修改文件目錄及文件名,修改后的編譯腳本如下:(直接覆蓋,其實不改這個SConscript文件也沒啥問題,強迫癥建議覆蓋)

from building import *
import rtconfig
cwd = GetCurrentDir()
src = []
CPPPATH = [cwd]
LOCAL_CCFLAGS = ''
if rtconfig.CROSS_TOOL == 'gcc':
LOCAL_CCFLAGS += ' -std=c99'
elif rtconfig.CROSS_TOOL == 'keil':
LOCAL_CCFLAGS += ' --c99'
group = DefineGroup('fal', src, depend = ['PKG_USING_FAL'], CPPPATH = CPPPATH, LOCAL_CCFLAGS = LOCAL_CCFLAGS)
Return('group')

別忘了執行scons —target=mdk5命令,到此直接編譯工程會出現error,需要接下來繼續更改文件。

.buildkeilObjrt-thread.axf: Error: L6218E: Undefined symbol nor_flash0 (referred from fal_flash.o).
.buildkeilObjrt-thread.axf: Error: L6218E: Undefined symbol stm32f2_onchip_flash (referred from fal_flash.o).

2.7 修改Kconfig

在原bsp目錄的board/Kconfig中的menu “On-chip Peripheral Drivers”內添加下面語句

config BSP_USING_ON_CHIP_FLASH
bool "Enable On-Chip Flash"
default n

添加完,進入menuconfig選中該項,并保存退出。

2.8 修改drv_flash_f4.c文件

STM32f427片內Flash驅動,RT-Thread已經在librariesHAL_Drivers drv_flashdrv_flash_f4.c目錄下提供了,同時還通過條件宏提供了向FAL注冊fal_flash_dev設備表項的代碼。但還需我們自己添加一部分代碼(個人覺得應該是rtt 官方留白,讓我們自定義分區基地址和大小),如下圖:

1.jpg

#define STM32_FLASH_START_ADRESS_16K ((uint32_t)0x08100000)
#define STM32_FLASH_START_ADRESS_64K ((uint32_t)0x08110000)
#define STM32_FLASH_START_ADRESS_128K ((uint32_t)0x08120000)
#define FLASH_SIZE_GRANULARITY_16K (641024 )
#define FLASH_SIZE_GRANULARITY_64K (64
1024 )
#define FLASH_SIZE_GRANULARITY_128K (896*1024)

為什么這樣添加分區基地址和大小?

先看下面的圖

1.jpg

因此我們現在這樣是在使用扇區12到23,又由于STM32F42x的這幾個扇區有16K,64K,128K大小的。所以使用fal時,必須把他們看成3個不同的flash設備進行管理,這也是上文所說flash設備表的作用。

2.9 覆蓋(或新建)fal_cfg.h

新建一個下面代碼塊內容的fal_cfg.h文件在packagesfal-latestinc 內

/*

  • Copyright (c) 2006-2018, RT-Thread Development Team
  • SPDX-License-Identifier: Apache-2.0
  • Change Logs:
  • Date Author Notes
  • 2018-05-17 armink the first version
    /
    #ifndef FAL_CFG_H
    #define FAL_CFG_H
    #include
    #include
    /
    ===================== Flash device Configuration ========================= /
    extern const struct fal_flash_dev stm32_onchip_flash_16k ;
    extern const struct fal_flash_dev stm32_onchip_flash_64k ;
    extern const struct fal_flash_dev stm32_onchip_flash_128k;
    /
    flash device table /
    #define FAL_FLASH_DEV_TABLE
    {
    &stm32_onchip_flash_16k,
    &stm32_onchip_flash_64k,
    &stm32_onchip_flash_128k,
    }
    /
    ====================== Partition Configuration ========================== /
    #ifdef FAL_PART_HAS_TABLE_CFG
    /
    partition table /
    #define FAL_PART_TABLE
    {
    {FAL_PART_MAGIC_WORD, "bl", "onchip_flash_16k" , 0, 64 * 1024, 0},
    {FAL_PART_MAGIC_WORD, "param", "onchip_flash_64k" , 0, 64 * 1024, 0},
    {FAL_PART_MAGIC_WORD, "app", "onchip_flash_128k", 0, 128
    1024, 0},
    {FAL_PART_MAGIC_WORD, "filesystem", "onchip_flash_128k", 128 * 1024, 768* 1024, 0},
    }
    #endif /* FAL_PART_HAS_TABLE_CFG /
    #endif /
    FAL_CFG_H */
    這段代碼的意思是使用flash設備stm32_onchip_flash_16k,stm32_onchip_flash_64k,stm32_onchip_flash_128k
    創建四個分區,分別名為bl,param,app,filesystem(名字都是隨便取的)。后兩個分區是分別瓜分了onchip_flash_128k設備內存。

2.x FAL使用示例

見博客 1.4 FAL使用示例 或者** **FAL:Flash 抽象層的 3、Finsh/MSH 測試命令
我的部分操作見 4.2 fal指令實驗
到此已經移植完fal了

3.搭載 littlefs 文件系統

littlefs 是 ARM 官方推出的,專為嵌入式系統設計的文件系統,相比傳統的文件系統,littlefs 具有以下優點:

自帶擦寫均衡
支持掉電保護
占用的 RAM/ROM
littlefs 自帶的擦寫均衡和掉電保護使開發者可以放心的將文件系統掛載到 nor flash 上。

3.1 使能DFS框架

打開 env,輸入 menuconfig,在 RT-Thread Components → Device virtual file system 中打開 DFS 框架。

1.jpg

使用默認配置

3.2 配置 littlefs

在 RT-Thread online packages → system packages → Littlefs: A high-integrity embedded file system 中打開 littlefs。

1.jpg

注意lfs enable wear leveling要改成100,這項意思是 lfs啟用損耗均衡

3.2.1 猜測

代碼中對于disk block size的注釋

// Size of an erasable block. This does not impact ram consumption and
// may be larger than the physical erase size. However, non-inlined files
// take up at minimum one block. Must be a multiple of the read
// and program sizes.
Google 翻譯
//可擦除塊的大小。 這不會影響ram的消耗,并且
//可能大于物理擦除大小。 但是,非內聯文件
//至少占用一個街區。 必須是讀取的倍數
//和程序大小。

結合程序調試中mtd_nor->block_size值為0x0002 0000。即128KB,又是”filesystem”分區所在的扇區的大小。

1.jpg

所以基本確定disk block size應該填128*1024,即131072。

其他配置我覺得默認配置問題不大。比如下面這個注釋的描述。

// Minimum size of a block read. All read operations will be a
// multiple of this value.
lfs_size_t read_size;

3.3 使能 MTD 設備

在 RT-Thread Components → Device Drivers 中使能 MTD 設備。

1.jpg

使用pkgs —update更新軟件包和scons —target=mdk5

3.4 創建 MTD 設備并掛載文件系統

fal 組件并沒有加入自動初始化的代碼,所以我們需要在 main 函數中初始化 fal,并使用 fal 提供的 API 來創建一個 MTD 設備。創建 MTD 設備后,就可以將 littlefs 掛載到剛剛生成的 MTD 設備上了。
在 main.c 文件中添加(覆蓋)的代碼如下所示:

/* 添加 fal 頭文件 /
#include
/
添加文件系統頭文件 /
#include
/
添加 DEBUG 頭文件 /
#define DBG_SECTION_NAME "main"
#define DBG_LEVEL DBG_INFO
#include
/
定義要使用的分區名字 */
#define FS_PARTITION_NAME "filesystem"
int main(void)
{
struct rt_device mtd_dev = RT_NULL;
/
初始化 fal /
fal_init();
/
生成 mtd 設備 /
mtd_dev = fal_mtd_nor_device_create(FS_PARTITION_NAME);
if (!mtd_dev)
{
LOG_E("Can't create a mtd device on '%s' partition.", FS_PARTITION_NAME);
}
else
{
/
掛載 littlefs /
if (dfs_mount(FS_PARTITION_NAME, "/", "lfs", 0, 0) == 0)
{
LOG_I("Filesystem initialized!");
}
else
{
/
格式化文件系統 /
dfs_mkfs("lfs", FS_PARTITION_NAME);
/
掛載 littlefs */
if (dfs_mount("filesystem", "/", "lfs", 0, 0) == 0)
{
LOG_I("Filesystem initialized!");
}
else
{
LOG_E("Failed to initialize filesystem!");
}
}
}
while (1)
{
rt_thread_mdelay(100);
}
}
注意這里使用了一個分區”filesystem”。所以上面創建分區必須也有名為”filesystem”的分區。

3.5 使用littlefs 文件系統

3.5.1 參考

文件系統語句都是通用的,都是基于POSIX 標準的

3.5.2 問題

需要注意:我這一直有個問題,就是只能使用mkdir 創建2條路徑,創建第3條就會出錯。如下:

1.jpg

暫未解決,因為創建二三十個.txt .c也沒出錯,就先這樣吧。

3.5.3 格式化

文檔里講的不清楚。
littlefs的格式化語句

1.程序里面寫的

/* 定義要使用的分區名字 /
#define FS_PARTITION_NAME "filesystem"
/
格式化文件系統 */
dfs_mkfs("lfs", FS_PARTITION_NAME);

2.Finsh組件
mkfs -t lfs filesystem

1.jpg

文檔里漏了

3.5.4 官方例程

1.jpg

4.實驗

4.1 分區實驗

看從0x0800 0000開始是否影響原程序
(是影響的,所以建議從扇區12開始。當然也可以看.map文件來知道程序所占ROM內存大小,來算從第幾個扇區開始是安全的,不過這樣就需要自己不按照我上文講的那樣配置設備表和分區表)

1.jpg

2.jpg

3.jpg

再步進一次,擦除所有扇區,即原來的程序也被擦除,導致hard_fault。匿名上位機保持上一張圖片的狀態

1.jpg

2.jpg

4.2 fal指令實驗

FAL為便于用戶調試,也提供了finsh命令fal,包括fal probe / read / write / erase / bench等命令

1.jpg

通過使用隨機的人為數據給“寫入函數”,讀取出“讀取函數”的值,來驗證是否復位后還保存著數據
(是能繼續存儲的,所以fal確實是操作著掉電不丟失數據的東西)

1.jpg

2.jpg

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 驅動器
    +關注

    關注

    53

    文章

    8271

    瀏覽量

    147067
  • 片上系統
    +關注

    關注

    0

    文章

    186

    瀏覽量

    26883
  • RT-Thread
    +關注

    關注

    31

    文章

    1305

    瀏覽量

    40386
  • Flash存儲
    +關注

    關注

    0

    文章

    38

    瀏覽量

    8334
  • DFS
    DFS
    +關注

    關注

    0

    文章

    26

    瀏覽量

    9191
收藏 人收藏

    評論

    相關推薦

    VxWorks文件系統Flash的TFFS設計與實現

    0 引言在VxWorks的應用系統中,基于flash文件系統通常都采用DOS+FAT+FTL的結構。一般情況下,磁盤文件系統大多是基于sector的
    發表于 06-18 16:23 ?2533次閱讀
    VxWorks<b class='flag-5'>文件系統</b>、<b class='flag-5'>Flash</b>的TFFS設計與實現

    如何去實現RT-Thread的flash掛載littlefs文件系統

    1、 flash掛載 littlefs 文件系統平臺 stm32l475-atk-pandora使能
    發表于 05-11 16:04

    flash使用文件系統筆記分享

    1、flash使用文件系統筆記  ?由于之前需要使用
    發表于 11-23 15:31

    嵌入式系統中的Flash文件系統

    介紹嵌入式系統中的 Flash文件系統。對 FFS需求,Flash存儲器特性,FFS要求和實現作了描述,并介紹幾種免費和商用的 FFS。
    發表于 04-07 09:40 ?15次下載

    車載MP3中Flash文件系統的設計與應用

    基于Flash 存儲器的特點,詳細介紹適合于車載MP3 的Flash 文件系統(包括Flash存儲管理系統和FAT
    發表于 04-15 10:03 ?18次下載

    車載MP3中Flash文件系統的設計與應用

    基于Flash 存儲器的特點,詳細介紹適合于車載MP3 的Flash 文件系統(包括Flash存儲管理系統和FAT
    發表于 05-16 13:54 ?11次下載

    基于CC CCS 的Flash 文件系統設計

    在深入分析TI 為開發DSP 提供的RTS.LIB(RTS.SRC 為源代碼)的基礎,介紹對自定義的文件和設備的操作方法; 設計一個簡易的Flash 文件系統, 極大地方便了應用編程
    發表于 05-18 13:27 ?17次下載

    基于VxWorks的文件系統的研究與實現

    詳細介紹TrueFFS的結構,以AM29LV160BT為例,在Flash建立文件系統。利用VxWorks下的文件系統TrueFFS實現對Flash
    發表于 12-28 10:55 ?35次下載

    fat文件系統筆記

    私人累積的fat文件系統筆記
    發表于 03-13 15:05 ?4次下載

    Flash文件系統剖析

    設備的文件系統意味著什么嗎?本文將向您介紹 Linux 的 flash 文件系統,并探索它們如何通過平均讀寫(wear leveling)處理底層的可消耗設備(flash 部件),并
    發表于 11-01 15:43 ?4次下載
    <b class='flag-5'>Flash</b><b class='flag-5'>文件系統</b>剖析

    SPI—外部FLASH文件系統

    -ST固件庫版本:1.5.1 【 !】功能簡介: 把FLASH芯片格式化成文件系統,使可以文件系統的方式讀寫文件數據 學習目的:學習文件系統
    發表于 12-13 15:16 ?5次下載
    SPI—外部<b class='flag-5'>FLASH</b><b class='flag-5'>文件系統</b>

    SPI FLASH LittleFS文件系統例程資料免費下載

    SPI FLASH LittleFS文件系統例程,基于STM32F103+STM32Cube開發的詳細資料免費下載。
    發表于 02-18 08:00 ?36次下載
    SPI <b class='flag-5'>FLASH</b> LittleFS<b class='flag-5'>文件系統</b>例程資料免費下載

    線性文件系統的設計方案在嵌入式應用管理Flash空間中的應用

    在嵌入式系統中,為了便于對閃存(Flash)空間進行管理,會采用文件的形式來訪問Flash。目前,可以購買到的Flash
    的頭像 發表于 09-10 17:54 ?3104次閱讀
    線性<b class='flag-5'>文件系統</b>的設計方案在嵌入式應用管理<b class='flag-5'>Flash</b>空間中的應用

    Nand Flash文件系統解決方案

    Nand Flash文件系統解決方案(嵌入式開發一般考什么證書)-ST提供適用于SLC的NFTL(NAND Flash Translation Layer)和FAT類文件系統來解決NA
    發表于 07-30 10:41 ?9次下載
    Nand <b class='flag-5'>Flash</b><b class='flag-5'>文件系統</b>解決方案

    手把手教你在flash移植fatfs文件系統(含實時操作系統)

    文章目錄基于stm32f103系列MCU,在spi_flash移植建立fatfs文件系統移植準備FATFS文件系統源碼單片機平臺SPI_FLASH
    發表于 12-09 12:51 ?30次下載
    手把手教你在<b class='flag-5'>flash</b><b class='flag-5'>上</b>移植fatfs<b class='flag-5'>文件系統</b>(含實時操作<b class='flag-5'>系統</b>)
    幸运水果机电脑版| 刀把状的房子做生意| 千亿百家乐官网的玩法技巧和规则 | 太阳城百家乐的分数| 海王星百家乐官网的玩法技巧和规则| 金殿百家乐官网的玩法技巧和规则| 蓝宝石百家乐官网娱乐城| 百家乐游戏开发技术| 百家乐官网二代皇冠博彩| 至尊百家乐官网娱乐网| 网上百家乐网址| 百家乐官网视频多开器| 百家乐官网tt赌场娱乐网规则| 百家乐官网是咋玩法| 大发888游戏平台188| 丹江口市| 太阳城娱乐网站| 澳门百家乐官网威尼斯| CEO百家乐官网娱乐城| 百家乐智能投注系统| 大发888心得| 崇文区| 骰子百家乐官网的玩法技巧和规则| 做百家乐网上投注| 大发888真人 新浪微群| 百家乐官网现金平台排名| 风水罗盘24方位| 真百家乐游戏| 海港城娱乐城| 百家乐官网任你博娱乐场| 在线百家乐平台| 新加坡百家乐官网规则| 百家乐下注法| 凯旋门百家乐官网技巧| 百家乐视频象棋| 大发888在线体育官网| 百家乐官网发牌器8副| 巴黎百家乐地址| 大发888bet游戏平台| 皇冠百家乐官网代理网址| 澳门百家乐娱乐场开户注册|