当前位置: 首页 > news >正文

2.在Openharmony写hello world

原文链接:https://kashima19960.github.io/2025/03/21/openharmony/2.在Openharmony写hello%20world/

前言

Openharmony 的第一个官方例程的是教你在Hi3861上编写hello world程序,这个例程相当简单编写 Hello World”程序,而且步骤也很省略,最重要的是这个例程 ,没有main函数都能运行!!官方所谓的“快速入门”其实是面向有基础的工程师,所以对于很多学识浅薄的学生来说,一看上去肯定会一脸懵逼。在这篇文章中,我会先过一遍例程,Openharmony的启动过程,你就明白main函数哪去了

hello world

Openharmony规定了用户编写自己代码的位置,所以要把代码放在指定目录里面

确定目录结构

applications/sample/wifi-iot/app 新建一个目录,这个目录的名字可以随便取,这里就取为my_first_app,在这个目录创建代码文件,和一个BUILD.gn编译脚本,如果不知道这个编译脚本是什么可以先不用管

在这里插入图片描述

如果还是不太懂就看一下总览的结构

image-20250327102835663

编写配置文件和代码

然后就可以开始编写相应文件的内容了,这里BUILD.gn有两个,一个是在``applications/sample/wifi-iot/app文件夹下,这个是外层的构建脚本,还有一个就是在自己建立的my_first_app`文件夹下,这个是内层的构建脚本。因为GN有自己的语法,所以你不懂的话,就先复制粘贴模仿一下

外层BUILD.gn内容

import("//build/lite/config/component/lite_component.gni")lite_component("app") {features = ["startup",#这个my_first_app就是文件夹的名字,这个hello_world要对应内层BUILD.gn中static_library括号里的内容"my_first_app:hello_world"]
}

内层BUILD.gn内容

static_library("hello_world") {sources = ["hello_world.c"]include_dirs = ["//utils/native/lite/include","//kernel/liteos_m/kal/cmsis","//base/iot_hardware/peripheral/interfaces/kits",]
}

以上的工作做好后,就可以开始写代码了,可以看到这里不需要main函数

#include <stdio.h>
#include "ohos_init.h"
#include "ohos_types.h"void HelloWorld(void)
{printf("[DEMO] Hello world.\n");
}
SYS_RUN(HelloWorld);

编译与烧录

编译方法有两种,一个是用hb工具,另一个用deveco device tool,但其实deveco device tool 也是用hb工具的,只是把编译操作做成一个按钮而已

image-20250327104345947

有提示success就算成功了

在这里插入图片描述

烧录方式也有两种,一个是用Hiburn,另一种是用deveco 的upload,上图有,那个upload就是烧录,之所以叫upload(上传),是因为要先把编译出来的镜像上传到Windows,然后再调用Hiburn烧录,所以这个``upload`底层是用的Hiburn,也是跟编译一样把某个底层工具封装成一个按钮

具体方法请参照官方文档

  • DevEco Device Tool烧录
  • Hiburn烧录

结果

image-20250327115628445

OpenHarmony启动的8个阶段

在系统启动过程中,服务和功能按以下顺序初始化

  • 阶段1. core
  • 阶段2. core system service
  • 阶段3. core system feature
  • 阶段4. system startup
  • 阶段5. system service
  • 阶段6. system feature
  • 阶段7. application-layer service
  • 阶段8. application-layer feature

ohos_init.h定义了8个宏,用于让一个函数以“优先级2”在系统启动过程的以上8个阶段执行。即函数会被标记为入口,在系统启动过程的1-8阶段,以“优先级2”被调用。

在这里插入图片描述

•在系统启动的某个阶段,会有多个函数被调用,优先级决定了调用顺序。

•优先级范围:0-4

•优先级顺序:0, 1, 2, 3, 4

前面代码中用到了SYS_RUN这个宏,就是让你自己写的函数以**“优先级2”在系统启动过程的“阶段4. system startup”阶段执行**。所以现在明白为啥没有main函数,你的代码都能被运行了吧,main函数是已经固化在系统里面了,你只能根据系统提供的特定的接口来把自己编写的功能放到系统里面。如果想要自己的函数在其他阶段运行,可以参照以下表格

宏定义启动阶段
CORE_INIT()阶段1. core
SYS_SERVICE_INIT()阶段2. core system service
SYS_FEATURE_INIT()阶段3. core system feature
SYS_RUN()阶段4. system startup
SYSEX_SERVICE_INIT()阶段5. system service
SYSEX_FEATURE_INIT()阶段6. system feature
APP_SERVICE_INIT()阶段7. application-layer service
APP_FEATURE_INIT()阶段8. application-layer feature

相关文章:

2.在Openharmony写hello world

原文链接&#xff1a;https://kashima19960.github.io/2025/03/21/openharmony/2.在Openharmony写hello%20world/ 前言 Openharmony 的第一个官方例程的是教你在Hi3861上编写hello world程序&#xff0c;这个例程相当简单编写 Hello World”程序&#xff0c;而且步骤也很省略&…...

「OC」源码学习——对象的底层探索

「OC」源码学习——对象的底层探索 前言 上次我们说到了源码里面的调用顺序&#xff0c;现在我们继续了解我们上一篇文章没有讲完的关于对象的内容函数&#xff0c;完整了解对象的产生对于isa赋值以及内存申请的内容 函数内容 先把_objc_rootAllocWithZone函数的内容先贴上…...

从0开始学习大模型--Day01--大模型是什么

初识大模型 在平时遇到问题时&#xff0c;我们总是习惯性地去运用各种搜索引擎如百度、知乎、CSDN等平台去搜索答案&#xff0c;但由于搜索到的内容质量参差不齐&#xff0c;检索到的内容只是单纯地根据关键字给出内容&#xff0c;往往看了几个网页都找不到答案&#xff1b;而…...

202533 | SpringBoot集成RocketMQ

SpringBoot集成RocketMQ极简入门 一、基础配置&#xff08;3步完成&#xff09; 添加依赖 <!-- pom.xml --> <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version&g…...

大模型学习专栏-导航页

概要 本专栏是小编系统性调研大模型过程中沉淀的知识结晶&#xff0c;涵盖技术原理、实践应用、前沿动态等多维度内容。为助力读者高效学习&#xff0c;特整理此导航页&#xff0c;以清晰脉络串联核心知识点&#xff0c;搭建起系统的大模型学习框架&#xff0c;助您循序渐进掌握…...

互联网大厂Java面试:从Java SE到微服务的全栈挑战

场景概述 在这场面试中&#xff0c;谢飞机&#xff0c;一个搞笑但有些水的程序员&#xff0c;面对的是一位严肃的大厂面试官李严。面试官的目的是考察谢飞机在Java全栈开发&#xff0c;特别是微服务架构中的技术能力。面试场景设定在内容社区与UGC领域&#xff0c;模拟一个社交…...

2024年408真题及答案

2024年计算机408真题 2024年计算机408答案 2024 408真题下载链接 2024 408答案下载链接...

【datawhaleAI春训营】楼道图像分类

目录 图像分类任务的一般处理流程为什么使用深度学习迁移学习 加载实操环境的库加载数据集&#xff0c;默认data文件夹存储数据将图像类别进行编码自定义数据读取加载预训练模型模型训练&#xff0c;验证和预测划分验证集并训练模型 修改baseline处理输入数据选择合适的模型Ale…...

Unity:输入系统(Input System)与持续检测键盘按键(Input.GetKey)

目录 Unity 的两套输入系统&#xff1a; &#x1f50d; Input.GetKey 详解 &#x1f3af; 对比&#xff1a;常用的输入检测方法 技术底层原理&#xff08;简化版&#xff09; 示例&#xff1a;角色移动 为什么会被“新输入系统”替代&#xff1f; Unity 的两套输入系统&…...

day04_计算机常识丶基本数据类型转换

计算机常识 计算机如何存储数据 计算机底层只能识别二进制。计算机底层只识别二进制是因为计算机内部的电子元件只能识别两种状态&#xff0c;即开和关&#xff0c;或者高电平和低电平。二进制正好可以用两种状态来表示数字和字符&#xff0c;因此成为了计算机最基本的表示方…...

rvalue引用()

一、先确定基础:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明确内存地址的表达式,可以取地址。比如变量名、引用等。 复制代码 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…...

【Web3】上市公司利用RWA模式融资和促进业务发展案例

香港典型案例 朗新科技&#xff08;充电桩RWA融资&#xff09; 案例概述&#xff1a;2024年8月&#xff0c;朗新科技与蚂蚁数科合作&#xff0c;通过香港金管局“Ensemble沙盒”完成首单新能源充电桩资产代币化融资&#xff0c;募资1亿元人民币。技术实现&#xff1a;蚂蚁链提供…...

什么是IIC通信

IIC(Inter-Integrated Circuit),即IC,是一种串行通信总线,由飞利浦公司在1980年代开发,主要用于连接主板、嵌入式系统或手机中的低速外围设备1。IIC协议采用多主从架构,允许多个主设备和从设备连接在同一总线上进行通信。 IIC协议的工作原理: IIC协议使用两根信号线进…...

网络原理 TCP/IP

1.应用层 1.1自定义协议 客户端和服务器之间往往进行交互的是“结构化”数据&#xff0c;网络传输的数据是“字符串”“二进制bit流”&#xff0c;约定协议的过程就是把结构化”数据转成“字符串”或“二进制bit流”的过程. 序列化&#xff1a;把结构化”数据转成“字符串”…...

掌纹图像识别:解锁人类掌纹/生物识别的未来——技术解析与前沿数据集探索

概述 掌纹识别是一种利用手掌表面独特的线条、纹理和褶皱模式进行身份认证的生物识别技术。它具有非侵入性、高准确性和难以伪造的特点,被广泛应用于安全认证领域。以下将结合提供的链接,详细介绍掌纹识别的技术背景、数据集和研究进展。 提供的链接分析 香港理工大学掌纹数…...

【FPGA开发】Xilinx DSP48E2 slice 一个周期能做几次int8乘法或者加法?如何计算FPGA芯片的GOPS性能?

Xilinx DSP48E2 slice 在一个时钟周期内处理 INT8&#xff08;8 位整数&#xff09;运算的能力。 核心能力概述 一个 DSP48E2 slice 包含几个关键计算单元&#xff1a; 预加器 (Pre-Adder): 可以执行 A D 或 A - D 操作&#xff0c;其中 A 是 30 位&#xff0c;D 是 27 位。…...

APP 设计中的色彩心理学:如何用色彩提升用户体验

在数字化时代&#xff0c;APP 已成为人们日常生活中不可或缺的一部分。用户在打开一个 APP 的瞬间&#xff0c;首先映入眼帘的便是其色彩搭配&#xff0c;而这些色彩并非只是视觉上的装饰&#xff0c;它们蕴含着强大的心理暗示力量&#xff0c;能够潜移默化地影响用户的情绪、行…...

残差网络实战:基于MNIST数据集的手写数字识别

残差网络实战&#xff1a;基于MNIST数据集的手写数字识别 在深度学习的广阔领域中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直是处理图像任务的主力军。随着研究的深入&#xff0c;网络层数的增加虽然理论上能提升模型的表达能力&#xff0c;但却面临梯度消失、…...

科学养生,开启健康生活新篇章

在快节奏的现代生活中&#xff0c;健康养生成为人们关注的焦点。科学合理的养生方式&#xff0c;能帮助我们远离疾病&#xff0c;提升生活质量&#xff0c;无需依赖传统中医理念&#xff0c;也能找到适合自己的养生之道。​ 饮食是养生的基础。遵循均衡饮食原则&#xff0c;每…...

如何扫描系统漏洞?漏洞扫描的原理是什么?

如何扫描系统漏洞?漏洞扫描的原理是什么&#xff1f; 漏洞扫描是网络安全中识别系统潜在风险的关键步骤&#xff0c;其核心原理是通过主动探测和自动化分析发现系统的安全弱点。以下是详细解答&#xff1a; 一、漏洞扫描的核心原理 主动探测技术 通过模拟攻击者的行为&#xf…...

Scrapy分布式爬虫实战:高效抓取的进阶之旅

引言 在2025年的数据狂潮中,单机爬虫如孤舟难敌巨浪,Scrapy分布式爬虫宛若战舰编队,扬帆远航,掠夺信息珍宝!继“动态网页”“登录网站”“经验总结”后,本篇献上Scrapy-Redis分布式爬虫实战,基于Quotes to Scrape,从单机到多机协同,代码简洁可运行,适合新手到老兵。…...

开元类双端互动组件部署实战全流程教程(第1部分:环境与搭建)

作者&#xff1a;一个曾在“组件卡死”里悟道的搬砖程序员 在面对一个看似华丽的开元类互动组件时&#xff0c;很多人以为“套个皮、配个资源”就能跑通。实际上&#xff0c;光是搞定环境配置、组件解析、控制端响应、前后端互联这些流程&#xff0c;已经足够让新手懵3天、老鸟…...

【实验笔记】Kylin-Desktop-V10-SP1麒麟系统知识 —— 开机自启Ollama

提示: 分享麒麟Kylin-Desktop-V10-SP1系统 离线部署Deepseek后,实现开机自动启动 Ollama 工具 的详细操作步骤 说明:离线安装ollama后,每次开机都需要手动启动,并且需要保持命令终端不能关闭;通过文档操作方法能实现开机自动后台启动 Ollama 工具 一、前期准备 1、离…...

Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡

Redis&#xff1a;现代服务端开发的缓存基石与电商实践-优雅草卓伊凡 一、Redis的本质与核心价值 1.1 Redis的技术定位 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据结构存储系统&#xff0c;由Salvatore Sanfilippo于2009年创建。它不同于传…...

认识并理解什么是链路层Frame-Relay(帧中继)协议以及它的作用和影响

帧中继(Frame Relay)是一种高效的数据链路层协议,主要用于广域网(WAN)中实现多节点之间的数据通信。它通过**虚电路(Virtual Circuit)**和统计复用技术,优化了传统分组交换网络(如X.25)的性能,特别适合带宽需求高、时延敏感的场景。 一、帧中继的核心设计目标 简化协…...

Python基本语法(类和实例)

类和实例 类和对象是面向对象编程的两个主要方面。类创建一个新类型&#xff0c;而对象是这个 类的实例&#xff0c;类使用class关键字创建。类的域和方法被列在一个缩进块中&#xff0c;一般函数 也可以被叫作方法。 &#xff08;1&#xff09;类的变量&#xff1a;甴一个类…...

Netty的内存池机制怎样设计的?

大家好&#xff0c;我是锋哥。今天分享关于【Netty的内存池机制怎样设计的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Netty的内存池机制怎样设计的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Netty的内存池机制是为了提高性能&#xff…...

Python学习之路(七)-绘画and动画

Python 虽然不是专为图形设计或动画开发的语言,但凭借其丰富的第三方库,依然可以实现 2D/3D 绘画、交互式绘图、动画制作、游戏开发 等功能。以下是 Python 在绘画和动画方面的主流支持方式及推荐库。建议前端web端展示还是用其他语言好╮(╯▽╰)╭ 一、Python 绘画支持(2D…...

【HarmonyOS 5】鸿蒙应用数据安全详解

【HarmonyOS 5】鸿蒙应用数据安全详解 一、前言 大家平时用手机、智能手表的时候&#xff0c;最担心什么&#xff1f;肯定是自己的隐私数据会不会泄露&#xff01;今天就和大家唠唠HarmonyOS是怎么把应用安全这块“盾牌”打造得明明白白的&#xff0c;从里到外保护我们的信息…...

动态指令参数:根据组件状态调整指令行为

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…...

Linux:权限的理解

目录 引言&#xff1a;为何Linux需要权限&#xff1f; 一、用户分类与切换 1.1、用户角色 1.2、用户切换命令 二、权限的基础概念 2.1、文件属性 三、权限的管理指令 3.1、chmod&#xff1a;修改文件权限 3.2、chown与chgro&#xff1a;修改拥有者与所属组 四、粘滞位…...

/etc/kdump.conf 配置详解

/etc/kdump.conf 是 Linux kdump 机制的核心配置文件&#xff0c;用于定义内核崩溃转储&#xff08;vmcore&#xff09;的生成规则、存储位置、过滤条件及触发后的自定义操作。以下是对其配置项的详细解析及常见用法示例&#xff1a; 一、配置文件结构 文件通常位于 /etc/kdu…...

Redis 中简单动态字符串(SDS)的深入解析

在 Redis 中&#xff0c;简单动态字符串&#xff08;Simple Dynamic String&#xff0c;SDS&#xff09;是一种非常重要的数据结构&#xff0c;它在 Redis 的底层实现中扮演着关键角色。本文将详细介绍 SDS 的结构、Redis 使用 SDS 的原因以及 SDS 的主要 API 及其源码解析。 …...

GPIO引脚的上拉下拉以及转换速度到底怎么选

【摘要】本文讲述在进行单片机开发当中&#xff0c;新手小白常常为GPIO端口的种种设置感到迷惑&#xff0c;例如到底设置什么模式&#xff1f;它们之间的区别是什么&#xff1f;到底是设置上拉还是下拉电阻&#xff0c;有什么讲究&#xff1f;端口的输出速度又该如何设置&#…...

day16 numpy和shap深入理解

NumPy数组的创建 NumPy数组是Python中用于存储和操作大型多维数组和矩阵的主要工具。NumPy数组的创建非常灵活&#xff0c;可以接受各种“序列型”对象作为输入参数来创建数组。这意味着你可以将Python的列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;…...

深入探索 51 单片机:从入门到实践的全面指南

深入探索 51 单片机&#xff1a;从入门到实践的全面指南 一、引言 在嵌入式系统发展的漫长历程中&#xff0c;51 单片机犹如一颗璀璨的明星&#xff0c;虽然诞生已有数十年&#xff0c;但至今仍在众多领域发挥着重要作用。它以结构简单、易于学习、成本低廉等优势&#xff0c…...

架构思维:构建高并发读服务_热点数据查询的架构设计与性能调优

文章目录 一、引言二、热点查询定义与场景三、主从复制——垂直扩容四、应用内前置缓存4.1 容量上限与淘汰策略4.2 延迟刷新&#xff1a;定期 vs. 实时4.3 逃逸流量控制4.4 热点发现&#xff1a;被动 vs. 主动 五、降级与限流兜底六、前端&#xff0f;接入层其他应对七、模拟压…...

时间同步服务核心知识笔记:原理、配置与故障排除

一、时间同步服务 在 Linux 系统中&#xff0c;准确的时间至关重要。对于服务器集群&#xff0c;时间同步确保各节点间数据处理和交互的一致性&#xff0c;避免因时间差异导致的事务处理错误、日志记录混乱等问题。在分布式系统中&#xff0c;时间同步有助于协调任务调度、数据…...

三种石墨烯(Graphene)拉伸模拟方法对比

免责声明:个人理解,仅供参考,若有问题欢迎讨论! 一、原理解释 1、fix deform 法——整体拉伸的理想模型 📌 模拟逻辑: 使用 fix deform 指令,对模拟盒子整体在 x 方向均匀伸长; 同时施加 npt 控制,使 y 和 z 方向维持零压状态(自由弛豫); 整个石墨烯结构在形变…...

Linux系统编程--基础指令(!!详细讲解+知识拓展)

第一讲 基础指令 ​ 我们现如今自己使用的电脑大部分是用的都是windows或者macOS&#xff0c;并配合上由微软和苹果开发的图形化界面&#xff0c;所以使用鼠标再屏幕上进行点击即可完成许多任务。但是作为操作系统的学习者&#xff0c;在linux的基础上不再使用图形化界进行操作…...

Python10天冲刺《Pydantic 是一个用于数据验证和设置管理的 Python 库》

Pydantic 是一个用于数据验证和设置管理的 Python 库&#xff0c;其核心功能围绕 数据验证、类型检查 和 模型配置 展开。以下是 Pydantic 的主要功能分类及其简要说明和示例&#xff1a; 1. 数据验证与类型检查 Pydantic 的核心功能是自动验证数据的类型、格式和约束条件。 …...

【工具】adverSCarial评估单细胞 RNA 测序分类器抵御对抗性攻击的脆弱性

文章目录 介绍代码参考 介绍 针对单细胞 RNA 测序&#xff08;scRNA-seq&#xff09;数据中健康细胞类型与病变细胞类型的检测&#xff0c;已有多项机器学习&#xff08;ML&#xff09;算法被提出用于医学研究目的。这引发了人们对于这些算法易受对抗性攻击的担忧&#xff0c;…...

机场围界报警系统的研究与应用

机场围界报警系统的研究与应用 摘要 本论文围绕机场围界报警系统展开深入研究,阐述了机场围界报警系统的重要性,对当前主流的机场围界报警技术原理、特点及应用场景进行详细分析,并探讨了现有系统存在的问题,最后对未来发展趋势进行了展望。研究表明,机场围界报警系统对…...

嵌入式操作系统

嵌入式操作系统是一种用途广泛的系统软件&#xff0c;通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。嵌入式操作系统负责嵌入式系统的全部 软、硬件资源的分配、任务调度&#xff0c;控制、协调并发活动。  嵌入式实时…...

预测性维护与传统维护成本对比:基于技术架构的量化分析

在工业 4.0 的技术演进浪潮中&#xff0c;设备维护模式正经历从经验驱动向数据驱动的变革。传统维护模式依赖固定周期巡检与故障后抢修&#xff0c;犹如 “蒙眼驾车”&#xff1b;而预测性维护借助物联网&#xff08;IoT&#xff09;、机器学习&#xff08;ML&#xff09;等技术…...

定位理论第一法则在医疗AI编程中的应用

引言 定位理论的核心在于通过明确目标、界定边界和建立差异化优势来占据用户心智中的独特位置。在医疗AI领域,定位理论的应用尤为重要,尤其是在医疗AI编程中,如何通过科学的定位确保技术与医疗本质的深度协同,而非技术主导的颠覆,是一个需要深入探讨的课题。本研究将深入剖…...

【macOS常用快捷键】

以下是 macOS 最常用快捷键列表&#xff0c;按使用频率由高到低分类整理&#xff0c;涵盖日常操作、效率工具及系统控制&#xff0c;助你快速提升使用效率&#xff1a; 一、基础高频操作 快捷键功能说明Command C复制选中内容Command V粘贴Command X剪切Command Z撤销上一…...

【Flask】ORM模型以及数据库迁移的两种方法(flask-migrate、Alembic)

ORM模型 在Flask中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;模型是指使用面向对象的方式来操作数据库的编程技术。它允许开发者使用Python类和对象来操作数据库&#xff0c;而不需要直接编写SQL语句。 核心概念 1. ORM模型…...

信息安全导论 第八章 入侵检测技术

目录 一、入侵检测系统概述 二、入侵检测技术 三、入侵检测系统实例 1. Snort简介 2. Snort架构 3. Snort规则示例 4. 检测流程 四、入侵防御系统 1. IPS vs. IDS 2. IPS分类 3. IPS核心技术 4. IPS优势 5.总结 一、入侵检测系统概述 定义 检测、识别和隔离对系统…...

每日c/c++题 备战蓝桥杯(P1886 滑动窗口 /【模板】单调队列)

洛谷P1886 滑动窗口【模板】单调队列详解 题目描述 给定一个长度为n的整数序列&#xff0c;要求输出所有长度为k的连续子数组的&#xff1a; 最小值&#xff08;第一部分输出&#xff09;最大值&#xff08;第二部分输出&#xff09; 数据范围&#xff1a; 1 ≤ k ≤ n ≤…...