bearpi开发板之HarmonyOS编译框架介绍

news/2024/7/21 10:11:27 标签: bearpi, HarmonyOS

编译控制的Json文件

在这里插入图片描述

业务gn文件,这里以my_led目录下的为例

在这里插入图片描述

  • 编译后生的libmyled.a
    在这里插入图片描述

模块gn文件,这里选择 "my_led:myled"模块参与编译

# Copyright (c) 2020 Nanjing Xiaoxiongpai Intelligent Technology Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

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

lite_component("app") {
    features = [
        #"A1_kernal_thread:thread_example",
        #"A2_kernel_timer:timer_example",
        #"A3_kernel_event:event_example",
        #"A4_kernel_mutex:mutex_example",
        #"A5_kernel_semaphore:semaphore_example",
        #"A6_kernel_message:message_example",

        #"B1_basic_led_blink:led_example",
        #"B2_basic_button:button_example",
        #"B3_basic_pwm_led:pwm_example",
        #"B4_basic_adc:adc_example",
        #"B5_basic_i2c_nfc:i2c_example",
        #"B6_basic_uart:uart_example",
        
        #"C1_e53_sf1_mq2:e53_sf1_example",
        #"C2_e53_ia1_temp_humi_pls:e53_ia1_example",
        #"C3_e53_sc1_pls:e53_sc1_example",
        #"C4_e53_sc2_axis:e53_sc2_example",
        #"C5_e53_is1_infrared:e53_is1_example",

        #"D1_iot_wifi_ap:wifi_ap",
        #"D2_iot_wifi_sta_connect:wifi_sta_connect",        
        #"D3_iot_udp_client:udp_client",
        #"D4_iot_tcp_server:tcp_server",
        #"D5_iot_mqtt:iot_mqtt",        
        #"D6_iot_cloud_oc:oc_mqtt",
        #"D7_iot_cloud_onenet:onenet_mqtt",
        #"D8_iot_cloud_oc_smoke:cloud_oc_smoke",
        #"D9_iot_cloud_oc_light:cloud_oc_light",
        #"D10_iot_cloud_oc_manhole_cover:cloud_oc_manhole_cover",
        #"D11_iot_cloud_oc_infrared:cloud_oc_infrared",
        #"D12_iot_cloud_oc_agriculture:cloud_oc_agriculture",
        #"D13_iot_cloud_oc_gps:cloud_oc_gps",
        
        "my_led:myled",
 
    ]
}

注册入口函数

void my_led_example(void)
{    
    static uint8_t cnt;
    cnt++;
    printf("-------> my_led_example %d",cnt);
    usleep(1000000);
}
SYS_RUN(my_led_example);
  • 使用SYS_RUN宏关联入口函数,SYS_RUN宏原型如下:
#define SYS_RUN(func) LAYER_INITCALL_DEF(func, run, "run")
  • LAYER_INITCALL_DEF宏原型如下:
#define LAYER_INITCALL_DEF(func, layer, clayer) \
    LAYER_INITCALL(func, layer, clayer, 2)
  • LAYER_INITCALL宏原型如下:
#define LAYER_INITCALL(func, layer, clayer, priority)            \
    static const InitCall USED_ATTR __zinitcall_##layer##_##func \
        __attribute__((section(".zinitcall." clayer #priority ".init"))) = func
  • InitCall 原型
typedef void (*InitCall)(void);
  • USED_ATTR宏原型
#define USED_ATTR __attribute__((used))
  • SYS_RUN(my_led_example)展开分析:

  • LAYER_INITCALL_DEF(my_led_example, run, “run”)

  • LAYER_INITCALL(my_led_example, run, “run”, 2)

  • static const InitCall USED_ATTR __zinitcall_run_my_led_example
    attribute((section(“.zinitcall.run2.init”))) = my_led_example
    这样函数指针_zinitcall_run_my_led_example指向了my_led_example,并编译到.zinitcall.run2.init段当中。

HOS_SystemInit中调用MODULE_INIT(run)来调用注册的入口函数my_led_example

void HOS_SystemInit(void)
{
   
    MODULE_INIT(bsp);
    MODULE_INIT(device);
    MODULE_INIT(core);
    SYS_INIT(service);
    SYS_INIT(feature);
    MODULE_INIT(run);
    SAMGR_Bootstrap();
}
  • MODULE_INIT宏原型如下:
#define MODULE_INIT(name)     \
    do {                      \
        MODULE_CALL(name, 0); \
    } while (0)

  • MODULE_CALL宏原型
#define MODULE_CALL(name, step)                                      \
    do {                                                             \
        InitCall *initcall = (InitCall *)(MODULE_BEGIN(name, step)); \
        InitCall *initend = (InitCall *)(MODULE_END(name, step));    \
        for (; initcall < initend; initcall++) {                     \
            (*initcall)();                                           \
        }                                                            \
    } while (0)
  • MODULE_BEGIN宏原型
#define MODULE_BEGIN(name, step) __section_begin(MODULE_NAME(name, step))
  • MODULE_END宏原型
#define MODULE_END(name, step) __section_end(MODULE_NAME(name, step))
  • MODULE_INIT(run)调用展开如
  do {                      \
        MODULE_CALL(run, 0); \
    } while (0)
  • MODULE_CALL(run, 0)展开
  do {                                                             \
        InitCall *initcall = (InitCall *)(MODULE_BEGIN(run, 0)); \
        InitCall *initend = (InitCall *)(MODULE_END(run, 0));    \
        for (; initcall < initend; initcall++) {                     \
            (*initcall)();                                           \
        }                                                            \
    } while (0)
  • MODULE_BEGIN(run, 0)展开
__section_begin(MODULE_NAME(run, 0))
  • MODULE_NAME宏原型
#define MODULE_NAME(name, step) ".zinitcall." #name #step ".init"
  • 最后展开MODULE_BEGIN(run, 0)如下
__section_begin(".zinitcall.run0.init"))
  • MODULE_END(run, 0))展开后
__section_end(".zinitcall.run0.init")
  • 通过函数指针遍历指定段保存的函数指针进行调用 (*initcall)();
 do {                                                             \
        InitCall *initcall = (InitCall *)__section_begin(".zinitcall.run0.init")); \
        InitCall *initend = (InitCall *)__section_end(".zinitcall.run0.init");    \
        for (; initcall < initend; initcall++) {                     \
            (*initcall)();                                           \
        }                                                            \
    } while (0)

编译烧录,运行结果如下

在这里插入图片描述

通过宏生成的函数指针变量名进行调用,测试函数如下

void test(void)
{
  __zinitcall_run_my_led_example();
}
  • 在HOS_SystemInit函数中调用test函数
void HOS_SystemInit(void)
{
   
    MODULE_INIT(bsp);
   
    MODULE_INIT(device);

    MODULE_INIT(core);
  
    SYS_INIT(service);
    
    SYS_INIT(feature);
  
    MODULE_INIT(run);

    test();
    SAMGR_Bootstrap();
    
    
}
  • 编译烧录,运行结果如下
    在这里插入图片描述

http://www.niftyadmin.cn/n/1226536.html

相关文章

ESP8266使用Docker容器化移动端控制

容器映像是一个软件的轻量级独立可执行软件包&#xff0c;包括运行该映像所需的一切&#xff1a;代码&#xff0c;运行时&#xff0c;系统工具&#xff0c;系统库和设置。 这样&#xff0c;您无需安装大量的库和软件&#xff0c;就可以使用现有映像并从中启动一个容器。 我们将…

Bearpi开发板之HarmonyOS任务管理

任务管理简介 基本概念 1、从系统的角度看&#xff0c;任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源&#xff0c;并独 立于其它任务运行。 2、LiteOS的任务模块可以给用户提供多个任务&#xff0c;实现了任务之间的切换和通信&#xff0…

ESP32整合Flutter,Firebase,Android,LCD,蓝牙等综合项目

3.2英寸TFT LCD中的快速Jpeg图像&#xff08;ILI9341&#xff09; 展示如何在ESP32中使用3.2英寸SPI TFT LCD。为了显示jpeg&#xff0c;您需要一个ESP32&#xff0c;Adafruit库&#xff0c;SPIFF和jpeg解码器。 使用SSD1351的硬件SPI与软件SPI 2. 向您展示了硬件和软件SPI接口…

Python实现圆形鼓面声波动画示例

本文将开发产生圆形鼓面声波图形所需的图形和动画机制。 理论 一维波形可以通过傅立叶分析描述为由正弦波之和组成&#xff0c;以整数谐波间隔组成。 在敲击乐器&#xff08;例如鼓&#xff09;的作用下&#xff0c;二维膜上的波传播受贝塞尔微分方程x2d2ydx2xdydx x2-2y0 …

Bearpi开发板之HarmonyOS定时器管理

软件定时器基本概念 软件定时器&#xff0c;是基于系统Tick时钟中断且由软件来模拟的定时器&#xff0c;当经过设定的Tick时钟计数值后会触发用户定义的回调函数。定时精度与系统Tick时钟的周期有关。硬件定时器受硬件的限制&#xff0c;数量上不足以满足用户的实际需求&#…

Bearpi开发板之HarmonyOS信号量

信号量的概念 信号量&#xff08;Semaphore&#xff09;是一种实现任务间通信的机制&#xff0c;实现任务之间同步或临界资源的互斥访问。常用于协助一组相互竞争的任务来访问临界资源。 在多任务系统中&#xff0c;各个任务之间需要同步或互斥实现临界资源的保护&#xff0c;…

声波的时域和频域Python实现示例

简介 傅里叶变换 傅立叶变换&#xff08;FT&#xff09;是一种数学变换&#xff0c;它可以将函数&#xff08;通常是时间的函数或信号&#xff09;分解为其组成频率&#xff0c;例如根据其组成音符的音量和频率来表达和弦。 术语傅立叶变换既指频域表示&#xff0c;也指将频域…

机器学习:Python概率入门

了解概率密度 为了理解基于勒贝格积分理论的现代概率的核心&#xff0c;我们需要从基本演算中扩展积分的概念。 首先&#xff0c;让我们考虑以下分段函数 在微积分中&#xff0c;您学习了黎曼积分&#xff0c;可以在此处应用 通常将其解释为组成f&#xff08;x&#xff09;的…