CC2530 中的ZigBee协议栈

1.何为协议栈

ZigBee协议栈将各个层的协议集合在一起,并以函数的形式实现,并且向用户提供接口,用户能够直接调用。

它本身就为一个工程。

2. 如何使用

  1. 开始组网,通过调用协议栈的组网函数等来实现网络的建立以及其他节点的加入网络;
  2. 发送数据,节点通过调用协议栈的消息发送函数来实现数据的无线发送;
  3. 接收数据,节点调用协议栈的消息接收函数来实现无线数据接收功能。

这就是它最常用得方法,组网,发送数据,接收数据,在协议栈中都有相应得函数。

3.下载ZigBee协议栈

[官网下载](Z-STACK 驱动程序或库 | 德州仪器 TI.com.cn)

4.例程文件介绍

在下载的zigbee协议栈中随便找一个事例工程打开,打开工程后如上所示。

APP: 为应用层的代码,用户的工作空间就在这。

BDB: zigbee 3.0新增的特性。实现ZigBee BDB(Base Device Behavior,设备基础行为)功能

GP:实现ZigBee GP(Green Power,绿色能源)功能。

HAL:硬件抽象层,存放各种驱动程序。

MAC:媒体介质访问控制,实现物理层通信及IEEE 802.15.4协议。

MT:监视层,为监视协议栈各层的运行状态提供支持。

NWK: ZigBee网络层。

OSAL:操作系统抽象层。

Profile:存放ZigBee标准化定义及相关功能实现的源代码文件。

Security:实现安全相关服务。

Services:提供一些公共的、常用的功能。

Tools:存放工程配置相关的文件。

ZDO:存放ZDO(ZigBee Device Object,ZigBee设备对象)相关源代码文件。

ZMac:属于mac层的内容。

ZMain:存放主函数所在的源代码文件及系统硬件启动相关的源代码文件。

Output:存放工程编译/链接时输出的文件。

ZigBee网络设备类型有3种,分别是Coordinator(协调器),Router(路由器)和EndDevice(终端设备),图中选项卡选项的含义描述如下:

(1)CoordinatorEB : ZigBee协调器。

(2)RouterEB : ZigBee路由器。

(3)EndDeviceEB : ZigBee终端设备。

(4)EndDeviceEB-OTAClient : 支持OTA(Over The Air)空中升级的ZigBee终端设备。

(5)RouterEB-OTAClient : 支持OTA(Over The Air)空中升级的ZigBee路由器。

5 启动流程

5.1 main()

打开ZMain文件夹下的ZMain.c文件,其中有main()函数,为程序的入口函数,程序在这里开始运行

里面有很多初始化函数,下面只说这两个函数:

​

osal_init_system();//-----------初始化操作系统--------
osal_start_system(); //---------开始任务调度---------
5.2 osal_init_system()

先看osal_init_system()这个函数,先跳转到这个函数里面

来到这个函数,可以看到调用了osalInitTasks()这个函数,接着跳转到osalInitTasks()这个函数,

来到这个函数,可以看到有各个层的初始化代码,并且分给了他们任务ID,下面还会提到这个任务ID,到这每个层的初始化就结束了,每个层都有自己的任务ID。

5.3 osal_start_system()

这个函数轮询任务池的函数,跳转到osal_start_system()中

void osal_start_system( void )
{
#ifdef USE_ICALL
/* Kick off timer service in order to allocate resources upfront.
* The first timeout is required to schedule next OSAL timer event
* as well. */
ICall_Errno errno = ICall_setTimer(1, osal_msec_timer_cback,
(void *) osal_msec_timer_seq,
&osal_timerid_msec_timer);
if (errno != ICALL_ERRNO_SUCCESS)
{
ICall_abort();
}
#endif /* USE_ICALL */ #if !defined ( ZBIT ) && !defined ( UBIT )
//主循环
for(;;)
#endif
{
//系统轮询调度
osal_run_system(); #ifdef USE_ICALL
ICall_wait(ICALL_TIMEOUT_FOREVER);
#endif /* USE_ICALL */
}
}

在osal_start_system()函数的主循环中,循环调用了 osal_run_system()函数,该函数主要工作轮询任务池。osal_run_system()函数的定义OSAL.c文件中,跳转到osal_run_system()中

代码太长,就贴出来一部,需要注意的就下面几行:

do {
if (tasksEvents[idx]) // Task is highest priority that is ready.
{
break;
}
} 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); activeTaskID = idx;
events = (tasksArr[idx])( idx, events );
activeTaskID = TASK_NO_TASK; HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx] |= events; // Add back unprocessed events to the current task.
HAL_EXIT_CRITICAL_SECTION(intState);
}

这是检测每个层是否有任务,如果有就去执行这个任务,执行之后,接着轮询,检测是否有任务,idx就是上述提到的任务ID。

do {
if (tasksEvents[idx]) // Task is highest priority that is ready.
{
break;
}
} while (++idx < tasksCnt);

这段代码中tasksEvents[idx]就是之前

申请的空间,用于存放每个层是否有任务的一个事件组之类的,如果有任务,这个层的tasksEvents[idx]就会被置1,读者可以跳转函数看看,

events = tasksEvents[idx];
...
activeTaskID = idx;
events = (tasksArr[idx])( idx, events );
activeTaskID = TASK_NO_TASK;
...

这个就是把任务的标志为给events,然后调用tasksArr [idx] (idx,events),这个函数就会根据idx的值调用相应层的事件处理函数.

6 应用层

每一个层次都有一个对应的任务来处理本层次的事务,例如MAC层对应一个MAC层的任务、网络层对应一个网络层的任务、HAL对应一个HAL的任务,以及应用层对应一个应用层的任务等,这些各个层次的任务构成一个任务池,这个任务池也就是上节课讲到的tasksEvents数组,如图所示。

下面打开APP下的

打开的例程不同,名字可能不同,不过,这无所谓

找到这两个函数

void zclSampleSw_Init( byte task_id )
{
zclSampleSw_TaskID = task_id;
...
MT_UartInit();
MT_UartRegisterTaskID(task_id);
... #endif
}
uint16 zclSampleSw_event_loop( uint8 task_id, uint16 events )
{
afIncomingMSGPacket_t *MSGpkt;
(void)task_id; // Intentionally unreferenced parameter if ( events & SYS_EVENT_MSG )
{
while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( zclSampleSw_TaskID )) )
{
switch ( MSGpkt->hdr.event )
{
... default:
break;
} // Release the memory
osal_msg_deallocate( (uint8 *)MSGpkt );
} // return unprocessed events
return (events ^ SYS_EVENT_MSG);
} // Rejoin Event
if ( events & SAMPLEAPP_REJOIN_EVT )
{
bdb_StartCommissioning(BDB_COMMISSIONING_MODE_NWK_STEERING |
BDB_COMMISSIONING_MODE_FINDING_BINDING ); return ( events ^ SAMPLEAPP_REJOIN_EVT );
} ... #endif // Discard unknown events
return 0;
}

每个层都有这两个函数,读者可以找找,看一下,一个初始化函数,一个事件处理函数,里面的参数前面也有提到,看一看。

7 结束

这里只讲了一些启动的大致过程,对于事件发送函数,如何处理函数及发送接收函数未提到,只是想让读者及笔者有一个大致方向,下面推荐一些更为详细的.

推荐

[推荐 一](Zigebee复习_void genericapp_messagemsgcb( afincomingmsgpacket_-CSDN博客)

[推荐二](ZigBee CC2530学习(二)认识协议栈_cc2530协议栈-CSDN博客)

[学习网站](课程简介 - ZigBee 3.0 开发指南 (topthink.com))

CC2530 中的ZigBee协议栈的更多相关文章

  1. ZigBee协议栈中AES加密算法

    原文地址:ZigBee协议栈中AES加密算法作者:大浪淘沙 Z-stack对Zigbee2006提供了全面的支持,功能之强大,性能稳定.安全性高,说到安全性是我们今天的主题.CC2430硬件支持128 ...

  2. [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)

    说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...

  3. [ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)

    1.Zigbee协议栈简介 协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收.协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用 ...

  4. 第1章 ZigBee协议栈初始化网络启动流程

    作者:宋老师,华清远见嵌入式学院讲师. ZigBee的基本流程:由协调器的组网(创建PAN ID),终端设备和路由设备发现网络以及加入网络. 基本流程:main()->osal_init_sys ...

  5. Zigbee协议栈--Z-Stack的使用

    使用方法简介:一般情况下用户只需要额外添加三个文件就可以完成一个项目.一个是主文件,存放具体的任务事件处理函数:一个是这个主文件的头文件:另外一个是以Osal开头的操作系统接口文件,是专门存放任务处理 ...

  6. Zigbee协议栈OSAL层API函数【转载】

              OSAL层提供了很多的API来对整个的协议栈进行管理.主要有下面的几类:信息管理.任务同步.时间管理.中断管理.任务管理.内存管理.电源管理以及非易失存储管理.看到这些管理是不是感 ...

  7. CC2530中串口波特率改为9600时单个数据包来不及接收的解决方案

    在调试CC2530过程中发现波特率改为9600时,单个包仅有3个Byte时,接收DMA就会启动 因而数据包被强迫拆分成多个,显然只要将接收DMA启动延时做到足够大即可. 具体修改内容如下图所示: 经过 ...

  8. cc2530中单片机的通用I/O接口

    cc2530中有21个输入/输出引脚. 这些引脚可以设置为通用I/O或者设置为外设I/O.(其实这里的外设还是不太懂到底指什么,网上说输入设备,但是通用I/O也可以输入啊,为什么要弄外设I/O?) 其 ...

  9. 基于ZigBee的家居控制系统的设计与应用

    基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘  要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通 ...

  10. 三、ZigBee无线网络工具

    CC2530概述 CC2530是德州仪器Ti公司用于2.4-GHz IEEE 802.15.4.ZigBee 和 RF4CE 应用的一个真正的片上系统(SoC)解决方案,是作为ZigBee无线传 感网 ...

随机推荐

  1. win32 - 创建带有标准阴影的无边框窗口

    这个框框好像删不掉,就先放这边吧...   #define WIN32_LEAN_AND_MEAN #include <unknwn.h> #include <windows.h&g ...

  2. Java 通过属性名称读取或者设置实体的属性值

    原因 项目实战中有这个需求,数据库中配置对应的实体和属性名称,在代码中通过属性名称获取实体的对应的属性值. 解决方案 工具类,下面这个工具是辅助获取属性值 import com.alibaba.fas ...

  3. 【Azure Webjob + Redis】WebJob一直链接Azure Redis一直报错 Timeout Exception

    问题描述 运行在App Service上的Webjob连接Azure Redis出现Timeout Exception. 错误截图: 参考Azure Redis对于超时问题的排查建议, 在修改Min ...

  4. 【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM

    问题描述 在Azure的Spring Cloud服务 (官名为:Spring Apps)中,在Metrics 页面中查看 App Memory Usage 和 jvm.memory.use,发现两则在 ...

  5. C++ STL 容器-array类型

    C++ STL 容器-array类型 array是C++11STL封装的数组,内存分配在栈中stack,绝对不会重新分配,随机访问 创建和初始化 // 下面的等同于int a[10]; std::ar ...

  6. SpringCloud Ribbon和Feign 的使用和源码分析

    1. Ribbon 介绍 Ribbon 是 Netflix 公司开源的一款 客户端 负载均衡软件,并被SpringCloud集成 作为SpringCloud 负载均衡的工具 服务端负载均衡 : 即在服 ...

  7. Java 关于变量的赋值

    1 /** 2 * 3 * @Description 4 * @author Bytezero·zhenglei! Email:420498246@qq.com 5 * @version 6 * @d ...

  8. Java 方法的重载(overload)

    1 /* 2 * 3 * 方法的重载(overload) 4 * 1.定义:在同一个类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型不同 5 * 6 * "两同一不同&quo ...

  9. 科技大厂、手机厂商、企服领域齐发力,手机智能体成AI Agent新趋势

    AI Agent涌向移动终端,手机智能体势不可挡 还没搞清楚什么是AI Agent,手机Agent就已经横空出世 AIGC为何涌向移动端?背后有哪些逻辑?什么是手机智能体?一文看明白 科技大厂.手机厂 ...

  10. 基于Apollo3 Blue MCU芯片的可穿戴产品解决方案开发之健康手环源码解析

    一 前记 健康手环是Apollo3 Blue的一个主打业务,也是该芯片最适合做的产品,在健康穿戴设备领域,该芯片有着对场景的透彻理解和技术的深厚积累. 二 源码分析 协议栈初始化: exactle_s ...