"Zigbee 添加自己的任务,主要涉及如何在Zigbee应用程序中创建和管理自定义的任务,包括任务的初始化、事件处理函数的定义和声明,以及任务与事件处理函数之间的关联。"
在Zigbee应用开发中,有时需要根据特定需求添加自定义的任务。这里以2007Pro版本为例,介绍如何在ZStack框架下添加一个名为"yylong"的新任务。首先,我们需要在`osalInitTasks`函数中注册任务的初始化函数。在这个例子中,`ZDApp_Init`和`SampleApp_Init`是已经存在的任务初始化函数,而`Fanli_Init`是我们要添加的自定义任务的初始化函数。
```c
void osalInitTasks(void){
……………..
ZDApp_Init(taskID++);
SampleApp_Init(taskID++);
Fanli_Init(taskID); // 添加任务初始化函数
}
```
任务ID是通过`taskID++`递增来分配的,确保每个任务有一个唯一的ID。`Fanli_Init`函数接收这个ID,并可以用于后续的自定义任务初始化操作,例如设置全局变量`yylong_TaskID`来记录任务的ID。
接下来,我们需要定义任务的事件处理函数。事件处理函数是任务的核心,它会响应特定的事件并执行相应的操作。在这个例子中,`Fanli_ProcessEvent`是我们的自定义事件处理函数,它负责处理`yylong`任务的事件:
```c
uint16 Fanli_ProcessEvent(uint8 task_id, uint16 events){
P1_0 = ~P1_0; // led1翻转
osal_start_timerEx(yylong_TaskID, 3, 250); // 250ms后再次启动yylong_TaskID任务
return 0;
}
```
此函数会反转LED状态,并设置定时器在250毫秒后触发`yylong`任务。
为了使系统知道这个事件处理函数,我们需要在对应的头文件(如`SampleApp.h`)中声明它:
```c
extern void Fanli_Init(uint8 task_id);
extern UINT16 Fanli_ProcessEvent(uint8 task_id, uint16 events);
```
这样,其他源文件就可以正确地引用和调用这些函数。
最后,`tasksArr[]`数组用于存储所有任务的事件处理函数指针。数组的结构必须与`osalInitTasks()`中任务添加的顺序保持一致,确保每个任务ID与其对应的事件处理函数相匹配。例如:
```c
const pTaskEventHandlerFnt tasksArr[] = {
……………….
ZDApp_event_loop,
SampleApp_ProcessEvent,
Fanli_ProcessEvent // 添加任务处理函数
};
```
这里的顺序与`osalInitTasks()`中的`Fanli_Init`添加顺序一致,保证了任务ID和事件处理函数在数组中的位置对应。
通过以上步骤,我们就成功地在Zigbee应用中添加了一个新的自定义任务"yylong",并且实现了它的初始化和事件处理逻辑。在实际开发中,可以根据需求扩展更多的任务和事件,以此实现更复杂的Zigbee网络功能。