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

news2024/11/15 11:25:45

移植芯片架构

芯片架构的移植是内核移植的基础,在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.coloradmin.cn/o/2129489.html

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

相关文章

2024年全国大学生软件测试大赛赛项安排(一)

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

怎么选择靠谱AI论文生成工具?看完我的试用都会明白!

2024年上半年开始AI论文写作工具开始火了,层出不穷!作为一个经常需要写论文的懒人,我非常好奇这些AI工具的实际效果到底怎么样?为了测试不同工具的实力,我对他们都进行了试用,发现了一些意想不到的结果....…

【楚怡杯】职业院校技能大赛 “云计算应用” 赛项样题一

某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenStack搭建企业内部私有云平台,开源Kubernetes搭建云原生服务平台,选…

【F172】基于Springboot+vue实现的智能菜谱系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 近些年,随着中国经济发展,人民的…

消防装备仓库管理系统|实现消防装备全流程跟踪

智慧消防装备仓库管理系统(智物资DW-S302)是一套成熟系统,依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 1、支持实时物资仓库货位二维和三维孪生…

第七篇——数学应用:华罗庚化繁为简的神来之笔

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 数学的意义,以及它对于生活的指导边界,是那么的重…

Oracle CloudWorld 2024:多云时代的AI与数据库融合革命

在今年的 Oracle CloudWorld 大会上,甲骨文董事会主席兼首席技术官Larry Ellison 深入探讨了AI、云计算与数据库融合的未来。 在这一技术盛宴中,Ellison的演讲不仅展现了云计算的新趋势,还为企业数字化转型提供了前瞻性的技术路线。 我们来回…

kettle 数据库迁移 使用分页原理实现 数据库mysql

使用 kettle 9.0 先修改配置文件: C:\Users\xx\.kettle 新增如下配置,解决mysql 空字符串 自动转 null bug KETTLE_EMPTY_STRING_DIFFERS_FROM_NULLY git地址: GitHub - 2292011451/kettle_tool 第一步: 先把要迁移的表进行读取,循环查询每个表的最大数量以及页数,追加到…

(一)模式识别——基于SVM的道路分割实验(附资源)

写在前面:本报告所有代码公开在附带资源中,无法下载代码资源的伙伴私信留下邮箱,小编24小时内回复 一、实验目的 1、实验目标 学习掌握SVM(Support Vector Machine)算法思想,利用MATLAB的特定工具箱和库函…

MFC工控项目实例之十四模拟量信号名称从文件读写

承接专栏《MFC工控项目实例之十三从文件读写板卡信号名称》 在BoardTest.cpp文件中添加代码 int m_CountGetCurSel_AD[16];//索引号 UINT m_CountComboID_AD[16]//控件ID号{IDC_COMBO33,IDC_COMBO34,IDC_COMBO35,IDC_COMBO36,IDC_COMBO37,IDC_COMBO38,IDC_COMBO39,IDC_COMBO40…

语言模型微调:提升语言Agent性能的新方向

人工智能咨询培训老师叶梓 转载标明出处 大多数语言Agent依赖于少量样本提示技术(few-shot prompting)和现成的语言模型。这些模型在作为Agent使用时,如生成动作或自我评估,通常表现不佳,且鲁棒性差。 论文《FIREACT…

2024外滩大会:远的更近 旧的更新

文 | 大力财经 导语:2024 外滩大会圆满落幕!未来更近了,旧的更创新了。全球 500 多位精英齐聚,50 余家企业 “招才”。在这里,我们不仅看到未来商业形态,更望见未来的影子。 为期三天的2024外滩大会圆满落幕…

flv复合流

一、什么是flv flv流媒体协议是Adobe公司推出的一种流媒体协议。其特点就是封装后的音视频数据量很小,并且协议规范相对简单,所以FLV流媒体协议适合网络传输,但是他是一个私有协议,所支持的网络传输比较有限:如RTMP、H…

Mysql异常断电InnoDB损坏处理

一、mysql启动报错信息收集 1、截图 [ERROR] InnoDB: Database page corruption on disk or a failed file read of page [page id: space0, page number203]. You may have to recover from a backup. Jun 27 13:30:06 localhost mysqld: 2024-06-27T13:30:06.14747208:00 0 …

意气实体过程函数论3

意气实体过程函数论3 和悦空间 y i y_i yi​才气的意气实体过程逻辑定义哥德尔数数理逻辑简称逻辑;明明德数符号琴语言数据结构王阳明群表示,被称为才气群表示论; 从劳动力关系向量到生产力配分函数算法为己之学模拟器接口函数声明内核与插件…

【JAVA入门】Day42 - 转换流

【JAVA入门】Day42 - 转换流 文章目录 【JAVA入门】Day42 - 转换流 转换流是字符流和字节流之间的桥梁。 转换流中的输入流叫做 InputStreamReader,它可以把字节流转换为字符流。 转换流的输出流叫做 OutputStreamWriter,它可以把字符流…

JAVA并发编程ReentrantLock核心原理剖析

JAVA并发编程系列以及陆续出了5篇,第六篇的主角ReentrantLock该出场了。之前《一文看懂全部锁机制》谈到可重入锁、《JAVA并发编程AQS原理剖析》谈到了JUC灵魂AQS,那么AQS的思想优秀实践者ReentrantLock是怎么实现AQS的呢? 1、ReentrantLock是…

Unity笔记:ScrollRect代码阅读

大体流程 Unity Docs - UGUI | Class ScrollRect 总的说 自身不负责Rebuild,设置脏之后交由LayoutRebuilder注册到CanvasUpdateRegistry里待rebuild的集合在固定时机统一Rebuild。自身只在Prelayout和Postlayout做一下数据准备和数据更新 自身的ICanvasElement.…

判断是否在同一个键盘行

给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 美式键盘 中: 第一行由字符 "qwertyuiop" 组成。第二行由字符 "asdfghjkl" 组成。第三行由字符 "zxcvbnm" 组成。…