当前位置: 首页 > news >正文

鸿蒙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

相关文章:

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

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

多字节字符和宽字符

小时候,买东西的单位是一角、二角和五角,现在的单位是一元、五元和十元。人类社会的发展和计算机发展本质没啥两样,形态不同而已。 编码格式的历史 尽管早期只用ASCII码就可以表达所有字符,但计算机日益推广让其他国家不同语言的…...

C++缺省参数

个人主页:Jason_from_China-CSDN博客 所属栏目:C系统性学习_Jason_from_China的博客-CSDN博客 缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则…...

深度学习中的常用线性代数知识汇总——第一篇:基础概念、秩、奇异值

文章目录 0. 前言1. 基础概念2. 矩阵的秩2.1 秩的定义2.2 秩的计算方法2.3 秩在深度学习中的应用 3. 矩阵的奇异值3.1 奇异值分解(SVD)3.2 奇异值的定义3.3 奇异值的性质3.4 奇异值的意义3.5 实例说明3.6 奇异值在深度学习中的应用 0. 前言 按照国际惯例…...

MATLAB | R2024b更新了哪些好玩的东西?

Hey, 又到了一年两度的MATLAB更新时刻,MATLAB R2024b正式版发布啦!,直接来看看有哪些我认为比较有意思的更新吧! 1 小提琴图 天塌了,我这两天才写了个半小提琴图咋画,MATLAB 官方就出了小提琴图绘制方法。 小提琴图…...

嵌入式硬件基础知识

嵌入式硬件基础知识涵盖了嵌入式系统中的硬件组成及其工作原理,涉及处理器、存储器、外设接口、电源管理等多个方面。这些硬件共同构成了一个完整的嵌入式系统,用于执行特定任务。下面我们来详细介绍嵌入式硬件的基础知识。 1. 嵌入式系统的组成 嵌入式…...

keepalived和lvs高可用集群

keepavlied和lvs高可用集群搭建 主备模式: 关闭防火墙和selinux systemctl stop firewalld setenforce 0部署master负载调度服务器 zyj86 安装ipvsadm keepalived yum install -y keepalived ipvsadm修改主节点配置 vim /etc/keepalived/keepalived.conf! Conf…...

在VMware部署银河麒麟系统

虚拟机镜像安装文件从下面下载: 银河麒麟桌面操作系统V10SP1 2403 下载地址_银河麒麟v10镜像iso下载-CSDN博客 虚拟机安装要求硬盘大小至少40G,我悬着60G 选择桥接网络安装后上不了网并且和本机也互相ping不通,因此选择Nat方式,然后重启,就可以上网 下面开始安装,第一个…...

git删除本地分支报错:error: the branch ‘xxx‘ is not fully merged

git删除本地分支报错:error: the branch xxx is not fully merged error: the branch xxx is not fully merged 直接: git branch -D xxx 就可以。 如果删除远程分支: git push origin --delete origin/xxx git强制删除本地分支 git branc…...

Tensorflow 兼容性测试-opencloudos

介绍 Tensorflow 兼容性测试: 测试 Tensorflow 各个版本在 OpenCloudOS Stream 的安装支持 操作系统 [rootlab101 ~]# cat /etc/os-release NAME"OpenCloudOS Stream" VERSION"23" ID"opencloudos" ID_LIKE"opencloudos" VERSION_I…...

Windows主机上安装CUPS服务端共享USB打印机实践心得

背景 平时主力机器是Windows,不想额外开一个Linux服务器来共享打印机。由于主力机平时也不关机,尝试在Windows上安装CUPS服务。 结论 先说结论,结论是可行,但是麻烦且不稳定,虚拟机方案少折腾,但是资源消耗…...

socket通讯原理及例程(详解)

里面有疑问或者不正确的地方可以给我留言。 对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问: 什么是TCP/IP、UDP?Socket在哪里呢?Socket是什么呢&#xff1…...

vue3使用provide和inject传递异步请求数据子组件接收不到

前言 一般接口返回的格式是数组或对象,使用reactive定义共享变量 父组件传递 const data reactive([])// 使用settimout模拟接口返回 setTimeout(() > {// 将接口返回的数据赋值给变量Object.assign(data, [{ id: 10000 }]) }, 3000);provide(shareData, dat…...

对称矩阵的压缩存储

1.给自己出题:自己动手创造,画一个5行5列的对称矩阵 2.画图:按“行优先”压缩存储上述矩阵,画出一维数组的样子 3.简答:写出元素 i,j 与 数组下标之间的对应关系 4.画图:按“列优先”压缩存储上述矩阵&a…...

高阶数据结构之哈希表基础讲解与模拟实现

程序猿的读书历程:x语言入门—>x语言应用实践—>x语言高阶编程—>x语言的科学与艺术—>编程之美—>编程之道—>编程之禅—>颈椎病康复指南。 前言: 哈希表(Hash Table)是一种高效的键值对存储数据结构&…...

基于STM32设计的智能货架(华为云IOT)(225)

文章目录 一、前言1.1 项目介绍【1】项目背景【2】项目支持的功能【3】项目硬件模块组成【4】ESP8266工作模式配置【5】Android手机APP开发思路【6】项目模块划分1.2 项目开发背景【1】选题来源与背景【2】国内外研究现状【3】课题研究的目的和内容【4】参考文献【5】研究内容【…...

JDBC API详解一

DriverManager 驱动管理类,作用:1,注册驱动;2,获取数据库连接 1,注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); 查看Driver类源码 static{try{DriverManager.registerDriver(newDrive…...

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

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

【LabVIEW学习篇 - 23】:简单状态机

文章目录 简单状态机状态机的创建和了解状态机实现红绿灯 简单状态机 一个优秀的应用程序离不开好的程序框架,不仅要很好满足用户的功能需求,还要考虑到系统的稳定性、实时性、可扩展性、可维护性,执行效率等方面。借用一些成熟的设计框架&a…...

【CSS】 Grid布局:现代网页设计的基石

引言 最近接到一个网页布局比较复杂的页面,看了半天还是决定用grid布局来写,记录一下 布局是构建用户界面的关键部分。CSS Grid布局提供了一种简单而强大的方式来创建复杂的网格布局,它让设计师和开发者能够更直观、更灵活地控制网页的结构。…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...