admin 管理员组文章数量: 1086019
小熊派鸿蒙2.0设备开发
本文主要围绕小熊派开发板展开对鸿蒙系统开发的学习,具体内容可以到Gitee小熊派开源社区进行学习。
目录
- 1 编译构建介绍
- 1.1 Ninja编译工具
- 1.2 模块gn文件
- 1.3 业务gn文件
- 1.4 Json文件
- 1.6 代码调用过程
- 2 CMSIS接口简介
- 2.1 什么是CMSIS-RTOS2接口
- 2.2 鸿蒙与CMSIS-RTOS2接口联系
- 3 “Hello World!”
- 3.1 业务代码
- 3.2 编译业务脚本
- 3.3 编译模块脚本
- 4 LED例程
- 4.1业务代码
- 4.2 编译业务脚本
- 4.3 编译模块脚本
- 总结
1 编译构建介绍
1.1 Ninja编译工具
在Unix/Linux下通常使用Makefile来控制代码的编译,但是Makefile对于比较大的项目有时候会比较慢,Ninja是一套新的控制编译的工具,相对于Makefile这套工具更注重于编译速度。
1.2 模块gn文件
此处仅截图供下文的功能说明中使用。
1.3 业务gn文件
此处仅截图供下文的功能说明中使用。
1.4 Json文件
如上图,build文件夹下有个BearPi-HM_Nano.json文件;
以applications为例,可以看出applications的路径指向“app”。
而app又是模块gn文件里lite_component里的内容,可见指向的内容为模块gn里的app。
模块gn里有形如 “A1_kernal_thread:thread_example” 这样的字段内容,指向了需要编译的业务模块和编译目标。
通过这几个文件,我门最终就可以确定需要编译的文件的依赖和编译生成的文件名。
1.6 代码调用过程
编写业务代码后需要使得业务代码被调用,如何实现业务代码的调用,这一过程需要从代码调用过程分析。
从图1.4可以看出系统启动后的一些初始化流程,其中的SYS_INIT(feature)即是关键,我们可以发现业务代码中对业务实现函数进行了注册,如图1.5所示。注册到了FEATRURE中。在执行SYS_INIT(service)通过INIT_APP_CALL(feature)函数、或者执行SYS_INIT(feature)时,会将Thread_example编译到代码段里,通过获取函数指针,找到对应的执行函数。
(整个流程个人感觉有点类似Linux添加静态编译的过程,如果理解有误请及时联系我进行修改)
2 CMSIS接口简介
2.1 什么是CMSIS-RTOS2接口
CMSIS是Cortex微控制器软件接口标准(Cortex Microcontroller Software Interface Standard)是ARM和一些编译器厂家以及半导体厂家共同遵循的一套标准,是由ARM专门针对Cortex-M系列提出的标准。在该标准的约定下,ARM和芯片厂商会提供一些通用的API接口来访问Cortex内核以及一些专用外设,以减少更换芯片以及开发工具等移植工作所带来的金钱以及时间上的消耗。
CMSIS-RTOS2(CMSIS-RTOS API Version 2)是Arm® Cortex®-M 处理器的通用的RTOS接口。为需要RTOS功能的软件组件提供了标准化的API。
2.2 鸿蒙与CMSIS-RTOS2接口联系
鸿蒙在CMSIS-RTOS2接口中封装了LiteOS-m的内核代码。实现了CMSIS-RTOS2函数接口和底层RTOS的适配。如图2.1所示。
3 “Hello World!”
根据前文的编译构建介绍,我们可以明确我们需要添加和修改的内容包括:
(1)业务代码:c文件
(2)编译业务脚本:BUILD.gn
(3)编译模块脚本:BUILD.gn
3.1 业务代码
C文件里需要创建业务入口函数,实现业务逻辑,所以需要有函数的主体存在。此外,
还需要使用OpenHarmony启动恢复模块接口SYS_RUN()启动业务。所以得到的C文件内容如下。
添加的示例代码:
#include "ohos_init.h"
#include "ohos_types.h"
#include <stdio.h>void HelloWorld(void)
{printf("Hello world!\n");
}
SYS_RUN(HelloWorld);
3.2 编译业务脚本
(2)与C文件在同级目录下的BUILD.gn的作用是将业务构建生成静态库。主要由三部分内容(目标、源文件、头文件路径)构成。
添加的示例代码:
static_library("myapp") {sources = ["hello_world.c"]include_dirs = ["//utils/native/liteos/include"]
}
3.3 编译模块脚本
从上面的代码中可以看出:
myapp指定编译结果的名称;
tatic_library中指定业务模块的编译结果,为静态库文件libmyapp.a;
hello_world.c为指定编译所依赖的c文件和路径,此处采用相对路径故没有路径描述;
//utils/native/liteos/include指定source所需要依赖的.h文件路径。
(3)编译模块脚本BUILD.gn
BUILD.gn作为一个编译脚本,使用的方法与Makefile类似,在不同层级的文件目录下会有相应的BUILD,gn。如同在Linux中有顶层Makefile和其他子文件中的Makefile文件。
所以我们需要在features字段中增加索引,使目标模块参与编译并屏蔽其他模块。
添加的示例代码:
#"D1_iot_wifi_scan:wifi_scan",#"D2_iot_wifi_connect:wifi_connect", #"D3_iot_udp_client:udp_client",#"D4_iot_tcp_server:tcp_server",#"D5_iot_mqtt:iot_mqtt", #"D6_iot_cloud_oc:oc_mqtt",#"D7_iot_cloud_onenet:onenet_mqtt","my_first_app:myapp"
my_first_app是相对路径,指向编译业务脚本;myapp是目标,指向编译业务脚本中的static_library(“myapp”) 。
4 LED例程
实现流程还是原来的三个步骤。主要是对三个文件进行添加和修改。
首先新建一个my_led文件夹用于存放业务源码文件。文件夹路径为:
./applications/BearPi/BearPi-HM_Nano/sample
而后新建led_example.c文件、BUILD.gn文件完成前期准备。
4.1业务代码
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
void Led_Sample(void)
{GpioInit(); //初始化GPIOIoSetFunc(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_IO_FUNC_GPIO_2_GPIO);//设置GPIO_2的复用功能为普通GPIOGpioSetDir(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_GPIO_DIR_OUT);//设置GPIO_2为输出模式GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2,1);//设置GPIO_2输出高电平点亮LED灯
}
APP_FEATURE_INIT(Led_Sample);
关于GPIO初始化的参数的具体功能此处不多赘述,注释中均已给出。
4.2 编译业务脚本
static_library("myled") {sources = ["led_example.c"]include_dirs = ["//utils/native/lite/include","//base/iot_hardware/interfaces/kits/wifiiot_lite"]
}
static_library中指定业务模块的编译结果;
sources中指定静态库.a所依赖的.c文件及其路径,若不包含"//"则表示相对路径;
include_dirs中指定source所需要依赖的.h文件路径。
4.3 编译模块脚本
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {features = ["my_led:myled",]
}
my_led是相对路径,myled是目标,具体作用参考本博客的第一章节和第三章节。
补充:本章节的LED只是实现了点亮功能,通过在LED程序中设置IO电平和使用usleep()函数设置延迟时间可以实现LED等的闪烁。
总结
后续将会持续更新本专栏内容,过程中有什么错误或者不足欢迎指出与补充。
本文标签: 小熊派鸿蒙20设备开发
版权声明:本文标题:小熊派鸿蒙2.0设备开发 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1693411889a220412.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论