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

我的配置:

代码为:
我是 TI-RTOS 的初学者、找不到错误。 可以有人帮助我吗?
非常感谢。
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.
你好!
我使用 NVS 将一些信息存储在闪存(永久存储器)中。 我在按照 nvsinternal 教程进行操作(用于 TI-RTOS、CCS 编译器)。 教程工作正常。 我尝试将该教程复制到我的项目中、现在在我的项目中它不起作用。 我查看了这两个文件的配置、它几乎是相同的。
示例:

我的配置:

代码为:
我是 TI-RTOS 的初学者、找不到错误。 可以有人帮助我吗?
非常感谢。
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, ®ionAttrs);
/*
* 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 文件具有相同的闪存基址和闪存大小。 因此、该示例的工作方式很奇怪。
再次感谢。
您好、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。
您基于哪个 BLE 示例? GapBondMgr 的 Simple NV 模块应该已经使用了一个 CONFIG_NVSIONNAL ,因此您应该为自己的目的创建第二个 NVS 实例。 我能够在 v5.20 SDK 的 simple_peripheral 示例中添加 CONFIG_NVS_0、而不会出现任何问题。
此致、
Ryan