This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2530:器件停止发送写入属性

Guru**** 2589280 points
Other Parts Discussed in Thread: Z-STACK

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/907680/cc2530-device-stops-sending-write-attributes

器件型号:CC2530
Thread 中讨论的其他器件:Z-stack

您好!

重访 Z-stack 2.6.1 (现有部署)中发现的问题

设置:9台路由器,1台主路由器定期向8台其他路由器写入属性值

方法1:使用多播

问题: 在“X”次后,主器件将停止写入属性,并最终崩溃

方法2:使用单播

问题: 主设备将在"Y"次后停止写入属性,并最终崩溃

碰撞顺序:

i)链路状态已停止  

ii)写入属性已停止

iii)报告属性已停止  

     IV)所有通信都已停止

根据粗略计算:(使用9台路由器)

使用了 ZCL_CMD_WRITE

disabledefaultsp=false (0)

70多播后、设备停止写入属性

530单点传送后、设备停止写入属性

 这两种情况中唯一常见的是主器件接收到的写入响应数量

即70 (多播) x 8 = 560

   ```````````````````````````μ A 530 (单播)

相反、如果我们只有4台路由器、而不是8台、则成功写入属性的数量增加到大约'2X'  

根据此观察结果,对三台路由器进行了另一项测试,其中1台路由器(主)将属性写入其他2台有写响应和没有写响应的路由器
写入属性每10秒完成一次

测试1:无写入属性响应的单播

即 使用了 ZCL_CMD_WRITE_NO_RSP  

   disabledefaultsp= true  

    在2006单播设置中未注意到问题

   然后我们停止了测试

测试2:具有写入属性响应的单播

即 使用了 ZCL_CMD_WRITE  

   disabledefaultsp= false

   在这种情况下、固件崩溃  

   以下是详细信息

1)在450**主机单播后,即 450个写入属性响应后,它停止发送链路状态  (**最大流量)

 

2)  480 **主机单播后 ,即 480个写入属性响应, 它停止发送写入属性 (** 最大值)


3)在2720次定期报告属性(不是写入属性)向协调器节点报告之后  

我们怀疑问题是由 Master 收到的 Write 属性响应引起的、

1) 1) zcl_SendWriteRequest 失败时返回0x10 (ZMemError)、这表示内存泄漏  

我们如何在 Z Stack 2.6.1中解决此问题,因为我们知道本例中的程序流程?

2) 2)我们如何确保在 Z Stack 3.0.2中迁移之前不会出现此问题?

此致、

深圳发展银行@23.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    zcl_SendWriteRequest 返回0x10 (ZMemError)通常是由应用程序未能很好地管理内存或在短时间内不断发送过多请求引起的。 我建议您先检查您的应用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 SDB@23、

    我同意这似乎是内存泄漏。  您能否比较 一下 zcl.c 在 Z-Stack 2.6.1和 Z-Stack 3.0.2之间的内容、尤其是 zcl_SendWriteRequest 和 zcl_SendCommand?  Z-Stack 2.6.1已被弃用多年、此错误很可能已与其他版本一起解决、至少最近未观察到或记录在 已知问题 E2E 页面上。   

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们在应用中的任何特定点都不会进行如此多的传输

    仅当启用了写入属性响应、在 zcl_HandlerExternal 函数中处理写入属性响应时、才会导致此问题

    在 cmd 表中、当我们使用 NULL 而不是函数 zcl_HandleExternal 函数时、

    ZCL_CMD_WRITE 和 disabledefaultsp=0

    节点工作正常

    我们怀疑 zcl_HandleExternal 函数中存在一些问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    命令中的代码

    在3.0.2中使用 AP 计数器代替 zcl_TransID

    zcl_SendWriteRequest 函数与3.0.2中的2.6.1没有变化

    Zcl_HandleExternal 函数

    2.6.1

    该消息被发送到 zcl_RegisteredTaskID、它将转到 zlL_target_event_loop

    在3.0.2中

    任务 ID 从 zcl_getExternalFoundationHandler 获取、并将消息发送到 zcl_samplelight_event 循环

    我看到在 z stack 2.6.1和 z stack 3.0.2函数 zcl_ProcessIncomingMsg 中如何处理响应存在差异

    将尝试在 z stack 3.0.2中实现相同的功能

    在 zcl_HandlerExternal 中形成消息并在2.6.1中发送到 zclRegisteredTaskID 之后、中是否存在任何问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是一个很好的调试过程、分配的消息似乎没有按照内存泄漏问题的预期被取消分配。  我无法对弃用堆栈的功能提供进一步的注释。  请务必使用未发现的任何其他信息更新此主题。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    发现内存泄漏的原因并修复了问题:

    1) zll_target.c

    zllTarget_Init 函数

    zcl_registerForMsg( zllTarget_TaskID );

    在这里、zcl 消息被注册到 zllTarget_TaskID

    2) zcl.c

    Zcl_HandleExternal 函数

    /*通过任务消息发送消息*/
    OSAL_msg_send (zcl_RegisteredMsgTaskID,(uint8 *) pCmd);

    在这里、消息被形成并发送到 zcl_RegisteredMsgTaskID、它是 zlltarget_TaskID

    3) zll_target.c

    zllTarget_EVENT_LOOP

    此处不处理来自 ZCL_INGING_MSG 的任何消息、因此默认情况下、该消息在函数中被取消分配

    4) zcl_ProcesMessageMsg()中分配的内存 attrCmd 应该被清除、但在 zlL_target_event 中未被清除  

    导致内存泄漏

    5) 5)通过释放  ZCL_INGING_MSG 的 zLL_TARGET_EVENT 中的 attrCmd、可以停止泄漏

    OSAL_mem_free (pInMsg->atttrCmd);

    感谢 Ryan 和 YK 的支持  

    此致、

    深圳发展银行@23.