鸿蒙OpenHarmony【轻量系统芯片移植】内核移植

移植芯片架构

芯片架构的移植是内核移植的基础,在OpenHarmony中芯片架构移植是可选过程,如果当前OpenHarmony已经支持对应芯片架构则不需要移植操作,在“liteos_m/arch”目录下可看到当前已经支持的架构,如表1:

表1 OpenHarmony已支持的架构

系列型号
armarm9 cortex-m3 cortex-m4 cortex-m7 cortex-m33
cskyv2
risc-vnuclei riscv32
xtensalx6

如果当前OpenHarmony尚未支持对应芯片架构,则需要芯片厂商自行适配,arch/include目录包含了通用的芯片架构适配所需要实现的函数。部分芯片架构代码由汇编实现,而汇编代码会因编译器的不同而不同,因此在具体的芯片架构下,还包含使用不同编译器(iar、keil、gcc等)编译的架构代码。

kernel/liteos_m/arch          # 不同版本路径有差异
├── arm                       # arm系列
│   ├── arm9
│   ├── cortex-m3
│   ├── cortex-m33
│   │   ├── gcc               # 使用gcc编译器编译的架构代码
│   │   └── iar               # 使用iar编译器编译的架构代码
│   ├── cortex-m4
│   ├── cortex-m7
├── csky                      # csky系列
├── include                   # 包含通用的芯片架构所需要实现的函数
│   ├── los_arch.h            # 定义芯片架构初始化所需要的函数
│   ├── los_atomic.h          # 定义芯片架构所需要实现的原子操作函数
│   ├── los_context.h         # 定义芯片架构所需要实现的任务上下文相关函数
│   ├── los_interrupt.h       # 定义芯片架构所需要实现的中断和异常相关的函数
│   └── los_timer.h           # 定义芯片架构所需要实现的系统时钟相关的函数
├── risc-v                    # risc-v系列
│   ├── nuclei
│   └── riscv32
└── xtensa                    # xtensa系列└── lx6

移植芯片厂商SDK

编译框架搭建完成后,需要将芯片厂商的SDK加入OpenHarmony编译框架,从而可以编译出带SDK的烧录文件(此时编译出的是不带系统的裸机工程),以便OpenHarmony可以调用SDK中的接口。通过以下步骤将厂商SDK加入OpenHarmony编译框架中:

  1. 将芯片厂商sdk置于device目录下合适的位置,SDK的编译脚本/镜像打包脚本整合进编译框架中。 参考编译脚本:“device/MyDeviceCompany/MyBoard/BUILD.gn”

    import("//build/lite/config/component/lite_component.gni")executable("OHOS_Image.elf") {    # 生成可执行程序libs = ["xxx/xxx/libxxx.a",           # 链接厂商闭源静态库方法一]asmflags = [                    # 汇编编译参数"",]ldflags = ["-T./xxx/xxx/xxx.ld",         # 链接脚本文件"-Lxxx/xxx/",                 # 指定厂商静态库路径"-lxxx",                      # 链接厂商闭源静态库方法二"-Wl,--whole-archive","-lmodule_xxx","-Wl,--no-whole-archive",]deps = ["//build/lite:ohos",          # 依赖OpenHarmony静态库编译完成,链接OpenHarmony编译出来的静态库":sdk",                       # 依赖厂商源码静态库编译完成,链接厂商源码生成的静态库]
    }copy("prebuilt") {                # 准备镜像生成工具等,一般把镜像生成工具拷贝到out目录sources = [ ]                   # 复制的源文件outputs = [ ]                   # 复制的目标文件
    }
    static_library("sdk") {sources = [ ]                   # 添加厂商源码编译成静态库include_dirs = [ ]              # 厂商源码包含头文件路径
    }
    build_ext_component("image") {    # 调用shell命令,生成可烧写镜像文件                             exec_path = rebase_path(root_out_dir)   #指定shell命令执行目录objcopy = "arm-none-eabi-objcopy"objdump = "arm-none-eabi-objdump"command = "$objcopy -O binary OHOS_Image.elf OHOS_Image.bin" command += " && sh -c '$objdump -t OHOS_Image.elf | sort > OHOS_Image.sym.sorted'" command += " && sh -c '$objdump -d OHOS_Image.elf > OHOS_Image.asm'"                  deps = [":prebuilt",                  # 无需准备镜像生成工具等可以删除此依赖":OHOS_Image.elf",            # 依赖elf文件的生成]
    }
    group("MyBoard") {                # MyBoard与当前路径名称一致
    }
    

    图1 目标的依赖执行顺序 1

  2. 自定义芯片厂“target_config.h”文件。 厂商应在“device/MyDeviceCompany/MyBoard”下合适位置创建内核配置文件“target_config.h”,并根据芯片的硬件资源修改参数(具体参数介绍详见表2target_config.h文件主要配置项)。

    参考文件路径:“device/hisilicon/hispark_pegasus/sdk_liteos/platform/os/Huawei_LiteOS/targets/hi3861v100/include/target_config.h”

    说明:

    1. 若已有的配置项不能满足需求,可查看“kernel/liteos_m/kernel/include/los_config.h”,其为liteos_m内核的全量配置文件。
    2. “target_config.h”文件中出现的配置将会覆盖“los_config.h”中的配置。

    表2 target_config.h文件主要配置项

    配置项说明参考值
    OS_SYS_CLOCK系统时钟。40000000UL
    LOSCFG_BASE_CORE_TICK_PER_SECOND操作系统节拍的时钟周期。100UL
    LOSCFG_BASE_CORE_TICK_HW_TIME定时器裁剪的外部配置项。YES
    LOSCFG_PLATFORM_HWI是否采用接管中断的方式。YES
    LOSCFG_BASE_CORE_TSK_LIMIT支持的最大任务个数(除去空闲任务)。32
    LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE空闲任务的堆栈大小。0x180UL
    LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE指定默认的任务栈大小,任务栈的大小按 8 字节大小对齐。0x1000UL
    LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE表示任务最小需要的堆栈大小。ALIGN(0x180, 4)
    LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT具有相同优先级任务的最长执行时间。2
    LOSCFG_BASE_IPC_SEM_LIMIT最大支持信号量的个数。100
    LOSCFG_BASE_IPC_MUX_LIMIT最大支持互斥量的个数。64
    LOSCFG_BASE_IPC_QUEUE_LIMIT最大支持消息队列量的个数。64
    LOSCFG_BASE_CORE_SWTMR_LIMIT支持的最大软件定时器数量,而不是可用的软件定时器数量。80
    LOSCFG_BASE_MEM_NODE_SIZE_CHECK配置内存节点大小检查。NO
    LOSCFG_PLATFORM_EXC异常模块配置项。YES
    LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT是否使用OS默认的中断。NO
  3. 修改内核中断。 内核提供了两种中断修改方式:

    1. 使用厂商默认中断。

    将“target_config.h”中的宏"LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT"置为NO (0),但需要在xxx.s启动文件中作以下修改:

    • PendSV_Handler:厂商sdk自带中断入口函数,需要替换为OpenHarmony的接口HalPendSV;
    • SysTick_Handler:厂商sdk自带时钟中断入口函数,需要替换为OpenHarmony的接口OsTickHandler。
    1. 系统初始化时重定向中断。

    将“target_config.h”中的宏"LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT"和"LOSCFG_PLATFORM_HWI"置为YES (1)。

    说明: 重定向后的中断向量表g_hwiForm需要根据arch手册要求进行字节对齐,通常0x200字节对齐。

添加内核子系统

添加完内核子系统后,可以编译出带有系统的工程。通过以下步骤添加内核子系统:

  1. 在“config.json”中添加内核子系统。 路径:“vendor/MyVendorCompany/MyProduct/config.json”

    修改如下:

    {"subsystem": "kernel",          # 添加内核子系统"components": [{ "component": "liteos_m", "features":[""] }]
    },
    
  2. 开启/关闭内核特性。 轻量级系统的内核提供了一些特性,此步骤将指导如何查看、开启/关闭这些特性。

    内核特性:liteos_m提供了包括文件系统、backtrace在内的一系列内核特性开关。

    路径:“kernel/liteos_m/BUILD.gn”

    declare_args() {enable_ohos_kernel_liteos_m_cppsupport = true        # cpp支持enable_ohos_kernel_liteos_m_cpup = true              # CPU占用率支持enable_ohos_kernel_liteos_m_exchook = true           # 异常处理支持enable_ohos_kernel_liteos_m_kal = true               # kal接口支持enable_ohos_kernel_liteos_m_fs = true                # 文件系统支持enable_ohos_kernel_liteos_m_backtrace = true         # backtrace支持
    }
    group("kernel") {
    deps = ["components/bounds_checking_function:sec","kernel:kernel","utils:utils",]if (enable_ohos_kernel_liteos_m_cppsupport == true) {deps += [ "components/cppsupport:cppsupport" ]     # 如果内核特性true,则会加入相应的代码进行编译}……if (enable_ohos_kernel_liteos_m_kal == true) {deps += [ "kal:kal" ]}
    }
    

    特性:可以选择cmsis接口或者posix接口支持。

    路径:“kernel/liteos_m/kal/BUILD.gn”

    declare_args() {enable_ohos_kernel_liteos_m_cmsis = true  # cmsis支持enable_ohos_kernel_liteos_m_posix = true  # posix支持
    }
    static_library("kal") {sources = [ "kal.c" ]if (enable_ohos_kernel_liteos_m_cmsis == true) {deps += [ "cmsis/" ]                    # 如果cmsis enable,加入cmsis目录编译}if (enable_ohos_kernel_liteos_m_posix == true) {deps += [ "posix/" ]                    # 如果posix enable,加入posix目录编译}
    }
    

    特性:可以选择fatfs支持。

    路径:“kernel/liteos_m/components/fs/BUILD.gn”

    declare_args() {enable_ohos_kernel_liteos_m_fatfs = true   # fatfs支持
    }
    group("fs") {deps = []if (enable_ohos_kernel_liteos_m_fatfs == true) {deps += [ "fatfs:fatfs" ] }
    }
    

    说明: 内核特性开关可以在具体产品模组中配置。例如关闭fs和cppsupport特性
    “vendor/MyVendorCompany/MyProduct/config.json”

    "subsystem": "kernel",
    "components": [{ "component": "liteos_m", "features":["enable_ohos_kernel_liteos_m_fs = false","enable_ohos_kernel_liteos_m_cppsupport = false"] }
    ]
    }
    

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

2

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!
3

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

羽毛球关键点检测系统源码分享

羽毛球关键点检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

openSSL 如何降版本

文章目录 前言openSSL 如何降版本1. 卸载2. 安装新的openssl版本3. 验证 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话&…

Linux IO模型(多路复用)

【1】Linux IO模型:IO多路复用 场景假设二 假设妈妈有三个孩子,分别不同的房间里睡觉,需要及时获知每个孩子是否醒了,如何做? 1.一直在一个房间呆着:看不到其他两个孩子 2.每个房间不停的看:可以…

WebGL系列教程五(使用索引绘制彩色立方体)

目录 1 前言2 立方体3 开始绘制3.1 声明顶点和颜色3.2 使用索引绘制3.3 效果3.4 完整代码 4 总结 1 前言 上一讲我们讲了如何绘制彩色的三角形,这一讲我们来说如何绘制立方体。为什么几乎所有的WebGL教程总是从开始绘制三角形开始,因为三角形是最小的面&…

服务器模型 Reactor 和 Proactor

Proactor 具体流程如下: 处理器发起异步操作,并关注 IO 完成事件;事件分离器等待操作完成事件;分离器等待过程中,内核并行执行实际的 IO 操作,并将结果存储入用户自定义的缓冲区,最后通知事件分…

【C++】C++ STL 探索:List使用与背后底层逻辑

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现 本文将通过模拟实现List,从多个角度深入…

60 道 MySQL 精选面试题

基础 #1、关系型和非关系型数据库的区别? 关系型数据库的优点 容易理解,因为它采用了关系模型来组织数据。可以保持数据的一致性。数据更新的开销比较小。支持复杂查询(带 where 子句的查询) 非关系型数据库(NOSQL…

微服务-nacos

nacos-注册中心 启动 服务注册到nacos

【Unity踩坑】创建新项目后提示编译错误要进入安全模式

在创建了新项目后(比如URP,AR,VR),首次打开时提示有编译错误,要进入安全模式。 脚本是项目模板自带的,不会有问题。这时需要先选择进入安全模式,然后关闭项目,重新打开就…

9月12号作业

主要更改的代码 void Widget::read_solt() { QByteArray msg socket->readAll();//接受信息 if(QString::fromLocal8Bit(msg)msg2||msg3QString::fromLocal8Bit(msg)||msg6QString::fromLocal8Bit(msg)) { QListWidgetItem *listItem new QListWidgetItem(QString::fromL…

网络视频流解码显示后花屏问题的分析

问题描述 rtp打包的ps视频流发送到客户端后显示花屏。 数据分析过程 1、用tcpdump抓包 tcpdump -i eth0 -vnn -w rtp.pcap 2、用wireshark提取rtp的payload 保存为record.h264文件 3、用vlc播放器播放 显示花屏 4、提取关键帧 用xxd命令将h264文件转为txt文件 xxd -p…

2 创建会计科目表

定义解释 在SAP系统中,会计科目表是财务系统的基础数据之一,对于企业的财务核算和财务管理至关重要 定义:会计科目表是SAP系统中用于定义和分类总账科目的集合,它包含了所有需要在财务系统中记录和管理的会计科目。这些科目按照…

工厂安灯系统在设备管理中的重要性

在现代制造业中,设备管理是确保生产效率和产品质量的关键环节。随着工业4.0的推进,越来越多的企业开始采用智能化的设备管理系统,其中安灯系统作为一种有效的管理工具,逐渐受到重视。安灯系统最初源于日本的丰田生产方式&#xff…

内存管理篇-23 二级页表的创建过程-上

二级页表的填充过程:一级页表是4096项(用虚拟地址高12位),二级页表是256项(用虚拟地址中间10位,每个项能代表一个物理页,因此4KB*2561MB)。因此,每个二级页表映射1MB的空…

Java stream使用与执行原理

stream简介 Stream: A sequence of elements supporting sequential and parallel aggregate operations stream为sequential即单线程串行操作,parallelStream支持并行操作,本文只讨论sequential的stream。 stream常用操作 Datastatic class Course {pr…

HarmonyOS应用开发( Beta5.0)HOS-用户认证服务:面部识别

介绍 User Authentication Kit(用户认证服务)提供了基于用户在设备本地注册的人脸和指纹来认证用户身份的能力。 用户向应用/系统服务请求访问某些个人数据或执行某些敏感操作时,应用/系统服务将调用系统用户身份认证控件对用户身份进行认证…

MySQL之库和表操作

目录 一:对库的操作 1.创建数据库 2.查看数据库列表 3.显示创建数据库的语句 4.删除数据库 5.字符集与校验集 6.确认当前所处的数据库 7.修改数据库 8.备份和恢复 9.查看连接情况 二:对表的操作 1.创建表 2.查看表 3.删除表 4.修改表 接下来的日…

Java 设计模式-状态模式

目录 一. 概述 二. 主要角色 三. 代码示例 四. 优缺点 优点: 缺点: 五. 常见应用场景 一. 概述 状态模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定…

信息安全工程师(1)计算机网络分类

一、按分布范围分类 广域网(WAN): 定义:广域网的任务是提供长距离通信,运送主机所发送的数据。其覆盖范围通常是直径为几十千米到几千千米的区域,因此也被称为远程网。特点:连接广域网的各个结点…