OpenHarmony系统调试实验-三色灯与任务

 

一、工程创建

 

1.在项目中创建如下文件夹

 

二、相关API介绍

 

1.头文件:

①#include <unistd.h>

Linux类系统调用头文件,提供usleep延时函数。

②#include "ohos_init.h"

OpenHarmony初始化头文件,提供APP_FEATURE_INIT注册宏。

③#include "cmsis_os2.h"

CMSIS-RTOS2标准内核头文件,操作系统任务相关结构体与创建函数。

 

2.相关函数以及结构体:

 

①osThreadAttr_t

任务配置结构体,常用成员:

-  const char *name :任务名称

-  uint32_t attr_bits :属性标志,填0

-  void *cb_mem :任务控制块内存,NULL内核分配

-  uint32_t cb_size :控制块大小,0自动分配

-  void *stack_mem :栈内存,NULL内核分配

-  uint32_t stack_size :任务栈总字节数

-  osPriority_t priority :任务优先级

②osThreadId_t osThreadNew(osThreadFunc_t func, void *argument, const osThreadAttr_t *attr)

创建系统线程任务,其参数及返回类型:

- func:任务函数指针

- argument:任务形参,不用传NULL

- attr:属性结构体地址

- 返回:任务句柄;NULL创建失败

 

③usleep(useconds_t us)

 当前线程阻塞延时,其参数:

- us:延时数值,单位μs

 

 

三、程序内容

 

1.在app路径下的BUILD.gn中写入如下代码

 

 

2.在3.0_RGB_Blink_Thread路径下的BUILD.gn中写入如下代码

 

 

3.在3.0_RGB_Blink_Thread路径下RGB_Blink.c文件中写入如下代码

 

 

#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_gpio.h"
#include "hi_io.h"


static void thread1(void)
{
    hi_gpio_init();

    // 配置GPIO2(红)、GPIO8(绿)、GPIO7(蓝)
    hi_io_set_func(HI_GPIO_IDX_2, HI_IO_FUNC_GPIO_2_GPIO);
    hi_gpio_set_dir(HI_GPIO_IDX_2, HI_GPIO_DIR_OUT);
    hi_io_set_func(HI_GPIO_IDX_8, HI_IO_FUNC_GPIO_8_GPIO);
    hi_gpio_set_dir(HI_GPIO_IDX_8, HI_GPIO_DIR_OUT);
    hi_io_set_func(HI_GPIO_IDX_7, HI_IO_FUNC_GPIO_7_GPIO);
    hi_gpio_set_dir(HI_GPIO_IDX_7, HI_GPIO_DIR_OUT);

    // 全部先设为低电平(初始全灭)
    hi_gpio_set_ouput_val(HI_GPIO_IDX_2, HI_GPIO_VALUE0);
    hi_gpio_set_ouput_val(HI_GPIO_IDX_8, HI_GPIO_VALUE0);
    hi_gpio_set_ouput_val(HI_GPIO_IDX_7, HI_GPIO_VALUE0);

    while (1)
    {
        hi_gpio_set_ouput_val(HI_GPIO_IDX_2, HI_GPIO_VALUE1);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_8, HI_GPIO_VALUE0);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_7, HI_GPIO_VALUE0);
        usleep(500000);

        hi_gpio_set_ouput_val(HI_GPIO_IDX_2, HI_GPIO_VALUE0);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_8, HI_GPIO_VALUE1);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_7, HI_GPIO_VALUE0);
        usleep(500000);

        hi_gpio_set_ouput_val(HI_GPIO_IDX_2, HI_GPIO_VALUE0);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_8, HI_GPIO_VALUE0);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_7, HI_GPIO_VALUE1);
        usleep(500000);
        
        hi_gpio_set_ouput_val(HI_GPIO_IDX_2, HI_GPIO_VALUE1);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_8, HI_GPIO_VALUE1);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_7, HI_GPIO_VALUE1);
        usleep(500000);

        hi_gpio_set_ouput_val(HI_GPIO_IDX_2, HI_GPIO_VALUE0);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_8, HI_GPIO_VALUE0);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_7, HI_GPIO_VALUE0);
        usleep(500000);

        hi_gpio_set_ouput_val(HI_GPIO_IDX_2, HI_GPIO_VALUE0);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_8, HI_GPIO_VALUE1);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_7, HI_GPIO_VALUE1);
        usleep(500000);

        hi_gpio_set_ouput_val(HI_GPIO_IDX_2, HI_GPIO_VALUE1);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_8, HI_GPIO_VALUE1);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_7, HI_GPIO_VALUE0);
        usleep(500000);

        hi_gpio_set_ouput_val(HI_GPIO_IDX_2, HI_GPIO_VALUE1);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_8, HI_GPIO_VALUE0);
        hi_gpio_set_ouput_val(HI_GPIO_IDX_7, HI_GPIO_VALUE1);
        usleep(500000);
    }
}

/******任务二:串口打印******/
static void thread2(void)
{

    while (1)
    {
        printf("任务二成功执行!\r\n");
        usleep(3000000);
    }
}

/******创建两个任务******/
static void LedExampleEntry(void)
{
    osThreadAttr_t attr;

    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024 * 4;

    // 创建任务1
    attr.name = "thread1";
    attr.priority = 25;
    if (osThreadNew((osThreadFunc_t)thread1, NULL, &attr) == NULL)
    {
        printf("Failed to create thread1!\n");
    }

    // 创建任务2
    attr.name = "thread2";
    attr.priority = 25;
    if (osThreadNew((osThreadFunc_t)thread2, NULL, &attr) == NULL)
    {
        printf("Failed to create thread2!\n");
    }
}

// 开机自动执行
APP_FEATURE_INIT(LedExampleEntry);

 

 

完成代码后记得保存文件

 

四、编译烧录与测试

 

1.在DevEco Device Tool插件中点击rebuild进行清理与编译

 

编译成功后如下

 

2.在Linux系统中找到如下地址文件out/hispark_pegasus/wifiiot_hispark_pegasus/Hi3861_wifiiot_app_allinone.bin

并将其复制到windows系统中

打开hiburn选择波特率为921600进行烧录

 

3.烧录成功后按下复位键观察三色灯

 观察到三色灯出现了预期现象

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐