CC2530F256中我用NV操作存自己的数据,但是有时候读出来发现数据不对
要实现的功能如下:
拍照,拍到后会得到一大串数据,通过串口接收, 串口接收一段数据存入item为0x0401的NV区,第二次接收存入0x0402,以此类推;
然后读取的时候从0x0401开始把数据读取出来;
因为数据量不会大到存至0x0FFF,所以程序我暂时没做限制。
程序如下
首先申请了一个二维数组
//ZComDef.h
// NV Items Reserved for applications (user applications)
// 0x0401 ?0x0FFF
uint16 pg_len[20][2] = {{0x0401,0}};
uint16 pg_hdr = 0x0401; //从item为0x0401开始操作NV
然后再串口接收到数据后将数据存入
/*串口处理函数*/
void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg)
{
uint8 *flash_cache = NULL;
。。。
pg_len[iw][0] = pg_hdr++; //存item
pg_len[iw][1] = len; //存对应item中要写入的数据长度len
osal_nv_item_init( pg_len[iw][0], len, NULL ); //每次读/写之前都需要init
osal_nv_write( pg_len[iw][0], 0, len, str ); //将串口接收到的数据str写入NV
flash_cache = osal_mem_alloc(len); //给指针分配空间
if ( flash_cache )
{
osal_nv_read( pg_len[iw][0], 0,len, flash_cache ); //开始读取
HalUARTWrite( 1, flash_cache, len );
osal_mem_free(flash_cache);
}
iw++;
。。。
}
这样子得到的数据是正确的,数据量大概是5K;
但是我实际应用当中不是边写边读的,边写边读完全不符合我的应用场景。
最后我的程序如下:
/*串口处理函数*/
void SampleApp_SerialCMD(mtOSALSerialData_t *cmdMsg)
{
uint8 *flash_cache = NULL;
。。。
pg_len[iw][0] = pg_hdr++;
pg_len[iw][1] = len;
osal_nv_item_init( pg_len[iw][0], len, NULL );
osal_nv_write( pg_len[iw][0], offset, len, str+1 );
iw++;
if (osal_memfind(str+1, pdhdr, len, 5) == TRUE)//接收到帧标识说明一帧数据接收完成
{
iw_max = iw;
iw = 0;
pg_hdr = 0x0401;
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_CAM_PKG_EVT, SAMPLEAPP_CAM_DELAY_VALUE);
//osal_set_event( SampleApp_TaskID, SAMPLEAPP_SEND_CAM_PKG_EVT );
}
。。。
}
/*事件轮询函数*/
uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )
{
。。。
if ( events & SAMPLEAPP_SEND_CAM_PKG_EVT )
{
SampleApp_CAM_SendMessage();
return (events ^ SAMPLEAPP_SEND_CAM_PKG_EVT);
}
。。。
}
/*NV数据读取事件函数*/
void SampleApp_CAM_SendMessage( void )
{
uint16 len;
uint8 *flash_cache = NULL;
uint16 ik = 0x0000;
uint16 pg = 0x0401;
HAL_ENABLE_INTERRUPTS();
for ( ik = 0; ik < iw_max; ik++ )
{
pg = pg_len[ik][0];
len = pg_len[ik][1];
flash_cache = osal_mem_alloc( len );
if ( flash_cache )
{
osal_nv_read( pg, offset, len, flash_cache );
HalUARTWrite( 1, flash_cache, len );
osal_mem_free( flash_cache );
}
}
HAL_DISABLE_INTERRUPTS();
}
注释应该很清楚,我解释下,串口处理函数SampleApp_SerialCMD将每次接收到的数据存入指定的NV中,当检测到数据接收完之后设定一个定时事件
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_CAM_PKG_EVT, SAMPLEAPP_CAM_DELAY_VALUE);
该事件为SAMPLEAPP_SEND_CAM_PKG_EVT,SAMPLEAPP_CAM_DELAY_VALUE(5000也就是5秒)时间后触发。
然后5秒后,事件轮询函数SampleApp_ProcessEvent轮询到刚才设定的事件,然后执行NV数据读取事件函数SampleApp_CAM_SendMessage开始读取NV中的数据,但是发现读取的数据前一段是对的,但是中间一大段没了,5K的数据我只能读取1K不到
希望给予帮助,之前有研究过用flash直接操作,但是单独读写没问题,放在串口接收函数中后,发现会影响串口接收。
有需要源码我可以上传
应该是因为写NV或者写Flash需要一定时间的缘故吧,这段时间内,摄像头还是在发出数据的,所以这段数据单片机就接收不到了
写Flash在时间上确实会长一点
但是我看到旧的协议栈版本比如2.3.0的,flash操作的函数是存在sram里的,大小正好是23字节,运行速度应该是非常之快的,但是新的协议栈没有将此段代码保存在这个sram里,我想知道为什么,新版协议栈做了此更改,另外就是假如和旧版协议栈一样的话那个写入速度具体是多快,能否满足我的要求