在 V4.1.0 中,將 fal 軟件包重新定義為 RT-Thread 內(nèi)部組件。
在使用方式上和以前有這些區(qū)別:原本使用 fal 需要在 RT-Thread 的包管理器中選擇并進(jìn)行下載;現(xiàn)在只需要在組件中打開使用即可。以下做詳細(xì)介紹。
1、FAL介紹
FAL (Flash Abstraction Layer) Flash 抽象層,是對(duì) Flash 及基于 Flash 的分區(qū)進(jìn)行管理、操作的抽象層,對(duì)上層統(tǒng)一了 Flash 及 分區(qū)操作的 API (框架圖如下所示),并具有以下特性:
-
支持靜態(tài)可配置的分區(qū)表,并可關(guān)聯(lián)多個(gè) Flash 設(shè)備;
-
分區(qū)表支持 自動(dòng)裝載 。避免在多固件項(xiàng)目,分區(qū)表被多次定義的問題;
-
代碼精簡,對(duì)操作系統(tǒng) 無依賴 ,可運(yùn)行于裸機(jī)平臺(tái),比如對(duì)資源有一定要求的 Bootloader;
-
統(tǒng)一的操作接口。保證了文件系統(tǒng)、OTA、NVM(例如:EasyFlash) 等對(duì) Flash 有一定依賴的組件,底層 Flash 驅(qū)動(dòng)的可重用性;
-
自帶基于 Finsh/MSH 的測試命令,可以通過 Shell 按字節(jié)尋址的方式操作(讀寫擦) Flash 或分區(qū),方便開發(fā)者進(jìn)行調(diào)試、測試;
1.1、打開 FAL
在組件中打開使用:
每個(gè)功能的配置說明如下:
-
開啟調(diào)試日志輸出(默認(rèn)開啟);
-
分區(qū)表是否在
fal_cfg.h
中定義(默認(rèn)開啟)。如果關(guān)閉此選項(xiàng),fal 將會(huì)自動(dòng)去指定 Flash 的指定位置去檢索并裝載分區(qū)表,具體配置詳見下面兩個(gè)選項(xiàng); -
存放分區(qū)表的 Flash 設(shè)備;
-
分區(qū)表的 結(jié)束地址 位于 Flash 設(shè)備上的偏移。fal 將從此地址開始往回進(jìn)行檢索分區(qū)表,直接讀取到 Flash 頂部。如果不確定分區(qū)表具體位置,這里也可以配置為 Flash 的結(jié)束地址,fal 將會(huì)檢索整個(gè) Flash,檢索時(shí)間可能會(huì)增加。
-
啟用 FAL 針對(duì) SFUD 的移植文件(默認(rèn)關(guān)閉);
-
應(yīng)輸入調(diào)用
rt_sfud_flash_probe
函數(shù)時(shí)傳入的 FLASH 設(shè)備名稱(也可以通過 list_device 命令查看 Block Device 的名字獲?。?。該名稱與分區(qū)表中的 Flash 名稱對(duì)應(yīng),只有正確設(shè)置設(shè)備名字,才能完成對(duì) FLASH 的讀寫操作。
1.2、FAL 目錄
1.3、FAL API
FAL 相關(guān)的 API 如圖所示,點(diǎn)擊此處查看 API 參數(shù)詳解。(以下鏈接請(qǐng)復(fù)制至外部瀏覽器打開)
https://github.com/RT-Thread/rt-thread/blob/master/components/fal/docs/fal_api.md
2、使用 FAL
使用 FAL 的基本步驟如下所示:
1、打開 FAL:從 Env 中打開 fal 組件。
2、FAL 移植:定義 flash 設(shè)備、定義 flash 設(shè)備表、定義 flash 分區(qū)表。以下主要對(duì)步驟 2 展開講解。
3、調(diào)用 fal_init() 初始化該庫:移植完成后,可在應(yīng)用層調(diào)用,如在 main 函數(shù)中調(diào)用。
2.1、定義 flash 設(shè)備
在定義 Flash 設(shè)備表前,需要先定義 Flash 設(shè)備??梢允瞧瑑?nèi) flash, 也可以是片外基于 SFUD 的 spi flash:
-
定義片內(nèi) flash 設(shè)備可以參考 fal_flash_stm32f2_port.c
-
定義片外 spi flash 設(shè)備可以參考 fal_flash_sfud_port.c
定義具體的 Flash 設(shè)備對(duì)象,用戶需要根據(jù)自己的 Flash 情況分別實(shí)現(xiàn) init
、 read
、 write
、 erase
這些操作函數(shù):
-
static int init(void)
:可選 的初始化操作。 -
static int read(long offset, uint8_t *buf, size_t size)
:讀取操作。
-
static int write(long offset, const uint8_t *buf, size_t size)
:寫入操作。
-
static int erase(long offset, size_t size)
:擦除操作。
用戶需要根據(jù)自己的 Flash 情況分別實(shí)現(xiàn)這些操作函數(shù)。在文件最底部定義了具體的 Flash 設(shè)備對(duì)象 ,如下示例定義了 stm32f2 片上 flash:stm32f2_onchip_flash
1conststructfal_flash_devstm32f2_onchip_flash=
2{
3.name="stm32_onchip",
4.addr=0x08000000,
5.len=1024*1024,
6.blk_size=128*1024,
7.ops={init,read,write,erase},
8.write_gran=8
9};
-
"stm32_onchip"
: Flash 設(shè)備的名字。 -
0x08000000
: 對(duì) Flash 操作的起始地址。 -
1024*1024
:Flash 的總大?。?MB)。 -
128*1024
:Flash 塊/扇區(qū)大小(因?yàn)?STM32F2 各塊大小不均勻,所以擦除粒度為最大塊的大?。?28K)。 -
{init, read, write, erase}
:Flash 的操作函數(shù)。如果沒有 init 初始化過程,第一個(gè)操作函數(shù)位置可以置空。 -
8
: 設(shè)置寫粒度,單位 bit, 0 表示未生效(默認(rèn)值為 0 ),該成員是 fal 版本大于 0.4.0 的新增成員。各個(gè) flash 寫入粒度不盡相同,可通過該成員進(jìn)行設(shè)置,以下列舉幾種常見 Flash 寫粒度: -
nor flash: 1 bit
-
stm32f2/f4: 8 bit
-
stm32f1: 32 bit
-
stm32l4: 64 bit
2.2、定義 flash 設(shè)備表
Flash 設(shè)備表定義在 fal_cfg.h
頭文件中,定義分區(qū)表前需 新建 fal_cfg.h
文件 ,請(qǐng)將該文件統(tǒng)一放在對(duì)應(yīng) BSP 或工程目錄的 port 文件夾下,并將該頭文件路徑加入到工程。fal_cfg.h 可以參考 示例文件 fal/samples/porting/fal_cfg.h 完成。
設(shè)備表示例:
1/*=====================FlashdeviceConfiguration=========================*/
2externconststructfal_flash_devstm32f2_onchip_flash;
3externstructfal_flash_devnor_flash0;
4
5/*flashdevicetable*/
6#defineFAL_FLASH_DEV_TABLE
7{
8&stm32f2_onchip_flash,
9&nor_flash0,
10}
Flash 設(shè)備表中,有兩個(gè) Flash 對(duì)象,一個(gè)為 STM32F2 的片內(nèi) Flash ,一個(gè)為片外的 Nor Flash。
2.3、定義 flash 分區(qū)表
分區(qū)表也定義在 fal_cfg.h
頭文件中。Flash 分區(qū)基于 Flash 設(shè)備,每個(gè) Flash 設(shè)備又可以有 N 個(gè)分區(qū),這些分區(qū)的集合就是分區(qū)表。在配置分區(qū)表前,務(wù)必保證已定義好 Flash 設(shè)備 及 設(shè)備表。fal_cfg.h 可以參考 示例文件 fal/samples/porting/fal_cfg.h 完成。
分區(qū)表示例:
1#defineNOR_FLASH_DEV_NAME"norflash0"
2/*======================PartitionConfiguration==========================*/
3#ifdefFAL_PART_HAS_TABLE_CFG
4/*partitiontable*/
5#defineFAL_PART_TABLE
6{
7{FAL_PART_MAGIC_WORD,"bl","stm32_onchip",0,64*1024,0},
8{FAL_PART_MAGIC_WORD,"app","stm32_onchip",64*1024,704*1024,0},
9{FAL_PART_MAGIC_WORD,"easyflash",NOR_FLASH_DEV_NAME,0,1024*1024,0},
10{FAL_PART_MAGIC_WORD,"download",NOR_FLASH_DEV_NAME,1024*1024,1024*1024,0},
11}
12#endif/*FAL_PART_HAS_TABLE_CFG*/
上面這個(gè)分區(qū)表詳細(xì)描述信息如下:
用戶需要修改的分區(qū)參數(shù)包括:分區(qū)名稱、關(guān)聯(lián)的 Flash 設(shè)備名、偏移地址(相對(duì) Flash 設(shè)備內(nèi)部)、大小,需要注意以下幾點(diǎn):
-
分區(qū)名保證 不能重復(fù);
-
關(guān)聯(lián)的 Flash 設(shè)備 務(wù)必已經(jīng)在 Flash 設(shè)備表中定義好 ,并且 名稱一致 ,否則會(huì)出現(xiàn)無法找到 Flash 設(shè)備的錯(cuò)誤;
-
分區(qū)的起始地址和大小 不能超過 Flash 設(shè)備的地址范圍 ,否則會(huì)導(dǎo)致包初始化錯(cuò)誤;
注意:每個(gè)分區(qū)定義時(shí),除了填寫上面介紹的參數(shù)屬性外,需在前面增加
FAL_PART_MAGIC_WORD
屬性,末尾增加0
(目前用于保留功能)
3、Finsh/MSH 測試命令
fal 提供了豐富的測試命令,項(xiàng)目只要在 RT-Thread 上開啟 Finsh/MSH 功能即可。在做一些基于 Flash 的應(yīng)用開發(fā)、調(diào)試時(shí),這些命令會(huì)非常實(shí)用。它可以準(zhǔn)確的寫入或者讀取指定位置的原始 Flash 數(shù)據(jù),快速的驗(yàn)證 Flash 驅(qū)動(dòng)的完整性,甚至可以對(duì) Flash 進(jìn)行性能測試。
具體功能如下:輸入 fal 可以看到完整的命令列表
1msh/>fal
2Usage:
3falprobe[dev_name|part_name]-probeflashdeviceorpartitionbygivenname
4falreadaddrsize-read'size'bytesstartingat'addr'
5falwriteaddrdata1...dataN-writesomebytes'data'startingat'addr'
6faleraseaddrsize-erase'size'bytesstartingat'addr'
7falbench-benchmarktestwithperblocksize
8
9msh/>
3.1、指定待操作的 Flash 設(shè)備或 Flash 分區(qū)
當(dāng)?shù)谝淮问褂?fal 命令時(shí),直接輸入 fal probe
將會(huì)顯示分區(qū)表信息??梢灾付ù僮鞯膶?duì)象為分區(qū)表里的某個(gè)分區(qū),或者某個(gè) Flash 設(shè)備。
分區(qū)或者 Flash 被成功選中后,還將會(huì)顯示它的一些屬性情況。大致效果如下:
1msh/>falprobe
2Noflashdeviceorpartitionwasprobed.
3Usage:falprobe[dev_name|part_name]-probeflashdeviceorpartitionbygivenname.
4[I/FAL]====================FALpartitiontable====================
5[I/FAL]|name|flash_dev|offset|length|
6[I/FAL]-------------------------------------------------------------
7[I/FAL]|bl|stm32_onchip|0x00000000|0x00010000|
8[I/FAL]|app|stm32_onchip|0x00010000|0x000b0000|
9[I/FAL]|ef|norflash0|0x00000000|0x00100000|
10[I/FAL]|download|norflash0|0x00100000|0x00100000|
11[I/FAL]=============================================================
12msh/>
13msh/>falprobedownload
14Probedaflashpartition|download|flash_dev:norflash0|offset:1048576|len:1048576|.
15msh/>
16
3.2、擦除數(shù)據(jù)
先輸入 fal erase
,后面跟著待擦除數(shù)據(jù)的起始地址以及長度。以下命令為:從 0 地址(相對(duì) Flash 或分區(qū))開始擦除 4096 字節(jié)數(shù)據(jù)
注意:根據(jù) Flash 特性,擦除動(dòng)作將按扇區(qū)對(duì)齊進(jìn)行處理。所以,如果擦除操作地址或長度未按照 Flash 的扇區(qū)對(duì)齊,將會(huì)擦除掉與其關(guān)聯(lián)的整個(gè)扇區(qū)數(shù)據(jù)。
1msh/>falerase04096
2Erasedatasuccess.Startfrom0x00000000,sizeis4096.
3msh/>
3.3、寫入數(shù)據(jù)
先輸入 fal write
,后面跟著 N 個(gè)待寫入的數(shù)據(jù),并以空格隔開。以下命令為:從地址 8 的位置依次開始寫入 1、2、3、4 、 5 這 5 個(gè)字節(jié)數(shù)據(jù)
1msh/>falwrite812345
2Writedatasuccess.Startfrom0x00000008,sizeis5.
3Writedata:12345.
4msh/>
3.4、讀取數(shù)據(jù)
先輸入 fal read
,后面跟著待讀取數(shù)據(jù)的起始地址以及長度。以下命令為:從 0 地址開始讀取 64 字節(jié)數(shù)據(jù)
1msh/>falread064
2Readdatasuccess.Startfrom0x00000000,sizeis64.Thedatais:
3Offset(h)000102030405060708090A0B0C0D0E0F
4[00000000]FFFFFFFFFFFFFFFF0102030405FFFFFF
5[00000010]FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
6[00000020]FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
7[00000030]FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
8
9msh/>
3.5、性能測試
性能測試將會(huì)測試 Flash 的擦除、寫入及讀取速度,同時(shí)將會(huì)測試寫入及讀取數(shù)據(jù)的準(zhǔn)確性,保證整個(gè) Flash 或整個(gè)分區(qū)的 寫入與讀取 數(shù)據(jù)的一致性。
先輸入 fal bench
,后面跟著待測試 Flash 的扇區(qū)大小(請(qǐng)查看對(duì)應(yīng)的 Flash 手冊(cè),SPI Nor Flash 一般為 4096)。由于性能測試將會(huì)讓整個(gè) Flash 或者整個(gè)分區(qū)的數(shù)據(jù)丟失,所以命令最后必須跟 yes
。
1msh/>falbench4096yes
2Erasing1048576bytesdata,waiting...
3Erasebenchmarksuccess,totaltime:2.674S.
4Writing1048576bytesdata,waiting...
5Writebenchmarksuccess,totaltime:7.107S.
6Reading1048576bytesdata,waiting...
7Readbenchmarksuccess,totaltime:2.716S.
8msh/>
4、常見應(yīng)用
-
基于 FAL 分區(qū)的 fatfs 文件系統(tǒng)例程
https://github.com/RT-Thread/IoT_Board/tree/master/examples/15_component_fs_flash
-
基于 FAL 分區(qū)的 littlefs 文件系統(tǒng)應(yīng)用筆記
https://www.rt-thread.org/document/site/application-note/components/dfs/an0027-littlefs/
-
基于 FAL 分區(qū)的 EasyFlash 移植說明
https://github.com/armink-rtt-pkgs/EasyFlash/tree/master/ports
原文標(biāo)題:RT-Thread v4.1.0 特性解析之 FAL 探秘
文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
FlaSh
+關(guān)注
關(guān)注
10文章
1677瀏覽量
151695 -
fal
+關(guān)注
關(guān)注
0文章
5瀏覽量
6858 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1402瀏覽量
41877
原文標(biāo)題:RT-Thread v4.1.0 特性解析之 FAL 探秘
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
RT-Thread v4.1.0 正式發(fā)布了!
RT-Thread v4.1.0版本內(nèi)核更新解析
支持RT-Thread V4.1.0的芯片BSP包,可以用V4.1.1版本嗎?
基于RT-Thread官方ART-Pi開發(fā)板+自制傳感器拓展板

RT-Thread v4.1.0版本正式發(fā)布

如何將fal軟件包重新定義為RT-Thread內(nèi)部組件

RT-Thread V4.1.0新特性CMake介紹與構(gòu)建CMake工程
RT-Thread 4.1.0的CMake構(gòu)建教程
RT-Thread全球技術(shù)大會(huì):Kconfig在RT-Thread中的工作機(jī)制

RT-Thread全球技術(shù)大會(huì):RT-Thread對(duì)POSIX的實(shí)現(xiàn)情況介紹

RT-Thread 4.1.0正式添加對(duì)Arm Compiler 6支持

評(píng)論