实验 任务建立实验
【实验目的】
1. 了解 ZigBee 2007 协议栈操作系统的工作机制
2. 熟悉系统中任务的基本格式
【实验设备】
1. 装有 IAR 开发工具的 PC 机一台
2. 实验箱一台
3. CCDebugger(以及 USB A-B 延长线)一个
【实验要求】
按照操作系统中任务的格式编写应用程序,实现每隔 1 秒钟让节点上的 LED 灯闪烁一次。

任务的概念:

一个任务(也称作一个线程),是一个简单的程序。该程序可以认为 CPU 完全只属于自己。实时应用
程序的设计思想是将问题分割成多个任务,每个任务都是整个应用程序的一部分,并赋予一定的优先级。

实验流程图

 

实验步骤

  1. PC机和实验箱用仿真器连接;
  2. 打开IAR,找到对应的任务代码,进行调试;
  3. APP组中的APP_Base.c中可以看到任务数组tasksArr,建立了任务处理函数,

 

  1. 在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

}