• Hi3861 业务代码编写框架


    前言:

            业务代码通过 ninja 进行构建,类似于 make,同时借助于 gn 生成 ninja 构建规则,类似于 cmake,所以我们编写业务代码除了关注代码本身的内容外,还要将代码添加到 gn 的构建规则中去。

            这种风格是继承自 linux 编译框架的风格,可能用惯了 STM32 啥单片机的小伙伴会觉得这个编译流程是老太太的裹脚布-又臭又长,有这种想法很正常,我刚接触的时候也想,搞一个 MCU 级别的小芯片,编译流程做的这么麻烦,不是劝退使用者嘛,实际上这些是对 LiteOS 内核适配,LiteOS 做的很大,最小都要 128K 的 ROM,对于 STM32F103C8 来说,移植都没法移植,不像 RT-Thread、FreeRTOS,最小 10K ROM 就能实现功能了,所以主观就觉得 LiteOS 拉胯。

            实际上 LiteOS 设计和应用的场景一般不是应用于 这种极小资源的芯片的,在很多场景下用在多核的 MCU、AIOT 芯片等等,内核编译框架需要有强大的多核开发支持,所以其编译框架有着很浓厚的 Linux 编译背景,学习的小伙伴也不要觉得麻烦,这可以作为向 linux 开发学习进军的一个小跳板呢!

    代码目录规则:

    下面继续研究 Hi3861,目前官方给出的目录规则框架如下:

    1. .
    2. └── applications       
    3.     └── BearPi
    4.         └── BearPi-HM_Nano
    5.             └── sample
    6.                 │── my_first_app
    7.                 │  │── hello_world.c
    8.                 │  └── BUILD.gn
    9.                 └── BUILD.gn

    那我按照官方的规则来建立一个测试代码目录,我的如下:

    1. .
    2. └── applications
    3. └── BearPi
    4. └── BearPi-HM_Nano
    5. └── sample
    6. │── test_app
    7. │ │── test.c
    8. │ └── BUILD.gn
    9. └── BUILD.gn

    业务代码:

    .c 文件内容,就是一个简单的打印程序:

    1. #include "ohos_init.h"
    2. #include "ohos_types.h"
    3. #include
    4. void test(void)
    5. {
    6. printf("[DEMO] Hello world Test.\n");
    7. }
    8. SYS_RUN(test);

    SYS_RUN 用于将函数注册到 LiteOS 系统的运行代码中执行。

    最小代码单元:

    最小特性的配置文件(和源代码同级目录的 gn 文件)用于每个代码模块的编译,代码如下:

    1. static_library("testapp") {
    2. sources = [
    3. "test.c"
    4. ]
    5. include_dirs = [
    6. "//utils/native/liteos/include"
    7. ]
    8. }

    该文件定义了 testapp 的编译规则,他的源文件和头文件目录,其中 // 是工程目录

    组件单元:

    上一级目录的 gn 文件代码如下,定义了组件的依赖关系,定义了 app 组件的特性包含 a_test_app 目录下的 testapp 静态库,编译时将它加入

    1. import("//build/lite/config/component/lite_component.gni")
    2. lite_component("app") {
    3. features = [
    4. "a_test_app:testapp",
    5. ]
    6. }

    编译结果:

    代码编译结果如下:

    烧写测试,看看有没有将代码添加到启动过程,可以看到执行打印出我写的代码了:

  • 相关阅读:
    VD6283TX环境光传感器驱动开发(3)----测试闪烁频率代码
    lc marathon 2022.6.22
    J2EE基础:SpringAop的使用
    MyBatis学习:使用resultMap或在SQL语句中给列起别名处理查询结果中列名和JAVA对象属性名不一致的问题
    Nginx (2):nginx反向代理配置
    物流监管:智慧仓储数据可视化监控平台
    SpringMVC:拦截器(动力)
    机器学习----k-means聚类
    C#实战:Dapper操作PostgreSQL笔记
    ansible自动化管理
  • 原文地址:https://blog.csdn.net/qq_45396672/article/details/126683966