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.

[参考译文] CC2652R7:删除后、组会在下电上电期间持续存在 NV 闪存。

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1410200/cc2652r7-groups-persist-in-nv-flash-across-power-cycles-after-removal

器件型号:CC2652R7

工具与软件:

我们正在开发一个典型的 ZCL 开/关输出开关(路由器)、目前正在遇到无法从 NV 闪存移除组的问题。

在通过网络添加/删除组或从器件上我们自己的固件调用添加/删除 ZStack 函数时、都会出现该问题。

为了确认没有固件时没有问题、我们从 SDK 中刷写了 zr_light_lp_CC2652R7_tirtos7_ticlang 光样本应用而未做任何更改、但仍然看到相同的行为。

例如、当从协调器发送 ZCL 命令时:

SEND ZCL command groups_get_group_membership:
>
> { capacity: 16, groupcount: 0, grouplist: [] }

SEND ZCL command add_group { groupid: 0x01, groupname: "group a" }:
SEND ZCL command groups_get_group_membership:
>
> { capacity: 15, groupcount: 1, grouplist: [ 1 ] }

SEND ZCL command groups_remove_group { groupid: 0x01}:
SEND ZCL command groups_get_group_membership:
>
> { capacity: 16, groupcount: 0, grouplist: [] }

这正如预期。 但在重新启动器件(CPU 复位、电路板复位或硬下电上电)后、该组会返回:

SEND ZCL command groups_get_group_membership:
>
> { capacity: 15, groupcount: 1, grouplist: [ 1 ] }

在本地设备上使用 Zstackapi_Aps GroupREQ / Zstackapi_Aps GroupREQ / Zstackapi_Aps IndGroupREQ 时也会出现同样的行为。 组功能正常、但重引导后删除的组仍然存在。 Zstackapi_Aps 骨灰骨灰骨灰骨灰骨灰骨灰骨的结果相同。

无论器件连接到调试器还是独立运行、都会出现该问题。

似乎删除正在内存中的 Groups 表中发生(删除后甚至可以重新添加该组)、但更改不会写入 NV、因此会在重新启动时再次加载到内存中。

唯一可以删除它们的函数是 Zstackapi_bdbResetLocalActionReq、它会执行完全 nV 清除(通过 bdb_setFN 调用 zgWriteStartupOptions)。

由于 APS_RemoveGroup 源不可用、因此无法进一步调试。

库缓存闪存写入可以减少磨损吗? 是否存在我们错过的用于"刷新"非易失性闪存更改的 API 调用?

环境:

设备: CC2652R7
-板: RF-STAR RF-BM-2652B2
- sdk: simplelink_cc13xx_cc26xx_sdk_7_41_00_17.
- CCS: v12.7.1.00001.
-编译器:TI_CGT_tiarmclang_3.2.0.LTS

编辑:

我注意到有人有类似的(相同?) 问题、我们认为这是 SDK 中的一个错误。 请参阅此处:

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1171018/cc2652r-last-group-added-using-aps_addgroup-can-never-be-deleted/4409476?tisearch=e2e-sitesearch&keymatch=Zstackapi_Aps eGroupReq #4409476.

那是两年前、那么我假设它已经修复了...?

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

    你好、Kenny、

    没错、这是 SDK 的一个错误、解决方案如下(修改 APS_GroupWriteNV):  

    /*********************************************************************
     * @fn          aps_GroupsWriteNV
     *
     * @brief       Save the Binding Table in NV
     *
     * @param       none
     *
     * @return      none
     */
    void aps_GroupsWriteNV( void )
    {
      apsGroupItem_t *pLoop;
      apsGroupNVItem_t item;
      uint8_t x = 0;
    
      pLoop = apsGroupTable;
      if (pLoop == NULL)  //ADD THIS LINE
      {  //ADD THIS LINE
          aps_GroupsSetDefaultNV();  //ADD THIS LINE
      }  //ADD THIS LINE
      else  //ADD THIS LINE
      {  //ADD THIS LINE
          while (pLoop)
          {
            item.endpoint = pLoop->endpoint;
            OsalPort_memcpy( &(item.group), &(pLoop->group), sizeof ( aps_Group_t ) );
            // Save the record to NV
            osal_nv_write_ex( ZCD_NV_EX_GROUP_TABLE, x++, sizeof(apsGroupNVItem_t), &item );
            pLoop = pLoop->next;
          }
      }  //ADD THIS LINE
    }

    谢谢!
    Alex F

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

    您好、Alex、

    感谢您确认它是错误。

    据我所知、APS_GroupsWriteNV 的源不可用。 它是 SDK 中预编译库的一部分、具体而言是 SDK_ROOT/source/ti/ZStack/lib/ticlang/m4F/libZStack_NWK_zr.a . 因此、无法修改原稿。

    我可以定义我自己的版本、但链接器会抱怨多个定义、我不能排除整个库。

    我对 TI 链接器不太熟悉、但我认为它支持-wrap 选项、这是一种可能性、但我想这不是您所建议的。

    编辑:

    我还注意到、函数不是从 ZStack/示例源中的任何位置调用、因此我假设必须从静态库中调用它[编辑:从 apsAddGroup/apsRemoveGroup/apsRemoveAllGroup]调用。 由于是这种情况、因此需要在库中修复该问题。 至少、APS_GROUPS.O.的固定版本

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

    你好、Kenny、

    没错、很遗憾、我提到的修复程序开发人员无法在 SDK 中应用、但此修复程序可通过预构建的库提供、我将对此进行询问。  

    谢谢!
    Alex F  

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

    我懂了。

    作为一个例外,我们不能真正理解这个错误如何仍然存在,当它(和修复)已经被知道超过两年。 自那时以来,已经有很多,很多版本,这是一个非常简单的修复。 至少我们希望它被列为一个已知问题。

    组是核心 ZCL 功能、几乎是每个认证产品中的必需群集。 尽管 ZCL 没有具体说明组必须在下电上电后持续存在、但我们无法想象、当客户对其光开关或插件模块进行下电上电后、被删除的组会在认证产品中被接受时、这些组会重新出现;TI 声称 ZCL 7"集成"。 当然、开发人员可以实施自己的 NV 闪存例程、可能 TI 不会考虑 ZStack 的该功能(APS_*)部分、但它肯定会呈现为此类功能。

    我们在这里遗漏了什么吗? 这是一个新问题、旧问题是否已解决?

    编辑: 实际上、ZCL 规范要求持久性组-"一个 APS 组表条目和一个 APS 绑定都是跨重新启动的持久性数据。" 因此、ZStack 似乎不符合要求。

    我们通过以下方式暂时解决了这一问题:

    查看 aps_groups.o 代码后、APS_GroupsWriteNV 会在 APS_AddGroup、APS_RemoveGroup 和 APS_RemoveAllGroup 执行这些函数的任何操作后调用这些函数。 由于当  apsGroupTable 为空时、现有的 APS_GroupsWriteNV 是 NOOP、因此在调用 APS_AddGroup、apsRemoveGroup apsRemoveAllGroup 之后立即调用以下函数与修复现有 APS_GroupsWriteNV 具有相同的效果

    void aps_GroupsWriteNVFix (void)
    {
      if (apsGroupTable == NULL)
      {
          aps_GroupsSetDefaultNV();
      } 
    }

    例如在 zstacktask.c 中

    static bool processApsRemoveGroup( uint8_t srcServiceTaskId, void *pMsg )
    {
      zstackmsg_apsRemoveGroup_t *pReq = (zstackmsg_apsRemoveGroup_t *)pMsg;
    
      pReq->hdr.status = zstack_ZStatusValues_ZInvalidParameter;
    
      if ( pReq->pReq )
      {
        // if ( aps_RemoveGroup( pReq->pReq->endpoint, pReq->pReq->groupID ) )        REMOVED
        uint8_t ret = aps_RemoveGroup( pReq->pReq->endpoint, pReq->pReq->groupID ) // ADDED
        aps_GroupsWriteNVFix();                                                    // ADDED
        if ( ret )                                                                 // ADDED
        {
          pReq->hdr.status = zstack_ZStatusValues_ZSuccess;
        }
      }
    
      return (TRUE);
    }

    我们进行了这些更改、它们似乎解决了问题、但如果您评论您是否会看到任何意外后果、因为如果没有源代码、我们将基于我们在汇编中看到的情况进行构建。

    谢谢

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

    你好、Kenny、

    我们已在内部联系以了解此修复程序是否可在不久的将来应用于 SDK、我将根据此处得出的结论为您提供最新情况;我还将研究您提供的代码更新。  

    谢谢!
    Alex F

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

    你好、Kenny、

    作为更新、我从 rnd 收到一些文件、这些文件允许我在 SDK 中生成新文件;我目前正在尝试更新这些文件、我将在获得结果时告知您。 此处的目的是确认可以在 SDK 中生成新文件、然后将预编译库作为修复程序传递给您、而更最终的解决方案我可以通知团队将此修复程序添加到未来的 SDK 版本中。  

    谢谢!
    Alex F

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

    你好、Kenny、

    传递给我的 rnd 文件目前存在一些构建错误、正在解决这个问题。  

    谢谢!
    Alex F

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

    你好、Kenny、

    Rnd 仍将指导我解决此处的构建错误、以便生成可传递给您的正确文件(*新建.A 文件)。  

    谢谢!
    Alex F

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

    你好、Kenny、

    我们能够将修复应用到附加的新.a 文件。

    您将需要获取新的.a 文件并替换 C:\ti\simplelink_cc13xx_cc26xx_sdk_7_41_00_17\source\ti\Zstack\lib\ticlang\m4F 中的文件。  

    (请注意、您还必须删除旧工程、然后重新导入、以应用新设置)  

     e2e.ti.com/.../libZStack_5F00_nwk_5F00_all.a

    谢谢!
    Alex F