11 开源鸿蒙OpenHarmony轻量系统源码分析
开源鸿蒙轻量系统源码分析
| 作者 | 将狼才鲸 |
|---|---|
| 日期 | 2024-03-28 |
一、前言
-
之前单独的LiteOS是通过Makefile编译的,当前的开源鸿蒙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编写指南
- 轻量系统STM32F407芯片移植案例
二、源码分析
- 源码下载: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.h198 directories, 1571 files
- 基础的操作系统内核代码里没有太多可借鉴的软件结构,它们都是针对某一项功能而实现一项功能,通用的东西较少,接下来我会从操作系统移植的角度稍微分析一下。
相关文章:
11 开源鸿蒙OpenHarmony轻量系统源码分析
开源鸿蒙轻量系统源码分析 作者将狼才鲸日期2024-03-28 一、前言 之前单独的LiteOS是通过Makefile编译的,当前的开源鸿蒙LiteOS-M和LiteOS-A是通过gn和ninja编译的。 Gitee官方只介绍了LiteOS-M的gn ninja编译的流程,针对M3使用Keil编译的流程可能要参…...
专题:一个自制代码生成器(嵌入式脚本语言)之应用实例
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 专题:一个自制代码…...
Appium设备交互API
设备交互API指的是操作设备系统中的一些固有功能,而非被测程序的功能,例如模拟来电,模拟发送短信,设置网络,切换横竖屏,APP操作,打开通知栏,录屏等。 模拟来电 make_gsm_call(phon…...
Qlib-Server部署
Qlib-Server部署 介绍 构建Qlib服务器,用户可以选择: 一键部署Qlib服务器逐步部署Qlib服务器一键部署 Qlib服务器支持一键部署,用户可以选择以下两种方法之一进行一键部署: 使用docker-compose部署在Azure中部署使用docker-compose进行一键部署 按照以下步骤使用docker…...
CMC学习系列 (4):β段CMC可以作为一种中风治疗的生物标志物和治疗靶点
CMC学习系列:β段CMC可以作为一种中风治疗的生物标志物和治疗靶点 0. 引言1. 主要贡献2. 方法2.1 相干源动态成像2.2 源统计分析 3. 结果3.1 训练前后比较3.2 源代码分析3.3 皮质重叠的分组分析 4. 讨论5. 总结欢迎来稿 论文地址:https://www.sciencedirect.com/sci…...
jmeter中参数加密
加密接口常用的方式有: MD5,SHA,HmacSHA RSA AES,DES,Base64 压测中有些参数需要进行加密,加密方式已接口文档为主。 MD5加密 比如MD5加密的接口文档: 请求URL:http://101.34.221…...
YOLOv8改进 | 检测头篇 | 2024最新HyCTAS模型提出SAttention(自研轻量化检测头 -> 适用分割、Pose、目标检测)
一、本文介绍 本文给大家带来的改进机制是由全新SOTA分割模型(Real-Time Image Segmentation via Hybrid Convolutional-TransformerArchitecture Search)HyCTAS提出的一种SelfAttention注意力机制,论文中叫该机制应用于检测头当中(论文中的分割效果展现目前是最好的)。我…...
verilog设计-cdc:多比特信号跨时钟域(DMUX)
一、前言 多比特一般为数据,其在跨时钟域传输的过程中有多种处理方式,比如DMUX,异步FIFO,双口RAM,握手处理。本文介绍通过DMUX的方式传输多比特信号。 二、DMUX同步跨时钟域数据 dmux表示数据分配器,该方…...
服务器停止解析域名,但仍然可以访问到
1.centos7 如何刷新dns缓存 在CentOS 7上,DNS缓存由nscd(Name Service Cache Daemon)管理,如果系统上安装了nscd,可以通过清除nscd缓存来刷新DNS缓存。 要刷新DNS缓存,请执行以下命令: sudo …...
Centos系统与Ubuntu系统防火墙区别,以及firewalld、ufw和iptables三者之前的区别。
现在大多数Centos系统上的防火墙是firewalld,Ubuntu系统上是ufw,而iptables是最底层的防火墙工具。iptables是Linux系统中最早的防火墙工具,并且被许多不同的Linux发行版使用,包括CentOS和Ubuntu。然而,CentOS 7及更高…...
ES6 学习(三)-- es特性
文章目录 1. Symbol1.1 使用Symbol 作为对象属性名1.2 使用Symbol 作为常量 2. Iterator 迭代器2.1 for...of循环2.2 原生默认具备Interator 接口的对象2.3 给对象添加Iterator 迭代器2.4 ... 解构赋值 3. Set 结构3.1 初识 Set3.2 Set 实例属性和方法3.3 遍历3.4 相关面试题 4…...
使用ChatGPT的场景之gpt写研究报告,如何ChatGPT写研究报告
推荐写研究报告使用智能站: dayfire.cn/ 1. 确定研究主题 明确主题:在开始之前,你需要有一个清晰的研究主题。这将帮助AI更好地理解你的需求…...
librdkafka的简单使用
文章目录 摘要kafka是什么安装环境librdkafka的简单使用生产者消费者 摘要 本文是Getting Started with Apache Kafka and C/C的中文版, kafka的hello world程序。 本文完整代码见仓库,这里只列出producer/consumer的代码 kafka是什么 本节来源&#…...
【iOS ARKit】播放3D音频
3D音频 在前面系列中,我们了解如何定位追踪用户(实际是定位用户的移动设备)的位置与方向,然后通过摄像机的投影矩阵将虚拟物体投影到用户移动设备屏幕。如果用户移动了,则通过VIO 和 IMU更新用户的位置与方向信息&…...
ES学习日记(四)-------插件head安装和一些配套插件下载
前言 接上节,第三方插件选择了时间久,功能丰富,长得丑的head,head 插件在ES 5版本以前开箱即用非常简单,ES 5版本以后需要运行在node环境下,所以我们要先准备一下环境 一.安装Git 不装了,明儿再说,看会儿手机准备下班!!!!!!!!!...
flask+uwsgi+云服务器 部署服务端
参考:使用uwsgi部署flask 报错 “找不到Python应用程序,请检查启动日志以查找错误” 或者: no python application found, check your startup logs for errors debug 过程:查到Python uWSGI 安装配置 里面说,先写测…...
linux学习之路 -- 普通用户添加进sudoer列表
在Linux系统里,很多的操作普通用户是不能执行的,所以我们需要对普通用户进行提权操作,可我们会发现,一开始没有配置的话,是无法的提权操作的,下面我将介绍普通用户该如何配置sudoer列表。 首先以root 的身…...
【分类评估指标,精确率,召回率,】from sklearn.metrics import classification_report
from: https://zhuanlan.zhihu.com/p/368196647 多分类 from sklearn.metrics import classification_report y_true [0, 1, 2, 2, 2] y_pred [0, 0, 2, 2, 1] target_names [class 0, class 1, class 2] # print(classification_report(y_true, y_pred, targe…...
element-ui autocomplete 组件源码分享
紧接着 input 组件的源码,分享带输入建议的 autocomplete 组件,在 element-ui 官方文档上,没有这个组件的 api 目录,它的 api 是和 input 组件的 api 在一起的,看完源码之后发现,源码当中 autocomplete 组件…...
视觉SLAM理论与实践的学习链接汇总
仅供学习,在此感谢所有乐于分享知识的大佬们~ 一、 ORB_SLAM理论 视觉SLAM 前端 后端 回环 建图 1、 前端视觉里程计 1.1 特征点法 一文带你搞懂相机内参外参(Intrinsics & Extrinsics)-知乎 VSLAM 笔记——我们如何通过图像来计算位姿的变化ÿ…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
