chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

基于OpenHarmony3.1的LittleFS文件系統(tǒng)hdf驅(qū)動(dòng)實(shí)現(xiàn)

福州市凌睿智捷電子有限公司 ? 2022-06-22 09:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、簡(jiǎn)介

LittleFS是一個(gè)小型的Flash文件系統(tǒng),它結(jié)合日志結(jié)構(gòu)(log-structured)文件系統(tǒng)和COW(copy-on-write)文件系統(tǒng)的思想,以日志結(jié)構(gòu)存儲(chǔ)元數(shù)據(jù),以COW結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)。這種特殊的存儲(chǔ)方式,使LittleFS具有強(qiáng)大的掉電恢復(fù)能力(power-loss resilience)。分配COW數(shù)據(jù)塊時(shí)LittleFS采用了名為統(tǒng)計(jì)損耗均衡的動(dòng)態(tài)損耗均衡算法,使Flash設(shè)備的壽命得到有效保障。同時(shí)LittleFS針對(duì)資源緊缺的小型設(shè)備進(jìn)行設(shè)計(jì),具有極其有限的ROMRAM占用,并且所有RAM的使用都通過(guò)一個(gè)可配置的固定大小緩沖區(qū)進(jìn)行分配,不會(huì)隨文件系統(tǒng)的擴(kuò)大占據(jù)更多的系統(tǒng)資源。當(dāng)在一個(gè)資源非常緊缺的小型設(shè)備上,尋找一個(gè)具有掉電恢復(fù)能力并支持損耗均衡的Flash文件系統(tǒng)時(shí),LittleFS是一個(gè)比較好的選擇。

LittleFS在嵌入式開(kāi)發(fā)過(guò)程中經(jīng)常遇到,但是如何在OpenHarmony中使用呢?本文基于OpenHarmony 3.1Release + 小凌派-RK2206開(kāi)發(fā)板做LittleFS文件系統(tǒng)移植,現(xiàn)將相關(guān)移植經(jīng)驗(yàn)發(fā)布,分享給大家。文中如有問(wèn)題,請(qǐng)大家?guī)兔χ刚?/p>

二、LittleFS移植過(guò)程

本文基于OpenHarmony3.1Release做LittleFS移植,小凌派-RK2206開(kāi)發(fā)板內(nèi)部Flash有8MB大小,其中4~8MB區(qū)間為空閑區(qū)域。我將4M~5M作為L(zhǎng)ittleFS文件系統(tǒng)的/data目錄掛載硬件設(shè)備。具體移植過(guò)程主要如下所示:

1、hcs配置

1.1、hdf.hcs

創(chuàng)建/device/soc/rockchip/rk2206/hcs_config/hdf.hcs文件,具體如下:

#include "device_info/device_info.hcs"#include "fs/fs_config.hcs"#include "gpio/gpio_config.hcs"#include "i2c/i2c_config.hcs"#include "spi/spi_config.hcs"root { module = "rockchip,rk2206_chip";}

如上所述,我將在device_info/device_info.hcs添加LittleFS設(shè)備,并在fs/fs_config.hcs添加LittleFS具體信息。

1.2、BUILD.gn

新建//device/soc/rockchip/rk2206/hdf_config/BUILD.gn,具體代碼如下所示:

import("http://drivers/adapter/khdf/liteos_m/hdf.gni")module_switch = defined(LOSCFG_DRIVERS_HDF)module_name = get_path_info(rebase_path("."), "name")hdf_driver(module_name) { hcs_sources = [ "hdf.hcs" ]}

上述代碼將在編譯OpenHarmony3.1Rlease時(shí),將編譯hdf.hcs。

1.3、device_info.hcs

創(chuàng)建/device/soc/rockchip/rk2206/hcs_config/device_info/device_info.hcs文件,在文件中添加LittleFS設(shè)備,具體代碼如下所示:

device_fs :: device { device0 :: deviceNode { policy = 0; priority = 5; permission = 0777; moduleName = "HDF_PLATFORM_FS_LITTLEFS"; serviceName = "littlefs_config"; deviceMatchAttr = "rockchip_rk2206_fs_littlefs"; } }

上述代碼表示建設(shè)一個(gè)設(shè)備驅(qū)動(dòng),該驅(qū)動(dòng)的模塊名稱(chēng)(即moduleName)為“HDF_PLATFORM_FS_LITTLEFS”,OpenHamrony系統(tǒng)依據(jù)該名稱(chēng)匹配驅(qū)動(dòng)程序;設(shè)備匹配信息(即deviceMatchAttr)添加小凌派開(kāi)發(fā)板Flash特殊信息(比如:分區(qū)信息,掛載目錄名、起始地址、結(jié)束地址等)。

1.4、fs_config.hcs

新建//device/soc/rockchip/rk2206/hdf_config/fs/fs_config.hcs文件,該文件主要寫(xiě)清楚設(shè)備掛載信息,具體如下:

root { platform { fs_config { template fs_controller { match_attr = ""; mount_points = []; block_size = []; block_start = []; block_count = []; }

fs_littefs :: fs_controller { match_attr = "rockchip_rk2206_fs_littlefs"; mount_points = ["/data"]; block_size = [4096]; block_start = [1024]; block_count = [256]; } } }}

如上所述,我將LittleFS移植所需的Flash信息分為4個(gè):

(1)mount_points:掛載目錄。

(2)block_size:Flash的擦除塊大小。

(3)block_start:該掛載Flash區(qū)域的起始?jí)K地址,實(shí)際Flash地址為block_size * block_start。

(4)block_count:該掛載Flash區(qū)域的存儲(chǔ)塊總數(shù)。

注意:match_attr所表示的字符串要與device_info.hcs所表示的字符串要一致。

2、hdf驅(qū)動(dòng)

新建//device/soc/rockchip/rk2206/hdf_driver/fs文件夾,文件夾下創(chuàng)建2個(gè)文件,具體如下所示:

2.1、fs_driver.c

2.1.1、添加必要的頭文件

#include#include#include "los_config.h"#include "hdf_log.h"#include "hdf_device_desc.h"#include "device_resource_if.h"#include "osal_mem.h"#include "lfs_api.h"


2.1.2、添加HDF驅(qū)動(dòng)

添加LittleFS匹配的hdf驅(qū)動(dòng),具體代碼如下所示:

static struct HdfDriverEntry g_fsDriverEntry = { .moduleVersion = 1, .moduleName = "HDF_PLATFORM_FS_LITTLEFS", .Bind = fs_driver_bind, .Init = fs_driver_init, .Release = fs_driver_release,};


HDF_INIT(g_fsDriverEntry);

其中,moduleName必須要與device_info.hcs中的moduleName保持一致。


2.1.3、fs_driver_init函數(shù)

fs_driver_init為hdf驅(qū)動(dòng)加載函數(shù)。OpenHarmony啟動(dòng)時(shí),將根據(jù)hcs的編寫(xiě)匹配對(duì)應(yīng)的驅(qū)動(dòng)程序,并運(yùn)行fs_driver_init函數(shù)。該函數(shù)負(fù)責(zé):

(1)讀取hcs文件的配置參數(shù)。

(2)初始化Flash。

(3)適配LittleFS對(duì)應(yīng)的read、write、erase和sync函數(shù),并適配LittleFS相關(guān)參數(shù)。

(4)掛載LittleFS。

具體代碼如下所示:

static int32_t fs_driver_init(struct HdfDeviceObject *device){ int result; int32_t ret; struct FileOpInfo *file_op_info = NULL;

if (device == NULL) { PRINT_ERR("device is null\n"); return HDF_ERR_INVALID_OBJECT; } if (device->property == NULL) { PRINT_ERR("device is null\n"); return HDF_ERR_INVALID_OBJECT; }

/* Flash設(shè)備初始化 */ FlashInit();

/* 讀取hcs參數(shù) */ ret = fs_driver_readdrs(device->property, &m_fs_cfg[0]); if (ret != HDF_SUCCESS) { PRINT_ERR("%s: fs_driver_readdrs failed(%d)\n", ret); return ret; } /* 適配LitteleFS對(duì)應(yīng)的函數(shù)和參數(shù) */ for (int i = 0; i < sizeof(m_fs_cfg) / sizeof(m_fs_cfg[0]); i++) { if (m_fs_cfg[i].mount_point == NULL) { PRINT_LOG("m_fs_cfg[%d].mount_point is null\n", i); continue; }

m_fs_cfg[i].lfs_cfg.read = flash_littlefs_read; m_fs_cfg[i].lfs_cfg.prog = flash_littlefs_write; m_fs_cfg[i].lfs_cfg.erase = flash_littlefs_erase; m_fs_cfg[i].lfs_cfg.sync = flash_littlefs_sync;

m_fs_cfg[i].lfs_cfg.read_size = 4; m_fs_cfg[i].lfs_cfg.prog_size = 4; m_fs_cfg[i].lfs_cfg.cache_size = 256; m_fs_cfg[i].lfs_cfg.lookahead_size = 64; m_fs_cfg[i].lfs_cfg.block_cycles = 1000;

m_fs_cfg[i].lfs_cfg.file_max = LFS_FILE_MAX; m_fs_cfg[i].lfs_cfg.name_max = LFS_NAME_MAX; /* 準(zhǔn)備掛載 */ result = SetDefaultMountPath(i, m_fs_cfg[i].mount_point); if (result != VFS_OK) { PRINT_ERR("SetDefaultMountPath(%d, %d) failed(%d)\n", i, m_fs_cfg[i].mount_point, result); continue; } /* 掛載目錄 */ result = mount(NULL, m_fs_cfg[i].mount_point, "littlefs", 0, &m_fs_cfg[i].lfs_cfg); printf("%s: mount fs on '%s' %s\n", __func__, m_fs_cfg[i].mount_point, (result == 0) ? "succeed" : "failed"); if (CheckPathIsMounted(m_fs_cfg[i].mount_point, &file_op_info) == TRUE) { int lfs_ret = lfs_mkdir(&file_op_info->lfsInfo, m_fs_cfg[i].mount_point); if (lfs_ret == LFS_ERR_OK) { PRINT_LOG("create root dir(%s) success.\n", m_fs_cfg[i].mount_point); } else if (lfs_ret == LFS_ERR_EXIST) { PRINT_LOG("root dir(%s) exist.\n", m_fs_cfg[i].mount_point); } else { PRINT_LOG("create root dir(%s) failed.", m_fs_cfg[i].mount_point); } } } return HDF_SUCCESS;}

2.2、BUILD.gn

BUILD.gn負(fù)責(zé)將fs_driver.c編譯到內(nèi)核中,具體源代碼如下所示:

import("http://drivers/adapter/khdf/liteos_m/hdf.gni")module_switch = defined(LOSCFG_SOC_SERIES_RK22XX) && defined(LOSCFG_DRIVERS_HDF_PLATFORM) && defined(LOSCFG_FS_LITTLEFS)module_name = get_path_info(rebase_path("."), "name")hdf_driver(module_name) { sources = [ "fs_driver.c", ] include_dirs = [ "." ]}

3、測(cè)試程序

我在main函數(shù)中添加一個(gè)任務(wù),負(fù)責(zé)每隔5秒讀寫(xiě)文件。具體代碼如下所示:

/* 文件系統(tǒng)測(cè)試 */

static void file_rw(){ static unsigned int cur = 0; char file_name[] = "/data/a.txt"; int fd_w, fd_r; unsigned char buffer[256];

/* 寫(xiě)操作 */ fd_w = open(file_name, O_WRONLY | O_CREAT); if (fd_w == -1) { printf("write: %s open failed!\n", file_name); return; } memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer), "Hello World and %d\n", cur++); printf("write: %s", buffer); write(fd_w, buffer, strlen(buffer)); close(fd_w);

/* 讀操作 */ fd_r = open(file_name, O_RDONLY); if (fd_r == -1) { printf("read: %s open failed!\n", file_name); return; } lseek(fd_r, 0, SEEK_SET); memset(buffer, 0, sizeof(buffer)); read(fd_r, buffer, sizeof(buffer)); printf("read: %s", buffer); close(fd_r);}

static void IotProcess(void *arg){ static const unsigned int SLEEP_MAXSEC = 5; while (1) { printf("%s: sleep %d sec!\n", __func__, SLEEP_MAXSEC); /* 文件系統(tǒng)測(cè)試 */ file_rw();

LOS_Msleep(SLEEP_MAXSEC * 1000); }}

三、實(shí)驗(yàn)結(jié)果

程序編譯燒寫(xiě)到開(kāi)發(fā)板后,按下開(kāi)發(fā)板的RESET按鍵,通過(guò)串口軟件查看日志如下:

[MAIN:D]Main: OpenHarmony start schedule...

Entering scheduler

IotProcess: sleep 5 sec!

write: Hello World and 0

read: Hello World and 0

IotProcess: sleep 5 sec!

write: Hello World and 1

read: Hello World and 1

IotProcess: sleep 5 sec!

write: Hello World and 2

read: Hello World and 2

......


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

    關(guān)注

    12

    文章

    1956

    瀏覽量

    88552
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【瑞薩FPB-RA6E2試用】SPI通信:W25Q64+LittleFS

    littlefs文件系統(tǒng),實(shí)現(xiàn)通過(guò)文件的形式管理內(nèi)存,不在需要手動(dòng)指定存儲(chǔ)和讀取的位置,同時(shí)littlefs還有擦寫(xiě)平衡的功能。 首先需要下
    發(fā)表于 01-11 22:46

    明晚8點(diǎn)|睿擎文件系統(tǒng)實(shí)戰(zhàn):從開(kāi)發(fā)到發(fā)布全流程解析

    文件操作到鏡像發(fā)布,一次直播掌握完整開(kāi)發(fā)流程!在嵌入式系統(tǒng)開(kāi)發(fā)中,文件系統(tǒng)是數(shù)據(jù)存儲(chǔ)、配置管理和資源訪問(wèn)的核心基礎(chǔ)。然而在實(shí)際開(kāi)發(fā)中,文件操作效率低下、鏡像打包流程復(fù)雜、
    的頭像 發(fā)表于 11-11 11:53 ?646次閱讀
    明晚8點(diǎn)|睿擎<b class='flag-5'>文件系統(tǒng)</b>實(shí)戰(zhàn):從開(kāi)發(fā)到發(fā)布全流程解析

    睿擎派文件系統(tǒng)指南:從開(kāi)發(fā)到發(fā)布全流程實(shí)踐 | 技術(shù)解析

    在嵌入式系統(tǒng)開(kāi)發(fā)中,文件系統(tǒng)扮演著至關(guān)重要的角色,它負(fù)責(zé)數(shù)據(jù)的持久化存儲(chǔ)、配置文件管理和資源訪問(wèn)等核心功能。睿擎平臺(tái)提供了一套完整的文件系統(tǒng)解決方案,從開(kāi)發(fā)階段的API調(diào)用到調(diào)試階段的
    的頭像 發(fā)表于 11-05 18:13 ?8104次閱讀
    睿擎派<b class='flag-5'>文件系統(tǒng)</b>指南:從開(kāi)發(fā)到發(fā)布全流程實(shí)踐 | 技術(shù)解析

    使用ulog 寫(xiě)入日志到文件系統(tǒng),無(wú)法使用cat命令讀取文件內(nèi)容怎么解決?

    1.我使用ulog+littlefs寫(xiě)入日志,日志正常寫(xiě)入,但是沒(méi)法使用cat指令讀取文件內(nèi)容失敗,必須關(guān)掉ulog,才能讀取日志文件顯示的內(nèi)容,發(fā)現(xiàn)上次日志是正常寫(xiě)入的。 2.調(diào)試發(fā)現(xiàn)ulog打開(kāi)
    發(fā)表于 10-13 06:12

    nor掛載一個(gè)littlefs文件系統(tǒng)之后,把裝置斷電重啟,重啟后裝置沒(méi)有運(yùn)行是為什么?

    ;Yaffs2filesystemret=%drn",ret); return 0; } 裝置再main中掛載一個(gè)littlefs文件系統(tǒng),并再這個(gè)文件系統(tǒng)中創(chuàng)建一個(gè)文件
    發(fā)表于 09-18 08:16

    rtt 5.1.0使用最新版的littleFS異常的原因?

    項(xiàng)目中使用文件系統(tǒng)(存儲(chǔ)介質(zhì)是spi nor flash),測(cè)試發(fā)現(xiàn)正在寫(xiě)文件掉電會(huì)導(dǎo)致文件系統(tǒng)破壞,于是將elm(fatfs)換成littleFS,遇到一個(gè)比較奇怪的問(wèn)題就是:如果首
    發(fā)表于 09-10 06:43

    技術(shù)貼|【RK3588】ELF 2開(kāi)發(fā)板如何添加exFAT和NTFS文件系統(tǒng)格式

    如何通過(guò)系統(tǒng)配置實(shí)現(xiàn)對(duì)該兩種文件系統(tǒng)的支持,并配置自動(dòng)掛載功能。Windows系統(tǒng)格式化存儲(chǔ)設(shè)備在使用TF卡前,需通過(guò)Windows自帶工具將其格式化為目標(biāo)
    的頭像 發(fā)表于 08-27 17:21 ?3540次閱讀
    技術(shù)貼|【RK3588】ELF 2開(kāi)發(fā)板如何添加exFAT和NTFS<b class='flag-5'>文件系統(tǒng)</b>格式

    Linux三大主流文件系統(tǒng)解析

    還在為選擇哪個(gè)文件系統(tǒng)而糾結(jié)?作為一名摸爬滾打多年的運(yùn)維老鳥(niǎo),我將用最接地氣的方式,帶你徹底搞懂 Linux 三大主流文件系統(tǒng)的奧秘。
    的頭像 發(fā)表于 08-05 17:37 ?1452次閱讀

    飛凌嵌入式ElfBoard ELF 1板卡-文件系統(tǒng)簡(jiǎn)介

    文件系統(tǒng)Journalling Flash File System Version 2是一個(gè)可讀寫(xiě),壓縮,日志型文件系統(tǒng)。其功能是管理在MTD設(shè)備上實(shí)現(xiàn)的日志型文件系統(tǒng)。啟動(dòng)時(shí)間依賴(lài)于
    發(fā)表于 06-19 17:22

    服務(wù)器數(shù)據(jù)恢復(fù)—ocfs2文件系統(tǒng)被格式化為Ext4文件系統(tǒng)的數(shù)據(jù)恢復(fù)案例

    服務(wù)器存儲(chǔ)數(shù)據(jù)恢復(fù)環(huán)境&故障: 人為誤操作將Ext4文件系統(tǒng)誤裝入一臺(tái)服務(wù)器存儲(chǔ)上的Ocfs2文件系統(tǒng)數(shù)據(jù)卷上,導(dǎo)致原Ocfs2文件系統(tǒng)被格式化為Ext4文件系統(tǒng)。
    的頭像 發(fā)表于 06-10 12:03 ?737次閱讀
    服務(wù)器數(shù)據(jù)恢復(fù)—ocfs2<b class='flag-5'>文件系統(tǒng)</b>被格式化為Ext4<b class='flag-5'>文件系統(tǒng)</b>的數(shù)據(jù)恢復(fù)案例

    迅為RK3568開(kāi)發(fā)板實(shí)操-HDF驅(qū)動(dòng)配置UART-修改HCS配置

    /hdf_config/khdf/device_info/device_info.hcs 文件,device_info.hcs 中添加以下內(nèi)容: 1、device3 :: deviceNode { 2
    發(fā)表于 05-22 11:32

    【北京迅為】iTOP-RK3568開(kāi)發(fā)板鴻蒙OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)實(shí)操-HDF驅(qū)動(dòng)配置UART

    【北京迅為】iTOP-RK3568開(kāi)發(fā)板鴻蒙OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)實(shí)操-HDF驅(qū)動(dòng)配置UART
    的頭像 發(fā)表于 03-25 11:02 ?1735次閱讀
    【北京迅為】iTOP-RK3568開(kāi)發(fā)板鴻蒙<b class='flag-5'>OpenHarmony</b><b class='flag-5'>系統(tǒng)</b>南向<b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)實(shí)操-<b class='flag-5'>HDF</b><b class='flag-5'>驅(qū)動(dòng)</b>配置UART

    如何正確選擇嵌入式文件系統(tǒng)?

    Linux嵌入式系統(tǒng)中,文件系統(tǒng)和緩存機(jī)制常導(dǎo)致數(shù)據(jù)存儲(chǔ)穩(wěn)定性問(wèn)題。本文通過(guò)案例分析原因,對(duì)比不同文件系統(tǒng)特性,為開(kāi)發(fā)者提供優(yōu)化建議,助力提升數(shù)據(jù)穩(wěn)定性和系統(tǒng)可靠性。前言基于Linux
    的頭像 發(fā)表于 03-17 11:35 ?1111次閱讀
    如何正確選擇嵌入式<b class='flag-5'>文件系統(tǒng)</b>?

    北京迅為iTOP-RK3568開(kāi)發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)實(shí)操-HDF驅(qū)動(dòng)配置LED

    北京迅為iTOP-RK3568開(kāi)發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)實(shí)操-HDF驅(qū)動(dòng)配置LED
    的頭像 發(fā)表于 03-14 14:41 ?1362次閱讀
    北京迅為iTOP-RK3568開(kāi)發(fā)板<b class='flag-5'>OpenHarmony</b><b class='flag-5'>系統(tǒng)</b>南向<b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)實(shí)操-<b class='flag-5'>HDF</b><b class='flag-5'>驅(qū)動(dòng)</b>配置LED

    北京迅為RK3568開(kāi)發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)內(nèi)核HDF驅(qū)動(dòng)框架架構(gòu)

    北京迅為RK3568開(kāi)發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)內(nèi)核HDF驅(qū)動(dòng)框架架構(gòu)
    的頭像 發(fā)表于 03-11 14:13 ?1863次閱讀
    北京迅為RK3568開(kāi)發(fā)板<b class='flag-5'>OpenHarmony</b><b class='flag-5'>系統(tǒng)</b>南向<b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)內(nèi)核<b class='flag-5'>HDF</b><b class='flag-5'>驅(qū)動(dòng)</b>框架架構(gòu)