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运算符: − * % / ! < > <…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
