0 OpenHarmony开源鸿蒙NEXT星河版内核嵌入式编程
开源鸿蒙NEXT星河版内核嵌入式编程
作者 | 将狼才鲸 |
---|---|
创建日期 | 2024-03-08 |
- CSDN文章阅读地址
- Gitee文章下载地址
一、前景提要
-
2024年1月18日,华为放出HarmonyOS NEXT 鸿蒙星河版开发者预览版本(不是HarmonyOS NEXT版,是HarmonyOS NEXT星河版),首次提到用鸿蒙内核(暂命名)取代了Linux内核。
- 该内核源码还未放出,当前能下载到的还是OpenHarmony4.1的版本,里面的轻型小型系统使用的还是LiteOS内核,标准系统使用的还是Linux内核。
- 等纯国产内核释出后,我会重新修改此文档。
-
开源鸿蒙OpenHarmony和华为HarmonyOS是两样东西!华为鸿蒙里面包含非开源代码。因为很多嵌入式产品单价低、利润薄、出货量大,所以我只会跟踪开源鸿蒙OpenHarmony的鸿蒙内核和底层代码,对华为鸿蒙不涉及。
-
参考网址:
- 开源鸿蒙系统介绍-OpenHarmony开源项目
- Gitee开源鸿蒙介绍-OpenHarmony Gitee源码仓库
- 开源鸿蒙子系统介绍
- 设备开发,系统移植介绍-docs/ zh-cn / device-dev
- 下载源码时的顶层仓库-OpenHarmony / manifest
- 下载源码的4种方法-获取源码
- b站视频教程-OpenHarmony开发者
- 一些开源鸿蒙的板子-学习-开发样例
- 一些开源鸿蒙的产品-兼容性测评结果
- 设备开发的官方教程-学习-学习路径
- 开发板和模块开发的官方教程-学习-在线课程-全部课程
- 开源鸿蒙系统介绍-OpenHarmony开源项目
二、OpenHarmony源码下载、编译与运行
1、源码整体感知
- 这是OpenHarmony的源码目录:
jim@ubuntu:~/OpenHarmony$ ls -a
. build developtools foundation .repo
.. build.py device .gn test
applications build.sh docs kernel third_party
base commonlibrary drivers productdefine vendor159,898 items, totalling 11.6 GB当前下载的是单一芯片单一系统类型的代码,总量11G,如果是全量代码,OpenHarmony4.0会有30G。
-
OpenHarmony有Gitee源码仓库:https://gitee.com/openharmony ,但是和其它简单的Git仓库不一样,它不是通过 git clone xxx 一个命令就能下载全量代码的,而是和安卓类似,需要用到manifest这个顶层仓库,并且通过repo工具把很多个Git仓库的特定版本拉到本地同一个目录。
- 顶层目录下没有.git的文件夹,只有.repo的文件夹,而底下的每个文件夹可能就是单独的Git仓库,有自己的.git隐藏文件夹
-
参考网址:
- 官方文档-获取源码
- 通过特定命令单独获取OpenHarmony标准、轻量、小型系统指定开发板的代码
- 华为云14天鸿蒙设备开发-Day1源码获取
- 使用码云(Gitee)获取开源鸿蒙+欧拉系统源代码
- OpenHarmony-v4.1-beta1.md
- 海思(二)OpenHarmony获取源码
- git repo工具详细使用教程——彻底学会Android repo的使用
- 如果获取鸿蒙源代码?
-
特定的开发板介绍:
- OpenHarmony开发板列表,官方支持的所有开发板和芯片
- 轻量、小型、标准系统的区别-快速入门概述
- OpenHarmony / docs 各个子系统介绍
-
官方的轻型系统开发板中我中意的有:瑞芯微RK2206和STM32F407IGT6,信息如下
- OpenHarmony / device_soc_rockchip
- OpenHarmony / device_board_lockzhiner
- OpenHarmony / vendor_lockzhiner
-
下载源码时可以指定目标硬件,开源鸿蒙的源码下载步骤和安卓类似,使用repo工具和https://gitee.com/openharmony/manifest 这个仓库,manifet是组织了很多独立的git仓库,一起给你按tag拉出一份全量代码;
- 从manifest仓库你们的readme可知,我下载时可以指明参数,例如 ohos:mini 轻型系统,ohos:chipset 选择一款芯片
- repo init -u URL -b master 下载整个系统全量代码,30多G
- repo init -u URL -b master -g ohos:mini 下载轻量系统全量代码。
- repo init -u URL -b master -m chipsets/chipsetN.xml -g ohos:mini 下载轻量系统指定芯片的代码。
- 在 https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/dev-board-on-the-master.md 里面有支持的所有开发板和芯片,我选中了ARM Cortex-M内核的Niobe407开发板的STM32F407IGT6芯片,小凌派-RK2206开发板的RK2206,还有使用QEMU虚拟机的虚拟开发板;
- 它们的型号和配置是 https://gitee.com/openharmony/manifest/blob/master/chipsets/niobe407/niobe407.xml 、 https://gitee.com/openharmony/manifest/blob/master/chipsets/lockzhiner/lingpi.xml 、 https://gitee.com/openharmony/manifest/blob/master/chipsets/qemu/qemu.xml
2、源码下载
2.1、最简单的下载方式
- 推荐你下载OpenHarmony4.1全量代码,最简单,直接网址下载,总共30G左右,不用解决Linux环境下的各种依赖错误。
- 下载网址 https://repo.huaweicloud.com/openharmony/os/4.1-Beta1/code-v4.1-Beta1.tar.gz
- 出了新版本后也是进入上面类似的网址,进入新版本的文件夹种下载压缩包即可。
2.2、常规的下载方式
- 如果你有过Linux内核开发经验,知道接下来要使用OpenHarmony在哪款板子上运行,则建议你下载特定类型(轻型小型标准)、特定芯片的系统,此下载步骤需要在Linux发行版如Ubuntu下进行,总共11G左右;
- 安装VMware或者VMware-Player或者Virual Box虚拟机,初学者建议使用VMware,网上教程更多,过程略;
- 安装Ubuntu系统,过程略,我使用的是Ubuntu18.04.6;
- 执行命令:
推荐使用Ubuntu18.04及以上版本,Ubuntu16.04不行,Windows + MSYS2 + MinGW64不行;安装Ubuntu后把“电源”和“隐私”的设置都改成永远不锁屏,否则一锁屏后下载就会停住,需要退出重新来,容易导致文件冲突;建议在你创建好的文件夹内打开命令行,如果你在~家目录打开命令行,则下载的源码文件都在家目录下,会和其它文件混在一起,文件夹很多,分辨不出哪个是系统原有的,想再剪切到别的文件就困难了。进入Ubuntu系统后,在桌面上按鼠标右键,然后点击打开终端这一项,老系统可以按Ctrl + Alt + T打开命令行终端,默认是在~家目录mkdir ~/openHarmony /* 家目录下新建文件夹 */cd ~/openHarmony /* 进入新建的文件夹 */sudo apt-get install git /* 安装Git软件 */git config --global user.name jimXXX /* 配置Git,输入你自己的名字 */git config --global user.email jimXXX@163.com /* 配置Git,输入你自己的邮箱 */git config --global credential.helper store /* 配置Git为自动保存账号密码 */ssh-keygen -t rsa -C jimXXX@163.com /* 生成Gitee网站要用到的密钥,这里是输入你自己的邮箱,回车三次 */gedit ~/.ssh/id_rsa.pub /* 复制密钥,复制里面全部的文本内容 */打开网址 https://gitee.com/ 注册账号,点击齿轮状的设置,点击安全设置中的SSH公钥,将刚刚复制的内容填入到“公钥”这个文本框内,点击确定,输入密码,即添加完Git公钥
mkdir ~/binsudo apt install curlcurl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo chmod a+x ~/bin/reposudo apt install python3-pip如果用了Ubuntu老版本系统,如Ubuntu18.04,则还要继续执行下面步骤:sudo apt-get install python3echo alias python=python3 >> ~/.bashrcsource ~/.bashrcpython3 --versionwhereis python3sudo ln -s /usr/bin/python3 /usr/bin/pythonpip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests如果使用了Ubuntu16.04及以前的系统,这条命令可能会报错,需要你自己解决gedit ~/.bashrc 打开桌面~下的.bashrc隐藏文件夹在最后面加上一句 export PATH=~/bin:$PATH,保存退出source ~/.bashrc 生效环境变量echo $PATH 查看环境变量repo init -u https://gitee.com/openharmony/manifest -b master -m chipsets/niobe407.xml -g ohos:mini 做好下载指定开发板指定芯片源码的准备,我这里是下载ARM Cortex-M内核的Niobe407开发板的STM32F407IGT6芯片如果下载全量代码,则使用 repo init -u git@github.com:openharmony/manifest.git -b master --no-repo-verify如果下载QEMU模拟器的代码,则使用 repo init -u https://gitee.com/openharmony/manifest -b master -m chipsets/qemu.xml -g ohos:minirepo sync -c 开始下载,等待时间会比较久需要设置电脑不待机,如果中途卡住,可以Ctrl + C退出当前命令,并再次repo sync -c继续下载如果继续下载有冲突,则手动删除有冲突的文件夹后继续使用repo sync -c你在哪个文件夹路径使用repo init,就会在这个路径形成一个.repo隐藏文件夹,已经下载完的文件夹会在当前目录中出现sudo apt-get install git-lfsrepo forall -c 'git lfs pull'继续拉取大文件
- 下载完之后的文件结构如下:
jim@ubuntu:~/OpenHarmony$ ls -a
. build developtools foundation .repo
.. build.py device .gn test
applications build.sh docs kernel third_party
base commonlibrary drivers productdefine vendor159,898 items, totalling 11.6 GB当前下载的是单一芯片单一系统类型的代码,总量11G,如果是全量代码,OpenHarmony4.0会有30G。
- repo仓库是由多个git仓库拼起来的,源码根目录下是.repo隐藏文件夹,里面的某些子文件夹下如果有.git隐藏文件夹,那么它就是一个独立的git仓库
3、编译系统,生成OHOS_Image可执行文件
- 编译OpenHarmony源码前先下载源码
- 步骤见:开源鸿蒙OpenHarmony niobe407 STM32F407IGT6芯片轻型系统全量源码4.1版本下载流程
- 确定你要编译哪一块开发板,我这里使用QEMU模拟器虚拟开发板:
- 可以编译的开发板和芯片列表,含QEMU模拟器 - 编译形态整体说明
- QEMU模拟器 + ARM Coterx-M核 + mini轻型系统的配置有:
- qemu_mini_system_demo arm_mps2_an386 qemu liteos_m mini arm-cortex-m4
- qemu_cm55_mini_system_demo arm_mps3_an547 qemu liteos_m mini arm-cortex-m55
- Qemu Arm Cortex-m4 mps2-an386 教程
- Qemu Arm Cortex-m55 mps3-an547 教程
- QEMU(Quick Emulator)鸿蒙QEMU模拟器操作指南
- 下载:安装VMware虚拟机 + Ubuntu发行版系统 + Git软件 + repo软件 + Python
- 如果你之前不是下载的全量30G代码,是下载的别的开发板的代码,那么在下载的openHarmony目录下再执行一次下面的命令,多下一份qemu模拟器的源码;
- 使用 repo init -u https://gitee.com/openharmony/manifest -b master -m chipsets/qemu.xml -g ohos:mini 初始化对应于QEMU模拟器(类似于开发板)的全套源码
- 按之前的的步骤接着下载鸿蒙源码
- repo sync -c
- repo forall -c ‘git lfs pull’
3.1、最简单的编译流程,使用Docker
- 使用鸿蒙官方已经准备好的Docker环境
- Docker编译环境
- sudo apt install docker.io
- sudo docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_mini:3.2
- cd ~/openHarmony 进入到你下载的开源鸿蒙源码的路径,再执行下面这一条
- docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_mini:3.2
- 这时已经进入到docker的虚拟环境
jim@ubuntu:~/openHarmony$ sudo docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_mini:3.2
root@949f932a2f80:/home/openharmony# ls
applications build build.sh developtools docs foundation ohos_config.json prebuilts qemu-run third_party
base build.py commonlibrary device drivers kernel out productdefine test vendor
root@949f932a2f80:/home/openharmony#
-
python3 build.py -p qemu_mini_system_demo@ohemu
- 你要编译什么板子,就使用什么命令,我这里是编译qemu的轻型系统
- 开始编译轻型系统,编译时间会需要很久,十几分钟……
- 编译工具分为轻型、小型、标准,而芯片、开发板的归属也分为这三种,下载的工具和你编译的参数必须属于同一种类,否则会编译各种报错!!!
-
在编译结束后,编译所生成的文件都会被存放在out/{device_name}/目录下,结果镜像输出在out/{device_name}/packages/phone/images/目录下。
-
如果遇到报错,则解决报错
-
编译成功后是这样的打印:
[OHOS INFO] [1614/1615] STAMP obj/build/ohos/images/make_images.stamp
[OHOS INFO] [1615/1615] STAMP obj/build/core/gn/images.stamp
[OHOS INFO] ccache_dir = /root/.ccache, ccache_exec = /usr/bin/ccache
[OHOS INFO] --------------------------------------------
[OHOS INFO] ccache summary:
[OHOS INFO] ccache version: 3.7.7
[OHOS INFO] cache hit (direct): 0
[OHOS INFO] cache hit (preprocessed): 0
[OHOS INFO] cache miss: 0
[OHOS INFO] hit rate: 0.00%
[OHOS INFO] miss rate: 0.00%
[OHOS INFO] Cache size (GB):
[OHOS INFO] ---------------------------------------------
[OHOS INFO] c targets overlap rate statistics
[OHOS INFO] subsystem files NO. percentage builds NO. percentage overlap rate
[OHOS INFO] hiviewdfx 12 0.8% 12 0.8% 1.00
[OHOS INFO] kernel 902 63.5% 902 63.5% 1.00
[OHOS INFO] security 61 4.3% 61 4.3% 1.00
[OHOS INFO] startup 26 1.8% 26 1.8% 1.00
[OHOS INFO] systemabilitymgr 15 1.1% 15 1.1% 1.00
[OHOS INFO] thirdparty 393 27.7% 393 27.7% 1.00
[OHOS INFO]
[OHOS INFO] c overall build overlap rate: 1.00
[OHOS INFO]
[OHOS INFO]
[OHOS INFO] qemu_mini_system_demo@ohemu build success
[OHOS INFO] Cost time: 0:05:47
root@ff38bf1e3e75:/home/openharmony# jim@ubuntu:~/openHarmony/out/arm_mps2_an386/qemu_mini_system_demo$ ls
all_parts_host.json build_configs config.h kconfig_files.txt OHOS_Image.bin src_installed_parts.json
all_parts_info.json build.log error.log libs OHOS_Image.map src_sa_infos_tmp.json
args.gn build.ninja etc NOTICE_FILES OHOS_Image.sym.sorted startup
binary_installed_parts.json build.ninja.d gen obj packages thirdparty
build.1709259296.3884952.log build.trace.gz hiviewdfx OHOS_Image security toolchain.ninja
build.1709259767.6772568.log config.gni kconfig_env.txt OHOS_Image.asm sorted_action_duration.txt
jim@ubuntu:~/openHarmony/out/arm_mps2_an386/qemu_mini_system_demo$
-
生成的系统镜像image是这里面的OHOS_Image文件
-
如需退出Docker,执行exit命令即可。这个命令会停止当前的Docker容器,并返回到您的操作系统。
-
下一步就可以把编译好的操作系统在QEMU模拟器中运行起来啦。
3.2、使用ohos-build工具编译
- 最常用的编译方式是使用hb命令,也就是ohos-build工具,这是鸿蒙自己的Python工具
-
了解OpenHarmony-编译
-
OpenHarmony支持hb和build.sh两种编译方式。
-
安装hb编译工具
-
安装库和工具集
-
.sh方式编译构建指导
-
python3 -V 查看python版本,如果是3.8以下,则:
- sudo apt install python3.8
- sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
- sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
- sudo update-alternatives --config python3
- python3 -V
-
python3 -m pip install --user ohos-build
- pip3是Python的包管理工具,用于安装、升和管理Python包
- 需要python3.8以上的版本
-
- 安装流程介绍:
- hb安装异常处理
- 快速入门-如何编译程序
- 安装库和工具集-编译流程
- 如果你是Ubuntu18.04,则先执行
- cd /usr/lib/python3/dist-packages
- cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so apt_pkg.cpython-39m-x86_64-linux-gnu.so apt_pkg.so
- cd -
- 再安装依赖库
sudo apt-get update && sudo apt-get install binutils binutils-dev git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib gcc-arm-linux-gnueabi libc6-dev-i386 libc6-dev-amd64 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby genext2fs device-tree-compiler make libffi-dev e2fsprogs pkg-config perl openssl libssl-dev libelf-dev libdwarf-dev u-boot-tools mtd-utils cpio doxygen liblz4-tool openjdk-8-jre gcc g++ texinfo dosfstools mtools default-jre default-jdk libncurses5 apt-utils wget scons python3.8-distutils tar rsync git-core libxml2-dev lib32z-dev grsync xxd libglib2.0-dev libpixman-1-dev kmod jfsutils reiserfsprogs xfsprogs squashfs-tools pcmciautils quota ppp libtinfo-dev libtinfo5 libncurses5-dev libncursesw5 libstdc++6 gcc-arm-none-eabi vim ssh locales libxinerama-dev libxcursor-dev libxrandr-dev libxi-dev
-
仔细看安装后的信息,如果提示有哪些包未安装成功,则你需要单独安装
sudo apt-get install g++-multilib
- sudo apt-get install gcc-arm-linux-gnueabi
- sudo apt-get install gcc-multilib
- sudo apt-get install lib32ncurses5-dev
- sudo apt-get install lib32z1-dev
- sudo apt-get install libc6-dev-i386
- sudo apt-get install gcc-7-arm-linux-gnueabi
- sudo apt-get install libc6-amd64:i386
- sudo aptitude install gcc-multilib:i386 使用aptitude命令可以自动解决包依赖关系,需要先安装aptitude软件
-
已经按前面的流程下载好源码
-
cd ~/openHarmony 进入到你下载的源码根目录
-
bash build/prebuilts_download.sh 安装和芯片相关的编译器和二进制工具,全自动的,会下载的同时进行安装,要等待一段时间,有进度条
-
python3 -m pip install --user build/hb
-
gedit ~/.bashrc
-
将 export PATH=~/.local/bin:$PATH 加入到最后一行并保存退出
-
source ~/.bashrc
-
hb --help 这个命令执行时可能有报错,有什么错误就解决什么错误,例如用下面方法解决报错
- python3 -m pip uninstall ohos-build
- python3 -m pip install --user ohos-build==0.4.3
-
hb set 进行编译设置
- 第一步目录输入. 选择源码根目录的当前目录
- 第二步选择开发板,我使用上下方向键选择qemu_mini_system_demo这款qemu的模拟器开发板,ARM Cortex-M4内核的虚拟芯片
- 编译形态整体说明,含QEMU,可以编译哪些开发板和芯片
- Qemu Arm Cortex-m4 mps2-an386 教程
- qemu_mini_system_demo arm_mps2_an386 qemu liteos_m mini arm-cortex-m4
jim@ubuntu:~/openHarmony$ hb set
[OHOS INFO] Input code path: .
OHOS Which product do you need? qemu_mini_system_demo
-
hb build -f 开始编译,有报错则处理报错
-
出现build success表示编程成功,然后进行烧录,或者直接用QEMU模拟器进行运行。
-
参考资料:
- 基于OpenHarmony搭建的Qemu仿真实验环境
- ohos-build 安装失败分析
- 基于Ubuntu20.04搭建OpenHarmony v3.0.6的qemu仿真环境
- 基于OpenHarmony搭建的Qemu仿真实验环境
- 搭建一个鸿蒙运行环境,来一窥神秘鸿蒙
3.3 使用传统Linux脚本方式编译
-
如果你用hb的方式编译始终出错,那么可以试试使用传统.sh脚本的方式
- 使用build.sh脚本编译源码
-
./build.sh --product-name qemu_mini_system_demo --ccache /* 需要换成你自己开发板的名称,我这里使用的是QEMU模拟器的虚拟开发板 */
- 有报错则解决报错
-
检查编译结果。编译完成后,log中显示如下:
- post_process
- =====build name successful.
- 编译所生成的文件都归档在out/{device_name}/目录下,结果镜像输出在out/{device_name}/packages/phone/images/ 目录下。
-
如果依然编译有报错,那还可以试试Docker
-
如果你只是想编译应用程序,那么可以使用DevEco Device Tool
- 应用编译
3、系统运行
- 如果你是在某一块开发板上运行开源鸿蒙系统,那么请参照该开发板对应的sdk文档
- 我准备在QEMU模拟器中运行ARM Cortex-M4的轻型开源鸿蒙系统
- 官方支持的开发板和模拟器种类-编译形态整体说明
- 已支持的示例工程,Qemu模拟器: arm_mps2_an386、esp32、riscv32_virt、SmartL_E802
- Qemu Arm Cortex-m4 mps2-an386 教程
- 在电脑上安装QEMU模拟器软件,可以在Windows下安装,也可以在Linux发行版下安装
- Qemu安装-QEMU Quick Emulator QEMU在Ubuntu下的安装流程;是下载源码后再编译,编译速度很慢,可以make只编译ARM部分的,这样编译速度会快很多
- …/configure --target-list=arm-softmmu,arm-linux-user
- make -j4
- sudo make install
- 在Windows下的安装流程更简单
- Windows的所有安装包 安装6.2.0及以上的版本都可以
- 官网下载很慢,可以用国内网站下载 https://www.mydown.com/soft/172/726002172.shtml
- Windows下安装后需要手动配置好QEMU的环境变量,或者直接进入到D:\Program Files\qemu的目录下打开CMD命令行界面,这样才能调用qemu的命令
- Qemu安装-QEMU Quick Emulator QEMU在Ubuntu下的安装流程;是下载源码后再编译,编译速度很慢,可以make只编译ARM部分的,这样编译速度会快很多
- Ubuntu回到OpenHarmony源码根目录下,使用命令行用QEMU模拟器运行开源鸿蒙系统
- ./qemu-run --help
- ./qemu-run -e out/arm_mps2_an386/qemu_mini_system_demo/OHOS_Image
- qemu-run是个脚本,可以用文本文件打开,它里面也是调用的qemu-system-arm这个命令,只是自动传入了需要的参数
- 这是开源鸿蒙在QEMU硬件模拟器中运行的结果,当前源码中对QEMU Cortex-M4的适配有点问题,会有程序跑飞的报错,你可以再尝试一下别的QEMU开发板,或者以后用OpenHarmony新版本的程序再试一次:
jim@ubuntu:~/openHarmony$ ./qemu-run -e out/arm_mps2_an386/qemu_mini_system_demo/OHOS_Image
board: arm_mps2_an386Enter to start qemu[y/n]:entering kernel init...
LfsLowLevelInit: DiskPartition succeed
LfsLowLevelInit: PartitionFormat succeed
LfsLowLevelInit: mount fs on '/littlefs' succeed
LfsLowLevelInit: mkdir '/littlefs' succeed
tcpip_init start
*************Exception Information**************
Type = 11
ThrdPid = 25
Phase = exc in task
FaultAddr = 0xabababab
Current task info:
Task name = (null)
Task ID = 25
Task SP = (nil)
Task ST = 0x0
Task SS = 0x0
Exception reg dump:
PC = 0x2100e62a
LR = 0x2101b045
SP = 0x210b18e0
R0 = 0x210a725c
R1 = 0x200
R2 = 0x210a725c
R3 = 0x2108a9b3
R4 = 0x0
R5 = 0x0
R6 = 0x0
R7 = 0x210b18e8
R8 = 0x0
R9 = 0x0
R10 = 0x0
R11 = 0x0
R12 = 0xc8000000
PriMask = 0x0
xPSR = 0x610f0000
----- backtrace start -----
backtrace 0 -- lr = 0x21015178
backtrace 1 -- lr = 0x2101b044
backtrace 2 -- lr = 0x210235da
backtrace 3 -- lr = 0x210235e2
backtrace 4 -- lr = 0x2102379a
----- backtrace end -----
qemu: fatal: Lockup: can't escalate 3 to HardFault (current priority -1)R00=210b2ad0 R01=2109fa3f R02=210a18f8 R03=6c0da998
R04=00000000 R05=00000060 R06=00000018 R07=210b1708
R08=00000019 R09=000003e8 R10=218ba1e8 R11=00000000
R12=00000000 R13=210b1708 R14=210011db R15=21000fcc
XPSR=21030006 --C- T handler
s00=00000000 s01=00000000 d00=0000000000000000
s02=00000000 s03=00000000 d01=0000000000000000
s04=00000000 s05=00000000 d02=0000000000000000
s06=00000000 s07=00000000 d03=0000000000000000
s08=00000000 s09=00000000 d04=0000000000000000
s10=00000000 s11=00000000 d05=0000000000000000
s12=00000000 s13=00000000 d06=0000000000000000
s14=00000000 s15=00000000 d07=0000000000000000
s16=00000000 s17=00000000 d08=0000000000000000
s18=00000000 s19=00000000 d09=0000000000000000
s20=00000000 s21=00000000 d10=0000000000000000
s22=00000000 s23=00000000 d11=0000000000000000
s24=00000000 s25=00000000 d12=0000000000000000
s26=00000000 s27=00000000 d13=0000000000000000
s28=00000000 s29=00000000 d14=0000000000000000
s30=00000000 s31=00000000 d15=0000000000000000
FPSCR: 00000000
/home/jim/openHarmony/vendor/ohemu/qemu_mini_system_demo/qemu_run.sh: line 95: 50440 Aborted (core dumped) qemu-system-arm -M mps2-an386 -m 16M -kernel $elf_file $qemu_option -append "root=dev/vda or console=ttyS0" -nographic
jim@ubuntu:~/openHarmony$
- 在Windows的QEMU下可以用这个命令
- qemu-system-arm -M mps2-an386 -cpu cortex-m4 -kernel OHOS_Image -serial stdio -nodefaults -nographic
- 另外一个可供你参考的命令 qemu-system-arm -machine versatileab -cpu cortex-a9 -nographic -monitor null -semihosting -append ‘some program arguments’ -kernel program.axf
D:\Program Files\qemu>qemu-system-arm -M mps2-an386 -cpu cortex-m4 -kernel OHOS_Image -serial stdio -nodefaults -nographic
qemu-system-arm: warning: nic lan9118.0 has no peer
entering kernel init...
LfsLowLevelInit: DiskPartition succeed
LfsLowLevelInit: PartitionFormat succeed
LfsLowLevelInit: mount fs on '/littlefs' succeed
LfsLowLevelInit: mkdir '/littlefs' succeed
tcpip_init start
*************Exception Information**************
Type = 11
ThrdPid = 25
Phase = exc in task
FaultAddr = 0xabababab
Current task info:
Task name = (null)
Task ID = 25
Task SP = (nil)
Task ST = 0x0
Task SS = 0x0
Exception reg dump:
PC = 0x2100e62a
LR = 0x2101b045
SP = 0x210b18e0
R0 = 0x210a725c
R1 = 0x200
R2 = 0x210a725c
R3 = 0x2108a9b3
R4 = 0x0
R5 = 0x0
R6 = 0x0
R7 = 0x210b18e8
R8 = 0x0
R9 = 0x0
R10 = 0x0
R11 = 0x0
R12 = 0xc8000000
PriMask = 0x0
xPSR = 0x610f0000
----- backtrace start -----
backtrace 0 -- lr = 0x21015178
backtrace 1 -- lr = 0x2101b044
backtrace 2 -- lr = 0x210235da
backtrace 3 -- lr = 0x210235e2
backtrace 4 -- lr = 0x2102379a
----- backtrace end -----
qemu: fatal: Lockup: can't escalate 3 to HardFault (current priority -1)R00=210b2ad0 R01=2109fa3f R02=210a18f8 R03=6c0da998
R04=00000000 R05=00000060 R06=00000018 R07=210b1708
R08=00000019 R09=000003e8 R10=218ba1e8 R11=00000000
R12=00000000 R13=210b1708 R14=210011db R15=21000fcc
XPSR=21030006 --C- T handler
s00=00000000 s01=00000000 d00=0000000000000000
s02=00000000 s03=00000000 d01=0000000000000000
s04=00000000 s05=00000000 d02=0000000000000000
s06=00000000 s07=00000000 d03=0000000000000000
s08=00000000 s09=00000000 d04=0000000000000000
s10=00000000 s11=00000000 d05=0000000000000000
s12=00000000 s13=00000000 d06=0000000000000000
s14=00000000 s15=00000000 d07=0000000000000000
s16=00000000 s17=00000000 d08=0000000000000000
s18=00000000 s19=00000000 d09=0000000000000000
s20=00000000 s21=00000000 d10=0000000000000000
s22=00000000 s23=00000000 d11=0000000000000000
s24=00000000 s25=00000000 d12=0000000000000000
s26=00000000 s27=00000000 d13=0000000000000000
s28=00000000 s29=00000000 d14=0000000000000000
s30=00000000 s31=00000000 d15=0000000000000000
FPSCR: 00000000D:\Program Files\qemu>
三、源码讲解
- 这是下载好的源码文件夹:
jim@ubuntu:~/openHarmony$ tree -a -L 1
.
├── applications
├── base
├── build
├── build.py -> build/build_scripts/build.py
├── build.sh -> build/build_scripts/build.sh
├── commonlibrary
├── developtools
├── device
├── docs
├── drivers
├── foundation
├── .gn -> build/core/gn/dotfile.gn
├── kernel
├── ohos_config.json
├── out
├── prebuilts
├── productdefine
├── qemu
├── qemu-run -> vendor/ohemu/common/qemu-run
├── .repo
├── test
├── third_party
└── vendor18 directories, 5 files
jim@ubuntu:~/openHarmony$ tree -a -L 2
.
├── applications
│ └── sample
├── base
│ ├── global
│ ├── hiviewdfx
│ ├── iothardware
│ ├── powermgr
│ ├── security
│ ├── sensors
│ ├── startup
│ └── update
├── build
│ ├── build_scripts
│ ├── bundle.json
│ ├── common
│ ├── compile_env_allowlist.json
│ ├── compile_standard_whitelist.json
│ ├── component_compilation_whitelist.json
│ ├── config
│ ├── core
│ ├── docs
│ ├── .git
│ ├── .gitattributes
│ ├── .gitee
│ ├── .gitignore
│ ├── gn_helpers.py
│ ├── hb
│ ├── LICENSE
│ ├── lite
│ ├── misc
│ ├── OAT.xml
│ ├── ohos
│ ├── ohos.gni
│ ├── ohos_system.prop
│ ├── ohos_var.gni
│ ├── prebuilts_download_config.json
│ ├── prebuilts_download.py
│ ├── prebuilts_download.sh
│ ├── print_python_deps.py
│ ├── __pycache__
│ ├── README_zh.md
│ ├── rust
│ ├── scripts
│ ├── subsystem_compoents_whitelist.json
│ ├── subsystem_config_example.json
│ ├── subsystem_config.json
│ ├── templates
│ ├── test
│ ├── test.gni
│ ├── toolchain
│ ├── tools
│ ├── version.gni
│ └── zip.py
├── build.py -> build/build_scripts/build.py
├── build.sh -> build/build_scripts/build.sh
├── commonlibrary
│ ├── c_utils
│ └── utils_lite
├── developtools
│ ├── global_resource_tool
│ ├── integration_verification
│ ├── packing_tool
│ └── syscap_codec
├── device
│ └── qemu
├── docs
│ ├── CODEOWNERS
│ ├── DCO.txt
│ ├── docker
│ ├── en
│ ├── .git
│ ├── .gitattributes
│ ├── .gitignore
│ ├── image.png
│ ├── LICENSE
│ ├── OAT.xml
│ ├── README.md
│ ├── README_zh.md
│ └── zh-cn
├── drivers
│ ├── hdf_core
│ ├── liteos
│ └── peripheral
├── foundation
│ ├── ability
│ ├── ai
│ ├── arkui
│ ├── bundlemanager
│ ├── communication
│ ├── distributedhardware
│ ├── graphic
│ ├── multimedia
│ ├── systemabilitymgr
│ └── window
├── .gn -> build/core/gn/dotfile.gn
├── kernel
│ ├── liteos_a
│ ├── liteos_m
│ └── uniproton
├── ohos_config.json
├── out
│ ├── arm_mps2_an386
│ ├── arm_virt
│ ├── hb_args
│ ├── ohos_config.json
│ ├── preloader
│ └── sdk
├── prebuilts
│ ├── ark_tools
│ ├── build-tools
│ ├── clang
│ ├── cmake
│ ├── develop_tools
│ ├── gcc
│ ├── mingw-w64
│ ├── packing_tool
│ ├── python
│ └── rustc
├── productdefine
│ └── common
├── qemu
│ ├── qemu-6.2.0
│ └── qemu-6.2.0.tar.xz
├── qemu-run -> vendor/ohemu/common/qemu-run
├── .repo
│ ├── manifests
│ ├── manifests.git
│ ├── manifest.xml
│ ├── project.list
│ ├── project-objects
│ ├── projects
│ ├── repo
│ └── .repo_fetchtimes.json
├── test
│ ├── ostest
│ ├── testfwk
│ └── xts
├── third_party
│ ├── bounds_checking_function
│ ├── cJSON
│ ├── cmsis
│ ├── curl
│ ├── FatFs
│ ├── ffmpeg
│ ├── FreeBSD
│ ├── freetype
│ ├── glslang
│ ├── gn
│ ├── googletest
│ ├── harfbuzz
│ ├── jerryscript
│ ├── jinja2
│ ├── json
│ ├── libjpeg-turbo
│ ├── libpng
│ ├── libunwind
│ ├── littlefs
│ ├── ltp
│ ├── lwip
│ ├── lzma
│ ├── markupsafe
│ ├── mbedtls
│ ├── mksh
│ ├── mtdev
│ ├── musl
│ ├── nghttp2
│ ├── NuttX
│ ├── openssl
│ ├── optimized-routines
│ ├── popt
│ ├── PyYAML
│ ├── qrcodegen
│ ├── spirv-headers
│ ├── spirv-tools
│ ├── sqlite
│ ├── toybox
│ ├── unity
│ ├── vk-gl-cts
│ ├── wpa_supplicant
│ └── zlib
└── vendor└── ohemu140 directories, 42 files
jim@ubuntu:~/openHarmony$
1、编译工具
- 编译源码可以使用hb命令(ohos-build),可以使用build.sh脚本,也可以使用build.py脚本,其中编译脚本在build这个git仓库里,hb命令的ohos-build源码也在build/lite目录下,可以通过这个仓库学习编译整套源码的流程。
- 对应的仓库地址为:https://gitee.com/openharmony/build
- 使用了Gn、Ninja、Python工具,类似于Linux中的Cmake、Makefile、Kconfig、Kbuild这些
- Ninja是谷歌用于替代Makefile的开源编译工具,使用并行机制提高速度,源码地址是 https://gitee.com/openharmony/third_party_ninja
- Ninja 构建系统-介绍
相关文章:

0 OpenHarmony开源鸿蒙NEXT星河版内核嵌入式编程
开源鸿蒙NEXT星河版内核嵌入式编程 作者将狼才鲸创建日期2024-03-08 CSDN文章阅读地址Gitee文章下载地址 一、前景提要 2024年1月18日,华为放出HarmonyOS NEXT 鸿蒙星河版开发者预览版本(不是HarmonyOS NEXT版,是HarmonyOS NEXT星河版&…...

Vue | 基于 vue-admin-template 项目的跨域问题解决方法
目录 一、现存问题 二、解决方法 2.1 修改的第一个地方 2.2 修改的第二个地方 2.3 修改的第三个地方 自存 一、现存问题 报错截图如下: 二、解决方法 2.1 修改的第一个地方 在 .env.development 文件中: # base api # VUE_APP_BASE_API /d…...

mutex 和 channel 哪一个工作效率更高?
关于Rust中mutex和channel哪一个工作效率更高的问题,实际上并没有一个绝对的答案,因为效率的高低取决于具体的使用场景和需求。 互斥锁(mutex)主要用于保护共享资源,确保一次只有一个线程可以访问它。当需要多个线程同…...

Elasticsearch 通过索引阻塞实现数据保护深入解析
Elasticsearch 是一种强大的搜索和分析引擎,被广泛用于各种应用中,以其强大的全文搜索能力而著称。 不过,在日常管理 Elasticsearch 时,我们经常需要对索引进行保护,以防止数据被意外修改或删除,特别是在进…...

备考银行科技岗刷题笔记(持续更新版)
银行考试计算机部分复习 IEEE 802.11的帧格式 1.1 IEEE 802.11是什么? 802.11是国际电工电子工程学会(IEEE)为无线局域网络制定的标准。目前在802.11的基础上开发出了802.11a、802.11b、802.11g、802.11n、802.11ac。并且为了保证802.11更…...

代码随想录算法训练营第五十五天|583. 两个字符串的删除操作、72. 编辑距离。
583. 两个字符串的删除操作 题目链接:两个字符串的删除操作 题目描述: 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 解题思路: 1、确定dp数组&#x…...

Softmax 回归 + 损失函数 + 图片分类数据集【动手学深度学习v2】李沐动手学深度学习课程笔记
目录 Softmax回归 损失函数 图片分类数据集 Softmax回归从零开始实现 Softmax回归简洁实现 Softmax回归 回归和分类的区别 回归问题举例上节课的预测房价问题,分类问题就是对样本进行分类 回归和分类的具体区别 假设真实的类别为第i个类别(值为1&#x…...

git 初始化项目并上传到github
如果还没配置过,需要配置账号信息 git config --global user.name "baymax-collab" git config --global user.email "baymax-collabtest.com"创建一个新的存储库 git clone gitgithub.com:xxxx cd test git switch --create main touch READ…...

前端javascript的DOM对象操作技巧,全场景解析
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:前端泛海 景天的主页:景天科技苑 文章目录 1.js的DOM介绍2.节点元素层级关系3.通过js修改,清空节点…...

TCP包头、TCP为什么安全可靠、UDP和TCP的区别、http协议
我要成为嵌入式高手之3月8日Linux高编第十八天!! __________________________________________________ 学习笔记 TPC包头 1、序号 发送端发送数据包的编号 2、确认号 已经确认接收到的数据的编号,只有当ACK为1时,该位才有用 …...

Android使用WebView打开内嵌H5网页
Android打开外部网页链接请参考上一篇文章 https://public.blog.csdn.net/article/details/136384559 继上篇,新建assets文章夹,将H5的网页资源放到此文件夹下 把H5的资源文件都拷进来 这个时候,将添加打开本地网页的代码: //打…...

UDP实现文件的发送、UDP实现全双工的聊天、TCP通信协议
我要成为嵌入式高手之3月7日Linux高编第十七天!! ———————————————————————————— 回顾 重要程序 1、UDP实现文件的发送 发端: #include "head.h"int main(void) {int sockfd 0;struct sockaddr_i…...

Yocto - Project Quick Build
欢迎光临! 这篇简短的文档将向您介绍使用 Yocto 项目构建典型镜像的过程。本文还介绍了如何为特定硬件配置构建。您将使用 Yocto Project 构建一个名为 Poky 的参考嵌入式操作系统。 Welcome! This short document steps you through the process for a typical i…...

深入探讨C++中的可变参数列表(Variadic Templates)
文章目录 导言可变参数列表的基本用法使用std::initializer_list应用场景 导言 在C编程中,处理可变数量参数的能力是一种非常有用的功能。通过可变参数列表,你可以编写更加通用和灵活的函数,从而提高代码的可读性和重用性。本文将详细介绍C中…...

MS2548 国产自动方向控制、半双工 RS-485 收发器 替代MAX13487
MS2548 国产自动方向控制、半双工 RS-485 收发器 替代MAX13487 北京冠宇铭通科技有限公司 肖小姐 产品简述 MS2548 是一个 5V 供电、半双工 RS-485 收发器。 芯片具有自动换向控制功能,可用于隔离485 端口,驱动器输入与使能信号一起配合控制芯片的状态&…...

数据库大师之路:Oracle在线学习平台全指南!
介绍数据库是由甲骨文公司开发的一款关系数据库管理系统(RDBMS),在数据库领域具有领先地位,并且以其系统可移植性而闻名。以下是对Oracle数据库的详细介绍: 市场地位:Oracle数据库是目前世界上流行的关系数…...

如何在Windows系统部署Jellyfin Server并实现公网访问内网影音文件
文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…...

华为北向网管NCE开发教程(3)CORBA协议开发
华为北向网管NCE开发教程(1)闭坑选接口协议 华为北向网管NCE开发教程(2)REST接口开发 华为北向网管NCE开发教程(3)CORBA协议开发 如果你真的还有选择的余地,能用REST,尽量用REST&…...

【算法训练营】最长公共子序列,倒水问题,奶牛吃草(Python实现)
最长公共子序列 时间限制:1 sec 空间限制:256 MB 问题描述 给定两个 1 到 n 的排列 A,B (即长度为 n 的序列,其中 [1,n] 之间的所有数都出现了恰好一次)。 求它们的最长公共子序列长度。 输入格式 第一行一个整数 n &a…...

Armadillo:矩阵类、向量类、Cube类和泛型类
文章目录 矩阵类、向量类、Cube类和泛型类Mat<type>matcx_matCol<type>veccx_vecRow<type>rowveccx_rowvecCube<type>cubecx_cubefield<object_type>SpMat<type>sp_matsp_cx_mat运算符: − * % / ! < > <…...

【守护健康】小脑萎缩患者必备营养指南
当生活给予我们挑战,我们选择用科学和关爱予以回应。面对小脑萎缩这一难题,正确的营养补充不仅是一剂强心针,更是患者康复之路上的坚实伙伴。今天,让我们一起了解那些能够助力小脑萎缩患者的神奇维生素! 1. 维生素B群…...

lvs集群中NAT模式
群集的含义 由多台主机构成,但对外表现为一个整体,只提供一个访问入口,相当于一台大型的计算机。 横向发展:放更多的服务器,有调度分配的问题。 垂直发展:升级单机的硬件设备,提高单个服务器自身功能。 …...

FPGA——三速自适应以太网设计(2)GMII与RGMII接口
FPGA——以太网设计(2)GMII与RGMII 基础知识(1)GMII(2)RGMII(3)IDDR GMII设计转RGMII接口跨时钟传输模块 基础知识 (1)GMII GMII:发送端时钟由MAC端提供 下…...

【校园导航小程序】2.0版本 静态/云开发项目 升级日志
演示视频 【校园导航小程序】2.0版本 静态/云开发项目 演示 首页 重做了首页,界面更加高效和美观 校园指南页 新增了 “校园指南” 功能,可以搜索和浏览校园生活指南 地图页 ①弃用路线规划插件,改用SDK开发包。可以无阻通过审核并发布…...

深入揭秘Lucene:全面解析其原理与应用场景(二)
本系列文章简介: 本系列文章将深入揭秘Lucene,全面解析其原理与应用场景。我们将从Lucene的基本概念和核心组件开始,逐步介绍Lucene的索引原理、搜索算法以及性能优化策略。通过阅读本文,读者将会对Lucene的工作原理有更深入的了解…...

Java中synchronized关键字、ReentrantLock、volatile关键字是如何实现线程同步的。
在Java中,synchronized关键字、ReentrantLock和volatile关键字这三个是编程中常用于实现线程同步的机制,下面结合代码详细说明一下这三个关键字的用法。 1. synchronized关键字: synchronized关键字是Java语言提供的内置锁机制,…...

路由拦截器
路由拦截可以分为几种不同的类型,每种类型都有其特定的作用和适用场景。以下是常见的几种路由拦截类型及其用途: 身份验证拦截器: 作用: 检查用户是否已经登录或具有有效的身份认证,并根据认证状态决定是否允许用户访问…...

Springboot+vue的物业管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。
演示视频: Springbootvue的物业管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的物业管理系统,采用M(model)Vÿ…...

STM32的启动流程分析 和 一些底层控制的原理
阅读引言: 阅读本文之后, 你将对单片机, 甚至是嵌入式系统, 或者是传统的PC机系统的启动流程有一个大致的了解, 本文更加偏向于单片机的启动流程分析。 目录 一、基础知识 1.STM32系列的微控制器(mcu&…...

C#面:几种注释类型
三种常见的注释类型:单行注释、多行注释和 XML 注释。 单行注释: 以双斜线 // 开头,用于在一行中注释单个语句或代码块。单行注释会被编译器忽略,不会对程序的执行产生任何影响。 例如: // 这是一个单行注释 int a…...