我是靠谱客的博主 雪白冬瓜,最近开发中收集的这篇文章主要介绍ZigBee协议栈浅显解读(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目前ZigBee开发主要用的是TI的CC2530。CC2530内部集成看增强型的51所以对于只学过51的小白入门不成问题。
本篇文章我只会介绍ZigBee的协议栈。
我们打开ZigBee协议栈后可以加看到这样的界面
这里写图片描述
上面的各个层的基础知识你们自己查去。
我们点开ZMain.c 熟悉一下ZigBee的协议栈的流程
main()函数主要就做两件事
一是系统初始化。二是开始执行函数osal_start_system(),进入查询式操作系统

int main( void )
{

  osal_int_disable( INTS_ALL ); //关闭所有中断

  HAL_BOARD_INIT();             //初始化系统时钟

  zmain_vdd_check();            //检查芯片电压是否正常

  InitBoard( OB_COLD );         //初始化I/O ,LED 、Timer 等

  HalDriverInit();              //初始化芯片各硬件模块

  osal_nv_init( NULL );         //初始化Flash 存储器

  ZMacInit();                   //初始化MAC 层

  zmain_ext_addr();             //确定IEEE 64位地址

  zgInit();                     //初始化非易失变量

#ifndef NONWK //如果没有定义NONWK编译选项,则进行AF初始化
  afInit();
#endif

  osal_init_system();           //初始化操作系统

  osal_int_enable( INTS_ALL );  //使能全部中断

  InitBoard( OB_READY );        //最终板载初始化

  zmain_dev_info();             //显示设备信息

#ifdef LCD_SUPPORTED //如果使用LCD_SUPPORTED编译选项,在LCD上显示设备的调试信息
  zmain_lcd_init();             //初始化LCD
#endif

#ifdef WDT_IN_PM1 //如果定义了WDT_IN_PM1,则使能看门狗

  WatchDogEnable( WDTIMX );
#endif

  osal_start_system(); // 进入轮转查询式操作系统事件处理的死循环,不再返回主函数

  return 0;  
}

在main()的函数中只有两重要的函数需要留意。分别为
osal_init_system(); //初始化操作系统
osal_start_system(); //进入轮转查询式操作系统事件处理的死循环
首先我们来看看osal_init_system(); //初始化操作系统

uint8 osal_init_system( void )
{
  // Initialize the Memory Allocation System
  osal_mem_init();

  // Initialize the message queue
  osal_qHead = NULL;

  // Initialize the timers
  osalTimerInit();

  // Initialize the Power Management System
  osal_pwrmgr_init();

  // Initialize the system tasks.
  osalInitTasks(); //初始化系统任务

  // Setup efficient search for the first free block of heap.
  osal_mem_kick();

  return ( SUCCESS );
}

在osal_init_system()的这个函数中 我们重点看的是
osalInitTasks(); //初始化系统任务
我们进入osalInitTasks();看看

void osalInitTasks( void ) //任务的初始化
{
  uint8 taskID = 0;

  // 分配内存,返回指向缓冲区的指针
//这两句代码为一个长度tasksCnt(任务的个数)的unit16数组taskEvents分配了内存空间并将其值初始化为零
//变量taskID初始值为0,每层初始化后其值加1,在每一层初始化过程中记录分配给他的taskID值
  tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
  // 设置所分配的内存空间单元值为0
  osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));

  // 任务优先级由高向低依次排列,高优先级对应taskID 的值反而小
  macTaskInit( taskID++ );  //macTaskInit(0) ,用户不需考虑
  nwk_init( taskID++ );     //nwk_init(1),用户不需考虑
  Hal_Init( taskID++ );     //Hal_Init(2) ,用户需考虑
#if defined( MT_TASK )
  MT_TaskInit( taskID++ );
#endif
  APS_Init( taskID++ );      //APS_Init(3) ,用户不需考虑
#if defined ( ZIGBEE_FRAGMENTATION )
  APSF_Init( taskID++ );
#endif
  ZDApp_Init( taskID++ );    //ZDApp_Init(4) ,用户需考虑
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
  ZDNwkMgr_Init( taskID++ );
#endif
  //用户创建的任务
  SampleApp_Init( taskID );  // SampleApp_Init _Init(5) ,用户需考虑
}

为什么我们要给每一层分配任务ID?
首先我们来看看ZigBee的系统
ZigBee的操作系统是轮转查询式的操作系统
下面是其流程图

这里写图片描述
系统开始运行后,就开始不断根据我们分配的taskID,从优先级高的层的任务优先处理。
优先级高的任务处理后,再次从新回到原点,重新查询,从优先级高的层的任务处理。如果优先级高的任务不需要处理,查询下一级的任务,如果任务没有处理,开始处理任务。处理结束后,回到起点,重新从最高优先级的层查询。

最后

以上就是雪白冬瓜为你收集整理的ZigBee协议栈浅显解读(一)的全部内容,希望文章能够帮你解决ZigBee协议栈浅显解读(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部