微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2640 SNV 疑问?

CC2640 SNV 疑问?

时间:10-02 整理:3721RD 点击:

使用协议栈:2.2

开发平台:CCS6.1

例程为协议栈自带的simple_peripheral工程,在SimpleBLEPeripheral_taskFxn任务中,使用SNV的步骤为:

1、先osal_snv_write(),

2、再osal_snv_read(),

加入这两个后程序就不运行了,我参考了PDF中的说明,也是这样调用的,请问还要注意什么吗?

可以看看调用的返回值。

1)NV_ID有一定范围

// Customer NV Items - Range 0x80 - 0x8F - This must match the number of Bonding entries
#define BLE_NVID_CUST_START 0x80 //!< Start of the Customer's NV IDs
#define BLE_NVID_CUST_END 0x8F //!< End of the Customer's NV IDs

2)可以参考文档里的做法试试

#define BUF_LEN 1
#define SNV_ID_APP 0x80
uint8 buf[BUF_LEN] = {0,};
// Initialize application
simple_peripheral_init();
uint8 status = SUCCESS;
//Read from SNV flash
status = osal_snv_read(SNV_ID_APP, BUF_LEN, (uint8 *)buf);
if(status != SUCCESS)
{
DISPLAY_WRITE_STRING_VALUE("SNV READ FAIL: %d", status, LCD_PAGE5);
//Write first time to initialize SNV ID
osal_snv_write(SNV_ID_APP, BUF_LEN, (uint8 *)buf);
}
//Increment value and write to SNV flash
buf[0]++;
status = osal_snv_write(SNV_ID_APP, BUF_LEN, (uint8 *)buf);

你好

       我确实是这样参考PDF写的代码,经过一上午的测试,可以确认的是写的代码,在逻辑上并没有错误。

       问题出现在:

        1、我在读操作的时候,将读出的指针通过 memcpy来拷贝到全局变量的时候,出现的程序未运行,

        2、只要在有osal_snv_read()和osal_snv_write()的地方,我都用了memcpy将局部变量拷贝为全局变量,

        问题总结:

        1、不知memcpy这一类函数对RTOS系统的任务调度或者系统任务有什么影响吗?为什么会导致程序死机的情况。

        2、SNV的操作会花费一些时间,需要向2540那样,在操作的时候进临界段吗?

还有一个重要的参数上午忘记说了,

把GAPROLE_TASK_STACK_SIZE=520预编译取消。适当扩大该堆栈,程序就正常运行。

首先,SNV操作的时Flash区域,字节缓存在cache中,和GAPRole的堆栈有什么关系呢?

我使用这两个API来操作SNV存储的时候也出现过问题,因为我把写和读程序写入了uart的callback函数结果出现了莫名其妙的写和读的错误,后来我把write和read操作改到了App消息处理中就好了,是尝试一下把这个操作在程序的其他地方进行,祝你早日解决问题。zhengxinkang@qq.com

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top