1. 学习要求

硬件学前班

  • GPIO 输入输出,高低电平
  • 系统编程多线程控制,锁机制
  • 单总线数据传感器,设备控制。
  • 联网操作 + MQTT + 云平台初步使用

代码量特别大!!!操作规范比较多,相较于之前的 C 语言开发操作难度较高。

2. Hi3861 芯片概述

官方海思提供的手册内容

3. OpenHarmony 概述

OpenHarmony 是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的一款面向全场 景的开源分布式操作系统。以下为你从其诞生背景、特点、应用场景、技术架构 主要用于智能家居,工业物联网,穿戴系统使用,是一个【完整的实时操作系统】。可以提供系统 支持,并且兼容多平台硬件。

4. 开发环境概述

基于 Ubuntu 22.04 搭建的 OpenHarmony 3.0 开发环境,利用 Ubuntu 环境进行程序编程,通 过【交叉编译工具】将程序编译为 hi3861 支持的可执行系统文件,烧录到开发版中,进行后续的 程序开发。

代码根据开发要求,对应的路径为

~/Desktop/OpenHarmony/code-v3.0-LTS/OpenHarmony/applications/sample/wifi
iot/app

5. OpenHarmony 第一行代码

5.1 代码实现

OpenHarmony 代码都是给予【多线程模式实现】,完成的每一个模块都是一个【线程模块】

【程序模块】

/*
C 语言标准库三剑客
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
以下是需要导入的 OpenHarmony 相关头文件
ohos_init.h OpenHarmony OS 系统初始化相关头文件
cmsis_os2.h 实时操作系统头文件
hi_timer.h 海思提供的 timer 定时器头文件
*/
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_timer.h"
/*
【第三步】
    在 OHOS 每一个组件都是一个线程模块,需要提供对应的线程任务代码
    线程任务代码要求
        1. 返回值为 void
        2. 参数为 void *
*/
/**
 * @brief 测试使用 Hello 线程任务函数
 * 
 * @param arg 用户提供的 void * 参数。
 */
void hello_thread(void * arg);
/*
【第一步】
    注册组件函数,
    函数要求 static 修饰,同时返回值和参数都是 void
    函数名称根据当前模块名称决定。
 */
static void helloTask(void)
{
    /*
    osThreadId_t osThreadNew (osThreadFunc_t func, 
                        void *argument, 
                        const osThreadAttr_t *attr);
    
    osThreadId_t OHOS 中对应线程号类型。 真实类型是 void *。
            details Thread ID identifies the thread.
            typedef void *osThreadId_t;
   
            osThreadFunc_t 函数指针变量名,要求提供的函数必须是返回值 为 void
                参数为 void * 类型。
            typedef void (*osThreadFunc_t) (void *argument);
   
    void *argument 当前线程任务函数所需参数
   
    const osThreadAttr_t *attr OHOS 提供的线程属性结构体类型。
        其中【重点】内容
            1. 线程名称
            2. 线程占用的【stack】 栈区内存大小
            3. 线程优先级
    当前程序创建线程任务,需要提供
        1. 线程目标任务函数
        2. 线程任务函数所需参数
        3. 线程任务相关属性结构体
    返回结果是当前 osThreadId_t,对应线程【地址】
    */
    /*
    【第五步】
        创建线程    
    */
    // 5.1 创建 osThreadAttr_t 线程属性结构体变量
BUILD.gn 文件内容
【注意】BUILD.gn  文件名称必须按照规范,不得拼写错误,不得小写
当前组件 demo01_hello 中的 BUILD.gn 文件内容
    osThreadAttr_t thread_attr;
    memset(&thread_attr, 0, sizeof(osThreadAttr_t));
    thread_attr.name = "hello_DD"; // 线程名称
    thread_attr.attr_bits = 1024;  // 当前线程占用的栈区大小,1024 ==> 1KB
    thread_attr.priority = osPriorityNormal; // 默认优先级
    // 5.2 利用 osThreadNew 创建线程,线程完毕,立即执行。
    osThreadId_t thread_id = osThreadNew(hello_thread,
                                HI_NULL, // HI_NULL <==> NULL 海思公司自行定义的 
NULL 类型。
                                &thread_attr);
    if (HI_NULL == thread_id)
    {
        perror("[osThreadNew] create thread [hello_thread] failed!");
        exit(EXIT_FAILURE);
    }
}
/*
【第二步】
    对当前组件进行注册,利用 OHOS 提供的有参数宏进行注册操作
    APP_FEATURE_INIT 是 OHOS 提供的用于注册组件的有参数宏,要求提供的
    函数返回值必须是 void 类型,参数也是 void 类型。利用函数指针
    对当前组件功能进行注册操作。
*/
APP_FEATURE_INIT(helloTask);
/*
【第四步】
    线程任务函数实现
*/
void hello_thread(void * arg)
{
    while (1)
    {
        printf("Hello OHOS Thread\n");
        /*
        osStatus_t osDelay (uint32_t ticks);
            ticks 嘀嗒,当前系统执行一次任务的时间。
            Hi3861 基于 OHOS tick 时间为 【10 ms】,可以认为当前开发板一秒钟执行 100 次任
务。
        
        100 ticks == 100 * 10ms == 1 s
        */
        osDelay(100);
    }
}

BUILD.gn 文件内容

  • 【注意】BUILD.gn 文件名称必须按照规范,不得拼写错误,不得小写

当前组件 demo01_hello 中的 BUILD.gn 文件内容

static_library("demo01_hello") {
sources = [
"demo_hello.c"
]
include_dirs = [
"//utils/native/lite/include", 
"//kernel/liteos_m/kal/cmsis"
]
}

APP 目录下的 BUILD.gn 文件内容

import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"demo01_hello",
]
}

5.2 编译烧录过程

安装 CH340 驱动。

编译程序

  • 切换路径到 OpenHarmony 原码根目录下
qf@qf:~/Desktop/OpenHarmony/code-v3.0-LTS/OpenHarmony
  • 使用编译命令 hb build 对项目进行编译操作

使用 HiBurn 烧录程序

端口确定

需要烧录到开发版中的程序在 Linux 虚拟机中,利用共享文件夹通过 IP 地址找到对应文件,文件 路径如下, 需要根据自行的 IP 地址进行修改,目标文件为

Hi3861_wifiiot_app_allinone.bin

\\192.168.25.129\qf\Desktop\OpenHarmony\code-v3.0
LTS\OpenHarmony\out\hispark_pegasus\wifiiot_hispark_pegasus

进行烧录操作

Connect 之后,开发板按下 RESET 键,进入烧录过程

烧录完成

HiBurn 断开连接,XCOM 连接当前开发板,打开串口,开发板按键 RESET ,启动程序运行

Logo

更多推荐