首页 > 其他分享 >CC2530 中的ZigBee协议栈

CC2530 中的ZigBee协议栈

时间:2024-03-19 11:11:39浏览次数:22  
标签:协议 函数 idx ZigBee system CC2530 osal events

### CC2530 中得ZigBee协议栈

1.何为协议栈

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

它本身就为一个工程。

2. 如何使用

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

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

3.下载ZigBee协议栈

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

4.例程文件介绍

image-20240319105931214

在下载的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:存放工程编译/链接时输出的文件。

image-20240319105954740

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()函数,为程序的入口函数,程序在这里开始运行

image-20240319110009073

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

image-20240319110025653

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

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

image-20240319110040865

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

image-20240319110055036

来到这个函数,可以看到有各个层的初始化代码,并且分给了他们任务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()中

image-20240319110111613

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

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]就是之前

image-20240319110126155

申请的空间,用于存放每个层是否有任务的一个事件组之类的,如果有任务,这个层的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数组,如图所示。
image-20240319110136298

下面打开APP下的

image-20240319110146741

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

找到这两个函数

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))

标签:协议,函数,idx,ZigBee,system,CC2530,osal,events
From: https://www.cnblogs.com/lyk-23/p/18082310

相关文章

  • ONVIF协议:推动安防行业标准化与协同性的重要力量
    ​在数字化和智能化的浪潮中,安防行业正面临着前所未有的发展机遇。作为网络视频产品的重要接口标准,ONVIF协议(OpenNetworkVideoInterfaceForum,开放型网络视频接口论坛)在推动安防行业的标准化与协同性方面发挥着重要作用。目前,网络摄像机的标准协议,国标标准上有三大类:ONVIF/PSIA......
  • 前端基础之HTTP协议介绍
    HTTP协议介绍HTTP协议(HyperTextTransferProtocol,超文本传输协议),用来规定服务端和浏览器之间的数据交互的格式,也是用于从万维网(WWW:WorldWideWeb)服务器传输超文本到本地浏览器的传送协议。该协议构建于TCP/IP协议族之上,属于应用层协议。主要用于传输与超文本相关的资源文件......
  • 传输层协议
    tcp/ip模型应用层传输层网络层接口层tcp/ip协议族tcp(传输控制协议):面向连接,在传递数据之前,会测试主机的联通性,如果通才会传输真实数据udp(用户数据报协议):无连接,不会测试主机的联通性,直接传递真实数据面向连接网络协议:是指通信双方之间在进行通信之前要先建立连......
  • AMBA协议
    AMBA(AdvancedMicrocontrollerBusArchitecutre,高级微控制器总线架构)协议由arm公司开发,是一组芯片通信协议的规范,广泛用于SoC设计中。主要包括以下3个部分:APB:advancedperipheralbus高级外设总线AHB:advancedhigh-performancebus高级高性能总线AXI:advancedexte......
  • 15. SPI通信协议
    一、SPI通信协议简介  SPI是SerialPeripheralinterface缩写,顾名思义就是串行外围设备接口。SPI通信协议是Motorola公司首先在其MC68HCXX系列处理器上定义的。SPI接口是一种高速的全双工同步的通信总线。SCK(SerialClock)时钟信号,由主设备产生。MOSI(MasterOut/......
  • 为什么 HTTP3.0 使用 UDP 协议?
    HTTP2.0和TCP的关系HTTP2.0是2015年推出的,还是比较年轻的,其重要的二进制分帧协议、多路复用、头部压缩、服务端推送等重要优化使HTTP协议真正上了一个新台阶。像谷歌这种重要的公司并没有满足于此,而且想继续提升HTTP的性能,花最少的时间和资源获取极致体验。那肯定要问HTTP2.0......
  • HTTPS 协议
    深入了解HTTPS协议在当今数字化时代,网络安全是至关重要的。随着网络攻击日益增多,保护数据的安全和隐私变得尤为重要。HTTPS(HypertextTransferProtocolSecure)作为一种保护网络通信安全的协议,正日益受到重视。本文将深入探讨HTTPS协议的工作原理、优势以及实施方法。1.......
  • 【网络原理】TCP协议详细解析
    文章目录......
  • NMEA 0183协议消息内容解析(HTZN TTL / HT1818Z3G5L)
    1.简单介绍​ HT1818Z3G5L(HTZNTTL)基于杭州中科微电子AT6558D芯片所打造的一款GPS+BDS北斗+GLONASS格洛纳斯卫星定位授时导航模块,该模块采用3.3V供电,串口TTL接收NMEA0183协议消息。​ NMEA0183协议的消息内容大致可分为两种,定位与时间消息、卫星状态消息,这里我们主要介绍一......
  • UART协议
    参考博客:https://blog.csdn.net/weixin_49259827/article/details/133761740 Uart:UniversalAsyncchronousReceiverTransmitter即通信异步收发器,是一种通用的串行、异步通信总线。该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与设备之前的通信波......