0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于OpenHarmony标准接口的文件读写实现案例

福州市凌睿智捷电子有限公司 2022-09-15 10:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、简介

嵌入式领域,FLASH是一种常用的存储设备,Flash闪存作为嵌入式系统的主要存储设备有其自身的特性。Fash的写入操作只能把对应位置的1修改成0,而不能把0修改为1,而擦除Fash就是把对应存储块的内容恢复为1。因此,一般情况下向Fash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(Bock)为单位进行的。闪存主要有NOR和NAND两种技术。因为Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序,于是就出现了专门针对FLASH的文件系统。比较常用的有jffs2,yaffs2,logfs,ubifs。本文基于小凌派-RK2206开发板 + OpenHarmony轻量级操作系统 + LitteFS文件系统,通过hal_file标准接口实现对Flash读写功能。

二、hal_file标准接口

头文件://utils/native/lite/hals/file/hal_file.h

1、HalFileOpen()

打开/创建文件,类似于Linux的open函数。

int HalFileOpen(const char *path, int oflag, int mode);

参数说明:

名字

描述

path

文件路径

oflag

参考///utils/native/lite/include/utils_file.hO_RDONLY_FS:只读O_WRONLY_FS:只写O_RDWR_FS:读写O_CREAT_FS:如果没有则创建O_EXCL_FS:如果没有则创建;如有则不能打开O_TRUNC_FS:如果文件存在,则清空文件内容O_APPEND_FS:如果文件存在,则标记位置移动到文件最后

mode

0

返回值为LOS_OK表示成功,其余为失败。

2、HalFileClose()

关闭文件,类似于Linux的close函数。

int HalFileClose(int fd);

参数说明:

名字

描述

fd

文件句柄

返回值为LOS_OK表示成功,其余为失败。

3、HalFileRead()

从文件中读取一段内容,类似于Linux的read函数。

int HalFileRead(int fd, char* buf, unsigned int len);

参数说明:

名字

描述

fd

文件句柄

buf

从文件读取内容的缓冲区

len

从文件读取内容的大小

返回值为从文件读取内容的大小,0或者小于0则为失败。

4、HalFileWrite()

往文件写入一段内容,类似于Linux的write函数。

int HalFileWrite(int fd, const char* buf, unsigned int len);

参数说明:

名字

描述

fd

文件句柄

buf

需要写入到文件的内容缓冲区

len

需要写入到文件的内容大小

返回值为成功写入到文件的内容大小,0或者小于0则为失败。

5、HalFileDelete()

删除文件,类似于Linux的unlink函数。

int HalFileDelete(const char* path);

参数说明:

名字

描述

path

文件路径

返回值为LOS_OK为成功,其余则为失败。

6、HalFileStat()

获取文件大小,类似于Linux的stat函数。

int HalFileStat(const char* path, unsigned int* fileSize);

参数说明:

名字

描述

path

文件路径

fileSize

文件内容大小

返回值为LOS_OK为成功,其余则为失败。

7、HalFileSeek()

文件所在位置移动,类似于Linux的lseek函数。

int HalFileSeek(int fd, int offset, unsigned int whence);

参数说明:

名字

描述

fd

文件句柄

offset

文件位置移动位数

whence

SEEK_SET_FS:从文件开头移动

SEEK_CUR_FS:从文件当前位置移动

SEEK_END_FS:从文件结尾移动

返回值为LOS_OK为成功,其余则为失败。

三、程序设计

本例程演示如何在小凌派-RK2206开发板上使用鸿蒙LiteOS-M内核接口,进行文件读写开发。例程流程如下所示:

(1)创建一个文件;

(2)每5秒进行1次文件读写操作;

(3)文件标识移动到文件起始处,读文件内容,并打印;

(4)文件标识移动到文件起始处,写文件内容;

(5)循环上述的第2~4步骤。

1、任务创建代码分析

在file_example函数中通过LOS_TaskCreate函数创建一个线程:hal_file_thread。

void file_example()
{
    unsigned int thread_id;
    TSK_INIT_PARAM_S task = {0};
    unsigned int ret = LOS_OK;

    task.pfnTaskEntry = (TSK_ENTRY_FUNC)hal_file_thread;
    task.uwStackSize = 1024 * 10;
    task.pcName = "hal_file_thread";
    task.usTaskPrio = 25;
    ret = LOS_TaskCreate(&thread_id, &task);
    if (ret != LOS_OK)
    {
        printf("Falied to create hal_file_thread ret:0x%x\n", ret);
        return;
    }
}

APP_FEATURE_INIT(file_example);

2. 文件读写代码分析

hal_file_thread函数负责打开文件,每5秒移动到文件头读取数据,再移动到文件头写入一段内容,重复以上流程。

void hal_file_thread()
{
    int fd;
    char buffer[1024];
    int read_length, write_length;
    int current = 0;

    /* 打开文件,如果没有该文件就创建,如有该文件则打开
     * O_TRUNC_FS => 清空文件内容
     */
    //fd = HalFileOpen(FILE_NAME, O_RDWR_FS | O_CREAT_FS, 0);
    fd = HalFileOpen(FILE_NAME, O_RDWR_FS | O_CREAT_FS | O_TRUNC_FS, 0);
    if (fd == -1)
    {
        printf("%s HalFileOpen failed!\n", FILE_NAME);
        return;
    }

    while (1)
    {
        /* 文件位置移动到文件开始位置 */
        HalFileSeek(fd, 0, SEEK_SET);
        memset(buffer, 0, sizeof(buffer));
        /* 读取文件内容 */
        read_length = HalFileRead(fd, buffer, sizeof(buffer));
        printf("read: \n");
        printf("    length = %d\n", read_length);
        printf("    content = %s\n", buffer);

        /* 文件位置移动到文件开始位置 */
        HalFileSeek(fd, 0, SEEK_SET);
        memset(buffer, 0, sizeof(buffer));
        snprintf(buffer, sizeof(buffer), "Hello World(%d) => ", current);
        /* 写入文件 */
        write_length = HalFileWrite(fd, buffer, strlen(buffer));

        current++;
        LOS_Msleep(5000);
    }

    HalFileClose(fd);
}

四、编译过程

1、搭建和下载源代码

我已将OpenHarmony源代码上传到Gitee社区中,大家可以根据以下网址下载。

https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts

注意:编译环境可根据以下网址来操作:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/vendor/lockzhiner/rk2206/README_zh.md

2、修改编译脚本

修改vendor/lockzhiner/rk2206/sample路径下 BUILD.gn 文件,指定 a7_hal_file参与编译。

"./a7_hal_file:hal_file_example",

修改 device/lockzhiner/rk2206/sdk_liteos路径下 Makefile 文件,添加 -lhal_file_example参与编译。

apps_LIBS = -lhal_file_example

3、编译固件

hb set -root .

hb set

hb build -f

4、烧写固件

请参考Gitee网址的说明手册(“烧录打印”章节):https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/device/rockchip/README_zh.md

五、实验结果

程序编译烧写到开发板后,按下开发板的RESET按键,通过串口软件查看日志如下:

HalFileInit: Flash Init Successful!

read:

length = 0

content =

read:

length = 18

content = Hello World(0) =>

read:

length = 18

content = Hello World(1) =>

好了,今天的课程就到这里,我们下次再见!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • OpenHarmony
    +关注

    关注

    31

    文章

    3926

    浏览量

    20725
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用AXI4接口IP核进行DDR读写测试

    本章的实验任务是在 PL 端自定义一个 AXI4 接口的 IP 核,通过 AXI_HP 接口对 PS 端 DDR3 进行读写测试,读写的内存大小是 4K 字节。
    的头像 发表于 11-24 09:19 2848次阅读
    使用AXI4<b class='flag-5'>接口</b>IP核进行DDR<b class='flag-5'>读写</b>测试

    飞凌嵌入式ElfBoard-系统应用编程之文件I/O

    的输入输出方法,即通过内核提供的系统调用函数来实现I/O操作,可以操作普通文件和驱动文件。1.1.2 标准IO标准IO带有缓冲机制,是由
    发表于 10-24 08:57

    DMA硬件实现——读写实现

    址寄存器、长度寄存器回到初始状态0,状态寄存器回到初始状态111。 此外,由于这里一次进行16个数据的读写,需要一个fifo模块存放数据。这里例化了fifo。下一小部分具体阐述fifo的实现
    发表于 10-24 07:58

    如何利用Verilog HDL在FPGA上实现SRAM的读写测试

    本篇将详细介绍如何利用Verilog HDL在FPGA上实现SRAM的读写测试。SRAM是一种非易失性存储器,具有高速读取和写入的特点。在FPGA中实现SRAM读写测试,包括设计SRA
    的头像 发表于 10-22 17:21 3966次阅读
    如何利用Verilog HDL在FPGA上<b class='flag-5'>实现</b>SRAM的<b class='flag-5'>读写</b>测试

    双UFS4.1 4Lane,速度可达8.6GB/s,大型文件读写速率提升达70%+

    /s。vivo从以往的1个UFS4.1双通道读写升级为2个UFS 4.1四通道并行协作,真正的双UFS4.1 4-Lane,大型文件读写速率提升达到70%+,最高读写速度可达到惊人的8
    的头像 发表于 09-26 07:32 5563次阅读

    求助各位大佬,关于如何读写编码格式为UTF-16LE的配置文件

    如题,小白求助各位大佬,要怎么实现对编码为UTF-16LE的配置文件读写。 使用读配置文件的vi读不出内容。 使用读文本的方式写入异常,文件
    发表于 09-14 12:54

    贡献 OpenHarmony 库关键配置

    Native API对外暴露的接口 │││└─liblibrary │││├─index.d.ts │││└─oh-package.json5 ││├─CMakeLists.txt// CMake配置文件
    发表于 05-28 13:46

    PCB标准封装库文件

    PCB标准封装库文件
    发表于 05-22 17:43 9次下载

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制FLASH外设

    1、实验简介 本实验将演示如何在小凌派-RK2206开发板上使用IOT库的FLASH接口,进行FLASH编程开发。 例程将创建一个任务,实现FLASH读写操作。 例程源代码:https
    发表于 04-22 15:02

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制FLASH外设

    1、实验简介本实验将演示如何在小凌派-RK2206开发板上使用IOT库的FLASH接口,进行FLASH编程开发。例程将创建一个任务,实现FLASH读写操作。例程源代码:https
    的头像 发表于 04-22 14:49 694次阅读
    基于小凌派RK2206开发板:<b class='flag-5'>OpenHarmony</b>如何使用IoT<b class='flag-5'>接口</b>控制FLASH外设

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制UART外设

    1、实验简介本实验将演示如何在小凌派-RK2206开发板上使用IOT库的UART接口,进行UART编程开发。例程将创建一个任务,通过配置UART引脚,实现UART读写操作。例程源代码:https
    的头像 发表于 04-22 14:22 802次阅读
    基于小凌派RK2206开发板:<b class='flag-5'>OpenHarmony</b>如何使用IoT<b class='flag-5'>接口</b>控制UART外设

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制GPIO外设

    1、案例简介本案例主要是如何在小凌派-RK2206开发板上使用IOT库的GPIO接口,进行GPIO编程开发。例程将创建一个任务,通过配置GPIO引脚,实现GPIO读写操作。例程源代码:https
    的头像 发表于 04-11 15:36 1621次阅读
    基于小凌派RK2206开发板:<b class='flag-5'>OpenHarmony</b>如何使用IoT<b class='flag-5'>接口</b>控制GPIO外设

    鸿蒙文件传输三方库上线开源鸿蒙社区 十行代码实现文件高速传输

    近日,华为在OpenHarmony社区上线了“super_fast_file_trans”文件传输三方库(以下简称“SFFT”)。这一三方库的推出,为开发者提供了一套支持大文件多线程并发分块下载
    发表于 03-06 10:29

    基于OpenHarmony标准系统的C++公共基础类库案例:ThreadPoll

    。每个线程每秒打印1段字符串,10秒后停止。2、基础知识C++公共基础类库为标准系统提供了一些常用的C++开发工具类,包括:文件、路径、字符串相关操作的能力增强接口
    的头像 发表于 02-10 18:09 602次阅读
    基于<b class='flag-5'>OpenHarmony</b><b class='flag-5'>标准</b>系统的C++公共基础类库案例:ThreadPoll

    扬杰科技USB PD快速充电标准的ESD EOS保护方案

    电子设备的标准接口,推动了C口的普及。通过USB Type-C除了读写文件资料,还能支持DisplayPort、HMDI等视频信号传输,并支持USB Power Delivery(USB-PD),从而提
    的头像 发表于 01-05 10:05 2343次阅读
    扬杰科技USB PD快速充电<b class='flag-5'>标准</b>的ESD EOS保护方案