作者:阿拉蕾aaa

来源:my.oschina.net/u/4518335/blog/4557426

最激动入门级选手的心的时刻来了,本示例将演示如何编写简单业务,输出“Hello World”。

修改源码

bugfix和新增业务两种情况,涉及源码修改。下面以新增业务举例,向开发者介绍如何进行源码修改。

1.确定目录结构。

开发者编写业务时,务必先在./applications/sample/wifi-iot/app路径下新建一个目录(或一套目录结构),用于存放业务源码文件。

例如:在app下新增业务my_first_app,其中hello_world.c为业务代码,BUILD.gn为编译脚本,具体规划目录结构如下:

.
└── applications└── sample└── wifi-iot└── app│── my_first_app│  │── hello_world.c│  └── BUILD.gn└── BUILD.gn

2.编写业务代码。

在hello_world.c中新建业务入口函数HelloWorld,并实现业务逻辑。并在代码最下方,使用OpenHarmony启动恢复模块接口SYS_RUN()启动业务。(SYS_RUN定义在ohos_init.h文件中)

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

3.编写用于将业务构建成静态库的BUILD.gn文件。

如步骤1所述,BUILD.gn文件由三部分内容(目标、源文件、头文件路径)构成,需由开发者完成填写。以my_first_app为例,需要创建./applications/sample/wifi-iot/app/my_first_app/BUILD.gn,并完如下配置。

static_library("myapp") {sources = ["hello_world.c"]include_dirs = ["//utils/native/liteos/include"]
}
  • static_library中指定业务模块的编译结果,为静态库文件libmyapp.a,开发者根据实际情况完成填写。

  • sources中指定静态库.a所依赖的.c文件及其路径,若路径中包含"//"则表示绝对路径(此处为代码根路径),若不包含"//"则表示相对路径。

  • include_dirs中指定source所需要依赖的.h文件路径。

4.编写模块BUILD.gn文件,指定需参与构建的特性模块。

配置./applications/sample/wifi-iot/app/BUILD.gn文件,在features字段中增加索引,使目标模块参与编译。features字段指定业务模块的路径和目标,以my_first_app举例,features字段配置如下。

import("//build/lite/config/component/lite_component.gni")lite_component("app") {features = ["my_first_app:myapp",]
}
  • my_first_app是相对路径,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn。

  • myapp是目标,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn中的static_library("myapp")。

调测验证

目前调试验证的方法有两种,分别为通过printf打印日志、通过asm文件定位panic问题,开发者可以根据具体业务情况选择。

由于本示例业务简单,采用printf打印日志的调试方式即可。下面开始介绍这两种调试手段的使用方法。

printf打印

代码中增加printf维测,信息会直接打印到串口上。开发者可在业务关键路径或业务异常位置增加日志打印,如下所示。

void HelloWorld(void)
{printf("[DEMO] Hello world.\n");
}

根据asm文件进行问题定位

系统异常退出时,会在串口上打印异常退出原因调用栈信息,如下文所示。通过解析异常栈信息可以定位异常位置。

=======KERNEL PANIC=======
**********************Call Stack*********************
Call Stack 0 -- 4860d8 addr:f784c
Call Stack 1 -- 47b2b2 addr:f788c
Call Stack 2 -- 3e562c addr:f789c
Call Stack 3 -- 4101de addr:f78ac
Call Stack 4 -- 3e5f32 addr:f78cc
Call Stack 5 -- 3f78c0 addr:f78ec
Call Stack 6 -- 3f5e24 addr:f78fc
********************Call Stack end*******************

为解析上述调用栈信息,需要使用到Hi3861_wifiiot_app.asm文件,该文件记录了代码中函数在Flash上的符号地址以及反汇编信息。asm文件会随版本大包一同构建输出,存放在./out/wifiiot/路径下。

1.将调用栈CallStack信息保存到txt文档中,以便于编辑。(可选)

2.打开asm文件,并搜索CallStack中的地址,列出对应的函数名 信息。通常只需找出前几个栈信息对应的函数,就可明确异常代码方向。

Call Stack 0 -- 4860d8 addr:f784c -- WadRecvCB
Call Stack 1 -- 47b2b2 addr:f788c -- wal_sdp_process_rx_data
Call Stack 2 -- 3e562c addr:f789c
Call Stack 3 -- 4101de addr:f78ac
Call Stack 4 -- 3e5f32 addr:f78cc
Call Stack 5 -- 3f78c0 addr:f78ec
Call Stack 6 -- 3f5e24 addr:f78fc

3.根据以上调用栈信息,可以定位WadRecvCB函数中出现了异常。4.完成代码排查及修改。

运行结果

示例代码编译、烧录、运行、调测后,会显示如下结果

ready to OS start
FileSystem mount ok.
wifi init success!
[DEMO] Hello world.

尝鲜!我在华为鸿蒙上编写的第一个 Hello World!那些说鸿蒙是PPT的可以闭嘴了!...相关推荐

  1. 鸿蒙系统开发者公测,公测尝鲜开启!华为Mate40/P40开始和安卓渐行渐远

    目前华为官方发布公告,华为EMUI的微博等相关官方媒体账号全部更名为HarmonyOS,这也意味着HarmonyOS将会成为华为在软件系统层面的重心,彻底替代基于Android的华为EMUI. 至于那 ...

  2. iOS 16.1新功能尝鲜:如何在iPhone上启用实时活动?

    近日,苹果发布了iOS 16.1正式版,在本次更新中,苹果推出了全新"实时活动"功能,用户能在iPhone锁定屏幕上查看到更多信息,如果是iPhone 14 Pro机型,实时活动信 ...

  3. Halium 9 尝鲜 -- 在小米平板4上的移植 (一)

    废话 最近Apple出了一个基于arm的笔记本,arm的低功耗.高续航的特点的确香到我了,但是学生党太穷买不太起,只有一个安卓系统的小米平板4在吃灰.在UOS和菊花厂的推动下,好多国产软件都有了arm ...

  4. Halium 9 尝鲜 -- 在小米平板4上的移植 (四)

    修改kernel 检查并修改内核选项 Halium提供了一个脚本检查defconfig的有些选项是否已经打开.找到内核项目里的defconfig,就可以开搞了. 脚本 ./check-kernelco ...

  5. Halium 9 尝鲜 -- 在小米平板4上的移植 (七)

    嗯,好像距离上次研究Halium已经过了很久了.虽然一直没时间弄这个,但是没全部驱动心里一直不太服气,最近还是抽出时间来把它弄好了(好了,但没完全好).小米平板4终于有机会可以摆脱"大手机& ...

  6. Halium 9 尝鲜 -- 在小米平板4上的移植 (三)

    修改device 由于不同的机型情况不一样这里只列举一些常见的修改,启动到rootfs应该是没什么问题的. 准备好一个可以用的git平台账号,fork目标机型的lineage os 16适配就可以开始 ...

  7. Halium 9 尝鲜 -- 在小米平板4上的移植 (六)

    烧写 生成了三个需要的镜像后,需要用twrp把vendor.img和halium-boot.img分别烧写到vendor分区和boot分区(在烧写前建议格式化system vendor cache d ...

  8. Halium 9 尝鲜 -- 在小米平板4上的移植 (五)

    编译 Halium 9 在完成上述修改后,终于可以开始编译了-- 写一个xml并同步你的适配包 在halium/devices/manifests目录下创建你的机型的xml 命名格式 (厂商)_(co ...

  9. Halium 9 尝鲜 -- 在小米平板4上的移植 (二)

    配置环境 Halium 9 是基于lineage os 16修改而来,所以基本上对环境的要求与其一致,推荐使用内存8gb以上的台式机和梯子进行编译.Ubuntu 20.04亲测是可以通过的. 安装依赖 ...

最新文章

  1. mysql防注入pdo_mysql PDO和存储过程动态SQL注入
  2. 极客邦科技旗下TGO鲲鹏会成立美国硅谷分会
  3. js里的数据类型转换
  4. centos pip命令安装mysql_centos下pip安装mysql_python报错mysql_config not found
  5. 实现机器学习的循序渐进指南V——支持向量机
  6. 糖原代谢疾病行业调研报告 - 市场现状分析与发展前景预测
  7. 某考试T1 game
  8. 你需要知道的包管理器(Package Manager)
  9. php access 所有表,Oracle|sql server|access 数据库里的所有表名,字段名
  10. 杂谈之什么是FullGC
  11. 【ACF学习】ACF安装、训练及检测初探
  12. 在线html网页编辑器ckeditor的使用与配置
  13. 30天免费试用 ▎(IDM) 极速下载工具
  14. Sophos防火墙v18版本访问内部服务器或者电脑SNAT地址转换的问题解决办法
  15. 哪个版本的outlook好_未来版本的Outlook的阴影?
  16. linux中cat的一个用法(向文件里面添加内容)
  17. Real-Time Rendering Fourth Edition 学习笔记之 -- 第一章:介绍
  18. 激光SLAM理论与实践(一)--激光SLAM简要介绍
  19. Ubuntu中使用apt-get时无法搜索软件的解决方法
  20. [league/climate]一个功能健全的命令行功能操作库

热门文章

  1. PyQt5 - 多选框
  2. 韦尔股份:卡位黄金赛道 CIS全球前三 高端产品实现技术突破加速追赶索尼三星
  3. a标签有个download属性
  4. 零基础入门网络安全,看这一篇就够了!
  5. oppo应用市场认领相关
  6. xp 无法关闭计算机,XP电脑关机关不了怎么办?电脑无法关机?
  7. 毕业答辩mysql会提问什么_【毕业论文答辩一般会问什么问题】答辩的五个问题及答案...
  8. 记录unity制作2D游戏过程
  9. input里面添加图片
  10. Linux dd 命令详解(测磁盘的吞吐量)