osal_snv_write使用异常
1.结构体:
typedef struct
{
uint8 pwm[4]; // 四路 pwm 的占空比值
}SYS_CONFIG;
SYS_CONFIG sys_config;
2.读取数据
void Init_Para(void)
{
int8 ret8 = osal_snv_read(0x80, sizeof(SYS_CONFIG), &sys_config);
if(NV_OPER_FAILED == ret8)
{
// 4路 pwm 设置, 相对于0xFF 的占空比
sys_config.pwm[0] = 255;
sys_config.pwm[1] = 255;
sys_config.pwm[2] = 255;//上电为白色
sys_config.pwm[3] = 0;
osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); // 写所有参数
}
}
3.写入数据
static void simpleProfileChangeCB( uint8 paramID )
{
case SIMPLEPROFILE_CHAR6: // pwm
SimpleProfile_GetParameter( SIMPLEPROFILE_CHARA, &newValue, &returnBytes);
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
HalLcdWriteStringValue( "Char A[0]:", (uint16)(newValue[0]), 16, HAL_LCD_LINE_5 );
HalLcdWriteStringValue( "Char A[1]:", (uint16)(newValue[1]), 16, HAL_LCD_LINE_6 );
HalLcdWriteStringValue( "Char A[2]:", (uint16)(newValue[2]), 16, HAL_LCD_LINE_7 );
HalLcdWriteStringValue( "Char A[3]:", (uint16)(newValue[3]), 16, HAL_LCD_LINE_8 );
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
if(returnBytes == 4)
{
sys_config.pwm[3] = 0; // 白色
sys_config.pwm[2] = newValue[1]; // 红色
sys_config.pwm[1] = newValue[2]; // 绿色
sys_config.pwm[0] = newValue[3]; // 蓝色
osal_set_event( simpleBLEPeripheral_TaskID, SBP_SET_PWM_EVT);//执行PWM事件
}
osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); // 写数据
}
break;
问 题:
当发送数据到两百多次后就失效了,等待几秒钟有恢复正常了,不知道是堆栈溢出还是哪里出现了问题,找了很久都没有找到问题;
有的人说每次写入数据都会覆盖原来的数据,我觉得数据都没有被覆盖啊,读取的时候只是读取了最后一次写入的数据而已,但是写入数据也是有限制的,同一个地址估计只能写252个字节:http://blog.csdn.net/feilusia/article/details/50190859 香瓜哥在博客中也是这么个意思
在此寻找解决方案;
我要实现的功能是掉电前,记住当前的状态,每次发的数据都不一样,又不知道什么时候掉电;
只有两种可能:
(1)每次发送的数据都记录到snv中,记录到252次后出现异常;
(2)检测掉电,在掉电的前一秒记录snv中,这样就不会溢出了,但这样会加一个电压检测,还要外接一个电容,让电压缓慢衰减。
如果都不用这两种方案,问是否还有其他解决方案,忘亲们指教!在此万分感谢!