0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

科技綠洲 ? 來源:RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 作者:RTThread物聯(lián)網(wǎng)操作 ? 2022-04-20 11:03 ? 次閱讀

在 V4.1.0 中,將 fal 軟件包重新定義為 RT-Thread 內(nèi)部組件。

在使用方式上和以前有這些區(qū)別:原本使用 fal 需要在 RT-Thread 的包管理器中選擇并進(jìn)行下載;現(xiàn)在只需要在組件中打開使用即可。以下做詳細(xì)介紹。

1、FAL介紹

FAL (Flash Abstraction Layer) Flash 抽象層,是對 Flash 及基于 Flash 的分區(qū)進(jìn)行管理、操作的抽象層,對上層統(tǒng)一了 Flash 及 分區(qū)操作的 API (框架圖如下所示),并具有以下特性:

支持靜態(tài)可配置的分區(qū)表,并可關(guān)聯(lián)多個(gè) Flash 設(shè)備;

分區(qū)表支持 自動(dòng)裝載 。避免在多固件項(xiàng)目,分區(qū)表被多次定義的問題;

代碼精簡,對操作系統(tǒng) 無依賴 ,可運(yùn)行于裸機(jī)平臺(tái),比如對資源有一定要求的 Bootloader;

統(tǒng)一的操作接口。保證了文件系統(tǒng)、OTA、NVM(例如:EasyFlash) 等對 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 針對 SFUD 的移植文件(默認(rèn)關(guān)閉);

應(yīng)輸入調(diào)用 rt_sfud_flash_probe 函數(shù)時(shí)傳入的 FLASH 設(shè)備名稱(也可以通過 list_device 命令查看 Block Device 的名字獲?。?。該名稱與分區(qū)表中的 Flash 名稱對應(yīng),只有正確設(shè)置設(shè)備名字,才能完成對 FLASH 的讀寫操作。

1.2、FAL 目錄

圖片

1.3、FAL API

FAL 相關(guān)的 API 如圖所示,點(diǎn)擊此處查看 API 參數(shù)詳解。(以下鏈接請復(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ū)表。以下主要對步驟 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è)備對象,用戶需要根據(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è)備對象 ,如下示例定義了 stm32f2 片上 flash:stm32f2_onchip_flash

1const struct fal_flash_dev stm32f2_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 = 89};

"stm32_onchip" : Flash 設(shè)備的名字。

0x08000000: 對 Flash 操作的起始地址。

1024*1024:Flash 的總大小(1MB)。

128*1024:Flash 塊/扇區(qū)大?。ㄒ?yàn)?STM32F2 各塊大小不均勻,所以擦除粒度為最大塊的大小:128K)。

{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 文件 ,請將該文件統(tǒng)一放在對應(yīng) BSP 或工程目錄的 port 文件夾下,并將該頭文件路徑加入到工程。fal_cfg.h 可以參考 示例文件 fal/samples/porting/fal_cfg.h 完成。

設(shè)備表示例:

 1/* ===================== Flash device Configuration ========================= */ 2extern const struct fal_flash_dev stm32f2_onchip_flash; 3extern struct fal_flash_dev nor_flash0; 4 5/* flash device table */ 6#define FAL_FLASH_DEV_TABLE                                          \ 7{                                                                    \ 8    &stm32f2_onchip_flash,                                           \ 9    &nor_flash0,                                                     \10}

Flash 設(shè)備表中,有兩個(gè) Flash 對象,一個(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#define NOR_FLASH_DEV_NAME             "norflash0" 2/* ====================== Partition Configuration ========================== */ 3#ifdef FAL_PART_HAS_TABLE_CFG 4/* partition table */ 5#define FAL_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è)備名、偏移地址(相對 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)的完整性,甚至可以對 Flash 進(jìn)行性能測試。

具體功能如下:輸入 fal 可以看到完整的命令列表

1msh />fal2Usage:3fal probe [dev_name|part_name]   - probe flash device or partition by given name4fal read addr size               - read 'size' bytes starting at 'addr'5fal write addr data1 ... dataN   - write some bytes 'data' starting at 'addr'6fal erase addr size              - erase 'size' bytes starting at 'addr'7fal bench              - benchmark test with per block size89msh />

3.1、指定待操作的 Flash 設(shè)備或 Flash 分區(qū)

當(dāng)?shù)谝淮问褂?fal 命令時(shí),直接輸入 fal probe 將會(huì)顯示分區(qū)表信息??梢灾付ù僮鞯膶ο鬄榉謪^(qū)表里的某個(gè)分區(qū),或者某個(gè) Flash 設(shè)備。

分區(qū)或者 Flash 被成功選中后,還將會(huì)顯示它的一些屬性情況。大致效果如下:

 1msh />fal probe     2No flash device or partition was probed. 3Usage: fal probe [dev_name|part_name]   - probe flash device or partition by given name. 4[I/FAL] ==================== FAL partition table ==================== 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 />fal probe download14Probed a flash partition | download | flash_dev: norflash0 | offset: 1048576 | len: 1048576 |.15msh />16

3.2、擦除數(shù)據(jù)

先輸入 fal erase ,后面跟著待擦除數(shù)據(jù)的起始地址以及長度。以下命令為:從 0 地址(相對 Flash 或分區(qū))開始擦除 4096 字節(jié)數(shù)據(jù)

注意:根據(jù) Flash 特性,擦除動(dòng)作將按扇區(qū)對齊進(jìn)行處理。所以,如果擦除操作地址或長度未按照 Flash 的扇區(qū)對齊,將會(huì)擦除掉與其關(guān)聯(lián)的整個(gè)扇區(qū)數(shù)據(jù)。

1msh />fal erase 0 40962Erase data success. Start from 0x00000000, size is 4096.3msh />

3.3、寫入數(shù)據(jù)

先輸入 fal write ,后面跟著 N 個(gè)待寫入的數(shù)據(jù),并以空格隔開。以下命令為:從地址 8 的位置依次開始寫入 1、2、3、4 、 5 這 5 個(gè)字節(jié)數(shù)據(jù)

1msh />fal write 8 1 2 3 4 52Write data success. Start from 0x00000008, size is 5.3Write data: 1 2 3 4 5 .4msh />

3.4、讀取數(shù)據(jù)

先輸入 fal read ,后面跟著待讀取數(shù)據(jù)的起始地址以及長度。以下命令為:從 0 地址開始讀取 64 字節(jié)數(shù)據(jù)

1msh />fal read 0 642Read data success. Start from 0x00000000, size is 64. The data is:3Offset (h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F4[00000000] FF FF FF FF FF FF FF FF 01 02 03 04 05 FF FF FF 5[00000010] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 6[00000020] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 7[00000030] FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 89msh />

3.5、性能測試

性能測試將會(huì)測試 Flash 的擦除、寫入及讀取速度,同時(shí)將會(huì)測試寫入及讀取數(shù)據(jù)的準(zhǔn)確性,保證整個(gè) Flash 或整個(gè)分區(qū)的 寫入與讀取 數(shù)據(jù)的一致性。

先輸入 fal bench ,后面跟著待測試 Flash 的扇區(qū)大?。ㄕ埐榭磳?yīng)的 Flash 手冊,SPI Nor Flash 一般為 4096)。由于性能測試將會(huì)讓整個(gè) Flash 或者整個(gè)分區(qū)的數(shù)據(jù)丟失,所以命令最后必須跟 yes

1msh />fal bench 4096 yes2Erasing 1048576 bytes data, waiting...3Erase benchmark success, total time: 2.674S.4Writing 1048576 bytes data, waiting...5Write benchmark success, total time: 7.107S.6Reading 1048576 bytes data, waiting...7Read benchmark success, total time: 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

審核編輯:彭菁
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6808

    瀏覽量

    88743
  • 軟件
    +關(guān)注

    關(guān)注

    69

    文章

    4699

    瀏覽量

    87088
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1261

    瀏覽量

    39838
收藏 人收藏

    評論

    相關(guān)推薦

    介紹RT-Thread軟件包

    學(xué)習(xí)要點(diǎn)介紹 RT-Thread軟件包;簡介 nRF24L01 軟件包的使用,講解如何使用此軟件包數(shù)據(jù)正確發(fā)送和接收;學(xué)習(xí)線程間的通信
    發(fā)表于 07-27 06:07

    使用menuconfig配置基于RT-Thread的NimBLE軟件包

    controller 功能的選項(xiàng),當(dāng)其沒有被定義時(shí),NimBLE 軟件包中藍(lán)牙 controller 部分功能則會(huì)被屏蔽失效。還有一些宏可以用于定義運(yùn)行參數(shù),例如棧大小、線程優(yōu)先級等,關(guān)于
    發(fā)表于 06-27 11:18

    基于RT-Thread studio的flash常用軟件包介紹

    , 以及使用步驟 基于 rt-thread studio。1 軟件包簡述1.1 falflash 管理中間層, 用來管理片內(nèi)flash 與 外部 nor flash ,上層軟件提供統(tǒng)
    發(fā)表于 09-06 14:58

    rt-studio潘多拉開發(fā)板最新rt-thread不能運(yùn)行的解決辦法分享

    ,是因?yàn)?在最新的 rt-thread 中有一個(gè)fal定義使用什么的都一樣,軟件包里面也有一個(gè),這個(gè)在鏈接時(shí),沖突了,解決辦法有兩個(gè) 1.刪掉 r
    發(fā)表于 12-05 13:52

    RT-Thread 軟件包介紹

    。所以,想要成為高級程序員就快來使用、創(chuàng)造軟件包吧~軟件包定義RT-Thread 軟件包:運(yùn)行于 RT
    發(fā)表于 05-21 19:38 ?5522次閱讀

    RT-Thread軟件包定義和使用

    RT-Thread軟件包是運(yùn)行于RT-Thread物聯(lián)網(wǎng)操作系統(tǒng)平臺(tái)上,面向不同應(yīng)用領(lǐng)域的通用軟件組件 。
    的頭像 發(fā)表于 05-21 11:29 ?1w次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>軟件包</b><b class='flag-5'>定義</b>和使用

    RT-Thread社區(qū)上有哪些優(yōu)秀的軟件包?

    SX12XX 軟件包是基于 semtech 官網(wǎng) Firmware Drivers V2.1.0代碼庫的移植實(shí)現(xiàn),目前只支持 SX1278 LoRa設(shè)備。該軟件包在原代碼庫功能的基礎(chǔ)上,對接 RT-Thread SPI 設(shè)備驅(qū)動(dòng)
    的頭像 發(fā)表于 04-03 15:35 ?7579次閱讀

    RT-Thread v4.1.0中FAL介紹

    在 V4.1.0 中, fal 軟件包重新定義 RT-Thread
    的頭像 發(fā)表于 04-26 13:34 ?3728次閱讀

    2022 RT-Thread全球技術(shù)大會(huì):RT-Thread軟件包

    RT-Thread在2022年上半年新增幾十個(gè)軟件包:rtt-rust、LuatOS、gui-guider-demo。
    的頭像 發(fā)表于 05-27 14:12 ?1017次閱讀
    2022 <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):<b class='flag-5'>RT-Thread</b><b class='flag-5'>軟件包</b>

    RT-Thread全球技術(shù)大會(huì):恩智浦新增100+軟件包

    RT-Thread全球技術(shù)大會(huì):恩智浦新增100+軟件包,支持了很多有用的功能。 ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 14:26 ?917次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會(huì):恩智浦新增100+<b class='flag-5'>軟件包</b>

    RT-Thread文檔_FAL 組件

    RT-Thread文檔_FAL 組件
    發(fā)表于 02-22 18:41 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>FAL</b> <b class='flag-5'>組件</b>

    RT-Thread在線軟件包改為本地軟件包的方法

    RT-Thread軟件包,使用時(shí)需要手動(dòng)通過 ENV 工具 更新到 本地的 packages 目錄,并且 packages 目錄默認(rèn)不參與 Git 工程管理,軟件包多了,偶爾需要更改軟件包
    的頭像 發(fā)表于 08-11 15:02 ?1125次閱讀
    <b class='flag-5'>RT-Thread</b>在線<b class='flag-5'>軟件包</b>改為本地<b class='flag-5'>軟件包</b>的方法

    RT-Thread使用cjson軟件包發(fā)送64位長整型數(shù)據(jù)

    開發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源0.2.2,rt-thread版本
    的頭像 發(fā)表于 10-11 15:09 ?858次閱讀
    <b class='flag-5'>RT-Thread</b>使用cjson<b class='flag-5'>軟件包</b>發(fā)送64位長整型數(shù)據(jù)

    RT-Thread中Agile Modbus軟件包的使用方法

    開發(fā)環(huán)境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的資源0.2.2,Agile Modbus軟件包版本
    的頭像 發(fā)表于 10-11 15:37 ?2273次閱讀
    <b class='flag-5'>RT-Thread</b>中Agile Modbus<b class='flag-5'>軟件包</b>的使用方法

    RT-Thread中mymqtt軟件包的使用方法

    在上一篇文章 RT-Thread中Lan8720和lwip協(xié)議棧的使用的工程基礎(chǔ)上添加mymqtt軟件包。 使能mqtt example和mqtt test,保存,等待下載更新軟件包。
    的頭像 發(fā)表于 10-13 10:44 ?895次閱讀
    <b class='flag-5'>RT-Thread</b>中mymqtt<b class='flag-5'>軟件包</b>的使用方法