zoukankan      html  css  js  c++  java
  • ZStack之ZDApp_Init解析

    [注:本文源自博客园http://www.cnblogs.com/cherishui/,为尊重劳动者成果,如需转载请保留此行]

    以下代码分析基于ZStack-CC2530-2.5.1a,开发环境为 IAR Embedded Workbench for 8051 IDE,版本号为8.30.2.

    ZDApp_Init在系统初始化时被调用,主要用来建立网络,注册系统消息和ZDO消息。

    image   

    地址相关函数名称 功能
    NLME_GetExtAddr 返回设备IEEE 64位地址的指针
    NLME_GetShortAddr 返回设备16位网络地址
    NLME_GetCoordShortAddr 返回设备的父节点的16位网络地址(PAN协调器的网络地址总是为0x0000)
    NLME_GetCoordExtAddr 返回设备父节点的IEEE 64位地址

    ZDAppCheckForHoldKey检查自动启动保持位,如果在上电启动的时候,检测到手工按下SW_BYPASS_START键,板子上的灯会持续闪烁,设备状态设置为DEV_HOLD,不进行网络初始化。TI自带的其他例子里面,定义了HOLD_AUTO_START这个宏,如果定义了这个宏,设备启动后不会自动组网。设备状态为DEV_HOLD,否则,设备状态为DEV_INIT。不管以什么方式启动,

    ZDO_Init:初始化ZDO条目,并设置设备的启动方式(ZDODeviceSetup),是协调器,还是路由器?

      image

    这个预定义宏,对于GenericApp这个demo来说,设计的很有特点.下面来分析一下.

    image

    f8wConfig.cfg为整个工程的全局配置文件,在任何设备的编译选项中都要被加入,对其任何的修改,将会影响到该份代码编译出的任何设备。

    ---------------------------技巧收集开始线---------------------------------------------------------

    备注:从网络上找到的好技巧,再次分享.向原文作者致敬。原文链接:http://blog.csdn.net/xshbx/article/details/7981564

    //两个测试宏
    #define PI 3.141592
    #define PI_TEST
    #deinfe MAX(a,b) ((a)>(b) ? (a):(b))
    
    //定义两个辅助宏
    #define PRINT_MACRO_HELPER(x) #x
    #define PRINT_MACRO #x" = "PRINT_MACRO_HELPER(x)
    
    //在需要测试该宏是否被定义,如果定义了,定义的值为多少时,在定义宏的下方调用
    #pragma message(PRINT_MACRO(PI))             //该宏定义并且定义了数值,则输出PI = 3.1415923
    #pragma message(PRINT_MACRO(PI_TEST))        //该宏定义了,没有定义数值,则输出PI = 
    #pragma message(PRINT_MACRO(PI2))            //如果该宏不存在的话,则输出PI2=PI2
    #pragma message(PRINT_MACRO(MAX(x,y)))       //输出MAX(x,y)=((x)>(y)?(x):(y))

    只要编译器支持pragma语法(一般C/C++编译器都支持的),就可以实现。

    ---------------------------技巧收集结束线--------------------------------------------------------

    image

    在ZDOInitDevice中,可以通过按键来跳过一些初始化设置,例如网络层的NV存储和网络层的初始化。确定好设备状态和初始化参数后,调用最关键的函数ZDApp_NetworkInit( extendedDelay ),顾名思义,该函数执行ZigBee网络的初始化操作。在这个函数里面 image

    通过我们前面的分析,可以知道,发给ZDApp的这个消息,会被ZDApp_event_Loop函数接收,

    image

    响应ZDO_NETWORK_INIT事件,再发起一个ZDO_STATE_CHANGE_EVT,然后执行ZDO_StartDevice来启动整个ZigBee设备网络层的实际初始化。

    image

    如果设备为路由器或者终端的话,则会发起NLME_NetworkDiscoveryRequest 请求原语来发起网络发现。如果设备的状态为MODE_RESUME,则会启动孤儿扫描流程。

     

    NLME_NetworkFormationRequest请求原语的响应函数,在源码里面没有找到,估计是在库中封装响应了,不过,找到了ZDO_NetworkFormationConfirmCB这个函数,从名字上来猜想,应该是收到响应信息后调用的回调函数。还有一个表示网络状态的函数nwk_Status,也是被调用执行的。

    从Z-Stack API文档中可以知道,NLME_NetworkFormationRequest函数返回的结果将传递给ZDO_NetworkFormationConfirmCB,网络建立成功后,会给ZDAppTask发送一个ZDO_NETWORK_START的消息,

     

     

     

     

     

  • 相关阅读:
    使用adns库解析域名
    三星DRAM+NAND FLASH 合成MCP芯片介绍及应用攻略
    内核initcall分析
    linux head-common.s分析(转)
    linux heads分析(转)
    虚拟内存_内核空间_用户空间
    linux kernel学习笔记-5内存管理_转
    u-boot README--linux support
    u-boot README--Memory Management&initialize
    linux内核中mtd架构分析
  • 原文地址:https://www.cnblogs.com/cherishui/p/3689376.html
Copyright © 2011-2022 走看看