用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
软件与程序人生
›
移动端开发
›
鸿蒙
›
鸿蒙OpenHarmony轻量体系源码分析
鸿蒙OpenHarmony轻量体系源码分析
鼠扑
论坛元老
|
2024-7-22 23:24:34
|
显示全部楼层
|
阅读模式
楼主
主题
2017
|
帖子
2017
|
积分
6051
一、前言
当前的开源鸿蒙LiteOS-M和LiteOS-A是通过gn和ninja编译的。
Gitee官方只介绍了LiteOS-M的gn + ninja编译的流程,针对M3利用Keil编译的流程可能要参考社区代码
harmonyos_next / stm32f103_simulator_keil
OpenHarmony / kernel_liteos_m
利用Keil编译ARM Cortex-M3时,只需要kernel_liteos_m堆栈和Keil工程堆栈,不需要全量的OpenHarmony代码
由此可知,开源鸿蒙轻量体系只是简单的由LiteOS-M内核 + 一些芯片厂商的驱动组成
LiteOS-M 编码规范
OpenHarmony轻内核编码规范
OpenHarmony C语言编程规范
开辟板移植流程
轻量体系STM32F407芯片移植案例
确定主频、选定默认打印输出的串口、printf标准输入输出重定向到默认串口、指定内存范围给内核、提供定时器给内核
移植芯片内核架构的流程
LiteOS-M内核BUILD.gn编写指南
二、源码分析
源码下载:OpenHarmony / kernel_liteos_m
代码总量只有8M,代码量和uC/OS这类操作体系雷同,因为代码量不多,因此一个人也是能分析完的;uC/OS虽然是开源、个人免费,但是商用是要收费的,所以ARM Cortex-M之类的芯片利用LiteOS-M大概RT-Thread这类操作体系还是蛮划算的,需要技术支持的话也可以找干系公司进行付费咨询。
代码结构如下:
jim@DESKTOP-SVP3BEM MINGW64 /d/1_git/openHarmony/kernel/liteos_m (master)
$ tree .
.
|-- BUILD.gn /* 老版本的LiteOS使用Makefile编译,新版本还可以用gn + ninja */
|-- Kconfig
|-- Makefile
|-- arch /* 硬件相关的代码,按内核IP公司 - IP系列进行区分 */
| |-- BUILD.gn
| |-- Kconfig
| |-- arm
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- arm9
| | | .......
| | |-- common /* 相同芯片内核IP公司通用的函数和接口 */
| | | |-- BUILD.gn
| | | |-- los_common_interrupt.c
| | | `-- los_common_interrupt.h
| | |-- cortex-m3 /* M3只支持Keil编译,之后的版本如M4、Cortex-A则是在Linux + gcc下编译 */
| | | `-- keil /* 操作系统底层相关的支持,也是操作系统移植的重点 */
| | | |-- los_arch_atomic.h
| | | |-- los_arch_context.h
| | | |-- los_arch_interrupt.h
| | | |-- los_arch_timer.h
| | | |-- los_atomic.S
| | | |-- los_context.c
| | | |-- los_dispatch.S
| | | |-- los_exc.S
| | | |-- los_interrupt.c
| | | |-- los_startup.s /* 芯片上电后执行的第二行代码,芯片上电后的第一行代码一般都融合进了编译器中,由芯片原厂实现,写代码时看不到 */
| | | `-- los_timer.c /* 需要给操作系统的定时器接口,用于时间片轮转 */
| | |-- cortex-m33
| | | ......
| | |-- cortex-m4
| | | .......
| | |-- cortex-m55
| | | .......
| | |-- cortex-m7
| | | .......
| |-- csky
| | .......
| |-- include /* 所有芯片对操作系统暴露出的统一接口 */
| | |-- los_arch.h
| | |-- los_atomic.h
| | |-- los_context.h
| | |-- los_interrupt.h
| | |-- los_mpu.h
| | `-- los_timer.h
| |-- risc-v
| | ......
| `-- xtensa
| ......
| /* arch结构和Linux源码类似,一组类似的模块会暴露出统一的接口放在.h中,而.c的实现会分散到各处的不同模块,这和普通裸机代码中.c和.h在一起的结构不一样 */
|-- bundle.json
|-- components /* 支持的插件,可选 */
| |-- BUILD.gn
| |-- backtrace
| | |-- BUILD.gn
| | |-- los_backtrace.c
| | `-- los_backtrace.h
| |-- cppsupport /* 是否支持C++ */
| | |-- BUILD.gn
| | |-- los_cppsupport.c
| | `-- los_cppsupport.h
| |-- cpup
| | |-- BUILD.gn
| | |-- los_cpup.c
| | `-- los_cpup.h
| |-- debugtools
| | |-- BUILD.gn
| | |-- los_debugtools.h
| | |-- los_hwidump.c
| | |-- los_schedtrace.c
| | `-- los_stackdump.c
| |-- dynlink
| | |-- BUILD.gn
| | |-- los_dynlink.c
| | |-- los_dynlink.h
| | `-- script
| | `-- so_parse
| |-- exchook
| | |-- BUILD.gn
| | |-- los_exc_info.c
| | |-- los_exc_info.h
| | |-- los_exchook.c
| | `-- los_exchook.h
| |-- fs /* 操作系统的四大模块之一:文件系统 */
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- fatfs /* FAT32最常用,可以用于U盘、Flash、网盘等 */
| | | |-- BUILD.gn
| | | |-- Kconfig
| | | |-- fatfs.c
| | | |-- fatfs.h
| | | `-- fatfs_conf.h
| | |-- littlefs
| | | ......
| | `-- vfs
| | ......
| |-- iar_tls
| | |-- los_iar_tls.c
| | `-- los_iar_tls.h
| |-- lmk
| | |-- BUILD.gn
| | |-- los_lmk.c
| | `-- los_lmk.h
| |-- lms
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- lms_libc.c
| | |-- los_lms.c
| | |-- los_lms.h
| | `-- los_lms_pri.h
| |-- net /* 操作系统的第五大功能:通信/网络通信 */
| | |-- BUILD.gn
| | |-- lwip-2.1 /* 像网络、U盘之类的大型通信类驱动代码会很多,有时甚至会比操作系统本身的代码量还多 */
| | | |-- BUILD.gn
| | | |-- enhancement
| | | | `-- src
| | | | |-- fixme.c
| | | | `-- lwip_ifaddrs.c
| | | |-- lwip_porting.gni
| | | `-- porting
| | | |-- include
| | | | |-- arch
| | | | | |-- cc.h
| | | | | |-- perf.h
| | | | | `-- sys_arch.h
| | | | |-- lwip
| | | | | |-- api_shell.h
| | | | | |-- dhcp.h
| | | | | |-- inet.h
| | | | | |-- lwipopts.h
| | | | | |-- netdb.h
| | | | | |-- netif.h
| | | | | |-- netifapi.h
| | | | | `-- sockets.h
| | | | `-- lwipopts.h
| | | `-- src
| | | |-- api_shell.c
| | | |-- driverif.c
| | | |-- lwip_init.c
| | | |-- netdb_porting.c
| | | |-- sockets_porting.c
| | | `-- sys_arch.c
| | `-- test
| | ......
| |-- power /* 低功耗模块 */
| | |-- BUILD.gn
| | |-- los_pm.c
| | `-- los_pm.h
| |-- security /* 权限管理模块 */
| | |-- BUILD.gn
| | |-- box
| | | |-- BUILD.gn
| | | |-- los_box.c
| | | `-- los_box.h
| | |-- syscall
| | | |-- BUILD.gn
| | | |-- los_syscall.c
| | | |-- los_syscall.h
| | | |-- pthread_syscall.c
| | | `-- syscall_lookup.h
| | `-- userlib
| | `-- BUILD.gn
| |-- shell /* 命令行 */
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- include
| | | |-- shcmd.h
| | | |-- shcmdparse.h
| | | |-- shell.h
| | | |-- shmsg.h
| | | `-- show.h
| | `-- src
| | |-- base
| | | |-- shcmd.c
| | | |-- shcmdparse.c
| | | |-- shmsg.c
| | | `-- show.c
| | `-- cmds
| | |-- date_shell.c
| | |-- fullpath.c
| | |-- mempt_shellcmd.c
| | |-- shell_shellcmd.c
| | |-- task_shellcmd.c
| | `-- vfs_shellcmd.c
| |-- signal
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- los_signal.c
| | `-- los_signal.h
| `-- trace /* 调试程序用 */
| ......
|-- config.gni
|-- config_iccarm.gni
|-- drivers /* 操作系统四大模块之二:设备管理 */
| `-- Kconfig
| /* 具体的外设驱动由芯片原厂在上层文件夹的device和vendor文件夹中提供 */
|-- figures /* 几张介绍本操作系统内核结构的图片 */
| ......
|-- kal
| |-- BUILD.gn
| |-- Kconfig
| |-- cmsis /* ARM格式的中间件统一接口 */
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- cmsis_liteos2.c
| | |-- cmsis_os.h
| | |-- cmsis_os2.h
| | |-- hos_cmsis_adp.h
| | `-- kal.h
| |-- libc /* C语言标准库,其实现一般都是在编译器中,由芯片原厂完成,所以这里只有头文件 */
| | |-- BUILD.gn
| | |-- Kconfig
| | |-- iccarm
| | | `-- BUILD.gn
| | |-- musl
| | | `-- BUILD.gn
| | `-- newlib
| | |-- BUILD.gn
| | `-- porting
| | |-- include
| | | |-- arpa
| | | | `-- inet.h
| | | |-- byteswap.h
| | | |-- dirent.h
| | | |-- endian.h
| | | |-- ifaddrs.h
| | | |-- limits.h
| | | |-- malloc.h
| | | |-- mqueue.h
| | | |-- net
| | | | |-- ethernet.h
| | | | |-- if.h
| | | | `-- if_arp.h
| | | |-- netdb.h
| | | |-- netinet
| | | | |-- if_ether.h
| | | | |-- in.h
| | | | |-- ip.h
| | | | `-- tcp.h
| | | |-- poll.h
| | | |-- semaphore.h
| | | |-- sys
| | | | |-- _pthreadtypes.h
| | | | |-- fcntl.h
| | | | |-- features.h
| | | | |-- ioctl.h
| | | | |-- mount.h
| | | | |-- prctl.h
| | | | |-- sched.h
| | | | |-- select.h
| | | | |-- socket.h
| | | | |-- statfs.h
| | | | |-- uio.h
| | | | `-- un.h
| | | `-- time.h
| | `-- src
| | |-- hook_adapt.c
| | `-- network
| | |-- htonl.c
| | |-- htons.c
| | |-- ntohl.c
| | `-- ntohs.c
| |-- libsec
| | `-- BUILD.gn
| `-- posix /* 操作系统给应用暴露出来的通用接口 */
| |-- BUILD.gn
| |-- Kconfig
| |-- include
| | |-- libc.h
| | |-- pipe_impl.h
| | |-- poll_impl.h
| | `-- rtc_time_hook.h
| `-- src
| |-- errno.c
| |-- libc.c
| |-- libc_config.h
| |-- malloc.c /* 操作系统的四大模块之三:内存管理 */
| |-- map_error.c
| |-- map_error.h
| |-- mqueue.c
| |-- mqueue_impl.h
| |-- pipe.c
| |-- poll.c
| |-- pthread.c
| |-- pthread_attr.c
| |-- pthread_cond.c
| |-- pthread_mutex.c
| |-- semaphore.c
| |-- signal.c
| |-- time.c
| `-- time_internal.h
|-- kernel /* 操作系统的四大模块之四:进程管理 */
| |-- BUILD.gn
| |-- include
| | |-- los_config.h
| | |-- los_event.h
| | |-- los_membox.h
| | |-- los_memory.h
| | |-- los_mux.h
| | |-- los_queue.h
| | |-- los_sched.h
| | |-- los_sem.h
| | |-- los_sortlink.h
| | |-- los_swtmr.h
| | |-- los_task.h
| | `-- los_tick.h
| `-- src
| |-- los_event.c
| |-- los_init.c
| |-- los_mux.c
| |-- los_queue.c
| |-- los_sched.c
| |-- los_sem.c
| |-- los_sortlink.c
| |-- los_swtmr.c
| |-- los_task.c
| |-- los_tick.c
| `-- mm
| |-- los_membox.c
| `-- los_memory.c
|-- liteos.gni
|-- testsuites /* 移植系统后进行自测用的,不用关心 */
| ......
|-- tools
| `-- mem_analysis.py
`-- utils
|-- BUILD.gn
|-- internal
| |-- los_hook_types.h
| `-- los_hook_types_parse.h
|-- los_compiler.h
|-- los_debug.c
|-- los_debug.h /* 串口调试输出的级别 */
|-- los_error.c
|-- los_error.h /* 所有模块都会用的,要返回的错误码 */
|-- los_hook.c
|-- los_hook.h
|-- los_list.h /* 链表,队列、模块缓存的基础 */
`-- los_reg.h
198 directories, 1571 files
复制代码
底子的操作体系内核代码里没有太多可借鉴的软件结构,它们都是针对某一项功能而实现一项功能,通用的东西较少,接下来我会从操作体系移植的角度稍微分析一下。
为了能让各人更好的学习鸿蒙(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.鸿蒙南向开辟方向
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
鼠扑
论坛元老
这个人很懒什么都没写!
楼主热帖
Java 基于Apache POI实现Excel读写操作 ...
Dapr 知多少 | 分布式应用运行时 ...
XAF新手入门 - 类型子系统(Types Info ...
springboot开启单元测试的方法分享 ...
5.15日 搭建青龙面板教程——狗东跑跑 ...
记录一次NoSuchMethodError问题的解决 ...
C#生成putty格式的ppk文件(支持passph ...
Python 封装SNMP调用接口
风险洞察之事件总线的探索与演进 ...
SQLSERVER大小写转换方法
标签云
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
分布式数据库
快速回复
返回顶部
返回列表