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

news2024/12/23 0:14:51

一、简介

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

        子系统

        子系统是一个逻辑概念,它由一个或多个具体的组件构成、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       # 组件编译脚本

 以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",
    ]
}

        此时编译,下载。

        看结果:

         可以看到,这里不单单是打印出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":[] }
        ]
      }

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

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

      新建hello world组件

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

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

lite_component("app") {
    features = [

    ]
}

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

        那么就在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"
        ]
      }
    },

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

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

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

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

 

        可以看到,自己添加的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中,即可查看到该产品。

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

         编译下载过程这里就不再介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/584477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电商用户行为分析__求前3点击量

测试代码 package Data_textimport org.apache.flink.streaming.api.TimeCharacteristic import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor import org.apache.flink.streaming.api.scala._ import org.apache.flink.st…

KWin事件总结和相关类介绍

KWin事件总结和相关类介绍 目录 KWin事件总结和相关类介绍 1、事件相关模块 1.1 事件类型 1.2 事件管理 1.3 事件过滤器 2、KWin其他模块整理 2.1 窗口 2.2 Item 2.3 scene 3、事件传递流程 3.1 事件整体流程 3.2 事件传递时序图 4、事件流程样例 4.1 鼠标拖动修…

英伟达发布 532.03 驱动,为新游戏和新显卡带来支持

继英伟达 RTX 4060系列显卡陆续发售后,又发布了 GeForce Game Ready 532.03 WHQL 驱动,驱动人生整理了一下NVIDIA GeForce Game Ready 532.03 WHQL 驱动带来的支持与优化。 GeForce Game Ready 532.03 WHQL 驱动主要同步支持 RTX 4060 Ti 8G 显卡&#…

Hadoop3.1.4分布式搭建

Hadoop3.1.4分布式搭建 1. 基础环境准备 1.1 实验网络规划 hostnameip addrroleotherk8s-m13310.10.10.133NameNode, DataNode, NodeManageerk8s-m13410.10.10.134SecondaryNameNode, DataNode, NodeManageerk8s-m13510.10.10.135ResourceManager, DataNode, NodeManageerk8…

Java 多线程基础

文章目录 Java 多线程基础一、相关概念1. 程序、进程和线程2. 线程调度3. 并行与并发 二、线程的创建1. 继承 Thread 类2. 实现 Runnable 接口3. 实现 Callable 接口4. 线程池 三、Thread 类常用方法1. 构造方法2. 常用方法3. 其他方法 四、线程的生命周期五、线程同步1. 线程安…

Serverless 是什么?

文章目录 Serverless 是什么?Serverless 的前世今生面临挑战以应用为中心,无需运营基础架构自动伸缩为价值付费内置高可用和高安全 Serverless 行业及应用场景IT 自动化数据处理微服务架构IoT 后端系统游戏 Serverless 解决方案推荐SaaS Boot适合客户方案…

代码审查 idea

目录 文档 alibaba java coding guidelines 插件下载 Upsource 文档 https://download.csdn.net/download/qq_41169544/87545171https://download.csdn.net/download/qq_41169544/87545171 alibaba java coding guidelines 插件下载 Alibaba Java Coding Guidelines安装使用…

【珍藏版】SolVES模型的生态系统服务功能社会价值评估及拓展

生态系统服务是人类从自然界中获得的直接或间接惠益,可分为供给服务、文化服务、调节服务和支持服务4类,对提升人类福祉具有重大意义,且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目(Millennium Ecosystem Asse…

OSI(Open System Interconnect)开放系统互联参考模型-7层模型(改版)

OSI(Open System Interconnect)开放系统互联参考模型-7层模型 1. OSI七层模型1.1 基本概念1.2 七层模型的划分1.3 数据传输过程 2. TCP/IP四层模型2.1 基本概念2.2 四层模型的划分2.3 数据传输过程 3. 涉及的协议及概念3.1 MTU1. 概念2. 关于mtu取值3. 修…

Anchor Free目标检测方法

faster rcnn anchor:尺寸比例固定 yolo anchor尺寸确定:通过聚类 Anchor Free方法 anchor的简单理解:在特征图上的模板,含有的信息为检测框的大小和尺度 Anchor based 方法小结 Faster rcnn(左上) yolo v3(右上) ssd (中) re…

python爬虫学习简记(更新中)

页面结构的简单认识 如图是我们在pycharm中创建一个HEML文件后所看到的内容 这里我们需要认识的是上图的代码结构,即html标签包含了head标签与body标签 table标签 table标签代表了一个网页页面中的表格,其包含了行和列,其中行标签我们使用tr标…

1.场景设计题

系统设计 文章目录 系统设计一、缓存设计1、Redis 缓存Key回收策略?1.1、Redis缓存Key过期策略1.2、Redis缓存Key回收策略 2、Redis缓存击穿如何解决?2.1、导致Redis缓存穿透原因有那些? 3、Redis缓存雪崩如何解决?4、Redis缓存击…

笛卡尔心形线

目录 一、前言 二、使用 EasyX 绘制笛卡尔心形线 一、前言 "谁能告诉我,这是什么?" "爱心呗" "哼,爱心,我们叫它心形线。关于心形线呢,还有一个美丽的故事,是跟笛卡尔有关。…

RabbitMQ六种工作模式01

01: Work Queue工作队列模式 //接口所有的属性都是静态常量属性 public interface RabbitContent {//队列String QEUEU_HELLO "hello";String QUEUE_WORKING "working";String QUEUE_BAIDU "baidu";String QUEUE_SINA "sina";//交换机…

【操作系统笔记】南京大学jyy老师

系列综述: 💞目的:本系列是个人整理为了操作系统学习,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于南京大学操作系统jyy老师课程进行的,每个知识点的修正…

Windows系统内核溢出漏洞提权

目录 Windows内核溢出漏洞原理 溢出漏洞简介 什么是缓冲区 缓冲区溢出 缓冲区溢出目的 Windows内核溢出漏洞利用流程 提权实战思路 手工提权测试 辅助提权 EXP如何寻找 使用MSF提权 关于提权时可能遇到的问题 如果提权的时候发现无法执行命令的话,可以上…

零售EDI:如何与Transgourmet 建立EDI连接?

Transgourmet是一家总部位于法国的批发和供应商公司,为酒店、餐馆和快餐行业提供食品和非食品产品。在欧洲拥有广泛的市场覆盖,经营范围涵盖法国、德国、奥地利、波兰、罗马尼亚和瑞士等国家。 Transgourmet EDI 需求分析 1.传输协议 Transgourmet选择…

一文看懂企业性能测试,指标解析+代码演示,简洁易懂!

目录 前言: 一、性能测试流程简介 二、性能测试指标分析 三、性能测试代码演示 四、性能测试结论 五、总结 前言: 性能测试在企业应用中是非常重要的一环,它可以帮助企业对自身的应用和系统进行全面评估,提高其性能、稳定性…

simbertmilvus实现相似句检索

朋友们,simbert模型是一个较好的相似句检索模型,但是在大规模检索中,需要实现快速检索,这个时候离不开milvus等向量检索库,下面用实际代码来讲一下simbert之milvus应用。 import numpy as np from bert4keras.backen…

addr2line 使用,定位kernel panic 代码位置

在kernel崩溃时,方便定位代码。 需要打开kernel配置CONFIG_DEBUG_INFO。 需要有System.map和vmlinux文件,一般在out目录。 一般panic的时候会有给出panic的指针,如下down_write。 el1_data说明发生异常了,进入和entry.S文件&a…