欢迎加入交流群: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_a
和 info_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
参考文献;
网友评论