实验十 任务建立实验
【实验目的】
1. 了解 ZigBee 2007 协议栈操作系统的工作机制
2. 熟悉系统中任务的基本格式
【实验设备】
1. 装有 IAR 开发工具的 PC 机一台
2. 实验箱一台
3. CCDebugger(以及 USB A-B 延长线)一个
【实验要求】
按照操作系统中任务的格式编写应用程序,实现每隔 1 秒钟让节点上的 LED 灯闪烁一次。
任务的概念:
一个任务(也称作一个线程),是一个简单的程序。该程序可以认为 CPU 完全只属于自己。实时应用
程序的设计思想是将问题分割成多个任务,每个任务都是整个应用程序的一部分,并赋予一定的优先级。
实验流程图
实验步骤
- 将PC机和实验箱用仿真器连接;
- 打开IAR,找到对应的任务代码,进行调试;
- 在APP组中的APP_Base.c中可以看到任务数组tasksArr,建立了任务处理函数,
- 在osalInitTasks函数中,为该任务提供一个定时器,
调试,可以看到节点每隔一秒钟周期闪烁。
实验感想
刚开始接触Zigbee,比较陌生,对实验箱和代码还有IAR都不熟悉,查阅了网上一些资料,通过老师提供的实验指导书和光盘资料才把实验调试出来。通过这次实验,摸索了一段时间,弄懂了任务的格式,如何建立一个任务和任务的执行。
完整实验代码
#include "APP_Base.h"
#if defined(SAPP_ZSTACK_DEMO)
#include "hal_led.h"
// 任务建立实验范例代码
// 任务处理函数
uint16 Hello_ProcessEvent(uint8 task_id, uint16 events);
uint16 Hello_ProcessEvent(uint8 task_id, uint16 events)
{
if(events & 0x0001)
{
// 控制LED闪烁
HalLedBlink(HAL_LED_1, 1, 50, 250);
// 启动定时器, 设置1秒钟后再次触发该任务
osal_start_timerEx(task_id, 0x0001, 1000);
}
// 清除定时器事件标志
return (events ^ 0x0001);
}
#endif
// 任务列表
const pTaskEventHandlerFn tasksArr[] = {
macEventLoop,
nwk_event_loop,
Hal_ProcessEvent,
#if defined( MT_TASK )
MT_ProcessEvent,
#endif
APS_event_loop,
#if defined ( ZIGBEE_FRAGMENTATION )
APSF_ProcessEvent,
#endif
ZDApp_event_loop,
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
ZDNwkMgr_event_loop,
#endif
#if defined(SAPP_ZSTACK)
sapp_controlEpProcess,
sapp_functionEpProcess,
#endif
#if defined(SAPP_ZSTACK_DEMO)
// 任务建立实验范例代码
// 任务列表
Hello_ProcessEvent,
#endif
};
const uint8 tasksCnt = sizeof(tasksArr)/sizeof(tasksArr[0]);
// 初始化任务
void osalInitTasks( void )
{
uint8 taskID = 0;
macTaskInit( taskID++ );
nwk_init( taskID++ );
Hal_Init( taskID++ );
#if defined( MT_TASK )
MT_TaskInit( taskID++ );
#endif
APS_Init( taskID++ );
#if defined ( ZIGBEE_FRAGMENTATION )
APSF_Init( taskID++ );
#endif
ZDApp_Init( taskID++ );
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
ZDNwkMgr_Init( taskID++ );
#endif
#if defined(SAPP_ZSTACK)
sapp_taskInitProcess();
#endif
#if defined(SAPP_ZSTACK_DEMO)
// 任务建立实验范例代码
// 启动定时器
osal_start_timerEx(taskID, 0x0001, 1000);
#endif
}