一、程序架构
因为是使用芯科SDK进行程序开发。所以在开发APP程序前需要了解和熟悉整个程序架构,这样才可以对程序进行修改。
首先,simplicity studioV4所生成的程序架构和simplicity studioV5所生成的程序架构是不一样的。且V5生成的程序的架构与一般的MCU程序没什么不一样,都是以main函数为入口。 这里主要重点说明的是使用V4生成的程序的架构。
对于初学者来说,用新不用旧,尽量使用simplicity studio V5进行程序的开发。
(1)、程序入口
程序的入口在simple-main.c文件中。
#include PLATFORM_HEADER
#include "app/framework/include/af.h"
// Our entry point is typically main(), except during testing.
#ifdef EMBER_TEST
#define MAIN nodeMain
#else
#define MAIN main
#endif
int MAIN(MAIN_FUNCTION_PARAMETERS)
{
halInit();
emberAfMainInit();
return emberAfMain(MAIN_FUNCTION_ARGUMENTS);
}
halInit()函数和emberAfMainInit()函数功能是初始化时钟、外设等,是根据simplicity studio自动生成的,建议不要修改。
主要注意的是emberAfMain()函数中的内容。里面主要设置用户自定义的初始化函数及主循环处理函数,其中的while(1)就相当于单片机裸机开发中的主循环。
二、开发模式
在实际开发中我们只需要在’.isc’文件的Callbacks选项中勾选Main Init及Main Tick
Main Init函数功能是开机时用户的初始化 Main Tick函数功能是用户的主循环处理 这两个函数都是在emberAfMain()中调用的。
勾选并且生成工程后我们只需要在coordinator_callbacks.c文件中实现以上两个函数,不实现的话直接编译也会出现报错。但是在后续修改配置后生成工程的时候可能会覆盖coordinator_callbacks.c文件中的内容。所以可以自己在工程中添加自定义用户文件。这样也方便后续平台改变带来的移植问题。
在开发过程中除了可以使用回调机制外,还可以使用事件机制进行程序开发,两者配合可以快速的进行程序功能的开发。学会这两个机制是非常有必要的。使用事件机制时在’.isc’文件中的Includes选项中的Event Configuration中,这里设置了三个事件处理函数。
以第一个处理函数为例ledEventControl是管理结构体,ledEventFunction是事件的处理函数。以下代码实现事件处理函数。
EmberEventControl ledEventControl;
void ledEventFunction(void)
{
//用户实现代码
//例如实现LED灯状态翻转
}
事件处理函数需要配合以下几个函数进行使用:
//功能是设置ledledEventFunction为活动状态,执行后ledEventFunction会执行一次
emberEventControlSetActive(ledEventControl);
//功能是设置ledledEventFunction为空闲状态,一般放到ledledEventFunction函数的起始位置
emberEventControlSetInactive(ledEventControl);
//功能是设置ledledEventFunction函数在500ms后执行
emberEventControlSetDelayMS(ledEventControl, 500);
例如需要实现简单的流水灯功能只需参考以下程序:
void emberAfMainInitCallback(void)
{
emberEventControlSetActive(ledEventControl);
}
void ledEventFunction(void)
{
emberEventControlSetInactive(ledEventControl);
halToggleLed();
emberEventControlSetDelayMS(ledEventControl, 500);
}