美文网首页
SimonLiu的ESP8266与AliOS Things 学习

SimonLiu的ESP8266与AliOS Things 学习

作者: 刘知海SimonLiu | 来源:发表于2019-03-23 13:46 被阅读0次

    欢迎加入交流群:ESP8266 AliOS Things 群 号: 107723112
    所有教程请看 AliOS Things 入门教程系列
    此教程在SimonLiu的CSDN博客同步更新。

    ESP8266的non_os SDK开发过程中,如果我们自己编写了一些驱动或者模块,一般只需要写一对.h/.c文件,然后引用那个头文件即可。但是在AliOS Things中,需要在mk文件中$(NAME)_SOURCES :=一行添加相应的c文件。或者使用模块方式来引用,引入模块需要相应编写模块的makefile和修改项目的makefile。本文介绍一个项目添加新模块的方法。
    官方文档里面出现了模块组件两种说法,但是主要使用模块,其实我的第一直觉是组件,不过还是按主流说法称之为模块吧。

    1. 目标:为上篇博文的project1添加一个模块

    1.1 选择模块存放位置

    模块可以放置在以下任一目录中:

    COMPONENT_DIRECTORIES := . \
                             example   \
                             board     \
                             kernel    \
                             platform  \
                             utility   \
                             framework \
                             tools     \
                             test      \
                             device    \
                             security
    

    例如在device下创建一个 info_a 目录。

    1.2 增加新模块源文件

    如在 info_a 目录中创建 info_a.c :

    #include <stdio.h>
    
    void info_a_fun()
    {
        printf("this is in info_a\n");
    }
    
    1.3 增加新模块的对外头文件

    如在 info_a 目录中创建 info_a.h :

    #ifndef INFO_A_H
    #define INFO_A_H
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    extern void info_a_fun();
    
    #ifdef __cplusplus
    }
    #endif
    #endif  /* INFO_A_H */
    
    1.4 增加新模块的.mk文件

    .mk文件是模块存在的标志。每一个模块都会有一个对应的mk文件,makefile通过搜索mk后缀的文件来查找模块。其中声明了一些针对该模块的定制化的东西。最基本的两个就是该模块所包含的源文件,头文件路径和该模块依赖的其他模块。如在info_a目录下创建 info_a.mk:

    NAME := info_a
    $(NAME)_SOURCES := info_a.c
    GLOBAL_INCLUDES += .
    

    1.2-1.4也可以简化为一个命令行(AliOS Things 2.0.0及以前的版本适用):
    aos new -c info_a
    然后修改相应文件内容。

    1.5 修改 project1 源文件调用新接口

    添加头文件#include "info_a.h"并调用其方法info_a_fun();

    #include <aos/aos.h>
    #include "info_a.h"
    
    static void app_delayed_action(void *arg)
    {
        LOG("helloworld %s:%d %s\r\n", __func__, __LINE__, aos_task_name());
        info_a_fun();
        aos_post_delayed_action(5000, app_delayed_action, NULL);
    }
    
    int application_start(int argc, char *argv[])
    {
        LOG("application started.");
        aos_post_delayed_action(1000, app_delayed_action, NULL);
        aos_loop_run();
    
        return 0;
    }
    
    1.6 修改 project1的 .mk 文件(project1.mk)依赖新模块

    1.6.1 添加一行$(NAME)_COMPONENTS += info_a
    1.6.2 修改原先的$(NAME)_COMPONENTS := yloop cli$(NAME)_COMPONENTS += yloop cli

    NAME := project1
    $(NAME)_SOURCES := helloworld.c
    $(NAME)_COMPONENTS += info_a
    GLOBAL_DEFINES += AOS_NO_WIFI
    
    $(NAME)_COMPONENTS += yloop cli
    
    ifeq ($(BENCHMARKS),1)
    $(NAME)_COMPONENTS  += benchmarks
    GLOBAL_DEFINES      += CONFIG_CMD_BENCHMARKS
    endif
    
    GLOBAL_INCLUDES += ./
    

    2. 目标二

    增加一个新模块info_b, 被另一个模块info_a所依赖。

    前4步和目标一中的一样,修改 info_a.c调用info_b的接口,再在 info_a.mk 加上下面这句即可:

    $(NAME)_COMPONENTS += info_b

    运行可见 info_ainfo_b 中的接口均被调用。

    3. 注意事项

    3.1 如果忘记添加新模块的头文件,编译可能不会报错,但是模块中的方法返回主程序的值会很奇怪。

    3.2 使用aos new ...创建的新项目,$(NAME)_COMPONENTS := yloop cli必须改为$(NAME)_COMPONENTS += yloop cli(也就是:=改为+=), 否则前面的+=info_a会被忽略。

    我是不会告诉你们我花了48小时才从上面的两个坑里面爬出来的~~~

    4. 非模块方式添加项目文件的方法

    比如一个项目 helloworld,需要添加项目子文件夹driver下的key.h/key.c
    需要做如下步骤:
    4.1 项目主文件helloworld.c 和其他相关的c文件需要包含头文件#include "driver/key.h"
    4.2 项目mk文件需要在$(NAME)_SOURCES := helloworld.c下面添加如下行:

    • $(NAME)_SOURCES += driver/gpio.c

    (注意必须在$(NAME)_SOURCES :=之后,或者将$(NAME)_SOURCES :=改为$(NAME)_SOURCES +=)

    • $(NAME)_INCLUDES += ./driver

    参考文献;

    1. AliOS-Things新增一个模块 - DataH - CSDN博客
    2. Add a new component example.zh · alibaba/AliOS-Things Wiki

    相关文章

      网友评论

          本文标题:SimonLiu的ESP8266与AliOS Things 学习

          本文链接:https://www.haomeiwen.com/subject/cxhsvqtx.html