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:NVS 可以#39;t 打开句柄

Guru**** 2457370 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1031231/cc2652r-nvs-can-t-open-the-handle

器件型号:CC2652R
Thread 中讨论的其他器件:SysConfig

你好!

我使用 NVS 将一些信息存储在闪存(永久存储器)中。 我在按照 nvsinternal 教程进行操作(用于 TI-RTOS、CCS 编译器)。 教程工作正常。 我尝试将该教程复制到我的项目中、现在在我的项目中它不起作用。 我查看了这两个文件的配置、它几乎是相同的。

示例:

Example configuration

我的配置:

My configuration

代码为:

nvsRegion = NVS_OPEN(CONFIG_NVSIONNAL、空);
//确认 NVS 区域已正确打开
if (nvsRegion == NULL){
//错误处理代码
//获取 nvsRegion 的通用 NVS 区域属性
NVS_getAttrs(nvsRegion、&regionAttrs);
//擦除 nvsRegion 的第一个扇区
状态= NVS_ERASE(nvsRegion、0、regionAttrs.sectorSize);
if (status!= NVS_STATUS_SUCCESS){
//错误处理代码
//将"Hello"写入 nvsRegion 的基址,写入后验证
状态= NVS_WRITE(nvsRegion、0、"Hello"、strlen ("Hello")+1、NVS_WRITE_POST_VERIFY);
if (status!= NVS_STATUS_SUCCESS){
//错误处理代码
//将“Hello”从 nvsRegion 复制到本地'buf'中
status = NVS_read(nvsRegion、0、buf、strlen ("Hello")+1);
if (status!= NVS_STATUS_SUCCESS){
//错误处理代码
//从获取的 NVS 存储打印字符串
System_printf ("%s\n"、buf);

我是 TI-RTOS 的初学者、找不到错误。 可以有人帮助我吗?

非常感谢。

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

    错误是 nvsRegion (处理程序)在打开后为空。 但我不知道为什么它不能打开。

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

    nvsRegion 为 NULL、因为您要将 NULL 参数传递到 NVS_OPEN 而不是 NVS_Params 中。

        NVS_Handle nvsHandle;
        NVS_Attrs regionAttrs;
        NVS_Params nvsParams;
    
        NVS_init();
    
        NVS_Params_init(&nvsParams);
        nvsHandle = NVS_open(CONFIG_NVSINTERNAL, &nvsParams);
        
        if (nvsHandle == NULL) {
            Display_printf(displayHandle, 0, 0, "NVS_open() failed.");
    
            return (NULL);
        }    
        
        /*
         * This will populate a NVS_Attrs structure with properties specific
         * to a NVS_Handle such as region base address, region size,
         * and sector size.
         */
        NVS_getAttrs(nvsHandle, &regionAttrs);    
        
        /*
         * Copy "sizeof(signature)" bytes from the NVS region base address into
         * buffer. An offset of 0 specifies the offset from region base address.
         * Therefore, the bytes are copied from regionAttrs.regionBase.
         */
        NVS_read(nvsHandle, 0, (void *) buffer, sizeof(signature));
    
        /*
         * Determine if the NVS region contains the signature string.
         * Compare the string with the contents copied into buffer.
         */
        if (strcmp((char *) buffer, (char *) signature) == 0) {
    
            /* Erase the entire flash sector. */
            NVS_erase(nvsHandle, 0, regionAttrs.sectorSize);
        }
        else {
    
            /* Write signature to memory. The flash sector is erased prior
             * to performing the write operation. This is specified by
             * NVS_WRITE_ERASE.
             */
            NVS_write(nvsHandle, 0, (void *) signature, sizeof(signature),
                NVS_WRITE_ERASE | NVS_WRITE_POST_VERIFY);
        }
    
        NVS_close(nvsHandle);    

    如果应用程序的闪存长于0x10000 、则还可能会干扰 SysConfig 分配的 NV 区域。  

    此致、
    Ryan

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

    您好!

    感谢您的回答。 我还尝试了以下代码:

    NVS_Handle nvsHandle;
    NVS_Attrs regionAttrs;
    NVS_Params nvsParams;
    
    NVS_init();
    NVS_Params_init(&nvsParams);
    nvsHandle = NVS_open(CONFIG_NVSINTERNAL, &nvsParams);
    
    if (nvsHandle == NULL) {
        printf("NVS_open() failed.");
    
        return (NULL);
    }
    printf("success");
    
    return (NULL);

    但它仍然不起作用。 NVS_open 仍返回空。

    示例的.cmd 文件和工程的.cmd 文件具有相同的闪存基址和闪存大小。 因此、该示例的工作方式很奇怪。

    再次感谢。

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

    增加 NVS 内部闪存区基地址(例如0x52000)、如果不起作用、请进一步详细说明您尝试将 NVS 功能合并到中的应用程序的内容并提供.map 文件 (构建后位于输出文件夹中) 然后再尝试添加 NVS 模块。

    此致、
    Ryan

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

    您好、Ryan、

    感谢您的回复。 我增加了内部闪存区域(增加了.cmd 文件中的闪存大小)、但它不起作用。

    应用程序正在使用任务、因此其中一个任务旨在将信息存储在非易失性存储器上(现在这是唯一处于活动状态的存储器)。

    在 TI-RTOS 示例 cc13x2_cc26x2_tirtos.cmd 文件中、我们可以看到以下变量:

    #define FLASH_BASE              0x0
    #define FLASH_SIZE              0x58000
    #define RAM_BASE                0x20000000
    #define RAM_SIZE                0x14000
    #define GPRAM_BASE              0x11000000
    #define GPRAM_SIZE              0x2000

    在我的代码中、同一个文件具有以下变量:

    #define FLASH_BASE   0x00000000
    #define GPRAM_BASE   0x11000000
    #define RAM_BASE     0x20000000
    #define ROM_BASE     0x10000000
    
    #define FLASH_SIZE   0x00058000
    #define GPRAM_SIZE   0x00002000
    #define RAM_SIZE     0x00014000
    #define ROM_SIZE     0x00040000
    
    #define RTOS_RAM_SIZE           0x0000012C
    #define RESERVED_RAM_SIZE_ROM_1 0x00000B08
    #define RESERVED_RAM_SIZE_ROM_2 0x00000EB3

    我的任务是管理蓝牙、其他任务管理 SPI、其他任务仅控制信息。

    使用 NVS 之前的.map 文件(以及激活所有其他任务)为:


    存储器配置

            名称           源   长度     使用    未使用  的属性   填充
    ------------  ----  ------  ----  ----  --------  
     闪存                00000000  00056000 00027469 0002eb97 R X
     FLASH_LAST_PAGE      00056000  00002000 00000058 00001fa8 R X
     RTOS_SRAM            20000000  0000012c 000000e4 00000048 RW X
     SRAM                 20000fdf  00013021 0000617e 0000cea3 RW X


    段分配映射

    运行 origin load origin  length  init length atts members
    ------  ------ ------ ------ ---- ----
    00000000   00000000   00010000  r-x    
     00000000   00000000   0000003c  0000003c   r-.Vecresets
     0000003c   0000003c   0000ffc4  0000ffc4   r-x .text.1
    00010000      00004000  00000000   Rw-
     00010000   00010000   00004000  00000000   rw-.TI.bound:flashBuf0
    00014000   00014000   00013470  00013470   r-x
     00014000   00014000 000109c0     000109c0   r-x .text.2
     000249c0   000249c0   000022d9  000022d9   r-.const
     00026c9c   00026c9c   00000138  00000138   r-.rodata
     00026dd8   00026dd8   00000698  00000698   r-.cinit
    00057fa8   00057fa8   00000058  00000058   r--
     00057fa8   00057fa8   00000058  00000058   r-.ccfg
    20000100   20000100   0000000c  00000000   rw-
     20000100   20000100   00000004  00000000   rw-.data:xdcRomConstPtr
     20000104   20000104   00000004  00000000   rw-.data:xdcRomExternFuncPtr
     20000108   20000108   00000004  00000000   rw-.data:xdcRomStatePtr
    20001830   20001830   00000010  00000000   rw-
     20001830   20001830   00000010  00000000   rw-.TI.bound:dmaSpi0RxControlTableEntry
    20001840   20001840   00000010  00000000   rw-
     20001840   20001840   00000010  00000000   rw-.TI.bound:dmaSpi0TxControlTableEntry
    20001900   20001900   00000010  00000000   rw-
     20001900   20001900   000000000010  00000000   rw-.TI.bound:dmaSpi1RxControlTableEntry
    20001910   20001910   00000010  00000000   rw-
     20001910   20001910   00000010  00000000   rw-.TI.bound:dmaSpi1TxControlTableEntry
    20001a30   20001a30   00000010  00000000   rw-
     20001a30   20001a30   00000010  00000000   rw-.TI.bound:dmaSpi0RxAltControlTableEntry
    20001a40   20001a40   00000010  00000000   rw-
     20001a40   20001a40   00000010  00000000   rw-.TI.bound:dmaSpi0TxAltControlTableEntry
    20001b00   20001b00   00000010  00000000   rw-
     20001b00   20001b00   00000010  00000000   rw-.TI.bound:dmaSpi1RxAltControlTableEntry
    20001b10   20001b10   00005d0e  00000000   rw-
     20001b10   20001b10   00000010  00000000   rw-.TI.bound:dmaSpi1TxAltControlTableEntry
     20001b20   20001b20   00000f0b  00000000   rw-.data
     20002a30   20002a30   00004dee  00000000   rw-.bss
    20013c00   20013c00   00000400  00000000   rw-
     20013c00   20013c00   00000400  00000000   rw-.stack


    部分分配映射

     输出                                 属性/
    段  页   原点     长度      输入段
    ----  --------   ------   --------
    .cinit    0   00026dd8   00000698     
                     00026dd8   000005bd    (.cinit.data.load)[加载映像、压缩= lzss]
                     00027395   00000003    --孔--[填充= 0]
                     00027398   0000000c    (_TI_handler_table)
                     000273a4   00000004    --hole --[填充= 0]
                     000273a8   00000008    (.cinit.TI.bound:dmaSpi0RxAltControlTableEntry.load)[加载映像、压缩= zero_init]
                     000273b0   00000008    (.cinit.TI.bound:dmaSpi0RxControlTableEntry.load)[加载映像、压缩= zero_init]
                     000273b8   00000008    (.cinit.TI.bound:dmaSpi0TxAltControlTableEntry.load)[加载映像、压缩= zero_init]
                     000273c0   00000008    (.cinit.TI.bound:dmaSpi0TxControlTableEntry.load)[加载映像、压缩= zero_init]
                     000273c8   00000008    (.cinit.TI.bound:dmaSpi1RxAltControlTableEntry.load)[加载映像、压缩= zero_init]
                     000273d0   00000008    (.cinit.TI.bound:dmaSpi1RxControlTableEntry.load)[加载映像、压缩= zero_init]
                     000273d8   00000008    (.cinit.TI.bound:dmaSpi1TxAltControlTableEntry.load)[加载映像、压缩= zero_init]
                     000273e0   00000008    (.cinit.TI.bound:dmaSpi1TxControlTableEntry.load)[加载映像、压缩= zero_init]
                     000273e8   00000008    (.cinit、.bss.load)[加载映像、压缩= zero_init]
                     000273f0   00000008    (.cinit.data:xdcRomConstPtr.load)[加载映像、压缩= lzss]
                     000273f8   00000008    (.cinit.data:xdcRomExternFunctr.load)[加载映像、压缩= lzss]
                     00027400   00000008    (.cinit.data:xdcRomStatePtr.load)[加载映像、压缩= lzss]
                     00027408   00000068    (_TI_cinit_table)

    有更多信息、但我认为最好阅读一下、如果所需信息不在此处、请告诉我。

    在我使用 NVS 任务构建后、其他任务被禁用:


    存储器配置

    名称源长度使用未使用的属性填充
    ------------ ---- ------ ---- ---- --------
    闪存00000000 00056000 0001fb7c 00036484 R X
    FLASH_LAST_PAGE 00056000 00002000 00000058 00001fa8 R X
    RTOS_SRAM 20000000 0000012c 000000e4 00000048 RW X
    SRAM 20000fdf 00013021 00002b41 000104e0 RW X


    段分配映射

    运行 origin load origin length init length atts members
    ------ ------ ------ ------ ---- ----
    00000000 00000000 00010000 r-x
    00000000 00000000 0000003c 0000003c r-.Vecresets
    0000003c 0000003c 0000ffc4 0000ffc4 r-x .text.1
    00010000 00004000 00000000 Rw-
    00010000 00010000 00004000 00000000 rw-.TI.bound:flashBuf0
    00014000 00014000 0000bb80 0000bb80 r-x
    00014000 00014000 00009554 00009554 r-x .text.2
    0001d554 0001d554 000020b8 000020b8 r-.const
    0001f60c 0001f60c 00000110 00000110 r-.rodata
    0001f720 0001f720 00000460 00000460 r-.cinit
    00057fa8 00057fa8 00000058 00000058 r--
    00057fa8 00057fa8 00000058 00000058 r-.ccfg
    20000100 20000100 0000000c 00000000 rw-
    20000100 20000100 00000004 00000000 rw-.data:xdcRomConstPtr
    20000104 20000104 00000004 00000000 rw-.data:xdcRomExternFuncPtr
    20000108 20000108 00000004 00000000 rw-.data:xdcRomStatePtr
    20001830 20001830 00000010 00000000 rw-
    20001830 20001830 00000010 00000000 rw-.TI.bound:dmaSpi0RxControlTableEntry
    20001840 20001840 00000010 00000000 rw-
    20001840 20001840 00000010 00000000 rw-.TI.bound:dmaSpi0TxControlTableEntry
    20001900 20001900 00000010 00000000 rw-
    20001900 20001900 000000000010 00000000 rw-.TI.bound:dmaSpi1RxControlTableEntry
    20001910 20001910 00000010 00000000 rw-
    20001910 20001910 00000010 00000000 rw-.TI.bound:dmaSpi1TxControlTableEntry
    20001a30 20001a30 00000010 00000000 rw-
    20001a30 20001a30 00000010 00000000 rw-.TI.bound:dmaSpi0RxAltControlTableEntry
    20001a40 20001a40 00000010 00000000 rw-
    20001a40 20001a40 00000010 00000000 rw-.TI.bound:dmaSpi0TxAltControlTableEntry
    20001b00 20001b00 00000010 00000000 rw-
    20001b00 20001b00 00000010 00000000 rw-.TI.bound:dmaSpi1RxAltControlTableEntry
    20001b10 20001b10 000026d1 00000000 rw-
    20001b10 20001b10 00000010 00000000 rw-.TI.bound:dmaSpi1TxAltControlTableEntry
    20001b20 20001b20 000009f5 00000000 rw-.data
    20002518 20002518 00001cc9 00000000 rw-.bss
    20013c00 20013c00 00000400 00000000 rw-
    20013c00 20013c00 00000400 00000000 rw-.stack

    非常感谢您的帮助。

    此致、

    Nazaret。

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

    无需更改命令链接器文件。  我的目的是让您将 SysConfig 中的 NVS 模块更改为 0x52000、 以便它不会干扰项目使用的闪存。

    此致、
    Ryan

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

    您好、Ryan、

    很抱歉耽误你的时间。

    此外、将区域基地址更改为0x52000也不起作用。 是否可以是 SimpleLink 的版本? 我有4.20.0.35、该示例使用5.20.0.52。

    此致、

    Nazaret。

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

    您好、Ryan、

    我尝试更改示例上的版本、但示例仍然有效。(尽管我更改了工程中的版本、但无法编译、因为它会在 makefile 中提供错误)。

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

    您基于哪个 BLE 示例?   GapBondMgr 的 Simple NV 模块应该已经使用了一个 CONFIG_NVSIONNAL ,因此您应该为自己的目的创建第二个 NVS 实例。  我能够在 v5.20 SDK 的 simple_peripheral 示例中添加 CONFIG_NVS_0、而不会出现任何问题。

    此致、
    Ryan

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

    您好、Ryan、

    我找不到我使用的简单外设示例(我的项目基于它)。 但 nv 内部使用的 nv i 示例。 我将尝试下载一个新的 BLE 示例。

    添加新的 NVS 实例时、基区是否为0x10000? 我想这两个实例都必须有扩散器、不是吗?

    P.D:谢谢 Ryan! 它最终会起作用。

    谢谢、此致、

    Nazaret

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

    我很高兴听到您解决了这个问题。  我已将新的 NVS 基地区更改为更高的闪存页、这样它就不会与 应用使用的闪存发生冲突。

    此致、
    Ryan

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

    您好、Ryan、

    非常感谢您的帮助。

    此致、

    Nazaret。