OpenHarmony(鸿蒙南向开发)——小型系统芯片移植指南(二)

news2024/11/17 13:18:36

往期知识点记录:

  • 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
  • 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
  • OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植指南(一)
  • OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植指南(二)
  • OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植指南(三)
  • OpenHarmony(鸿蒙南向开发)——轻量系统芯片内核移植
  • OpenHarmony(鸿蒙南向开发)——小型系统芯片移植指南(一)
  • OpenHarmony(鸿蒙南向开发)——小型系统芯片移植指南(二)
  • 持续更新中……

LiteOS-A内核

移植概述

移植场景

LiteOS-A当前支持ARMv7-a指令集架构,如果三方芯片为ARMv7-a架构,可以进行内核基础适配;否则还需要先根据芯片的架构来新增内核对该芯片架构的支持,这个工作较为复杂,不在这篇文章范围内。

目录规范

LiteOS-A目录规范参考 LiteOS-A 简介。

基础适配

LiteOS-A提供系统运行所需的系统初始化流程和定制化配置选项。移植过程中,需要关注初始化流程中跟硬件配置相关的函数。

如下图所示,LiteOS-A的初始化流程主要包含以下七步:

  1. 新增target_config.h文件,并且编写单板内存相关的配置宏DDR_MEM_ADDR和DDR_MEM_SIZE,分别表示内存起始地址和内存的长度,预链接脚本board.ld.S会根据这两个宏进行展开生成链接脚本board.ld。

  2. 新增定义MMU映射全局数组(g_archMmuInitMapping),指定各个内存段属性及虚实映射关系,内核启动阶段根据该表建立内存映射关系。

  3. 如果是多核,需要新增定义从核操作函数句柄(struct SmpOps),其中SmpOps->SmpCpuOn函数需要实现唤醒从核的功能;接着定义SmpRegFunc函数,调用LOS_SmpOpsSet接口进行句柄注册;最后通过启动框架完成注册过程,即LOS_MODULE_INIT(SmpRegFunc, LOS_INIT_LEVEL_EARLIEST)。

  4. 链接阶段根据链接脚本board.ld生成内核镜像。

  5. 单核CPU镜像运行入口为汇编文件reset_vector_up.S,多核CPU的入口为reset_vector_mp.S,在汇编文件中进行中断向量表初始化、MMU页表初始化等操作。

  6. reset_vector.S汇编代码最终会跳转到C语言的main函数,进行硬件时钟、软件定时器、内存和任务等初始化,这个过程会依赖target_config.h的特性宏配置,最后会创建SystemInit任务,并且开启任务调度OsSchedStart()。

  7. SystemInit任务在单板代码中实现,其中调用DeviceManagerStart函数进行HDF驱动初始化,这个过程会调用单板代码中的驱动配置文件hdf.hcs以及drivers源码实现

整体启动流程如下图所示:

图1 整体启动流程

从图1中可以看到,内核基础适配需要单板进行适配的代码包含三部分:

  • 新增target_config.h文件,其中新增单板硬件配置参数和特性开关的配置参数,具体说明如下:

表1 target_config.h配置项说明

配置项说明
OS_SYS_CLOCK系统cycle的频率
DDR_MEM_ADDR系统内存的起始地址
DDR_MEM_SIZE系统内存的大小
PERIPH_PMM_BASE外设寄存器的起始地址
PERIPH_PMM_SIZE外设寄存器的长度大小
OS_HWI_MIN系统中断最小值
OS_HWI_MAX系统中断最大值
NUM_HAL_INTERRUPT_UART0UART0中断号
UART0_REG_BASEUART0寄存器基址
GIC_BASE_ADDRGIC中断寄存器基址
GICD_OFFSETGICD相对GIC基址的偏移地址
GICC_OFFSETGICC相对GIC基址的偏移地址
  • SystemInit函数用于单板用户态业务初始化,典型的初始化场景如图2所示:

图2 业务启动流程

  • main函数用于内核基础初始化和单板内核态业务初始化,流程如下图3所示,整体由内核启动框架主导初始化流程,图中浅蓝色部分为启动框架中可接受外部模块注册启动的阶段。

注意: 同一层级内的模块不能有依赖关系。

图3 内核启动框架

表2 启动框架层级

层级说明
LOS_INIT_LEVEL_EARLIEST最早期初始化
说明:不依赖架构,单板以及后续模块会对其有依赖的纯软件模块初始化
例如:Trace模块
LOS_INIT_LEVEL_ARCH_EARLY架构早期初始化
说明:架构相关,后续模块会对其有依赖的模块初始化,如启动过程中非必需的功能,建议放到LOS_INIT_LEVEL_ARCH层
LOS_INIT_LEVEL_PLATFORM_EARLY平台早期初始化
说明:单板平台、驱动相关,后续模块会对其有依赖的模块初始化,如启动过程中必需的功能,建议放到LOS_INIT_LEVEL_PLATFORM层
例如:uart模块
LOS_INIT_LEVEL_KMOD_PREVM内存初始化前的内核模块初始化
说明:在内存初始化之前需要使能的模块初始化
LOS_INIT_LEVEL_VM_COMPLETE基础内存就绪后的初始化
说明:此时内存初始化完毕,需要进行使能且不依赖进程间通讯机制与系统进程的模块初始化
例如:共享内存功能
LOS_INIT_LEVEL_ARCH架构后期初始化
说明:架构拓展功能相关,后续模块会对其有依赖的模块初始化
LOS_INIT_LEVEL_PLATFORM平台后期初始化
说明:单板平台、驱动相关,后续模块会对其有依赖的模块初始化
例如:驱动内核抽象层初始化(mmc、mtd)
LOS_INIT_LEVEL_KMOD_BASIC内核基础模块初始化
说明:内核可拆卸的基础模块初始化
例如:VFS初始化
LOS_INIT_LEVEL_KMOD_EXTENDED内核扩展模块初始化
说明:内核可拆卸的扩展模块初始化
例如:系统调用初始化、ProcFS初始化、Futex初始化、HiLog初始化、HiEvent初始化、LiteIPC初始化
LOS_INIT_LEVEL_KMOD_TASK内核任务创建
说明:进行内核任务的创建(内核线程,软件定时器任务)
例如:资源回收系统常驻任务的创建、SystemInit任务创建、CPU占用率统计任务创建

进行单板移植适配,推荐关注LOS_INIT_LEVEL_ARCH至LOS_INIT_LEVEL_KMOD_TASK之间的层级,且尽可能拆分初始化行为进行细化阶段注册。

说明: 启动框架中同一层级内的注册模块不能有依赖关系,建议新增模块按照上述启动阶段进行模块初始化的拆分,按需注册启动。

可通过查看系统编译生成文件OHOS_Image.map中.rodata.init.kernel.*段内的符号表来了解当前已注册进内核启动框架中的各个模块初始化入口,以及检查新注册的模块初始化入口是否生效。

编程样例

在单板SDK文件中

/* 内核启动框架头文件 */
#include "los_init.h"
......

/* 新增模块的初始化函数 */
unsigned int OsSampleModInit(void)
{
    PRINTK("OsSampleModInit SUCCESS!\n");
    ......
}
......
/* 在启动框架的目标层级中注册新增模块 */
LOS_MODULE_INIT(OsSampleModInit, LOS_INIT_LEVEL_KMOD_EXTENDED);

验证

main core booting up...
OsSampleModInit SUCCESS!
releasing 1 secondary cores
cpu 1 entering scheduler
cpu 0 entering scheduler

根据上述系统启动阶段的打印可知,内核在启动时进行了该注册模块的初始化函数调用,完成该模块的初始化操作。

系统启动完毕后进入内核态shell,能够运行task命令能够正常显示即可。

OHOS # help
***shell commands:*

arp           cat           cd            chgrp         chmod         chown         cp            cpup          
date          dhclient      dmesg         dns           format        free          help          hwi           
ifconfig      ipdebug       kill          log           ls            lsfd          memcheck      mkdir         
mount         netstat       oom           partinfo      partition     ping          ping6         pmm           
pwd           reset         rm            rmdir         sem           shm           stack         statfs        
su            swtmr         sync          systeminfo    task          telnet        touch         umount        
uname         v2p           virstatfs     vmm           watch         writeproc     

Linux内核

移植概述

Linux内核移植主要涉及基于linux内核基线合入三方芯片补丁后,进行基础的内核编译构建及验证。

基本信息

当前Linux内核基线是基于Linux社区 4.19 LTS版本演进,合入CVE及bugfix补丁。具体信息参考 代码库,对应repo工程代码路径为kernel/linux-4.19

Bootloader

可以使用芯片厂商自带的Bootloader,或者是开源Uboot等加载内核镜像。比如为支持Hi3516DV300开发板,OpenHarmony引入的开源 Uboot。

适配编译和烧录启动

1.准备内核config(特别是芯片相关的config)。

config文件所在源码目录:kernel/linux/config/

以hi3516dv300芯片为例,可在对应的linux-4.19/arch/arm/configs/目录下新建<YOUR_CHIP>_small_defconfig,如hi3516dv300_small_defconfig表示针对hi3516dv300小型系统的defconfig。该config文件可以由基础defconfig文件small_common_defconfig与该芯片相关的config组合生成。

2.准备芯片补丁。

补丁文件所在源码目录:kernel/linux/patches/linux-4.19

以hi3516dv300芯片为例,参考已有的patch目录hi3516dv300_small_patch目录,新建<YOUR_CHIP>_patch目录,放置相关芯片补丁,注意hdf.patch等驱动补丁。

3.编译。

具体内核编译入口脚本位于工程目录kernel/linux/patches/下面,版本级整编命令会通过BUILD.gn进入kernel_module_build.shkernel.mk,需要在这2个文件中针对性进行patch及defconfig文件路径、编译器、芯片架构、内核Image格式等的适配。

通过编译错误日志调整补丁,典型错误场景:

(1)补丁合入失败,出现冲突,需要进行上下文适配修改。
(2)编译失败,内核版本差异(函数实现调整等)需要针对性进行内核适配。

注意:

  • 参考kernel.mk,在OpenHarmony工程的编译构建流程中会拷贝kernel/linux-4.19的代码环境后进行打补丁动作,在使用版本级编译命令前,需要kernel/linux-4.19保持原代码环境。

  • 对应拷贝后的目录位于:out/<***>/kernel/linux-4.19,可以在该目录下进行补丁的修改适配。

4.烧录启动。

由于不同芯片的开发板的烧录方式不一样,此处不表述具体的烧录方式。需要注意烧录的各镜像的大小及启动参数的配置,参考hi3516dv300采用uboot启动参数:

    setenv bootargs 'mem=128M console=ttyAMA0,115200 root=/dev/mmcblk0p3 ro rootfstype=ext4 rootwait blkdevparts=mmcblk0:1M(boot),9M(kernel),50M(rootfs),50M(userfs)'

验证

调试init进程、启动shell和运行简单的用户态程序,验证内核移植是否成功。OpenHarmony小型系统的OS镜像结构以及linux用户态的启动流程如下图1所示:

图1 基于linux内核的OS镜像结构和用户态程序启动流程

基于上述流程,推荐按以下步骤完成验证:

1.制作根文件系统镜像。

请参考 新建芯片解决方案和产品解决方案 生成根文件系统镜像rootfs.img。从上图可以看到启动过程与产品配置强相关,在制作rootfs.img过程中请完成如下四种配置:

  • 组件配置

产品组件配置文件vendor/{company}/{product}/config.json需配置启动恢复子系统(startup)的init_lite组件和内核子系统的linux_4_1_9组件。

  • 系统服务配置

系统服务配置文件vendor/{company}/{product}/init_configs/init_xxx.cfg需要启动shell服务。

  • 文件系统配置

文件系统配置vendor/{company}/{product}/fs.yml中需要创建/bin/sh -> mksh/lib/ld-musl-arm.so.1 -> libc.so软连接,这两个文件分别是shell可执行程序和可执行程序依赖的c库。

  • 启动配置

启动配置在vendor/{company}/{product}/init_configs/etc目录下,包括fstab、rsS和Sxxx文件,请按开发板实际情况配置。

编译完成后,可通过检查产品编译输出目录下的rootfs内容,确认rootfs.img文件生成是否符合预期。

2.调试init进程和shell。

烧录rootfs.img并调试init进程和shell,不同厂商的开发板的烧录工具和流程可能不同,请按芯片解决方案提供的流程进行烧录。烧录rootfs.img前请确认bootloader和linux内核启动正常。如果rootfs.img被内核正常挂载,接着将运行/bin/init程序,init进程为用户态的第一个应用程序,它的运行意味着用户态的开始。

init程序首先会调用/etc/init.d/rcS脚本,rcS脚本执行第一条命令为/bin/mount -a,该命令会加载fstab文件,在fstab中的命令执行完后rcS将顺序调用Sxxx脚本完成设备节点创建和扫描、文件权限配置等操作。

最后,init程序会读取init.cfg系统服务配置文件。根据步骤1中的设置,init程序将会启动shell。如果上述流程运行正常,系统则会进入shell。

若串口有如下版本号日志打印,则表示init程序启动正常:

图2 init启动正常日志

正常进入shell后执行ls命令,串口打印信息如下图:

图3 正常进入shell后输入ls命令串口打印

3.配置NFS。

init进程和shell正常启动后,以服务端IP为192.168.1.22、客户端IP为192.168.1.4为例,可在根目录执行如下命令开启NFS:

    ifconfig eth0 192.168.1.4 netmask 255.255.255.0
    mkdir -p /storgage/nfs
    mount -t nfs -o nolock,addr=192.168.1.22 192.168.1.22:/nfs /storage/nfs

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

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(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/2133418.html

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

相关文章

安全工具 | 使用Burp Suite的10个小tips

Burp Suite 应用程序中有用功能的集合 img Burp Suite 是一款出色的分析工具&#xff0c;用于测试 Web 应用程序和系统的安全漏洞。它有很多很棒的功能可以在渗透测试中使用。您使用它的次数越多&#xff0c;您就越发现它的便利功能。 本文内容是我在测试期间学到并经常的主要…

CSS框架 Tailwind CSS

文章目录 前言一、Tailwind CSS是什么&#xff1f;二、项目中如何使用1.安装Tailwind CSS2.初始化Tailwind CSS该处使用的url网络请求的数据。3.引入Tailwind CSS样式4.进行配置&#xff08;tailwind.config.js&#xff09;5.全局引入注册6.使用Tailwind CSS 总结 前言 Tailwi…

基于鸿蒙API10的RTSP播放器(七:亮度调节功能测试)

目标&#xff1a; 当我的手指在设备左方进行上下移动的时候&#xff0c;可以进行屏幕亮度的调节&#xff0c;在调节的同时&#xff0c;有实时的调节进度条显示 步骤&#xff1a; 界面逻辑&#xff1a;使用Stack() 组件&#xff0c;完成音量图标和进度条的组合显示&#xff0c…

pytorch-AutoEncoders实战

目录 1. AutoEncoders回顾2. 实现网络结构3. 实现main函数 1. AutoEncoders回顾 如下图&#xff1a;AutoEncoders实际上就是重建自己的过程 2. 实现网络结构 创建类继承自nn.Model&#xff0c;并实现init和forward函数&#xff0c;init中实现encoder、decoder 直接上代码&a…

DataWind将string类型转化为int类型的报错解决

一、现象&#xff1a; toInt64([kernel_wakeup_top_count_str]) 二、日志&#xff1a; 遇到&#xff1a;错误: 直连查询失败&#xff0c;内部异常:<class aeolus.aeolus.libs.exception.aeolus_base_exception.AeolusBaseException>: aeolus/logicQuery/logicQueryMysq…

Java数据结构应用(力扣题20. 有效的括号)

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

Unity Timeline

数据存储 TimeLine和Animation一样也是资源&#xff0c;以.playable的格式存储&#xff0c;可以通过Playable Director进行加载播放。 Playable具有以下优势&#xff1a; 结构简单&#xff1b; 运行时创建、添加和删除&#xff1b; 更加灵活&#xff0c;可以直接控制动画的各种…

Golang | Leetcode Golang题解之第402题移掉K位数字

题目&#xff1a; 题解&#xff1a; func removeKdigits(num string, k int) string {stack : []byte{}for i : range num {digit : num[i]for k > 0 && len(stack) > 0 && digit < stack[len(stack)-1] {stack stack[:len(stack)-1]k--}stack app…

react 事件处理

概述 Web应用中&#xff0c;事件处理是重要的一环&#xff0c;事件处理将用户的操作行为转换为相应的逻辑执行或界面更新。在React中&#xff0c;处理事件响应的方式有多种&#xff0c;本文将详细介绍每一种处理方式的用法、使用场景和优缺点。 如果原生DOM有一个监听事件&…

论文复现--基于LeNet网络结构的数字识别

前言 一直就听说学习深度学习无非就是看论文&#xff0c;然后复现&#xff0c;不断循环&#xff0c;这段时间也看了好几篇论文(虽然都是简单的)&#xff0c;但是对于我一个人自学&#xff0c;复现成功&#xff0c;我感觉还是挺开心的 本人初学看论文的思路&#xff1a;聚焦网络…

2-93 基于matlab的无人机FMCW(频率调制连续波)毫米波高度计雷达仿真

基于matlab的无人机FMCW&#xff08;频率调制连续波&#xff09;毫米波高度计雷达仿真&#xff0c;不考虑环境杂波和收发信号隔离泄漏。通过考虑雷达天线、波束形成、信号传播、回波接收等环节影响。建立FMCW毫米波雷达系统的数学模型&#xff0c;评估无人机在不同高度下的高度…

区块链先驱孙宇晨:引领价值传播,激发行业创新活力

​孙宇晨&#xff0c;这位被誉为“区块链布道师”的年轻企业家&#xff0c;以其独特的愿景和行动力在区块链行业中脱颖而出。作为波场TRON的创始人&#xff0c;他不仅是区块链技术的倡导者&#xff0c;更是一位不懈推动行业发展的领导者。他通过自身的努力和影响力&#xff0c;…

vxe-table之复选框 设置父子节点不互相关联

通过 checkStrictly 设置父子节点不互相关联&#xff0c;默认不显示头部复选框&#xff0c;可以通过 checkbox-config{showHeader} 设置 <template><div><vxe-table:column-config"{resizable: true}":data"tableData":tree-config"{…

Python 数学建模——Fitter 拟合数据样本的分布

文章目录 介绍代码实例 介绍 数学建模中很多时候&#xff0c;我们有某个随机变量 X X X 的若干样本 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X1​,X2​,⋯,Xn​&#xff0c;想要还原随机变量 X X X 的概率密度函数 f ( x ) f(x) f(x)。诚然&#xff0c;高斯核密度估计可以…

使用WinRAR把bat文件打包成exe

WinRAR下载 官网地址&#xff1a;https://www.winrar.com.cn/#:~:text64%E4%BD%8D%20WinRAR 百度网盘: https://pan.baidu.com/s/16m8Hph3sHqR2hmrJpY0yKQ 提取码: 3340 选择bat文件&#xff0c;点击添加压缩 名称改成exe&#xff0c;压缩选项那块自动勾选 切换到高级&am…

王者荣耀改重复名(java源码)

王者荣耀改重复名 项目简介 “王者荣耀改重复名”是一个基于 Spring Boot 的应用程序&#xff0c;用于生成王者荣耀游戏中的唯一名称。通过简单的接口和前端页面&#xff0c;用户可以输入旧名称并获得一个新的、不重复的名称。 功能特点 生成新名称&#xff1a;提供一个接口…

PAM后门从入门到应急响应

目录 1. PAM与PAM后门介绍 PAM介绍 PAM后门 2.植入PAM后门 2.1 关闭 selinux 和临时关闭 setenforce 2.2 查看 pam 版本号 2.3 下载对应版本的 pam 源码包 2.4 安装gcc编译器和flex库 2.5 留 PAM 后门和保存 ssh登录的账户密码 2.6 编译 2.9 登录测试 3. 应急响应…

Synchronized的底层实现

Synchronized用法 Synchronized 是 Java 中的一个重要关键字&#xff0c;主要是用来加锁的。在使用Synchronized的时候需要指定一个对象&#xff0c;所以synchornized也被称为对象锁。 synchronized 的使用方法比较简单&#xff0c;主要可以用来修饰方法和代码块。根据其锁定…

PLC远程调试-无需硬件设备-V3.2.0发布

文章目录 前言一、无缝连接&#xff0c;突破距离限制二、高效调试&#xff0c;提升工作效率三、安全可靠&#xff0c;保护数据安全四、用户友好&#xff0c;简化操作流程五、软件地址六、远程调试软件 七、基本操作1、订阅主题2、连接3、串口调试4、网口调试 八、软件地址结束语…

【数据结构精讲】01绪论(基本概念介绍和时间复杂度计算)

绪论 在绪论这部分会介绍常用的一些基本概念&#xff0c;让同学们对这门课的整体有所了解&#xff01; 数据结构以及相关概念 一、几个重要概念 1、数据&#xff1a;凡是能输入到计算机并能被计算机程序处理的符号的总称 2、数据元素&#xff1a;数据的基本单位&#xff0…