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.

[参考译文] CC2652R:非批量使用

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1360296/cc2652r-nonvol-usage

器件型号:CC2652R

您好!


我们有一个 使用 SimpleLink CC13x2 26x2 SDK v4.20.01.04运行在 CC2652R 上的简单应用程序。  它使用 BLE 无线电和 Zigbee。  我们一直在使用 zclport API 来创建和管理闪存中的几个 NV 项目、而闪存高于 NVOCMP 驱动程序的一层。  最近、我们浏览了一篇文章、其中指出应用程序不应直接使用 NVOCMP 驱动程序、而应使用 osal_SNV API 来管理闪存项。

闪存—SimpleLink CC13x2 / CC26x2 SDK BLE5-Stack 用户指南2.01.00.00文档

如果是正确的,那么我们似乎应该迁移 NV 接口以使用 osal_SNV() API。  是这样吗?

我从那条路开始、然后遇到了几个问题。

1.上面发布的相同链接似乎表明我们只能使用从0x80到0x8F 的令牌 ID 值-最多只支持16个应用程序令牌。  是这样吗?

2. osal_snv_init()函数在初始化过程中的调用很晚-在应用程序初始化函数被调用之后。  我可以在堆栈调用 osal_svn_init ()之前调用 osal_svn_read ()和_write ()函数吗?  如果不是,那么在堆栈初始化完成之前,我是否无法使用 osal_SNV_read ()和 write ()函数?  是否可以使用任何类型的事件或通知来了解 OSAL SNV 系统何时可以使用?

3、我在初始化期间编写了一个简单的函数、尝试初始化 OSAL SNV (在堆栈之前)、然后读取和写入一个新值。  规范如下:

静态 my_struct_typedef_t my_struct ={0};
uint8_t status = osal_SNV_init ();
status = osal_SNV_read (0x80、sizeof (my_struct)、&my_struct);
//将值设置到 my_struct 中
status = osal_svn_WRITE(0x80, sizeof (my_struct ),&my_struct );

--

我打印了所有3个状态值、并获得了以下结果:

* osal_snv_init ()-返回0

* OSAL_SNV_READ ()-返回2 (INVALIDPARAMETER ?)

* OSAL_SNV_WRITE ()-返回5 ( INVALID_MSG_POINTER ?)

为什么这些简单的调用失败了?

谢谢!

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

    您好!

    感谢您与我们联系。

    将非易失性存储器与 BLEStack 一起使用时、实际上有两个选项。
    第一个选项是利用与堆栈相同的 NVS 区域、并遵循您指出的文档。 当考虑存储少量数据时、建议使用此方法。
    第二个选项是定义应用程序自己的 NVS 区域。 这为开发人员提供了更多的自由(以及更多的存储空间)。 缺点是存储器消耗会更大、因为至少有一个闪存页分配给新的 NVS 区域。

    在您的情况下、似乎您应该选择 NVS 区域方法。 用户指南中没有关于此方法的具体指导、因为它与堆栈完全无关-堆栈不访问应用程序的 NVS 区域、并且 NVS 区域不会与堆栈进行连接。 如果需要、我建议您参考 NVS 驱动程序文档和示例。

    我将回答其他一些问题、但细节不多-请告诉我是否应该扩大我的答案范围:

    1. 的确如此、在 SDK 4.20上、应用程序只剩16个 NVS 令牌。 请注意、更新的 SDK 版本已将令牌最大数量增加到更高的数量。 以下是较新 SDK 的下载链接: https://www.ti.com/tool/download/SIMPLELINK-LOWPOWER-F2-SDK
    2. OSAL_SNV_INIT ()应在任何其他 OSAL SNV 函数之前调用。 OSAL_SNV_INIT ()应在 iCall_enrollService ()之后调用。 除此之外、您应该能够在初始化过程中相当早地调用它。
    3. 我相信第一个 osal_snv_read ()失败,因为你试图读取一个未初始化的 SNV ID - SNV ID 是通过用 osal_snv_write ()来初始化的。
      osal_snv_write ()操作可能失败、原因是"my_struct"(应为 uint8_t 的表)。

    我希望这将有所帮助、

    此致、

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

    您好!

    感谢您的答复!  关于#3、您说"my_struct"类型应该是 uint8_t 的表。  这是什么意思?  这是否意味着16个 NVS 令牌中的每个令牌只能是一个 u8?  OSAL NV 系统不支持结构?  或者、我能否创建一个 长度为 say 为40-60字节的单个 U8数组令牌?

    OSAL SNV 系统似乎很容易使用并有详尽的文档记录、但如果我们将其限制在16个字节、它绝对是过于限制、我必须弄清楚您建议的 NVS 区方法。  您可以向我推荐您想到的 NVS 驱动程序文档和示例吗?  这个软件是在线提供的、还是在 SDK 中提供的?  很抱歉遇到新手问题。  非常感谢您的帮助!

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

    您好!

    令牌一定可用于指向大于1个字节的数据。 这里、我不确定"my_struct"有哪个大小、也不知道它是否对齐了。

    可以在 SDK 中找到 NVS 示例: \examples\rtos\CC26X2R1_LAUNCHXL\drivers\nvsinternal
    NVS 文档可以在 SDK 的文档文件夹中找到、或在线获取: https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_7_40_00_77/docs/drivers/doxygen/html/_n_v_s_8h.html

    此致、

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

    我将结构(4字节对齐)更改为64字节数组、但仍获得相同的错误状态代码。  但是、我在第二个电路板上尝试过它、它可以正常工作。  我猜测第一块板上必须有一些 NV 损坏、因此我稍后将尝试擦除它。  不管怎样, OSAL_NV 方法似乎现在起作用,所以我认为这解决了我的问题。  谢谢!