SimonLiu的ESP8266与AliOS Things 学习教程系列之七:添加模块(components)

欢迎加入交流群: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 

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 
#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 学习教程系列之七:添加模块(components))