ZigBee协议栈工作原理

ZigBee协议栈工作原理  ZigBee的任务轮询如下图:  打开协议栈文件夹TexasInstruments\Projects\zstack,里面包含了TI公司的例程和工具。再打开Samples文件夹:  Samples文件夹里面有三个例子,即GenericApp、SampleApp、SimpleApp。在这里我们选择SampleApp对协议栈的工作流程进行讲解。打开SampleApp\CC2530DB下的工程文件SampleApp.eww,留意左边的工程目录,我们暂时只需要关注Zmain文件夹和App文件夹。  

大家好,又见面了,我是你们的朋友全栈君。

  ZigBee的任务轮询如下图:
在这里插入图片描述
  打开协议栈文件夹Texas Instruments\Projects\zstack,里面包含了TI公司的例程和工具。再打开Samples文件夹:
在这里插入图片描述
  Samples文件夹里面有三个例子,即GenericAppSampleAppSimpleApp。在这里我们选择SampleApp对协议栈的工作流程进行讲解。打开SampleApp\CC2530DB下的工程文件SampleApp.eww,留意左边的工程目录,我们暂时只需要关注Zmain文件夹和App文件夹。
在这里插入图片描述
  任何程序都在main函数开始运行,Z-STACK也不例外。打开Zmain.C,找到main函数。大概浏览一下main函数的代码:

int main ( void ) { 
   
    osal_int_disable ( INTS_ALL ); /* Turn off interrupts 关闭所有中断 */
    HAL_BOARD_INIT(); /* Initialization for board related stuff such as LEDs */
    zmain_vdd_check(); /* Make sure supply voltage is high enough to run 检查芯片电压是否正常 */
    InitBoard ( OB_COLD ); /* Initialize board I/O 初始化I/O、LED、Timer等 */
    HalDriverInit(); /* Initialze HAL drivers 初始化芯片各硬件模块 */
    osal_nv_init ( NULL ); /* Initialize NV System 初始化Flash存储器 */
    ZmacInit(); /* Initialize the MAC 初始化MAC层 */
    zmain_ext_addr(); /* Determine the extended address 确定“IEEE 64”位地址 */
    zgInit(); /* Initialize basic NV items 初始化非易失变量 */
#ifndef NONWK
    afInit(); /* Since the AF isn't a task, call it's initialization routine */
#endif
    osal_init_system(); /* Initialize the operating system 初始化操作系统 */
    osal_int_enable ( INTS_ALL ); /* Allow interrupts 使能全部中断 */
    InitBoard ( OB_READY ); /* Final board initialization 初始化按键 */
    zmain_dev_info(); /* Display information about this device 显示设备信息 */
#ifdef LCD_SUPPORTED /* Display the device info on the LCD */
    zmain_lcd_init();
#endif
#ifdef WDT_IN_PM1
    WatchDogEnable ( WDTIMX ); /* If WDT is used, this is a good place to enable it. */
#endif
    osal_start_system(); /* No Return from here 执行操作系统,进去后不会返回 */
    return 0; /* Shouldn't get here. */
}

  我们重点了解2个函数:初始化操作系统osal_init_system,运行操作系统osal_start_system。先来看osal_init_system系统初始化函数。进入该函数,发现里面有6个初始化函数,这里只关心osalInitTasks任务初始化函数:

void osalInitTasks ( void ) { 
   
    uint8 taskID = 0;
    tasksEvents = ( uint16 * ) osal_mem_alloc ( sizeof ( uint16 ) * tasksCnt ); /* 分配内存,返回指向缓冲区的指针 */
    osal_memset ( tasksEvents, 0, ( sizeof ( uint16 ) * tasksCnt ) ); /* 设置所分配的内存空间单元值为0 */
    /* 任务优先级由高向低依次排列,高优先级对应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(5),用户需考虑 */
}

  我们可以这样理解,函数对taskID这个东西进行初始化,每初始化一个任务,taskID加一。大家看到了注释后面有些写着用户需要考虑,有些则写着用户不需考虑。写着需要考虑的,用户可以根据自己的硬件平台进行设置;写着不需考虑的,则是不能修改的。
  我们再来看第二个函数osal_start_system运行操作系统。TI对该函数的描述为This function is the main loop function of the task system. It will look through all task events and call the task_event_processor() function for the task with the event. If there are no events (for all tasks), this function puts the processor into Sleep. This Function doesn't return.,翻译成中文是这个是任务系统轮询的主要函数,它会查找发生的事件,然后调用相应的事件执行函数。如果没有事件登记要发生,那么就进入睡眠模式。这个函数是永远不会返回的

void osal_start_system ( void ) { 
   
#if !defined ( ZBIT ) && !defined ( UBIT )
    for ( ;; ) /* Forever Loop */
#endif
    { 
   
        uint8 idx = 0;
        osalTimeUpdate(); /* 这里是在扫描哪个事件被触发了,然后置相应的标志位 */
        Hal_ProcessPoll(); /* This replaces MT_SerialPoll() and osal_check_timer(). */

        Do { 
   
            if ( tasksEvents[idx] ) { 
    /* Task is highest priority that is ready. */
                break; /* 得到待处理的最高优先级任务索引号idx */
            }
        } while ( ++idx < tasksCnt );

        if ( idx < tasksCnt ) { 
   
            uint16 events;
            halIntState_t intState;
            HAL_ENTER_CRITICAL_SECTION ( intState ); /* 进入临界区,保护 */
            events = tasksEvents[idx]; /* 提取需要处理的任务中的事件 */
            tasksEvents[idx] = 0; /* Clear the Events for this task. 清除本次任务的事件 */
            HAL_EXIT_CRITICAL_SECTION ( intState ); /* 退出临界区 */
            events = ( tasksArr[idx] ) ( idx, events ); /* 通过指针调用任务处理函数,关键 */
            HAL_ENTER_CRITICAL_SECTION ( intState ); /* 进入临界区 */
            tasksEvents[idx] |= events; /* Add back unprocessed events to the current task. 保存未处理的事件 */
            HAL_EXIT_CRITICAL_SECTION ( intState ); /* 退出临界区 */
        }
#if defined( POWER_SAVING )
        else { 
    /* Complete pass through all task events with no activity? */
            osal_pwrmgr_powerconserve(); /* Put the processor/system into sleep */
        }
#endif
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140214.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 扫描系统漏洞的工具_免费漏洞扫描工具

    扫描系统漏洞的工具_免费漏洞扫描工具端口扫描之王NMAPNmap是一款非常强大的实用工具包含的功能如下:扫描到的端口状态:TCP扫描(-sT):这是一种最为普通的扫描方法,这种扫描方法的特点是:扫描的速度快,准确性高,对操作者没有权限上的要求,但是容易被防火墙和IDS(防入侵系统)发现运行的原理:通过建立TCP的三次握手连接来进行信息的传递SYN扫描(-sS):这是一种秘密的扫描方式之一,因为在SYN扫描中Client端和Server端没有形成3次握手,所以没有建立一个正常的TCP连接,因此不被防火墙和日志所记录…

    2025年11月3日
    5
  • 【19】进大厂必须掌握的面试题-50个React面试

    【19】进大厂必须掌握的面试题-50个React面试

    2020年11月13日
    212
  • 利用MDK软件生成bin文件的简单方法

    利用MDK软件生成bin文件的简单方法一、缘由:之前学习KeilMDK-ARM软件,找了好久生成bin文件的方法,这次分享最简单的,所以写了此篇博文二、操作步骤:1、打开“KeilMDK-ARM软件”-找到魔术棒“Optionsfortarget…”:2、点击“User”选择AfterBulid/Rebuild状态下的“▢Run#1”:3、点击后面的空白处,写入命令,,最后关闭窗口,重新编译软件,即可生成bin文件:4、具体命令如下:命令格式1:fromelf.exe–bin-o“%L@L.

    2022年10月20日
    2
  • ConcurrentModificationException异常解决办法

    1、在开发自己的第一款app,在操作存放子弹的ArrayList时,报出java.util.ConcurrentModificationException异常,因为该异常是非捕获型异常而且很少见,所以费了些时间才找到问题所在.查询了很多资料,终于调通了.原代码是这样的,synchronized(mCowBoys){ for(CowBoySprite cowBoy: mCowBoys)

    2022年3月9日
    41
  • 解决了无法显示验证码的问题怎么办_验证码不能显示的问题

    解决了无法显示验证码的问题怎么办_验证码不能显示的问题 晚上检测一个站的时候,猜解出了密码,扫出了后台,可验证码就是无法显示,难道管理员故意弄的?不太可能吧?于是上网一搜,没想到还真找到了解决的方法。我的是VistaUltimate,部分XPSP2也会有这个问题。好了,不废话了,解决办法如下:运行regedit,找到“HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/InternetExplorer/Securit

    2025年9月26日
    5
  • mysql h2_h2初始化数据库

    mysql h2_h2初始化数据库H2是一个开源的嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提供了一个十分方便的web控制台用于操作和管理数据库内容。H2还提供兼容模式,可以兼容一些主流的数据库,因此采用H2作为开发期的数据库非常方便。一、引入Maven依赖在maven中定义H2数据库的版本属性1.3.172添加H2依赖com.h2databaseh2${h2.version}test二、运行方式1、在内存中…

    2022年10月10日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号