学习目标

  • 了解开发中的目录结构
  • 掌握代码的编译和烧录
  • 掌握程序的编写流程

    学习内容

    项目结构

    075.png

    需要掌握目录

    device

    设备目录。此目录内部为开发板板和芯片目录:

    1. ├── board
    2. └── itcast
    3. └── genkipi
    4. └── soc
    5. └── hisilicon
    6. ├── LICENSE
    7. ├── OAT.xml
    8. ├── README.en.md
    9. ├── README.md
    10. ├── hi3861v100
    11. └── ohos.build
  • board中为开发板。

    • board目录下的子目录表示公司。itcast表示江苏传智播客教育科技股份有限公司 。
    • genkipi表示传智公司的开发板
  • soc中为芯片。
    • soc目录下的子目录表示公司。hisilicon表示海思半导体有限公司。
    • hi3861v100表示海斯的具体芯片。
      vendor
      厂商目录。此目录表示厂商对于开发板的一些配置: ```bash

└── itcast └── genkipi ├── BUILD.gn ├── config.json ├── hals └── ohos.build

  1. - vendor目录下的子目录表示公司。itcast表示江苏传智播客教育科技股份有限公司
  2. - genkipi表示传智公司下的开发板。
  3. - config.json:表示开发板的配置信息,需要用到什么芯片,采用系统组件有哪些。
  4. <a name="uv7nF"></a>
  5. ##### out
  6. 编译输出目录。目录中会编译生成安装文件:
  7. - `Hi3861_wifiiot_app_allinone.bin`为我们的安装文件
  8. <a name="repaf"></a>
  9. #### 需要了解的目录
  10. <a name="MapAW"></a>
  11. ##### base
  12. 基础通用组件库。其中`iothardware`为硬件通用驱动库。
  13. <a name="INlwm"></a>
  14. ##### build
  15. 编译工具链。整个操作系统的打包,依赖于这个工具链。其中对于轻量级系统的编译,依赖的是`lite`目录下的工具。
  16. <a name="Qo9pa"></a>
  17. ##### foundation
  18. 子系统服务。提供子系统服务功能。例如communication_wifi提供wifi能力的子系统。
  19. <a name="tBdBa"></a>
  20. ##### kernel
  21. 内核服务。
  22. <a name="vjvuv"></a>
  23. ##### third_party
  24. 第三方开源库。
  25. <a name="e1lzW"></a>
  26. ##### test
  27. 兼容性测试库。
  28. <a name="xPUAm"></a>
  29. #### 应用开发目录
  30. 早期开发系统应用,我们在`application`目录,通过实践和基金会沟通发展,现在有了一个比较合理的操作方式。<br />我们系统应用开发的代码,放到具体的开发板目录中。例如我们的genkipi开发板目录在`device/board/itcast/genkipi`。我们的应用开发放到这个目录的`app`目录下。<br />为什么需要这样设计? <br />一个芯片可以制作出很多不同类型的开发板,每种类型的开发板功能不同,导致不同开发板对应的系统应用不同,如果采用之前的`application`目录,从理解上就是所有开发板都是这一套应用,这样是不合理的。
  31. <a name="ENtso"></a>
  32. ### Hello World
  33. 我们编写代码的**根目录**为`device/board/itcast/genkipi/app`.<br />项目创建流程如下:
  34. 1. **根目录**下新建`hello_world`文件夹
  35. 2. `hello_world` 下新建 `main.c` 文件
  36. 3. `hello_world`下新建 `BUILD.gn`文件
  37. 4. 修改根目录下的`BUILD.gn`文件
  38. <a name="Shlag"></a>
  39. #### 代码部分
  40. ```c
  41. #include "ohos_init.h"
  42. #include "ohos_types.h"
  43. static void start(void) {
  44. printf("hello world!!!\n");
  45. }
  46. APP_FEATURE_INIT(start);
  1. static_library("hello_world") {
  2. sources = [
  3. "main.c"
  4. ]
  5. }
  1. import("//build/lite/config/component/lite_component.gni")
  2. lite_component("app") {
  3. features = [
  4. "hello_world:hello_word"
  5. ]
  6. }

程序入口

我们采用APP_FEATURE_INIT作为程序入口,参数为要去执行的程序名称。例如:

  1. static void start(void) {
  2. printf("hello world!!!\n");
  3. }
  4. APP_FEATURE_INIT(start);

就是把start函数作为程序入口。
需要注意的是需要额外的引入一些头:

  1. #include "ohos_init.h"
  2. #include "ohos_types.h"
  • 程序的启动配置都在这些里面定义的

    编译配置

    OpenHarmony的构建系统采用的是GN。
    GN全称为Generate Ninja。是Google开发的一种构建配置文件,用于构建和管理项目代码的构建系统。许多大型项目中采用了这个构建系统:

  • Chromium

  • Fuchsia
  • Flutter
  • WebRTC

BUILD.gn文件通常位于项目根目录或子目录中,用于描述项目的构建规则。它定义了编译目标、依赖项、编译选项、编译器设置等。通过编辑BUILD.gn文件,开发人员可以控制代码的编译和构建过程,包括选择要编译的文件、指定编译器和链接器选项,以及定义自定义构建规则。
我们的根目录下的BUILD.gn负责引导加载我们编写的应用。我们编写的应用中的BUILD.gn主要用来配置编译的源文件已经依赖。

程序烧录运行

这里介绍几种烧录方式。

通过Hiburn.exe的GUI进行烧录

068.png069.png
070.png071.png

通过Hiburn.exe的命令行进行烧录

  1. out\genkipi\genkipi\目录下的Hi3861_wifiiot_app_allinone.bin,拷贝到Hiburn.exe同级目录下
  2. 打开命令行,执行以下操作:

    1. HiBurn.exe -com:3 -signalbaud:921600 -bin:Hi3861_wifiiot_app_allinone.bin
    • com: 中表示为串口对应的端口
    • signalbaud:表示以多大的波特率烧录,921600为支持的最大波特率
    • bin:表示要烧录的文件

      通过自定义脚本进行烧录

  3. 将burn_cmd目录拷贝到和项目目录同级目录。例如项目目录为Ohos_compiler,则结构如下:

    1. ├── Ohos_compiler
    2. └── burn_cmd
  4. 如果要编译Ohos_compiler这个项目,在burn_cmd中打开windows的命令行,执行如下命令:

    1. burn.bat Ohos_compiler 3
    • Ohos_compiler为项目名称,根据实际情况进行配置。
    • 3表示串口,根据实际情况进行配置。
  5. 脚本执行过程如图:

076.png
此时需要按下开发板的重置按钮。按下后就正式开始烧录,如下:
077.png
078.png

作业

  • 编写hello world程序