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_UART0 UART0中断号
UART0_REG_BASE UART0寄存器基址
GIC_BASE_ADDR GIC中断寄存器基址
GICD_OFFSET GICD相对GIC基址的偏移地址
GICC_OFFSET GICC相对GIC基址的偏移地址
  • SystemInit函数用于单板用户态业务初始化,典型的初始化场景如图2所示:

图2 业务启动流程

  • main函数用于内核基础初始化和单板内核态业务初始化,流程如下图3所示,整体
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值