STM32F407移植OpenHarmony笔记9
继上一篇笔记,已经完成liteos内核的基本功能适配。
今天尝试启动OHOS和XTS兼容性测试。
如何启动OHOS?
OHOS系统初始化接口是OHOS_SystemInit(void),在内核初始化完成后,就能调用。
extern void OHOS_SystemInit(void);
OHOS_SystemInit();
OHOS_SystemInit函数在//base/startup/bootstrap_lite/services/source/system_init.c里面。
它负责初始化系统组件,由于系统组件的初始化用了特殊的宏定义,比如:
CORE_INIT()
SYS_RUN()
SYS_SERVICE_INIT_PRI()
......
这些宏在ohos_init.h里面可以看到,利用编译器把这个函数放到指定的代码段,相当于在编译阶段生成一个静态数组,然后OHOS_SystemInit会从这个数组取出函数,再依次执行。要实现这样的机制还需要修改链接脚本,好消息是talkweb的demo代码已经帮我们写好了,直接拿来就能用。
LD脚本添加的内容长下面的样子:
__zinitcall_bsp_start = .;KEEP (*(.zinitcall.bsp0.init))KEEP (*(.zinitcall.bsp1.init))KEEP (*(.zinitcall.bsp2.init))KEEP (*(.zinitcall.bsp3.init))KEEP (*(.zinitcall.bsp4.init))__zinitcall_bsp_end = .;......__zinitcall_exit_start = .;KEEP (*(.zinitcall.exit0.init))KEEP (*(.zinitcall.exit1.init))KEEP (*(.zinitcall.exit2.init))KEEP (*(.zinitcall.exit3.init))KEEP (*(.zinitcall.exit4.init))__zinitcall_exit_end = .;
OHOS系统组件是按子系统来分类管理的,每个子系统下面又有多个组件,需要用哪些系统功能就要添加对应的组件到config.json文件里面去。每个组件都有一个专门的描述文件:bundle.json,描述组件的名字和适用系统类型等信息。
功能组件之间也存在依赖关系,目前我还不知道怎么查询依赖关系,只能凭经验手动添加来测试。
在编辑config.json添加组件时,还有一个features字段,也不知道从哪找。
XTS是一个独立子系统,依赖组件不太清楚,只能根据编译报错信息往里面加,加到编译不报错为止。不过这就遇到一个奇怪的报错:
[OHOS ERROR] FAILED: gen/base/startup/init/services/param/liteos/lite_ohos_param_to_param_cfg_to_code.log
[OHOS ERROR] /home/openharmony/prebuilts/python/linux-x86/3.9.2/bin/python3 ../../../base/startup/init/scripts/param_cfg_to_code.py --source /home/openharmony/base/startup/init/services/etc_lite/param/ohos_const/ohos.para --source /utils/sys_param/vendor.para --source /home/openharmony/base/startup/init/services/etc/param/ohos.para --dest_dir /home/openharmony/out/demo_board/hello/gen/init/
通过对比talkweb的demo,原来需要手写一个vendor.para文件,而且还要指定路径。
需要在config.json里面添加产品适配器的路径,就是下面这行代码:
"product_adapter_dir": "//vendor/demo/hello/hals",
这表示某些需要产品级适配的组件,会在这个目录去寻找对应的文件。
刚才的报错就是“syspara_lite”这个组件所需要的适配文件。
参考talkweb的demo,在这个目录下创建以下文件:
utils/sys_param/vendor.para
utils/sys_param/hal_sys_param.c
utils/sys_param/BUILD.gn
再次编译又遇到bool未定义的问题,我真是服了!用bool必须要#include <stdbool.h>。
经过一番折腾总算是编译通过了。
下载到板子上程序跑起来了,也看到一些日志了,但是还没有看到XTS的日志。
01-01 00:00:00.063 0 124 I 1/SAMGR: Init service 0x8039010 <time: 4294967260ms> success!
01-01 00:00:00.071 0 124 I 1/SAMGR: Initialized all core system services!
01-01 00:00:00.078 0 124 I 1/SAMGR: Goto next boot step return code:-6
再研究研究,XTS默认没有显示调用,只是被编译成静态库了。不会被链接脚本加入目标文件中,还需要手动在ldflags里面添加要引用的库,下面是抄来的参考代码:
if (build_xts) {lib_dirs = [ "$root_out_dir/libs" ]ldflags += ["-Wl,--whole-archive","-lbootstrap","-lbroadcast","-lhctest",#"-lhal_sysparam",#公共基础库#"-lmodule_ActsUtilsFileTest",#"-lmodule_ActsKvStoreTest",#DFX"-lmodule_ActsDfxFuncTest","-lmodule_ActsHieventLiteTest",#启动恢复"-lmodule_ActsBootstrapTest",#"-lmodule_ActsParameterTest",#分布式任务调度"-lmodule_ActsSamgrTest",#网络#"-lmodule_ActsLwipTest",#"-lmodule_ActsUpdateTest","-Wl,--no-whole-archive",]}
这回终于看到XTS的日志打印了。

后面还会有很多个Start to run test suite:xxxx还在滚动。
滚到最后会打印All the test suites finished!

到此OHOS已成功启动,XTS测试也跑起来了。
相关文章:
STM32F407移植OpenHarmony笔记9
继上一篇笔记,已经完成liteos内核的基本功能适配。 今天尝试启动OHOS和XTS兼容性测试。 如何启动OHOS? OHOS系统初始化接口是OHOS_SystemInit(void),在内核初始化完成后,就能调用。 extern void OHOS_SystemInit(void); OHOS_Sys…...
telnet笔记
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、场景二、介绍1.测试端口2.访问百度3. 简单的爬虫 前言 最近telnet命令用的比较多,所以记录一下。 一、场景 ping应该是大家最常用的命令&…...
【考研408】操作系统笔记
文章目录 [toc] 计算机系统概述操作系统的基本概念操作系统的概念和特征操作系统的目标和功能(**处理器管理、存储器管理、设备管理、文件管理、向用户提供接口、扩充机器**) 操作系统的发展与分类操作系统的运行环境操作系统的运行机制 操作系统的体系结…...
从0开始搭建、上传npm包
从0开始搭建、上传npm包 1、上传一个简单获取水果价格的包创建 vite 项目在项目根目录 src 文件夹中创建 index.ts 文件,文件内容如下:在 main.ts 文件中导入、导出上面创建的方法创建 vite.config.ts 配置文件,文件内容如下配置 package.jso…...
【Go】在 JSON 中解析 time.Duration
当解析 JSON 时,使用time.Duration可能是一个繁琐的过程,因为它需要在一秒的后面添加 9 个零(即 1000000000)。为了简化这个过程,我创建了一个名为 Duration 的新类型: type Duration time.Duration为了将…...
UE4 C++ UGameInstance实例化
1.创建GameInstance C类 2.在.h添加变量 class 工程名称_API UMyGameInstance : public UGameInstance {GENERATED_BODY()public: //定义了三个公开的变量UMyGameInstance();UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "MyGameInstance")FString Name…...
在工业制造方面,如何更好地实现数字化转型?
实现工业制造的数字化转型涉及利用数字技术来增强流程、提高效率并推动创新。以下是工业制造领域更好实现数字化转型的几个关键步骤: 1.定义明确的目标: 清楚地概述您的数字化转型目标。确定需要改进的领域,例如运营效率、产品质量或供应链…...
【MySQL】-10 MySQL 存储过程
MySQL 存储过程 优点缺点一、存储过程的创建和调用创建存储过程实例1、in 输入参数2、out输出参数3、inout输入参数 三、变量1. 变量定义2. 变量赋值3. 用户变量 四、注释MySQL存储过程的调用MySQL存储过程的查询MySQL存储过程的修改MySQL存储过程的删除MySQL存储过程的控制语句…...
3.闭包 - JS
作用域 一般认为 JS 中作用域有三种: 全局作用域:一个脚本运行代码的默认作用域;模块作用域:一个模块运行代码的默认作用域;函数作用域:一个函数运行代码的默认作用域。 而由于 let/const 声明变量的作用…...
Java实现批量视频抽帧2.0
继上个版本 对其进行略微升级 🤓 上个版本仅对一个视频进行抽帧处理 此版本可对一个文件夹内的全部视频进行抽帧并对应的文件夹进行帧图片的保存 1️⃣配置pom.xml (保持上次不变) <dependencies><dependency><grou…...
MFC 原生LsitCtrl单元格嵌入图标
// ListItemInsertIconDlg.h: 头文件 //#pragma once// CListItemInsertIconDlg 对话框 class CListItemInsertIconDlg : public CDialogEx { // 构造 public:CListItemInsertIconDlg(CWnd* pParent nullptr); // 标准构造函数// 对话框数据 #ifdef AFX_DESIGN_TIMEenum { IDD…...
黑马头条 - minio
我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 知…...
认识Tomcat (一)
认识Tomcat (一) 一、服务器 1.1 服务器简介 硬件服务器的构成与一般的PC比较相似,但是服务器在稳定性、安全性、性能等方面都要求更高,因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。 软件服务器&…...
SSH免密切换服务器案例-ssh协议(公钥和私钥)
公钥和私钥理解 公钥提供加密,私钥解密,公钥可以共享,私钥不可以。举例公钥相当于锁头,可以给别人用,钥匙相当于私钥,只能开自己发出去的锁头,也就是私钥和公钥成对,私钥只能解密对…...
AMH面板如何安装与公网远程访问本地面板界面
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【教3妹学编程-算法题】1696. 跳跃游戏 VI
3妹:好冷啊, 冻得瑟瑟发抖啦 2哥 : 没想到都立春了还这么冷啊~ 3妹:暴雪、冻雨、大雨,这天气还让不让人活啦!!! 2哥 :哎,好多人都滞留的高铁站了,没法回家了 3妹…...
解决C#中无限递归导致的System.StackOverflowException异常
目录 背景: 错误示例分析: 为什么是错误的? 正确的使用递归: 修改后的代码: 原理和原因: 结论: 背景: 在软件开发中,递归是一种常见的编程技术,它允许方法调用自…...
ASP.NET Core 预防开放式重定向攻击
写在前面 为预防钓鱼网站的常用套路,在进行 Web 应用程序的开发时,原则上应该将所有由用户提交的数据视为不可信。如果应用程序中包含了基于 URL 内容重定向的功能,需要确保这种类型的重定向操作只能在应用本地完成,或者明确判断…...
HashCat 恢复Excel、Word、PPT密码保姆教程
HashCat 恢复Excel、Word、PPT密码 一、流程 整体需要两个步骤 先用office2john.py获取下文件的hash值 python office2john.py 1.xlsx > hash这个命令需要你电脑有python环境,然后在cmd命令窗口中执行此命令就行 文件链接:https://github.com/magnu…...
flink实战--flink的job_listener使用解析
背景 生产环境可能有如下的需求:当一个flink作业提交完成或者是运行中不定时给我们触发某个接口或发送一个消息,然后我们在做其他的操作,尤其是batch作业。 flink的job_listener就可以满足我们监听flink任务提交和运行状态的需求,具体如何使用本文将全面介绍一下。 注册入…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
