协议栈:Z-Stack 3.0.2
协调器:CC2538
1、问题描述
网络中有 100 个设备在线,此时进行 OTA 升级,在升级的过程中让一个新的节点入网就有几率让协调器发送不出数据,经测试发现 “zcl_SendCommand” 消息发送函数返回的参数是 ZMemError(0x10) ,也就是申请内存失败。现在协调器并没有死机,串口功能和定时器功能等都能正常工作,就是无法收发数据。而且等了半个小时也无法恢复正常,此时调用内存管理接口发现当前 OSALMEM_SMALL_BLKSZ 大小的内存块申请了很多个,而且并未释放。
请问有可能是什么原因造成上面这种情形?
Alvin Chen:
怀疑你100node 协调器本来内存比较紧张,当你的发送OTA时会动态申请内存,而此时node入网也会申请一部分内存,导致内存不足。你在抓包中是否又发现 入网的tclk 传输导致ota 传输卡住的现象。
Jesse Huang:
回复 Alvin Chen:
我设置了 ZDSECMGR_TC_DEVICE_MAX=200 ,并且通过调整内存结构把 NV 区域扩大了,100 个设备入网,它们的 TC LINK 不应该都只是存在了 NV 中吗,它们的什么还占用了 SRAM ?其实我怀疑是广播的 route request 命令导致协调器的 SRAM 申请完了,有可能吗?
Alvin Chen:
回复 Jesse Huang:
我指的是你end device 传输过来TCLK的过程中的,你抓包有什么发现吗,你说的也是有可能的,你debug试试看。
Jesse Huang:
回复 Alvin Chen:
但是我已经设置了发送消息缓存为7秒,7秒后终端还未读取此消息的话会自动删除的。但是内存一直没有释放,我就很奇怪这些内存有可能是哪里申请的。
Alvin Chen:
回复 Jesse Huang:
你好,我看到ryan对你的回复也是怀疑大网络以及ota造成的alloc的问题,我们会在英文继续帮助您解决问题。