Optimizing CC2530 Z-Stack 3.0.2 Flash and RAM 翻译



点击左上角的“关注”,定期更新 Zigbee 最新资讯,总有你想要的信息!

摘要

  本文档旨在帮助开发人员在使用 CC2530 平台开发自己的应用程序时优化 Z-stack 3.0.2 的 Flash 和 RAM 的使用。它还描述了由于 CC2530 RAM 大小的局限性,在使用 CC2530 设备作为 Zigbee 协调器设备时的一些限制。本文档将以 Z-stack 3.0.2 中的 Sample Switch 路由项目作为例程讲解。


1. 源例程代码大小

  Z-Stack 3.0.2 可从 Texas Instruments Z-STACK 工具页面下载,安装完成后将默认存放在 C:\TexasInstruments 中。首先在 IAR EW 8051 v10.20 中加载 CC2530 项目工作区。在 IAR 中选择 File->Open Workspace 并找到正确的工作区文件即可加载,在本例 SampleSwitch.ew 示例位于这里:
C:\TexasInstruments\Z-Stack3.0.2\Projects\zstack\HomeAutomation\SampleSwitch\CC2530DB
  然后在 IAR中 点击 Project->Configuration 并选择 Router 选项,然后点击 Project->Make(或按下F7),在不做任何修改的情况下从 Z-stack 3.0.2 构建 Sample Switch 路由器项目。生成代码后,请参阅 .map文件(位于Output 文件夹中)的最底端,以查看内存占用的起点:

 239 555 bytes of CODE  memory
      32 bytes of DATA  memory (+ 68 absolute )
   7 425 bytes of XDATA memory
     192 bytes of IDATA memory
       8 bits  of BIT   memory
   1 867 bytes of CONST memory

  这个列表我们主要看 CODE 和 XDATA 内存,它们分别对应的是 Flash 和 RAM。

2. Flash优化

2.1 删除示例用户界面

  Z-Stack 3.0.2 示例应用程序提供的用户界面 (UI) 提供了一种可以轻松启动和运行网络的方法,在 LCD上查看网络状态,并在运行时修改网络调试参数。然而,它也会占用大量的代码空间,开发人员不必将其保存在自己的自定义应用程序中。
要删除此接口,必须做三件事:

  • 从编译中排除UI文件
  • 删除示例应用程序文件中对 UI 函数的 API 调用
  • 修改项目编译标志以排除与 LCD 相关的驱动程序

2.1.1 排除UI文件

  首先,我们要从编译中排除 App/zcl_sampleapps_ui.c。可以通过右键单击该文件并转到 “Options…”,然后单击提示左上角的复选框将其从编译中排除。
在这里插入图片描述

2.1.2 删除对 UI 函数的 API 调用

  在 zcl_samplesw.c 中,我们必须删除对 UI API 的各种调用。在这个文件中搜索 “UI_”,然后注释掉或者完全删除这个代码。例如:

voidzclSampleSw_Init(bytetask_id)
{
	...
	//UI_Init(zclSampleSw_TaskID,SAMPLEAPP_LCD_AUTO_UPDATE_EVT,SAMPLEAPP_KEY_AUTO_REPEAT_EVT,
	//&zclSampleSw_IdentifyTime,APP_TITLE,&zclSampleSw_UiUpdateLcd,zclSampleSw_UiStatesMain);
	//UI_UpdateLcd();
}

  必须删除所有 “UI_” 函数,否则将会发生编译错误,因为这些函数都位于被排除的 zcl_sampleapps_ui.c 文件中。

2.1.3 修改编译标志以排除 LCD 相关驱动程序

  项目的编译标志可通过右键单击 project,选择 “Options…”,然后点击 “C/C++Compiler”->“Preprocessor”->“Defined symbol”。在这里,可以进行以下与 LCD 相关的更改:

  • 删除 LCD_SUPPORTED=DEBUG
  • 添加 HAL_LCD=FALSE
    在这里插入图片描述

2.2 删除/修改驱动程序文件

  Z-Stack 示例应用程序中默认包含一些驱动程序,自定义应用程序可能不需要这些驱动程序。例如,要移除 ADC 驱动程序,通过右键单击 project,选择 “Options…”,然后点击 “C/C++Compiler”->“Preprocessor”->“Defined symbol”,然后添加 “HAL_ADC=FALSE” 编译标志。

2.3 更改可用的虚拟寄存器数

  这是针对 CC2530 设备的次要优化,可以节省几百字节的 flash。通过右键单击 project,选择 “Options…”,然后点击 “General Options”->“Target”->“Number of virtual registers”。默认情况下,此值设置为 16,但 Z-Stack 项目的最佳值为 24。可以尝试将该值修改为各种不同的大小,并观察哪一个值构建的代码内存最小。
在这里插入图片描述

2.4 支持的 ZCL Cluster 注意事项

  确保 Z-Stack 项目中不存在该设备类型或 Zigbee 认证不需要的 ZCL Cluster。例如,在 Sample Switch 路由项目中,ZCL_GROUPS Cluster 默认包含在项目编译标志中。通过 ZigBee 照明和 Occupancy 设备规范,这个集群是可选的集群,因此可以从 C/C++Compiler->Preprocessor->Defined symbols 中移除。使用 Zigbee Cluster V6 规范、Zigbee 照明和 Occupancy 设备规范以及 Zigbee 家庭自动化配置文件规范(所有这些都可以从 Zigbee 联盟网站获得)来确定所选的 Zigbee 设备必须支持哪些 Cluster。

2.5 BDB_Reporting 注意事项

  对于支持特定 Cluster 的某些设备类型,Zigbee 3.0 规范中的属性报告发送功能是必选功能。例如,Zigbee On/Off 灯设备必须支持 On/Off Cluster 的客户端功能。这必须支持 “OnOff” 属性,并且根据 ZCL V6 规范,这个属性必须是可报告的。如果应用程序要支持任何具有可报告访问类型(根据 ZCL V6 规范)的 Cluster 属性,则必须在应用程序中包含编译标志 BDB_REPORTING。
在Z-Stack中,有 4 个单独的宏与 ZCL 报告功能相关:

  • BDB_REPORTING:定义添加报告发送功能的BDB报告状态机。
  • ZCL_REPORTING_DEVICE:定义发送报告的设备。
  • ZCL_REPORT_DESTINATION_DEVICE:在应用程序代码中启用报告接收/处理功能。
  • ZCL_REPORT_CONFIGURING_DEVICE:启用在远程设备上配置报告参数的功能。

  BDB_REPORTING 功能将 flash 大小增加约 9kB。此状态机使用在 zcl.c 中定义的 ZCL_REPORTING_DEVICE 编译标志下定义的函数,因此,在定义 BDB_REPORTING 时,也会自动定义 ZCL_REPORTING_DEVICE。但是,BDB_REPORTING 不会自动定义其它两个编译标志 ZCL_REPORT_DESTINATION_DEVICE 和 ZCL_REPORT_CONFIGURING_DEVICE,如果需要它们的功能,则必须分别添加它们。尽管这些功能占用的内存很小,每个功能占用的 flash 容量都小于 1kB,但是如果设备不需要报告发送功能(该设备不支持 ZCL 规范要求强制报告的任何 Cluster),则无需浪费 BDB 报告发送功能所需的 9kB flash 来支持报告处理和报告配置功能。

3. RAM 优化

3.1 UART 设备

  如果应用程序需要 UART 功能,则可以通过添加 HAL_UART 编译标志来添加它。默认情况下,UART 驱动程序使用 256 字节的 TX 和 RX 缓冲区,这两个缓冲区总共占用 1kb 的 RAM。通过修改编译标志 HAL_UART_DMA_RX_MAX=128,可以使用更小缓冲区的 UART。将 “HAL_UART_DMA_RX_MAX=128” 标志添加到 “Defined symbols” 中会将 RX 和 TX 缓冲区的大小从 256 字节更改为 128 字节,并节省约 500 字节的 RAM。但必须考虑的一个缺点是串口通信是否会包含数据量较大的数据包,例如允许帧长度最多为 253 字节的监视器和测试 (MT) 接口。在这种情况下,缓冲区大小必须保持默认值。

3.2 设备列表大小

  在 Zigbee 路由设备(协调器和路由器)上有两个设备列表,它们在编译时会占用静态分配的 RAM:

  • NWK_MAX_DEVICE_LIST
    — 定义支持的直接连接子设备的数量。
    — 此表中的每个条目都占用 28 字节的 RAM。
    — 默认大小为 20。
  • MAX_NEIGHBOR_ENTRIES
    — 定义“邻居”设备的数量,该数量在 Zigbee 网络路由过程部分使用。更多的邻居设备 <==>更好的网状网络。
    — 此表中的每个条目都占用 23 字节的 RAM。
    — 默认大小为 16。
      要重新定义其中一个或两个列表的大小,可以在 NWK/NWK_globals.h 中更改默认值或将其添加到 “Defined symbols” 中(例如,NWK_MAX_DEVICE_LIST=15)。
    在这里插入图片描述

3.3 堆大小

  可以通过更改 INT_HEAP_LEN 的值来调整堆大小,对于 ZMain/OnBoard.h 中的路由设备,默认值是 3072 字节的 RAM。在此处更改值或将其添加到 “Defined symbols” 中(例如,INT_HEAP_LEN=2688)。

3.4 堆栈大小

  可以通过更改 XDATA 堆栈的值来调整堆栈大小,该值在 IAR 项目选项中定义。通过右键单击 project,选择 “Options…”,然后点击 “General Options”->“Stack/Heap”->“Stack Sizes”->“XDATA”。
在这里插入图片描述

  默认情况下,此值为 0x400 或 1024 字节的 RAM,但 0x300 适合大多数基本的 Z-Stack 应用程序。

4. 优化代码大小

  作为节省代码空间的示例,对 Sample Switch 路由器项目进行了以下更改:

  • 移除 UI 代码
  • 移除 ADC 驱动代码
  • 移除 ZCL_GROUPS Cluster 代码
  • 优化虚拟寄存器数
  • 将堆减少到 2688 字节
  • 将 NWK_MAX_DEVICE_LIST 减少到 15 个设备
  • 将 MAX_NEIGHBOR_ENTRIES 减少到 10 个设备

  下面的数据反映了新项目的编译大小:

 225 182 bytes of CODE  memory
      40 bytes of DATA  memory (+ 59 absolute )
   6 435 bytes of XDATA memory
     192 bytes of IDATA memory
       8 bits  of BIT   memory
     660 bytes of CONST memory

  与源例程代码的 flash 相比,总共节省了 14KB 的 flash 和大约 1KB 的 RAM。这将为应用程序扩展留下大约 37kB 的 flash 和 1750 字节的 RAM。

5. CC2530 Zigbee 协调器配置限制

  通过实现与上述相同的优化,Sample Switch Coordinato r配置在 CC2530 设备上使用了 6762 字节的 XDATA 存储器,留下了 1430 字节的可用 RAM。与路由器设备相比,内存分配的额外增加主要是由于 ZDSECMGR_TC_DEVICE_MAX (ZDO/ZDSecMgr.h 的默认值为 40),它为每个 APS 密钥分配 8 个非易失性 (NV) 字节。作为 Zigbee 3.0 的信任中心 (TC),协调器必须存储这些密钥来管理网络安全,因此 ZDSECMGR_TC_DEVICE_MAX 决定允许加入网络设备的数量。
  此外,如果希望协调器充当记录网络路由发现的多对一 (MTO) 数据集中器(通过在 NWK/ZGlobals.h 中将 CONCENTRATOR_ENABLE和CONCENTRATOR_ROUTE_CACHE 设置为 true),则 NWK/nwk_globals.h 中的 MAX_RTG_SRC_ENTRIES 将进一步填充 XDATA,默认值为 12,每个条目需要 6 个字节的 RAM。还要考虑到必须增加堆以容纳作为每个源路由表项的最后一个元素存储的中继列表指针。作为 Zigbee 网络处理器 (ZNP) 通过 MT 接口传输此信息将需要额外的 RAM 用于 UART 缓冲区。
  考虑到这些限制以及最终应用的网络拓扑和设计标准,我们可以知道,CC2530 设备上的 8 kb flash 将无法支持包含大量节点的网络。在这些情况下,建议将 CC2652R 或 CC1352P SimpleLink 无线 MCU 作为替代方案。这些器件除了具有低于 µA 的休眠电流和高达 80kB 的 RAM 保留之外,还支持 SimpleLink CC26x2/CC13x2 SDK,该 SDK 结合了 TI RTOS 框架和 Z-Stack3.x,每季度可提供一次经过测试和维护的可靠 Zigbee 解决方案。访问 Zigbee 概述页面可了解更多设备和解决方案。


大家的支持就是我分享技术的动力,希望大家需转载时能附上原作者的博客:https://blog.csdn.net/u012993936,谢谢。



--- End ---
你可能还想看:

> 如何7天快速入门Zigbee?
> 免费的Zigbee抓包神器!比Ubiqua还好用!


文章都看完了,随手点个赞吧~
在这里插入图片描述
↓↓↓ ↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jesse_嘉伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值