HI,
我从论坛上看到,CC1310进行FLASH写操作的时候,需要是4字节对齐,但是为什么我写3个字节也可以?我用的是NVS_write()函数。
还有就是我在用easylink rfWsnNode进行开发的时候,我想把节点接收到的数据保存到FLASH里面,但是会死机,具体操作如下:
我是在NodeTask 主循环中里面先把数据写到缓存区,再调用NodeRadioTask_sendAdcData函数,生成无线发送数据事件,数据发送事件在NodeRadioTask里面运行的。数据发送完成之后,开启非阻塞接收,等待反馈数据,(非阻塞接收超时时间我开的5s),当反馈数据接收成功时,进行FLASH写操作,将反馈的数据写入FLASH中,但是每次进行写操作时候就会死机,函数调用NVS_write().
Send_Status = NodeRadioTask_sendAdcData(0x01);
if(Send_Status == 0x00)
{
Write_Flash((void *)addrtemp,4);
}
void Write_Flash(void *buffer,size_t writelen)
{
NVS_erase(nvsHandle,0,regionAttrs.regionSize); NVS_write(nvsHandle,0,buffer,writelen,NVS_WRITE_ERASE|NVS_WRITE_POST_VERIFY);
}
这是怎么回事呢?
谢谢!
ruimao cong:
什么情况下进行flash写操作会导致死机呢?因为我单独测试FLASH读写操作的时候,是没问题的。
Felix ZF:
你使用的那个版本的SDK?
NVS初始化正确吗?
ruimao cong:
回复 Felix ZF:
我用的simplelink 1.50的SDK。
NVS_Handle nvsHandle;
NVS_Attrs regionAttrs;
NVS_Params nvsParams;void Flash_Init(void)
{NVS_init();NVS_Params_init(&nvsParams);nvsHandle = NVS_open(Board_NVS0, &nvsParams);NVS_getAttrs(nvsHandle, ®ionAttrs);
}void Read_Flash(void *buffer,size_t readlen)
{NVS_read(nvsHandle,0,buffer,readlen);
}void Write_Flash(void *buffer,size_t writelen)
{NVS_erase(nvsHandle,0,regionAttrs.sectorSize);NVS_write(nvsHandle,0,buffer,writelen,NVS_WRITE_ERASE|NVS_WRITE_POST_VERIFY);
}我是这样设置的,我现在发现是因为 我在NVS_erase之前加了串口发送uart_write(),导致NVS_erase直接跑飞了。我现在每次发送close 掉uart_handle就好了,这是为什么?
谢谢!
Loops:
回复 ruimao cong:
你如果不擦除直接写可以吗?
Felix ZF:
回复 ruimao cong:
是不是uart的操作还没有完成,就执行flash操作了?
你试试在uart和flash之间多加点延时。
ruimao cong:
回复 Felix ZF:
我调用的UART_write(),发送4个字节,uart_write不是会阻塞直到发送成功吗?
ruimao cong:
回复 Loops:
之前的数据我不用了,想擦除掉,我试了在nvs_write()前加uart_write()是没事的。
Loops:
回复 ruimao cong:
如果是un block 模式,就不会阻塞。你用的什么模式?
ruimao cong:
回复 Loops:
我用的阻塞模式。