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.

[参考译文] CC2340R5:CC2340R5:NVS_OPEN ()失败、无法获取有效的句柄

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1343090/cc2340r5-cc2340r5-nvs_open-failed-cannot-get-valid-handle

器件型号:CC2340R5
主题中讨论的其他器件:SysConfig

尊敬的 TI 成员:

最近、我在驱动程序示例之后编写了一个 nvsinternal 测试代码。 下面是代码片段:

int Peripheral_NVS_init (void) {

    struct nvs_bt_rf_last_state bt_last_st = {
                                              .nvsHandle    =   NULL,           \
                                              .nvsParams    =   {NULL},         \
                                              .regionAttrs  =   {NULL, 0, 0},   \
                                              .first_boot   =   "first boot"    \
                                            };
    int bt_state = -1;
    char buffer[12];

    NVS_init();
    NVS_Params_init(&bt_last_st.nvsParams);
    if ((bt_last_st.nvsHandle = NVS_open(CONFIG_NVSINTERNAL, &bt_last_st.nvsParams)) == NULL) {
        Log_printf(LogModule_App1, Log_DEBUG, "NVS_open() failed.");
        return bt_state;
    }

    NVS_read(bt_last_st.nvsHandle, 0, (void*)&bt_state, sizeof(bt_state));
    NVS_read(bt_last_st.nvsHandle, 1, (void*)buffer,    sizeof(bt_last_st.first_boot));

    /* device boot for the first time */
    if (strncmp(bt_last_st.first_boot, buffer, sizeof(bt_last_st.first_boot))) {
        NVS_write(bt_last_st.nvsHandle, 1, (void*)bt_last_st.first_boot,  sizeof(bt_last_st.first_boot),   NVS_WRITE_ERASE | NVS_WRITE_POST_VERIFY);
        return 1;
    }

    if (bt_state != 1 || bt_state != 0) {
        return -1;
    }

    return bt_state;
}

但是,NVS_OPEN()返回导致失败的 NULL 指针。

我在初始化期间是否错过了某些内容?

下表是我当前的建筑环境:

软件

版本

Code Composer Studio

12.4.0.202306011800

SimpleLink SDK

7.20.1.10

XDCtools

3.62.1.16_CORE

谢谢。

扎赫

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

    尊敬的 Zach:

    作为调试步骤、请尝试将 NVS 内部驱动程序本身添加到您的项目中、 然后单步执行到 NVS_OPEN 中(或在 NVSLPF3_OPEN 中放入一个断点、然后单步执行)。
    驱动程序文件位于以下位置: C:\ti\simplelink_lowpower_f3_sdk_7_40_00_64\source\ti\drivers\NVS\NVSLPF3.c

    我最初的猜测是 CONFIG_NVSINTERNAL 句柄可能已打开、因为 BLE 项目也将一些数据写入内部闪存。
    如果是这样、您可以考虑在 SysConfig 文件中添加另一个 NVS 对象、例如  CONFIG_NVSINTERNAL。 应用程序_app ,则在上述函数中使用此函数。
    这个单独的 NVS 对象需要配置一个不重叠的闪存区域:1) BLE 项目用于 NVS 的闪存区域;2)应用区域。
    您可能还必须相应地更新链接器文件(例如、 cc23x0_app_freertos.cmd)、以便编译器知道不应为可执行代码分配哪个闪存段。

    谢谢。
    托比

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

    尊敬的 Toby:

     

    <<<我的初始猜测是 CONFIG_NVSINTERNAL 句柄可能已打开、因为 BLE 项目也将一些数据写入内部闪存。

    >>正确,CONFIG_NVSINTERNAL 句柄已打开;因此,NVSLPF3_OPEN()返回 NULL。

    <<< 如果是这样的话、您可以考虑在您的 SysConfig 文件中添加另外一个 NVS 对象、例如:  CONFIG_NVSINTERNAL_APP ,则在上述函数中使用此函数。

    >>我打算添加一个新的 NVS 句柄、但不知道如何配置区域和扇区。 对于闪存地址、我应该遵循哪个文档?

    <<< 您还必须相应地更新链接器文件(例如、 cc23x0_app_freertos.cmd)、以便编译器知道不应为可执行代码分配哪个闪存段。

    您能告诉我如何操作吗? 我不熟悉 CCS 平台。  

     谢谢。

    扎赫

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ]>我打算添加一个新的 NVS 句柄、但不知道如何配置区域和部门。 就闪存地址而言、我应该遵循哪个文档?

    使用屏幕截图右上角的"添加"按钮。

    该区域应为扇区大小的倍数(对于 CC2340为0x800、在 cc23x0_app_freertos.cmd 文件中显示为"page_size")。

    首先、您可以使用 正好位于 BLE 示例中使用的默认 NVS 部分之前的闪存扇区。

    <<< 您还必须相应地更新链接器文件(例如、 cc23x0_app_freertos.cmd)、以便编译器知道不应为可执行代码分配哪个闪存段。

    您能告诉我如何操作吗? 我不熟悉 CCS 平台。  

    [/报价]

    对于 BLE NVS 配置、您可以看到链接器文件更改。

    应该为您的定制 NVS 部分执行类似的操作。

    ble_basic 示例的示例、用于.syscfg 和.cmd 文件

    e2e.ti.com/.../basic_5F00_ble.syscfg

    e2e.ti.com/.../cc23x0_5F00_app_5F00_freertos.cmd