全志XR806 OpenHarmony系统入门之Hello World演示

Hello Word

编译顺序

在正式开始程序编写之前,有必要先整体上了解程序的编译顺序。

Harmony的编译路径主要由vendor/xradio/xr806/config.json决定

json 复制代码
  "product_name": "wifi_skylark",
  "ohos_version": "OpenHarmony 1.0.1",
  "device_company": "xradio",
  "board": "xr806",
  "kernel_type": "liteos_m",

其中"product_name"决定了执行hb set出现的选项,"device_company","board","kernel_type"共同决定了编译路径。

hb set选定wifi_skylark后,会在根目录中生成文件ohos_config.json,里面的内容大致如下:

json 复制代码
{
 "root_path": "/home/workspace/Harmony_XR806",
 "board": "xr806",
 "kernel": "liteos_m",
 "product": "wifi_skylark",
 "product_path": "/home/workspace/Harmony_XR806/vendor/xradio/xr806",
 "device_path": "/home/workspace/Harmony_XR806/device/xradio/xr806/liteos_m"
}

在执行hb build -f后,HarmonyOS的编译脚本会从device_path中获取编译工具和编译选项,从product_path下寻找BUILD.gn文件。BUILD.gn文件内容如下:

gn 复制代码
build_ext_component("libSDK") {
  exec_path = rebase_path(".", root_build_dir)
  outdir = rebase_path("$root_out_dir")
  command = "./build.sh ${outdir}"
  deps = [
      "//kernel/liteos_m:kernel",		#(3)
      "os:liteos_glue",
      "adapter/hals:adapter",
      "adapter/console:app_console",
      "ohosdemo:ohosdemo",				#(2)
  ]
}

group("xr806") {
    deps = [
        ":libSDK"		#(1)
    ]
}

(1)deps关键字代表执行group("xr806")前需要先执行libSDK,也就是build_ext_component("libSDK")。

(2)执行build_ext_component("libSDK")前要求先寻找ohosdemo文件夹下的BUILD.gn,并且BUILD.gn里面会有ohosdemo的定义。

(3)"//"代表绝对路径,可以理解为根目录。//kernel/liteos_m代表根目录下的kernel/liteos_m文件夹。

打开ohosdemo/BUILD.gn

gn 复制代码
group("ohosdemo") {
    deps = [
        "hello_demo:app_hello",				#(1)
        #"iot_peripheral:app_peripheral",
        #"wlan_demo:app_WlanTest",
    ]
}

(1)"#"是gn文件的注释符号。

打开hello_demo/BUILD.gn

import("//device/xradio/xr806/liteos_m/config.gni")			#(1)

static_library("app_hello") {								#(2)
   configs = []
   sources = [
      "src/main.c",											#(3)
   ]

   cflags = board_cflags									#(4)

   include_dirs = board_include_dirs						#(5)
   include_dirs += [
      "//kernel/liteos_m/kernel/arch/include",				#(6)
   ]
}

(1).gni文件类似C语言的.h文件,用于定义一些模板

(2)static_library代表生成静态库(.a)文件,其中包含main.c的静态库必须是app_打头,如app_hello,否则虽然可以编译成功,但无法生效。

(3)需要编译的C文件,代表src文件夹下的main.c文件。

(4)gcc编译选项,其中board_cflags在//device/xradio/xr806/liteos_m/config.gni中定义。

(5)全局头文件,其中board_include_dirs在//device/xradio/xr806/liteos_m/config.gni中定义。

(6)除了board_include_dirs,额外需要添加的头文件。

代码

C 复制代码
#include <stdio.h>
#include "ohos_init.h"						//(2)						
#include "kernel/os/os.h"

static OS_Thread_t g_main_thread;

static void MainThread(void *arg)
{
  while (1) {
​    printf("hello world!\n");
​    LOS_Msleep(1000);
  }
}

void HelloTestMain(void)
{
  printf("Wifi Test Start\n");
  if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL,
​        OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {
​    printf("[ERR] Create MainThread Failed\n");
  }
}

SYS_RUN(HelloTestMain);						//(1)

(1)Harmony启动时会调用所有SYS_RUN,上文中提到的应用库必须用"app_ "打头就是因为SYS_RUN不会加入ld链接,所以使用"app_"标识,强制链接。

(2)必须添加ohos_init.h头文件,否则SYS_RUN失效。

演示

XR806_OpenHarmony串口默认配置为:波特率115200,无校验,8位数据位,1位停止位。

开发板成功连接PC上对串口调试助手后,按下开发板的复位按键,串口输出如下。

相关推荐
Random_index5 小时前
#Uniapp篇:支持纯血鸿蒙&发布&适配&UIUI
uni-app·harmonyos
鸿蒙自习室9 小时前
鸿蒙多线程开发——线程间数据通信对象02
ui·harmonyos·鸿蒙
SuperHeroWu711 小时前
【HarmonyOS】鸿蒙应用接入微博分享
华为·harmonyos·鸿蒙·微博·微博分享·微博sdk集成·sdk集成
zhangjr057514 小时前
【HarmonyOS Next】鸿蒙实用装饰器一览(一)
前端·harmonyos·arkts
Industio_触觉智能15 小时前
如何在开源鸿蒙OpenHarmony开启SELinux模式?RK3566鸿蒙开发板演示
openharmony·selinux·开源鸿蒙·鸿蒙开发板·rk3566开发板
诗歌难吟46420 小时前
初识ArkUI
harmonyos
SameX21 小时前
HarmonyOS Next 设备安全特性深度剖析学习
harmonyos
郭梧悠1 天前
HarmonyOS(57) UI性能优化
ui·性能优化·harmonyos
郝晨妤1 天前
鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)
android·ios·华为od·华为·华为云·harmonyos·鸿蒙
Peace*1 天前
HarmonyOs鸿蒙开发实战(16)=>沉浸式效果第一种方案一窗口全屏布局方案
harmonyos·鸿蒙·鸿蒙系统