小熊派鸿蒙2.0设备开发

本文主要围绕小熊派开发板展开对鸿蒙系统开发的学习,具体内容可以到Gitee小熊派开源社区进行学习。

1 编译构建介绍

1.1 Ninja编译工具

在Unix/Linux下通常使用Makefile来控制代码的编译,但是Makefile对于比较大的项目有时候会比较慢,Ninja是一套新的控制编译的工具,相对于Makefile这套工具更注重于编译速度。

1.2 模块gn文件

此处仅截图供下文的功能说明中使用。
模块gn内容截图

图1.1 模块gn内容截图

1.3 业务gn文件

此处仅截图供下文的功能说明中使用。
业务gn文件截图

图1.2 业务gn文件截图

1.4 Json文件

编译相关Json文件截图

图1.3 编译相关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 系统启动初始化函数

从图1.4可以看出系统启动后的一些初始化流程,其中的SYS_INIT(feature)即是关键,我们可以发现业务代码中对业务实现函数进行了注册,如图1.5所示。注册到了FEATRURE中。在执行SYS_INIT(service)通过INIT_APP_CALL(feature)函数、或者执行SYS_INIT(feature)时,会将Thread_example编译到代码段里,通过获取函数指针,找到对应的执行函数。
模块注册入口函数

图1.5 业务代码部分截图

(整个流程个人感觉有点类似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所示。
不同层关系示意图

图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(); //初始化GPIO
	IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_IO_FUNC_GPIO_2_GPIO);//设置GPIO_2的复用功能为普通GPIO
	GpioSetDir(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等的闪烁。

总结

后续将会持续更新本专栏内容,过程中有什么错误或者不足欢迎指出与补充。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值