LiteOS-A内核
移植概述
移植场景
LiteOS-A当前支持ARMv7-a指令集架构,如果三方芯片为ARMv7-a架构,可以进行内核基础适配;否则还需要先根据芯片的架构来新增内核对该芯片架构的支持,这个工作较为复杂,不在这篇文章范围内。
目录规范
LiteOS-A目录规范参考 LiteOS-A 简介。
基础适配
LiteOS-A提供系统运行所需的系统初始化流程和定制化配置选项。移植过程中,需要关注初始化流程中跟硬件配置相关的函数。
如下图所示,LiteOS-A的初始化流程主要包含以下七步:
-
新增target_config.h文件,并且编写单板内存相关的配置宏DDR_MEM_ADDR和DDR_MEM_SIZE,分别表示内存起始地址和内存的长度,预链接脚本board.ld.S会根据这两个宏进行展开生成链接脚本board.ld。
-
新增定义MMU映射全局数组(g_archMmuInitMapping),指定各个内存段属性及虚实映射关系,内核启动阶段根据该表建立内存映射关系。
-
如果是多核,需要新增定义从核操作函数句柄(struct SmpOps),其中SmpOps->SmpCpuOn函数需要实现唤醒从核的功能;接着定义SmpRegFunc函数,调用LOS_SmpOpsSet接口进行句柄注册;最后通过启动框架完成注册过程,即LOS_MODULE_INIT(SmpRegFunc, LOS_INIT_LEVEL_EARLIEST)。
-
链接阶段根据链接脚本board.ld生成内核镜像。
-
单核CPU镜像运行入口为汇编文件reset_vector_up.S,多核CPU的入口为reset_vector_mp.S,在汇编文件中进行中断向量表初始化、MMU页表初始化等操作。
-
reset_vector.S汇编代码最终会跳转到C语言的main函数,进行硬件时钟、软件定时器、内存和任务等初始化,这个过程会依赖target_config.h的特性宏配置,最后会创建SystemInit任务,并且开启任务调度OsSchedStart()。
-
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所示,整体