CN / EN
CN / EN

gr5515的sdk中关于nvds的问题 请原厂同事关注 提供测试代码

已解决

188***767

2022-05-12 21:59

如题,请帮忙解答。


使用的sdk版本是:GR551x_SDK_V1.6.12


测试代码,这个代码跑不了成功。会return负数出来。

int unit_test_nvds_put_get(void)
{
char buf[] = "20220509092056_20220509092057&20220509092058_20220509092059&20220509092100_20220509092101&20220509092102_20220509092103&20220509092104_20220509092105&20220509092106_20220509092107&20220509092108_20220509092109&20220509092110_20220509092111&20220509092112_20220509092113&20220509092114_20220509092115&20220509092116_20220509092117&20220509092118_20220509092119&20220509092120_20220509092121&20220509092122_20220509092123&20220509092124_20220509092125&20220509092126_20220509092127&20220509092128_20220509092129&20220509092130_20220509092131&20220509092132_20220509092133&20220509092134_20220509092135&20220509092136_20220509092137&20220509092138_20220509092139&20220509092140_20220509092141&20220509092142_20220509092143&20220509092144_20220509092145&20220509092146_20220509092147&20220509092148_20220509092149&20220509092150_20220509092151&20220509092152_20220509092153&20220509092154_20220509092155&20220509092156_20220509092157&20220509092158_20220509092159&";
int error = 0;
uint16_t size = 0;

for (size_t i = 0; i < 500; i++) { // 修改输入的简易代码
buf[0] = ((i%2) == 0) ? '1': '2';
error = nvds_put(NV_TAG_APP(0x500), strlen(buf), (const uint8_t*)buf);
if (error != NVDS_SUCCESS) {
APP_LOG_ERROR("nvds_put [%d] error", error);
return -1;
}
size = nvds_tag_length(NV_TAG_APP(0x500));
error = nvds_get(NV_TAG_APP(0x500), (uint16_t*)&size, (uint8_t*)buf);
if (error != NVDS_SUCCESS) {
APP_LOG_ERROR("nvds_get [%d] error", error);
return -2;
}
APP_LOG_INFO("index [%ld] size [%d]", i, size);
vTaskDelay(pdMS_TO_TICKS(1000));
}
return 0;
}


请帮忙解答,因为是sdk,无法入手,只能求助,盼望原厂大佬答复,谢谢。

0收藏

0赞成

Tomo

汇顶员工
2022-05-13 10:06

这个问题涉及到nvds功能,这边已反馈给对应工程师处理,有结论了再回复您, 谢谢.

0条评论

0赞成

0收藏

您的评论

azhe

汇顶员工
2022-05-13 11:24

以下测试结果基于GR551x_SDK_V1.6.12验证,Return的负数Log能Share下吗?

 int unit_test_nvds_put_get(void)

{
......
}

int main(void)
{
hal_init();
bsp_log_init();
printf("\r\nThis example demo start.\r\n");

uint8_t xx = unit_test_nvds_put_get();
printf("unit_test_nvds_put_get:%d\r\n",xx);
printf("\r\n nvds task over\r\n");
while (1);
}

测试结果:

This example demo start.

APP_I: index [0] size [960]

[10:52:25.608]收←◆APP_I: index [1] size [960]

[10:52:26.715]收←◆APP_I: index [2] size [960]

......

[11:01:13.316]收←◆APP_I: index [498] size [960]

[11:01:14.334]收←◆APP_I: index [499] size [960]

[11:01:15.336]收←◆unit_test_nvds_put_get:0 

nvds task over

    测试环境为官方SK开发板,无RTOS的例程,在17.0的SDK上也验证能通过,能否提供更详细的调试环境?

2条评论

0赞成

0收藏

您的评论

188***767

2022-05-13 20:26


错误日志如图。

0条评论

0赞成

0收藏

您的评论

188***767

2022-05-13 20:30


这是测试代码 我已经删除了 其他的任务代码

问题依然存在  之前start_thread中有很多任务初始化代码

0条评论

0赞成

0收藏

您的评论

188***767

2022-05-13 20:32

擦除代码,也附上,不过这应该不是问题关键。

我单独操作一次擦除, 再跑 unit_test_nvds_put_get 这个测试代码结果也一样


int nvds_attr_factory(void)
{
uint32_t start_addr = nvds_get_start_addr();
if (start_addr != NVDS_START_ADDR) {
APP_LOG_WARNING("nvds_get_start_addr [%d] != NVDS_START_ADDR [%d]", start_addr, NVDS_START_ADDR);
}
uint32_t sector_size = hal_flash_sector_size();
nvds_lock(); // 软件锁 请忽略
int error = hal_flash_erase(NVDS_START_ADDR, NVDS_NUM_SECTOR * sector_size);
nvds_unlock();
if (!error) {
return -1;
}
APP_LOG_WARNING("nvds_attr factory done");
return 0;
}



0条评论

0赞成

0收藏

您的评论

188***767

2022-05-13 20:41

我想再确认下我的测试环境

1、硬件是使用的外部spi-flash

2、工程使用ble_app_template_freertos复制创建的

3、测试了两种功耗模式,情况一样。

pwr_mgmt_mode_set(PMR_MGMT_IDLE_MODE); / pwr_mgmt_mode_set(PMR_MGMT_SLEEP_MODE);

4、其他还有哪些需要确认的呢


0条评论

0赞成

0收藏

您的评论

188***767

2022-05-13 21:04
// <o> NVDS Start Address
// <i> Default: 0x010FF000
#ifndef NVDS_START_ADDR
#if (CHIP_TYPE == 0)
#define NVDS_START_ADDR 0x010FF000
#else
#define NVDS_START_ADDR 0x0107F000
#endif
#endif

// <o> The Number of sectors for NVDS
// <i> Default: 1
#ifndef NVDS_NUM_SECTOR
#define NVDS_NUM_SECTOR 64
#endif


我的nvds配置,64个sector。


0条评论

0赞成

0收藏

您的评论
最佳答案

Tomo

汇顶员工
2022-05-17 13:54

使用相同代码和配置参数,有复现到问题,经查看是因ROM中代码变量溢出导致nvds_get()获取tag索引失败,ROM中代码暂时无法更改,需要限制NVDS_NUM_SECTOR的大小要小于等于16,请使用如下的NVDS配置:

#define NVDS_START_ADDR 0x010F0000 

#define NVDS_NUM_SECTOR 16  


若有更大存储空间需求,建议使用 components\libraries\hal_flash\hal_flash.c中的接口hal_flash_read/hal_flash_write进行读写存储操作.


感谢您反馈的问题,我们将再下一版SDK的代码和文档中更新NVDS使用限制.





1条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注