芯科zigBee开发过程:3、APP程序的架构及开发模式

文章介绍了使用芯科SDK进行程序开发时的程序架构,特别是simplicitystudioV4和V5的区别。主要程序入口在simple-main.c文件,入口函数是main()。开发模式包括回调函数MainInit和MainTick,以及事件处理函数,如ledEventFunction。文章强调了理解和掌握回调和事件机制对于程序开发的重要性。
摘要由CSDN通过智能技术生成

一、程序架构

因为是使用芯科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);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值