全局掌控
- 确定新项目的目录
- 用VSCode新建项目
- 重新打开SDK目录
- 简单修改新项目的模板
- 编译,烧写,查看结果
- AliOS Things 的Yloop调度
新项目的目录
我们将从Git上面下载的源码,称之为SDK。
这个文件夹,就是存放SDK的文件夹。
SDK的路径你随意放。
在零妖的电脑上,SDK的路径是:F:AliOS_SourceAliOS-Things
新建的项目,需要放到SDK里面的一个叫做 example 的目录。
这个目录里面已经有一些参考项目了。
咱们要做的,就是在这个目录里面新建自己的项目。
比如零妖要新建一个 led1 的项目,那就新建一个文件夹,名字叫做 led1 。
新建的项目路径是:F:AliOS_SourceAliOS-Thingsexampleled1
VSCode新建项目
打开VSCode,点击这个符号就可以新建项目。
你提前复制好你的项目路径。
零妖的电脑上,这个路径是:F:AliOS_SourceAliOS-Thingsexampleled1
点过之后,这里会有一个默认路径,删除掉。
粘贴上自己的项目路径后,敲回车。
OK,这一步完成后,你就可以关闭VSCode了。
打开刚才新建的项目文件夹,发现里面多了许多文件。
重新打开SDK的目录
需要用VSCode,重新打开SDK文件夹。
看到了吧。刚才新建的项目已经能找到了。
简单修改新项目的模板
新建的项目,是一个Helloworld的模板项目。
简单修改一下。
编译,烧写,查看结果
编译之前要选择对应的项目,选择对应的硬件。
选择好之后,编译一下。
编译OK。
烧写OK。
打开串口。
输出的调试信息和咱修改的一致。
AliOS Things 的Yloop调度
Yloop实现原理
Yloop是AliOS Things的异步事件框架。
每个Yloop实例(aos_loop_t)与特定的任务上下文绑定。
AliOS Things的程序入口application_start所在的上下文与系统的主Yloop实例绑定,该上下文也称为主任务。当底层的OS初始化完毕后,会第一个执行 application_start 这个函数。
主任务以外的任务也可以创建自己的Yloop实例。
Yloop实现了对资源的的统一调度管理,比如:
- IO:最常见的是Socket,也可以是AliOS Things的vfs管理的设备
- timer:即常见的定时器
- callback:特定的执行函数
- event:包括系统事件,用户自定义事件
当调用aos_loop_run后,当前任务将会等待上述的各类事件发生。
程序讲解
application_start里面做了两件事情:
- 调用aos_post_delayed_action创建了一个1秒的定时器(Yloop里面只有oneshot timer)
- 调用aos_loop_run进入事件循环
1秒后,定时器触发,app_delayed_action被调用,而app_delayed_action里面
- 调用LOG打印
- 再次创建一个5秒的定时器,重而实现定期执行app_delayed_action
这里注意到,程序并不需要aos_loop_init()去创建Yloop实例,因为系统会默认自动创建主Yloop实例。
OS内的API参考:https://github.com/alibaba/AliOS-Things/wiki/AliOS-Things-API-YLOOP-Guide#6-aos_post_delayed_action
解释一个函数的原型:
int aos_post_delayed_action(int ms, aos_call_t action, void *arg)
作用:
比如:aos_post_delayed_action(5000, test, NULL);
系统定时5000ms,然后时间到了之后,运行 test() 这个函数。
//当OS初始化完成1S之后,系统会执行一次此函数
static void app_delayed_action(void *arg)
{
LOG("你好零妖 %s:%d %s\r\n", __func__, __LINE__, aos_task_name());//串口打印一些信息
aos_post_delayed_action(5000, app_delayed_action, NULL);//告诉系统,5S后执行一下这个函数
}
//主任务。OS初始化完成后,会第一个执行的函数。
int application_start(int argc, char *argv[])
{
LOG("初始化完成,应用程序开始:");//串口输出OS完成信息
aos_post_delayed_action(1000, app_delayed_action, NULL);//1S后,触发 app_delayed_action 函数
aos_loop_run();//OS开始等待各个事件是否发生,并随时准备执行对应的函数
return 0;
}
结束
- 新建的项目,一定要放到SDK里面,example的文件夹里。
- 一定要重新打开VSCode,然后打开SDK文件夹。
- example文件夹里面有很多参考项目,非常大的参考价值。
- 自己的项目,可以边参考例程,边自己修改。
微信公众号 偶尔更新