CC2640 SNV 疑问?
使用协议栈: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