移植案例与原理 - utils子系统之file文件操作部件

news2024/9/25 15:26:39

往期知识点记录:

往期知识点记录:

  • 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
  • startup子系统之syspara_lite系统属性部件 (1)
  • startup子系统之syspara_lite系统属性部件 (2)
  • startup子系统之bootstrap_lite服务启动引导部件(1)
  • startup子系统之bootstrap_lite部件 (2)
  • utils子系统之file文件操作部件
  • utils子系统之KV存储部件 (1)
  • utils子系统之KV存储部件 (2)
  • utils子系统之KV存储部件 (3)
  • build lite配置目录全梳理
  • build lite编译构建过程
  • XTS子系统之应用兼容性测试用例开发
  • XTS子系统之应用兼容性测试套件(1)
  • XTS子系统之应用兼容性测试套件(2)
  • HPM包描述文件bundle.json
  • build lite源码分析 之 hb命令__main__.py
  • 持续更新中……

Utils子系统是OpenHarmony的公共基础库,存放OpenHarmony通用的基础组件。这些基础组件可被OpenHarmony各业务子系统及上层应用所使用。公共基础库在不同平台上提供的能力:

  • LiteOS-M内核:KV(key value)存储、文件操作、定时器、Dump系统属性。
  • LiteOS-A内核:KV(key value)存储、定时器、JS API(设备查询,数据存储)、Dump系统属性。

本文介绍下移植开发板时如何适配utils子系统之file文件操作部件,并介绍下相关的运行机制原理。系统属性部件syspara_lite包含系统参数特性syspara_lite和token。file文件操作部件定义在utils\native\lite\。源代码目录如下:

utils/native/lite/              # 公共基础库根目录
├── file                        # 文件接口实现
├── hals                        # HAL目录
│   └── file                    # 文件操作硬件抽象层头文件
├── include                     # 公共基础库对外接口文件
├── js                          # JS API目录                 
│   └── builtin
│       ├── common
│       ├── deviceinfokit       # 设备信息Kit
│       ├── filekit             # 文件Kit
│       └── kvstorekit          # KV存储Kit
├── kal                         # KAL目录
│   └── timer                   # Timer的KAL实现
├── kv_store	                # KV存储实现
│   ├── innerkits               # KV存储内部接口
│   └── src	                    # KV存储源文件
├── memory
│   └── include                 # 内存池管理接口
├── os_dump                     # Dump系统属性
└── timer_task                  # Timer实现

1、file文件操作部件适配示例

1.1 配置产品解决方案config.json

utils子系统之file文件操作部件的适配示例可以参考vendor\ohemu\qemu_csky_mini_system_demo\config.json,代码片段如下。⑴处用于配置子系统的file部件。⑵处指定在开发板目录中适配目录,这个适配目录下需要创建目录device\qemu\SmartL_E802\adapter\hals\utils\file\。为什么配置这个目录,后文会解析。

      {
        "subsystem": "utils",
        "components": [
⑴        { "component": "file", "features":[] },
          { "component": "kv_store", "features":[] }
        ]
      }
    ],
⑵   "vendor_adapter_dir": "//device/qemu/SmartL_E802/adapter",

1.2 适配hal_file.h文件中的接口

在文件utils\native\lite\hals\file\hal_file.h头文件中,定义了文件操作接口,适配开发板时,如果需要使用utils子系统之file文件操作部件,就要适配这些接口。需要适配的接口如下。HalFileOpen()函数返回值是文件描述符fd,可以被其他带int fd参数的函数使用。

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

int HalFileClose(int fd);

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

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

int HalFileDelete(const char* path);

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

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

文件device\qemu\SmartL_E802\adapter\hals\utils\file\src\hal_file.c可以作为参考示例,演示如何适配上述接口。⑴处的HalFileOpen()函数中,先组装文件路径,"/littlefs"是SmartL_E802开发板设置的LFS文件默认挂载点,关于LFS的适配请参考device\qemu\SmartL_E802\liteos_m\board\fs\fs_init.c。HalFileXXX函数调用的open、close、read、write、unlink、stat、lseek等函数定义在kernel\liteos_m\kal\libc\musl\fs.c或kernel\liteos_m\kal\libc\newlib\porting\src\fs.c,这个取决于使用的是musl C库还是newlib C库。文件系统接口调用链如下所示:UtilsFileXXX(utils\native\lite\file\src\file_impl_hal\file.c)-> HalFileXXXX(device\qemu\SmartL_E802\adapter\hals\utils\file\src\hal_file.c) -> open/read/write/…(kernel\liteos_m\kal\libc\musl\fs.c或kernel\liteos_m\kal\libc\newlib\porting\src\fs.c) -> LOS_XXXX(kernel\liteos_m\components\fs\vfs\los_fs.c) -> Lfs_XXXX(kernel\liteos_m\components\fs\littlefs\lfs_api.c) -> lfs_file_XXX (third_party\littlefs\lfs.c) -> Littlefs*(device\qemu\SmartL_E802\liteos_m\board\fs\littlefs_hal.c)。

  int HalFileOpen(const char* path, int oflag, int mode)
  {
      char tmpPath[LITTLEFS_MAX_LFN_LEN] = {0};
⑴    (void)snprintf_s(tmpPath, LITTLEFS_MAX_LFN_LEN, LITTLEFS_MAX_LFN_LEN, "/littlefs/%s", path);
      return open(tmpPath, oflag, mode);
  }

  int HalFileClose(int fd)
  {
      return close(fd);
  }

  int HalFileRead(int fd, char *buf, unsigned int len)
  {
      return read(fd, buf, len);
  }

  int HalFileWrite(int fd, const char *buf, unsigned int len)
  {
      return write(fd, buf, len);
  }

  int HalFileDelete(const char *path)
  {
      char tmpPath[LITTLEFS_MAX_LFN_LEN] = {0};
      (void)snprintf_s(tmpPath, LITTLEFS_MAX_LFN_LEN, LITTLEFS_MAX_LFN_LEN, "/littlefs/%s", path);
      return unlink(path);
  }

  int HalFileStat(const char *path, unsigned int *fileSize)
  {
      char tmpPath[LITTLEFS_MAX_LFN_LEN] = {0};
      struct stat halStat ;
      int ret = 0;
      (void)snprintf_s(tmpPath, LITTLEFS_MAX_LFN_LEN, LITTLEFS_MAX_LFN_LEN, "/littlefs/%s", path);
      ret = stat(tmpPath, &halStat);
      *fileSize = halStat.st_size;
      return ret;
  }

  int HalFileSeek(int fd, int offset, unsigned int whence)
  {
      return lseek(fd, (off_t)offset, whence);
  }

2、file文件操作部件代码分析

2.1 部件的头文件

上文已经知道,file文件操作部件代码的头文件为utils\native\lite\include\utils_file.h,用户程序可以使用该头文件中定义的接口。

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

int UtilsFileClose(int fd);

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

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

int UtilsFileDelete(const char* path);

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

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

int UtilsFileCopy(const char* src, const char* dest);

int UtilsFileMove(const char* src, const char* dest);

头文件utils\native\lite\hals\file\hal_file.h中定义的接口,需要移植适配时提供实现,具体接口见上文。

2.2 部件的源代码文件

文件utils\native\lite\file\src\file_impl_hal\file.c中实现了UtilsFileXXX接口,代码比较简单,调用需要开发板移植适配的HalFileXXX接口。

int UtilsFileOpen(const char* path, int oflag, int mode)
{
    return HalFileOpen(path, oflag, mode);
}

int UtilsFileClose(int fd)
{
    return HalFileClose(fd);
}

int UtilsFileRead(int fd, char* buf, unsigned int len)
{
    return HalFileRead(fd, buf, len);
}

int UtilsFileWrite(int fd, const char* buf, unsigned int len)
{
    return HalFileWrite(fd, buf, len);
}

int UtilsFileDelete(const char* path)
{
    return HalFileDelete(path);
}

int UtilsFileStat(const char* path, unsigned int* fileSize)
{
    return HalFileStat(path, fileSize);
}

int UtilsFileSeek(int fd, int offset, unsigned int whence)
{
    return HalFileSeek(fd, offset, whence);
}

int UtilsFileCopy(const char* src, const char* dest)
{
    if ((src == NULL) || (dest == NULL)) {
        return EC_FAILURE;
    }
    int fpSrc = UtilsFileOpen(src, O_RDONLY_FS, 0);
    if (fpSrc < 0) {
        return fpSrc;
    }
    int fpDest = UtilsFileOpen(dest, O_RDWR_FS | O_CREAT_FS | O_TRUNC_FS, 0);
    if (fpDest < 0) {
        UtilsFileClose(fpSrc);
        return fpDest;
    }
    bool copyFailed = true;
    char* dataBuf = (char *)malloc(BUFFER_SIZE);
    if (dataBuf == NULL) {
        goto MALLOC_ERROR;
    }
    int nLen = UtilsFileRead(fpSrc, dataBuf, BUFFER_SIZE);
    while (nLen > 0) {
        if (UtilsFileWrite(fpDest, dataBuf, nLen) != nLen) {
            goto EXIT;
        }
        nLen = UtilsFileRead(fpSrc, dataBuf, BUFFER_SIZE);
    }
    copyFailed = (nLen < 0);

EXIT:
    free(dataBuf);
MALLOC_ERROR:
    UtilsFileClose(fpSrc);
    UtilsFileClose(fpDest);
    if (copyFailed) {
        UtilsFileDelete(dest);
        return EC_FAILURE;
    }
    return EC_SUCCESS;
}

int UtilsFileMove(const char* src, const char* dest)
{
    int ret = UtilsFileCopy(src, dest);
    if (ret == EC_SUCCESS) {
        ret = UtilsFileDelete(src);
    }
    return ret;
}

2.3 部件的编译构建

编译构建配置文件utils\native\lite\file\BUILD.gn代码如下,⑴处的配置项ohos_board_adapter_dir为产品解决方案配置文件config.json中定义的开发板适配目录。可以看出来:

  • 开发板适配目录必须包含目录hals/utils/file
  • 目录hals/utils/file同级的BUILD.gn文件中,构建目标必须为hal_file_static。不能随意命名。
  import("//build/lite/config/component/lite_component.gni")

  static_library("native_file") {
    sources = [ "src/file_impl_hal/file.c" ]
    include_dirs = [
      "//utils/native/lite/include",
      "//utils/native/lite/hals/file",
    ]
⑴  deps = [ "$ohos_board_adapter_dir/hals/utils/file:hal_file_static" ]
  }

  lite_component("file") {
    features = [ ":native_file" ]
  }

小结

本文介绍了utils子系统之file文件操作部件的移植适配案例,分析了部件源代码。

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

在这里插入图片描述

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

在这里插入图片描述

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN/733GH/overview

在这里插入图片描述

OpenHarmony 开发环境搭建

图片

《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN/733GH/overview

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2126143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于ssm+vue+uniapp的电影交流平台小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

海康IPC摄像头通过国标28181方式接入带域名的视频监控接入平台,视频通道无法上传到视频监控平台,导致无法获取视频资源的问题解决

目录 一、问题背景 二、域名介绍 1、域名详解 2、域名与IP的区别 三、解决过程 1、检查设备能力 2、升级摄像头的版本 3、通过域名进行连接 4、在视频监控平台观察接入情况 四、解决结果 一、问题背景 视频监控接入平台部署在内网环境&#xff0c;摄像头在公网或在另一个局…

【Linux C | 终端设备】Linux下 tty、ttyS*、ttyAMA*、console 的区别,以及系统输出重定向(附带代码)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-09-11 …

QT实现TCP/UDP通信

服务器端&#xff1a; 客户端&#xff1a; 服务器&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug&…

哈喽GPT-4o,现代程序员提高编码能力的正确打开方式

目录 round 1&#xff1a;图片识别能力ChatGPT4oClaude3.5 Sonnet图片识别能力小结&#xff1a;图片识别能力&#xff0c;ChatGPT4o完胜。 round 2&#xff1a;代码能力ChatGPT4oClaude3.5 Sonnet代码能力小结&#xff1a;代码能力&#xff0c;Claude3.5 Sonnet小胜。 round 3&…

一个人,如何管理上百个污水处理站?

管理上百个污水处理站&#xff0c;无疑是一项复杂而艰巨的任务&#xff0c;它不仅要求管理者具备深厚的专业知识、卓越的组织协调能力&#xff0c;还依赖于先进的技术支持与科学的管理模式。以下几点策略&#xff0c;可为高效管理众多污水处理站提供参考框架&#xff1a; 1. 部…

Unity+LeapMotion2的使用

开始吧 导入步骤1.到官网下载软件并安装2.安装插件3.场景中添加检测管理器4.场景中添加手部模型 更多细节 导入步骤 1.到官网下载软件并安装 地址 重启电脑后连接设备 可以看到连接成功 2.安装插件 &#xff08;也可以看官方教程&#xff09; Project—>PackageManag…

9.9日记录

1.常见排序算法的复杂度 1.快速排序 1.1快速排序为什么快 从名称上就能看出&#xff0c;快速排序在效率方面应该具有一定的优势。尽管快速排序的平均时间复杂度与“归并排序”和“堆排序”相同&#xff0c;但通常快速排序的效率更高&#xff0c;主要有以下原因。 出现最差情况…

DC 板 boot 测 nor 兼容性记录(qspi )

DC 板 boot 测 nor 兼容性记录&#xff08;qspi &#xff09; 软件问题&#xff1a; 1、DC板在跑 qspi时&#xff0c;在跑ddr 初始化部分需要修改以下参数&#xff0c;否则会在fsbl stage1 或者 stage 3 出错。 Board配置选 ad101_v10&#xff1b; 2、由于socket与DC板接触可能…

22. Revit API: 几何对象(三)- Solid操作

一、前言 几何对象中&#xff0c;Face就先跳过了&#xff0c;这里讲讲如何使用 Revit API 中 Solid 操作相关类。 使用SolidUtils&#xff0c;主要是复制和移动。使用GeometryCreationUtilities&#xff0c;生成Solid。使用SolidSolidCutUtils和BooleanOperationsUtils&#…

Python 从入门到实战14(字符串相关操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了字符串进行简单说明。今天继续讨论字符…

斗地主之顺子

题目描述 在斗地主扑克牌游戏中&#xff0c;扑克牌由小到大的顺序为:3,4,5.6,7.8,9,10,J,Q,K,A,2&#xff0c;玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。 其中顺子的出牌规则为:由至少5张由小到大连续递增的扑克牌组成&#xff0c;且不能包含2。 例如:(3.4.…

【Windows系统工具】dll综合解决工具,解锁专业版功能!

电脑上经常会出现dll文件丢失的情况&#xff0c;那么面对这种情况&#xff0c;小白用户应该如何应对并且解决呢&#xff1f; 这时&#xff0c;不得不提出dll综合解决工具的重要性了。虽然电脑上有很多自带的工具可以使用&#xff0c;但是方法步骤都比较复杂&#xff0c;很多小白…

day4 QT

作业 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speech(new QTextToSpeech) {ui->setupUi(this);id startTimer(1000); }Widget::~Widget() {delete ui; }void Widget::tim…

从C语言过渡到C++

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;C &#x1f3c5;往期回顾&#x1f3c6;&#xff1a;单链表实现&#xff1a;从理论到代码-CSDN博客&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱的博客-CSDN博客 目录 ​…

常用的 CMD 指令及其功能

目录 1&#xff1a;Win R命令。 2&#xff1a;cmd命令。 3&#xff1a;盘符名: 命令。 4: mkdir命令。 5&#xff1a;dir命令。 6: dir 名称。 7&#xff1a;Tab。 8&#xff1a;cd name。 9: copy con 文件的名字。 10: type 文件名。 11: cd .. 命令。 12&a…

分享 6 款在日常电脑办公中频繁使用的软件

分享6款经常能用到的电脑办公软件&#xff0c;个个功能强大又易用&#xff0c;装进电脑可以提高工作效率&#xff0c;让你每天准点下班~ 1、Dropit 这个软件真的很给力&#xff0c;特别适合我们这种平时电脑桌面上乱七八糟的人。你知道的&#xff0c;有时候下载各种东西&…

自然语言处理系列六十八》搜索引擎项目实战》搜索引擎系统架构设计

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十八搜索引擎项目实战》搜索引擎系统架构设计…

【人工智能】Transformers之Pipeline(十七):文本分类(text-classification)

目录 一、引言 二、文本分类&#xff08;text-classification&#xff09; 2.1 概述 2.2 DistilBERT—BERT 的精简版&#xff1a;更小、更快、更便宜、更轻便 2.3 应用场景​​​​​​​ 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 …

布偶猫应该喂什么猫罐头:交响乐金罐、希喂、尾巴生活测评

布偶猫&#xff0c;萌宠界的甜心代表&#xff0c;爱撒娇又黏人。想让它健康成长&#xff1f;喂养是关键。选粮不当&#xff0c;健康受损。今日精选三款热门主食罐&#xff0c;依据布偶猫营养需求&#xff0c;直接评测&#xff0c;助你快速了解何为理想之选。无需繁琐&#xff0…