鸿蒙Hi3861学习二十-编译构造

这篇具有很好参考价值的文章主要介绍了鸿蒙Hi3861学习二十-编译构造。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

        在使用编译构造子系统前,应了解如下基本概念:

        子系统

        子系统是一个逻辑概念,它由一个或多个具体的组件构成、OpenHarmony整体遵从分层设计,从下向上依次为:内核层系统服务层架构层应用层。系统功能按照“系统 > 子系统 > 组件”逐级展开,在多设备部署场景下,支持根据实际需求裁剪某些非必要的子系统或组件。

        组件

        系统最小的可复用、可配置、可剪裁的功能单元。组件具备目录独立可并行开发、可独立编译、可独立测试的特征。

        gn

        Generate ninja的缩写,用于产生ninja文件

        ninja

        ninja是一个专注于速度的小型构建系统

        hb

        OpenHarmony的命令行工具,用来执行编译命令。

      编译目录结构

build/lite
├── components                  # 组件描述文件
├── figure                     # readme中的图片
├── hb                          # hb pip安装包源码
├── make_rootfs                 # 文件系统镜像制作脚本
├── config                      # 编译配置项
│   ├── component               # 组件相关的模板定义
│   ├── kernel                  # 内核相关的编译配置
│   └── subsystem               # 子系统编译配置
├── platform                    # ld脚本
├── testfwk                     # 测试编译框架
└── toolchain                   # 编译工具链配置,包括:编译器路径、编译选项、链接选项等

二、构建规则

        为了实现芯片解决方案、产品解决方案与OpenHarmony是解耦的、可插拔的,组件、芯片解决方案和产品解决方案的路径、目录树和配置需遵循一定的规则,具体如下:

      组件

        组件源码路径命名规则为:{领域} / {子系统} / {组件},组件目录树规则如下;

        注:组件的名称、源码路径、功能简介、是否必选、编译目标、RAM、ROM、编译输出、已适配的内核、可配置的特性和依赖等属性定义,在build/lite/components目录下对应子系统的json文件中,新增组件时需要在对应子系统json文件中添加对应的组件定义产品所配置的组件必须在某个子系统中被定义过,否则会校验失败

component
├── interfaces
│   ├── innerkits  # 系统内接口,组件间使用
│   └── kits       # 应用接口,应用开发者使用
├── frameworks     # framework实现
├── services       # service实现
└── BUILD.gn       # 组件编译脚本

鸿蒙Hi3861学习二十-编译构造

 以applications.json中的wifi_iot_sample_app为例:

    {
      "component": "wifi_iot_sample_app",  #组件名称
      "description": "Wifi iot samples.",    #组件功能描述
      "optional": "true",    #组件是否为最小系统必选
      "dirs": [    #组件源码路径
        "applications/sample/wifi-iot/app"
      ],
      "targets": [    #组件编译入口
        "//applications/sample/wifi-iot/app"
      ],
      "rom": "",    #组件ROM值
      "ram": "",    #组件RAM估值
      "output": [],    #组件编译输出
      "adapted_board": [ "hi3861v100" ],    #组件已适配的芯片
      "adapted_kernel": [ "liteos_m" ],    #组件已适配的内核
      "features": [],    #组件可适配的特性
      "deps": {
          "components": [    #组件依赖的其他组件
            "utils_base"
        ]
      }
    },

        组件BUILD.gn的编译建议如下:

  • 编译目标名称与组件一致
  • 组件对外可配置的特性变量需声明在该组件BUILD.gn中,特性变量命名规则:ohos_{subsystem}_{component}_{feature}。特性在组件描述中也需要同步定义,在产品配置文件config.json中按需配置。
  • 宏定义规则:OHOS_{SUBSYSTEM}_{COMPONENT}_{FEATURE}

         

      芯片解决方案

        芯片解决方案是指基于某款开发板的完整解决方案,包含驱动设备侧接口适配开发板SDK等。

        芯片解决方案是一个特殊的组件,源码路径规则为:device / {芯片解决方案厂商} / {开发板}

        芯片解决方案组件会随产品选择的开发板默认编译

        芯片解决方案目录树规则如下:

device                                      
└── hisilicon                       # 芯片解决方案厂商(海思)
    ├── BUILD.gn                # 编译脚本
    ├── hals                    # OS南向接口适配
    ├── hispark_aries           # Hi3518
    ├── hispark_pegasus         # Hi3861
    ├── hispark_taurus          # Hi3516

       

      产品解决方案

        产品解决方案为基于开发板的完整产品,主要包含产品对OS的适配组件拼装配置启动配置文件系统配置等。产品解决方案的源码路劲规则为:vendor / {产品方案解决厂商} / {产品名称}。产品解决方案也是一个特殊的组件

        产品解决方案的目录树规则如下:

vendor                              
└── hisilicon                       # 产品解决方案厂商(海思)
    ├── hispark_aries               # 产品名称 Hi3518
    ├── hispark_pegasus             # 产品名称 Hi3861
    ├── hispark_taurus              # 产品名称 Hi3516
    │   ├── init_configs
    │   │     ├── etc               # init进程启动配置(可选,仅linux内核需要)
    │   │     └── init.cfg          # 系统服务启动配置
    │   ├── hals                    # 产品解决方案OS适配
    │   ├── BUILD.gn                # 产品编译脚本
    │   └── config.json             # 产品配置文件
    │   └── fs.yml                  # 文件系统打包配置
    └── ......

        注:新增产品需按如上的规则创建目录和文件,编译构建系统将按该规则扫描已配置的产品。

        关键目录和文件详细介绍如下:

        1.vendor / company / product / init_configs / etc

        该文件夹中包含rcs脚本,Sxxx脚本和fstab脚本。init进程在启动系统服务之前执行这些脚本。执行流程为“rcs -> fstab -> S00-xxx”。Sxxx脚本中的内容与开发板和产品需求有关,主要包括设备节点的创建、创建目录、扫描设备节点、修改文件权限等等。这些文件在产品编译的BUILD.gn中按需拷贝到产品out目录中,最终打包到rootfs镜像中

        2.vendor / company / product / init_configs / init.cfg

        init 进程启动服务的配置文件,当前支持解析的命令有:

start:启动某个服务
mkdir:创建文件夹
chmod:修改指定路径/文件的权限
chown:修改指定路径/文件的属性
mount:挂在命令

        3.vendor / company / product / hals

        解决方案厂商对OS的适配,需要实现的接口请见各个组件的readme说明文档。

        4.vendor / company / product / config.json

        config.json 为编译构造的主入口,包含了开发板、OS组件和内核等配置信息。

        以hispark_pegasus为例

    "product_name": "wifiiot_hispark_pegasus",    #产品名称
    "ohos_version": "OpenHarmony 1.0",    #选择的OS版本
    "device_company": "hisilicon",    #芯片厂商
    "board": "hispark_pegasus",    #开发板名称
    "kernel_type": "liteos_m",    #内核类型
    "kernel_version": "",    #内核版本
    "subsystems": [    #子系统
      {
        "subsystem": "applications",    #子系统名称
        "components": [    
          { "component": "wifi_iot_sample_app", "features":[] }    #选择的组件和组件的特性配置
        ]
      },

        5.vendor / company / product / BUILD.gn

        产品编译的入口,主要用于编译解决方案厂商源码和拷贝启动配置文件。如果某个产品被选择为要编译的产品,那么对应产品目录下的BUILD.gn会默认编译。一个典型的产品编译BUILD.gn应该如下:

group("product") { # target名称需与product名称即三级目录名称一致
  deps = []
  # 拷贝init配置
  deps += [ "init_configs" ]
  # 其他
  ......
}

三、新增组件

        在上一章中,添加了hello_world工程。这里回顾一下。目录结构如下:

applications/sample                              
└── wifi-iot                      
    └── app               
        ├── hello_world            
            ├── hello_world.c             
            ├── BUILD.gn
        └──BUILD.gn

        hello_world下的BUILD.gn内容如下:

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

        hello_world.c内容如下:

int cnt = 0;

void HelloWorld(void)
{
    printf("[DEMO] Hello world.\n");
    while(1)
    {
        cnt++;
        osDelay(100);
        printf("[DEMO] Hello world.[%d]\n",cnt);
    }
}

APP_FEATURE_INIT(HelloWorld);

      在原有组件中添加hello world

        修改app目录下的BUILD.gn文件如下:

import("//build/lite/config/component/lite_component.gni")

lite_component("app") {
    features = [
        "hello_world:hello_world",
    ]
}

        此时编译,下载。

        看结果:

鸿蒙Hi3861学习二十-编译构造

         可以看到,这里不单单是打印出hello world,还打印了很多test的代码。这是因为SDK默认是运行xts_test,需要关闭xts_test

        在vendor / hisilicon / hispark_pegasus / config.json中,将子系统“test”删除。注:这里不能注释掉,只能删除

      {
       "subsystem": "test",
       "components": [
         { "component": "xts_acts", "features":[] },
         { "component": "xts_tools", "features":[] }
        ]
      }

鸿蒙Hi3861学习二十-编译构造

         重新编译,需要注意的是,这里只有clean后,重新build,设置才会生效

鸿蒙Hi3861学习二十-编译构造

         重新clean,build,Upload后,运行正常。

      新建hello world组件

        不使用app目录下的BUILD.gn,内容如下:

import("//build/lite/config/component/lite_component.gni")

lite_component("app") {
    features = [

    ]
}

        在上边的文章中介绍过,系统是通过 领域 -> 子系统 -> 组件来的。新增加的组件需要在build/lite/components目录下对应子系统的json文件中声明

鸿蒙Hi3861学习二十-编译构造

        那么就在buld/lite/components/applications.json文件中增加如下代码:

    {
      "component": "hello_world",  
      "description": "hello world.",
      "optional": "true",
      "dirs": [
        "applications/sample/wifi-iot/app/hello_world"
      ],
      "targets": [
        "//applications/sample/wifi-iot/app/hello_world"
      ],
      "rom": "",
      "ram": "",
      "output": [],
      "adapted_board": [ "hi3861v100" ],
      "adapted_kernel": [ "liteos_m" ],
      "features": [],
      "deps": {
          "components": [
            "utils_base"
        ]
      }
    },

鸿蒙Hi3861学习二十-编译构造

        声明后,还需要让编译系统知道要把该组件编译进去,所以需要在编译构造的主入口文件中添加要编译进去的子系统。

鸿蒙Hi3861学习二十-编译构造

         在vendor/hisilicon/hispark_tegasus/config.json中添加如下代码:

{ "component": "hello_world", "features":[] }

鸿蒙Hi3861学习二十-编译构造

        添加完成后,重新编译,下载。

 鸿蒙Hi3861学习二十-编译构造

        可以看到,自己添加的Hello world组件,已经正常运行了。

四、新增产品

        直接修改vendor/hisilicon/hispark_pegasus/config.json文件。修改“product_name”为“hello_world_test”。完整代码如下:

  {
    "product_name": "hello_world_test",
    "ohos_version": "OpenHarmony 1.0",
    "device_company": "hisilicon",
    "board": "hispark_pegasus",
    "kernel_type": "liteos_m",
    "kernel_version": "",
    "subsystems": [
      {
        "subsystem": "applications",
        "components": [
          { "component": "hello_world", "features":[] }
        ]
      },
      {
        "subsystem": "iot_hardware",
        "components": [
          { "component": "iot_controller", "features":[] }
        ]
      },
      {
        "subsystem": "hiviewdfx",
        "components": [
          { "component": "hilog_lite", "features":[] },
          { "component": "hievent_lite", "features":[] }
        ]
      },
      {
        "subsystem": "distributed_schedule",
        "components": [
          { "component": "system_ability_manager", "features":[] }
        ]
      },
      {
        "subsystem": "security",
        "components": [
          { "component": "hichainsdk", "features":[] }
        ]
      },
      {
        "subsystem": "startup",
        "components": [
          { "component": "bootstrap", "features":[] },
          { "component": "syspara", "features":[] }
        ]
      },
      {
        "subsystem": "communication",
        "components": [
          { "component": "wlan", "features":[] },
          { "component": "soft_bus", "features":[] },
          { "component": "wifi_aware", "features":[]}
        ]
      },
      {
        "subsystem": "update",
        "components": [
          { "component": "hota", "features":[] }
        ]
      },
      {
        "subsystem": "iot",
        "components": [
          { "component": "iot_link", "features":[] }
        ]
      },
      {
        "subsystem": "utils",
        "components": [
          { "component": "file", "features":[] },
          { "component": "kv_store", "features":[] },
          { "component": "os_dump", "features":[] }
        ]
      },
      {
        "subsystem": "vendor",
        "components": [
          { "component": "hi3861_sdk", "target": "//device/hisilicon/hispark_pegasus/sdk_liteos:wifiiot_sdk", "features":[] }
        ]
      }
    ],
    "vendor_adapter_dir": "//device/hisilicon/hispark_pegasus/hi3861_adapter",
    "third_party_dir": "//device/hisilicon/hispark_pegasus/sdk_liteos/third_party",
    "product_adapter_dir": "//vendor/hisilicon/hispark_pegasus/hals",
    "ohos_product_type":"",
    "ohos_manufacture":"",
    "ohos_brand":"",
    "ohos_market_name":"",
    "ohos_product_series":"",
    "ohos_product_model":"",
    "ohos_software_model":"",
    "ohos_hardware_model":"",
    "ohos_hardware_profile":"",
    "ohos_serial":"",
    "ohos_bootloader_version":"",
    "ohos_secure_patch_level":"",
    "ohos_abi_list":""
  }

         此时,在DevEco中,即可查看到该产品。

鸿蒙Hi3861学习二十-编译构造

         创建好之后,配置产品的相关配置,包括upload_portupload_partitions等。完成后,在左侧的PROJECT TASKS中也会出现“hello_world_test”的工具栏,即可进行编译和下载。

鸿蒙Hi3861学习二十-编译构造

         编译下载过程这里就不再介绍。文章来源地址https://www.toymoban.com/news/detail-471304.html

到了这里,关于鸿蒙Hi3861学习二十-编译构造的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 鸿蒙Hi3861学习十五-Huawei LiteOS-M(Socket客户端)

            在网络编程的时候,不管是客户端还是服务端,都离不开 Socket 。那什么是Socket,这里做个简单介绍。详细的内容,可以参考这篇文章:WIFI学习一(socket介绍)_wifi socket_t_guest的博客-CSDN博客          socket在计算机领域,被翻译为“ 套接字 ”。它是计算机之间进

    2024年02月05日
    浏览(50)
  • Hi3861鸿蒙物联网项目实战:智能安防报警

    华清远见FS-Hi3861开发套件,支持HarmonyOS 3.0系统。开发板主控Hi3861芯片内置WiFi功能,开发板板载资源丰富,包括传感器、执行器、NFC、显示屏等,同时还配套丰富的拓展模块。开发板配套丰富的学习资料,包括全套开发教程、视频课程、7大项目实战案例 可以帮助学员系统性学

    2024年02月09日
    浏览(47)
  • 鸿蒙OS Hi3861的芯片实际开发中遇到的问题

    优点: 比较适合开发者快速开发,上面的硬件操作的函数封装很简单,非常适合初学者使用封装好的函数调用硬件管脚,比如I2c gpio spi sdio 都被封装了,特别简单,中文注释,而且还提供了无线wifi 的封装函数,当然也有http 解析啊什么的,可以使用在简单的物联网控制的简单

    2024年02月09日
    浏览(49)
  • 鸿蒙OS2.0 设备开发之Hi3861-基础功能汇总

    这是一篇讲解在 鸿蒙2.0全量源码中开发Hi3861 的常用功能汇总,可帮助我们 快速配置GPIO 如,如何实现 PWM、I2C、ADC 等。 1.1 输出 分两步,使能、配置输出值; 需要注意的是,有些GPIO还需要设置复用功能,可能默认不是普通GPIO模式。 这时候就需要使用 hi_io_set_func 函数;以

    2024年02月07日
    浏览(49)
  • HI3861学习笔记(12)——GPIO输入接口使用

    HI3861V100 芯片有 15 个 GPIO,引脚分布如下: 以下 GPIO 接口位于 baseiot_hardwareinterfaceskitswifiiot_litewifiiot_gpio.h 。 业务BUILD.gn中包含路径 功能 初始化GPIO外设 函数定义 unsigned int GpioInit(void) 参数 无 返回 错误码 功能 设置GPIO输出方向 函数定义 unsigned int GpioSetDir(WifiIotGpioIdx id,

    2024年02月09日
    浏览(43)
  • Hi3861开发第一节:环境搭建,并顺利完成编译

    步骤一:下载devicetool-windows-tool-3.1.0.400.zip版,下载网址:https://device.harmonyos.c om/cn/develop/ide#download 步骤二:解压DevEco Device Tool压缩包,双击安装包程序,点击\\\"下一步\\\"进行安装(如果之前有 安装过,会弹出先卸载之前版本在安装,请按照要求先卸载); 步骤三:设置DevEco

    2024年02月09日
    浏览(38)
  • 鸿蒙OpenHarmony【小型系统 编译】(基于Hi3516开发板)

    OpenHarmony支持hb和build.sh两种编译方式。此处介绍hb方式,build.sh脚本编译方式请参考[使用build.sh脚本编译源码]。 进入源码根目录,执行如下命令进行版本编译。 说明:   _name_为产品名称,例如Hi3516DV300、rk3568等。 检查编译结果。编译完成后,log中显示如下: 编译所生成的文

    2024年04月28日
    浏览(60)
  • Hi3861开发环境搭建 ||避坑指南|| [适用于几乎所有以Hi3861为主控的开发板]

    前言: 这几天为了搭建Hi3861的开发环境,看了不少官方文档和视频,但是依然折腾了很久才配置好编译、上传都能正常的环境,这其中踩了不少坑,希望通过这篇文章能让大家少踩点。 当然其实主要问题还是源码更新、视频教程更新还有文档更新速度没匹配上 参考海思社区

    2024年02月05日
    浏览(78)
  • Hi3861 OpenHarmony 运行Hello World

    海思 hi3861 有2个型号:  Hi3861LV100 低功耗版 低功耗MCU Wi-Fi芯片,适用于智能门锁、智能猫眼等低功耗物联网智能产品。 Hi3861V100 标准版 MCU Wi-Fi芯片,适用于大小家电、电工照明等常电类物联网智能产品。 系统默认的是标准版,低功耗版好像是需要改下设置。越简单越好的原

    2024年02月20日
    浏览(38)
  • Hi3861 硬件 i2c 驱动 oled

    最近想用 3861 做个有意思的东西,记录一下开发过程。今天使用 3861 的硬件 i2c 驱动 oled。 硬件平台:Bearpi-Nano 软件SDK:润和sdk 我之前写过一篇基于 stm32cubemx 快速使用 iic 接口 oled 的过程,里面有现成的 oled 接口,我们只要直接拿过来替换掉底层接口就行。  STM32CubeMX驱动4脚

    2023年04月23日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包