当前位置: 首页 > news >正文

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,目前官方给出的目录规则框架如下:

.
└── applications       
    └── BearPi
        └── BearPi-HM_Nano
            └── sample
                │── my_first_app
                │  │── hello_world.c
                │  └── BUILD.gn
                └── BUILD.gn

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

.
└── applications        
    └── BearPi
        └── BearPi-HM_Nano
            └── sample
                │── test_app
                │  │── test.c
                │  └── BUILD.gn
                └── BUILD.gn

业务代码:

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

#include "ohos_init.h"
#include "ohos_types.h"
#include <stdio.h>
void test(void)
{
    printf("[DEMO] Hello world Test.\n");
}
SYS_RUN(test);

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

最小代码单元:

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

static_library("testapp") {
    sources = [
        "test.c"
    ]
    include_dirs = [
        "//utils/native/liteos/include"
    ]
}

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

组件单元:

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

import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
    features = [
        "a_test_app:testapp",
    ]
}

编译结果:

代码编译结果如下:

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

相关文章:

  • Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]
  • BIO、NIO、IO多路复用(select/poll/epoll)、信号驱动IO、异步IO
  • Echarts y轴相关配置
  • 02.6 概率
  • 【web-渗透测试方法】(15.2)分析应用程序、测试客户端控件
  • 03.1线性回归
  • 【智能优化算法】基于觅食生境选择的改进粒子群算法(FHSPSO)附 Matlab代码
  • 密码相关----对称加密,非对称加密
  • 02.1、数据操作
  • 离散数学 --- 命题逻辑 -- 命题符号化与命题公式
  • 回坑记之或许是退役赛季?
  • 初识OpenGL (-)EBO元素缓冲对象(Element Buffer Object)
  • typescript真的有学习的必要吗?
  • PyTorch Lightning入门教程(二)
  • 【滤波跟踪】基于变分贝叶斯卡尔曼滤波器实现目标跟踪附matlab代码
  • 【5+】跨webview多页面 触发事件(二)
  • 【css3】浏览器内核及其兼容性
  • ➹使用webpack配置多页面应用(MPA)
  • AWS实战 - 利用IAM对S3做访问控制
  • JSONP原理
  • mac修复ab及siege安装
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 观察者模式实现非直接耦合
  • 和 || 运算
  • 警报:线上事故之CountDownLatch的威力
  • 两列自适应布局方案整理
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 小程序测试方案初探
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 原生 js 实现移动端 Touch 滑动反弹
  • 在weex里面使用chart图表
  • 最近的计划
  • MyCAT水平分库
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​ubuntu下安装kvm虚拟机
  • #13 yum、编译安装与sed命令的使用
  • (06)金属布线——为半导体注入生命的连接
  • (12)Hive调优——count distinct去重优化
  • (BFS)hdoj2377-Bus Pass
  • (NSDate) 时间 (time )比较
  • (八)Spring源码解析:Spring MVC
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (黑马C++)L06 重载与继承
  • (已解决)什么是vue导航守卫
  • ***检测工具之RKHunter AIDE
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置