原创 【原创】ZigBee学习之20——SimpleAPP分析

2010-2-8 16:30 4466 5 5 分类: MCU/ 嵌入式

下面来看看这个最简单例子的分析


我将做最详细的分析,相信是程序注释量最大的了额


SimpleApp分析


程序总是从helloword开始的,如果能找到一个例子开始,那么是最好不多的了,还好Ti为我们提供了很多的机会,让我们开始看一下simpleapp吧【Texas Instruments\ZStack-<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1.4.3-1.2.1\Projects\zstack\Samples\SimpleApp


SimpleApp里面有两个应用,一个是收集传感器的值,其中有一个传感器设备和一个收集设备;另一个应用时智能开关,有一个控制节点和一个灯节点。这里主要展示了如何网络建立,绑定和解绑定的演示以及开发一个自己的应用。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


双击打开\Texas Instruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SimpleApp\CC2430DB\SimpleApp.eww工程,既然是51的内核那只能用C了,一个地球人都知道的原理就是C程序是从main()开始的,而且整个程序就是一个main()函数,那么好办了,我们找到main()然后分析它就可以看清楚整个程序的结构了。


在工作空间中有8种项目配置,因为TI提供了两种开发板,所以实际上4种项目配置,分别配置成应用中4种设备。


我们直接看智能灯的应用,跟这个应用相关的配置是(以DB开发板为原型):SimpleSwitchDB和SimpleControllerDB。SimpleSwitchDB是终端设备(我的理解是这里是灯的开关),SimpleControllerDB是控制设备是协调器或者路由器。这里之所以把和灯相连的设备作为协调器或者是路由器我认为是为了和家庭或者是场景中的其他设备进行交互所需要的。因为灯的状态还必须被其他的设备知道,就必须通知其他设备当前的状态!


演示效果:控制设备-SW1:以协调器启动,SW2:以路由器启动


启动控制设备将进入允许绑定状态,此时在10S内按动终端设备上的S1将发送绑定请求,成功绑定后LED1将点亮(如果打开节能选项,将是闪烁状态);按动终端设备上的S2将发送切换命令,将导致控制设备上的LED1开关状态的切换,按S3将此设备接绑定。效果清楚了接下来就是看看程序怎样了。


找到ZMain.c,看看函数的描述Description:    Startup and shutdown code for ZStack(启动和关闭Z-Stack)看来来对地方了哈。


第一个宏:MINIMIZE_ROOT(line 126)


如果定义这个宏那么ZMAIN中的API函数将被在ROOT段外实现以为用户提供更多的空间来定义自己的常量,默认这个编译选项是不定义的。所谓的ZMAIN API函数定义在line138-line144。在line152终于看到了期待的main()


ZSEG int main( void )
{
  // Turn off interrupts
  osal_int_disable( INTS_ALL );


  // Initialize HAL
  //处理器运行时钟,LED IO口设置
  HAL_BOARD_INIT();


  // Make sure supply voltage is high enough to run
  zmain_vdd_check();


  // Initialize stack memory
  zmain_ram_init();


  // Initialize board I/O
  InitBoard( OB_COLD );


  // Initialze HAL drivers
  HalDriverInit();


  // Initialize NV System
  osal_nv_init( NULL );


  // Determine the extended address
  zmain_ext_addr();


  // Initialize basic NV items
  zgInit();


  // Initialize the MAC
  ZMacInit();


#ifndef NONWK
  // Since the AF isn't a task, call it's initialization routine
  afInit();
#endif


  // Initialize the operating system
  osal_init_system();


  // Allow interrupts
  osal_int_enable( INTS_ALL );


  // Final board initialization
  InitBoard( OB_READY );


  // Display information about this device
  zmain_dev_info();


  /* Display the device info on the LCD */
#ifdef LCD_SUPPORTED
  zmain_lcd_init();
#endif


  osal_start_system(); // No Return from here
} // main()

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条