ucos操作系统下,临界区里用软件IIC写EEPROM出错,求帮助

2019-07-20 11:07发布

本人在用407开发过程中,要将设备配置参数写入EEPROM,但是在ucos操作下,如果在临界区里使用AT24CXX_Write()会导致写入数据出错,读取出来的数据与写入的不一样,CRC校验通过不了。
BOOLEAN_MINE  SaveDefaultToEeprom(void)
{
    DATA_SAVE_TO_EEPROM   savedata_backup;
    OS_CPU_SR  cpu_sr;
    OS_ENTER_CRITICAL();   
    data_save_to_eeprom.EEP_Calibration=Common_CRC16_Check((u8 *)&data_save_to_eeprom,sizeof(DATA_SAVE_TO_EEPROM)-2);   
    AT24CXX_Read(EEP_STARTADDR,(u8*)&savedata_backup,sizeof(DATA_SAVE_TO_EEPROM));
    if(memcmp(&data_save_to_eeprom,&savedata_backup,sizeof(DATA_SAVE_TO_EEPROM)))     //如果发现EEPROM里的数据和要写入的数据不一样
    {
        AT24CXX_Write(EEP_STARTADDR,(u8*)&data_save_to_eeprom,sizeof(DATA_SAVE_TO_EEPROM));
    }
    OS_EXIT_CRITICAL();   
    return  TRUE;
}

但是将临界区注释掉之后,写入就没有问题,读取出来的数据也是对的。
BOOLEAN_MINE  SaveDefaultToEeprom(void)
{
    DATA_SAVE_TO_EEPROM   savedata_backup;
//    OS_CPU_SR  cpu_sr;
//    OS_ENTER_CRITICAL();   
    data_save_to_eeprom.EEP_Calibration=Common_CRC16_Check((u8 *)&data_save_to_eeprom,sizeof(DATA_SAVE_TO_EEPROM)-2);   
    AT24CXX_Read(EEP_STARTADDR,(u8*)&savedata_backup,sizeof(DATA_SAVE_TO_EEPROM));
    if(memcmp(&data_save_to_eeprom,&savedata_backup,sizeof(DATA_SAVE_TO_EEPROM)))     //如果发现EEPROM里的数据和要写入的数据不一样
    {
        AT24CXX_Write(EEP_STARTADDR,(u8*)&data_save_to_eeprom,sizeof(DATA_SAVE_TO_EEPROM));
    }
//    OS_EXIT_CRITICAL();   
    return  TRUE;
}

我又单独做了一份程序来验证的,只有EEPROM读写一个任务,没有用到中断。请问这是什么原因导致的,感觉进临界区不会影响软件模拟IIC端口的时序啊!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。