-
开源鸿蒙通过芯片仓存放指定芯片和指定开发板的代码,硬件相关的代码和纯逻辑代码是分开存放的
- 源码模块的组织结构在manifest这个Git仓库,这也是拉取源码时的顶层仓库:
https://gitee.com/openharmony/manifest
- 平台仓都组织在
manifests/ohos/ohos.xml
文件中,而芯片仓都组织在manifests/chipsets/
目录下 - 每个芯片平台会在device和vendor目录下创建相应的仓,把这类仓称为芯片仓,其它的仓称为平台仓,芯片仓可能会随着硬件的演进而逐渐废弃,生命周期相对较短
- default.xml由ohos/ohos.xml和chipsets/all.xml组成,是所有平台仓和芯片仓的集合;可以通过缺省参数下载所有代码仓(全量代码)
- chipsets/chipsetN/chipsetN-detail.xml是单个芯片平台所引入的仓集合
- 每个开发板的chipsets/chipsetN/chipsetN-detail.xml里主要包括device/soc,device/board以及vendor相关仓
- 官方支持的开发板和模拟器种类-编译形态整体说明
- 源码模块的组织结构在manifest这个Git仓库,这也是拉取源码时的顶层仓库:
-
因为硬件各种各样,为了学习方便,这里选择几个ARM核的QEMU模拟器(不使用硬件,使用虚拟开发板)
- 编译参数(产品名):qemu_arm_linux_headless,开发板名称:qemu-arm-linux,芯片名称:qemu,芯片内核:ARM Cortex-A,系统类型:标准,系统内核:linux,开发板参数:
https://gitee.com/openharmony/vendor_ohemu/blob/master/qemu_arm_linux_headless/config.json
- 编译参数(产品名):qemu_small_system_demo,开发板名称:arm_virt,芯片名称:qemu,芯片内核:ARM Cortex-A,系统类型:小型,系统内核:liteos_a,开发板参数:
https://gitee.com/openharmony/vendor_ohemu/blob/master/qemu_small_system_demo/config.json
- 编译参数(产品名):qemu_mini_system_demo,开发板名称:arm_mps2_an386,芯片名称:qemu,芯片内核:ARM Cortex-M4,系统类型:轻型,系统内核:liteos_m,开发板参数:https://gitee.com/openharmony/vendor_ohemu/blob/master/qemu_mini_system_demo/config.json
- 编译参数(产品名):qemu_arm_linux_headless,开发板名称:qemu-arm-linux,芯片名称:qemu,芯片内核:ARM Cortex-A,系统类型:标准,系统内核:linux,开发板参数:
-
verdor芯片仓的开发板配置
https://gitee.com/openharmony/vendor_ohemu/tree/master/qemu_arm_linux_headless
https://gitee.com/openharmony/vendor_ohemu/tree/master/qemu_small_system_demo
https://gitee.com/openharmony/vendor_ohemu/tree/master/qemu_mini_system_demo
-
device芯片仓的源码和配置
https://gitee.com/openharmony/device_qemu/tree/master/arm_virt/linux
https://gitee.com/openharmony/device_qemu/tree/master/arm_virt/liteos_a
https://gitee.com/openharmony/device_qemu/tree/master/arm_virt/liteos_a_mini
https://gitee.com/openharmony/device_qemu/tree/master/arm_mps2_an386
含上电后的初始化代码https://gitee.com/openharmony/device_qemu/tree/master/drivers
-
参考网址:
源码框架
-
以下配置文件指示了你要下载哪些Git仓库,并将他们拉取到哪个子文件夹下,拉取完成后才会构成完整的开源鸿蒙源码
- https://gitee.com/openharmony/manifest/blob/master/default.xml 分为平台仓和芯片仓
- https://gitee.com/openharmony/manifest/blob/master/ohos/ohos.xml 所有与硬件无关的平台仓,按group类型拉取代码,是你的group则拉取,不是则忽略
- 例如,将 https://gitee.com/openharmony/kernel_liteos_m 仓库拉取到 kernel/liteos_m 目录下
- https://gitee.com/openharmony/manifest/blob/master/chipsets/all.xml 所有与硬件相关的芯片仓,按芯片名称分类
- https://gitee.com/openharmony/manifest/blob/master/chipsets/qemu.xml 选中一款芯片,例如选中qemu这款虚拟芯片,平台仓还是选中全量,芯片仓则选中特有的
- https://gitee.com/openharmony/manifest/blob/master/chipsets/qemu/qemu.xml qemu这款虚拟芯片的芯片仓代码
- 将 https://gitee.com/openharmony/vendor_ohemu 这个仓库拉取到 vendor/ohemu 文件夹下,含模块依赖关系、操作系统的配置参数、OEM-ID-密钥源码
- 将 https://gitee.com/openharmony/device_qemu 这个仓库拉取到 device/qemu 文件夹下,包含芯片相关驱动底层硬件相关部分
-
以ARM Cortex-M内核的arm_mps2_an386开发板为例,简述源码结构
-
openHarmony\device\qemu\arm_mps2_an386\liteos_m\board\startup.s(源码网址
https://gitee.com/openharmony/device_qemu/blob/master/arm_mps2_an386/liteos_m/board/startup.s
) 中描述了芯片上电后的第二行代码:复位中断(第一行代码RAM 0地址的复位中断融合到编译器里面去了),在复位中断中跳转到C语言的main函数
.global Reset_Handler
.section .text
.type Reset_Handler, %function
Reset_Handler:
ldr r0, =__bss_start
ldr r1, =__bss_end
mov r2, #0
bss_loop:
str r2, [r0, #0]
add r0, r0, #4
subs r3, r1, r0
bne bss_loop
ldr sp, =__irq_stack_top
b main
.size Reset_Handler, .-Reset_Handler
- openHarmony\device\qemu\arm_mps2_an386\liteos_m\board\main.c(源码网址
https://gitee.com/openharmony/device_qemu/blob/master/arm_mps2_an386/liteos_m/board/main.c
) 中在main函数里面启动操作系统
/*****************************************************************************
Function : main
Description : Main function entry
Input : None
Output : None
Return : None
*****************************************************************************/
LITE_OS_SEC_TEXT_INIT int main(void)
{
unsigned int ret;
UartInit();
ret = LOS_KernelInit();
if (ret != LOS_OK) {
printf("LiteOS kernel init failed! ERROR: 0x%x\n", ret);
goto EXIT;
}
#if (LOSCFG_SUPPORT_LITTLEFS == 1)
LfsLowLevelInit();
#endif
Uart0RxIrqRegister();
NetInit();
#if (LOSCFG_USE_SHELL == 1)
ret = LosShellInit();
if (ret != LOS_OK) {
printf("LosAppInit failed! ERROR: 0x%x\n", ret);
}
#endif
ret = LosAppInit();
if (ret != LOS_OK) {
printf("LosAppInit failed! ERROR: 0x%x\n", ret);
}
LOS_Start();
EXIT:
while (1) {
__asm volatile("wfi");
}
}
- openHarmony\device\qemu\arm_mps2_an386\liteos_m\board\driver 包含了芯片的底层驱动代码
- 接下来就是理解操作系统内核模块,当前时LiteOS-M、LiteOS-A和Linux,之后会全部换成鸿蒙内核
为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙开发学习手册》:
如何快速入门:https://qr21.cn/FV7h05
- 基本概念
- 构建第一个ArkTS应用
- ……
开发基础知识:https://qr21.cn/FV7h05
- 应用基础知识
- 配置文件
- 应用数据管理
- 应用安全管理
- 应用隐私保护
- 三方应用调用管控机制
- 资源分类与访问
- 学习ArkTS语言
- ……
基于ArkTS 开发:https://qr21.cn/FV7h05
- Ability开发
- UI开发
- 公共事件与通知
- 窗口管理
- 媒体
- 安全
- 网络与链接
- 电话服务
- 数据管理
- 后台任务(Background Task)管理
- 设备管理
- 设备使用信息统计
- DFX
- 国际化开发
- 折叠屏系列
- ……
鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH
鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH
1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向