大家好,最近一个数据异常变化的bug,一直未能找到问题原因,请大家帮忙分析分析:
使用的单片机是MSP340F2272,每次当指定事件产生时记录下事件产生时间,当事件结束时将开始时间和结束时间通过RF24L01汇报给接收设备。
现在出现的问题是全局时间变量g_SysTime在有些情况下会发生异常变化。数据的最高位变为01,如:01 EF 73 5E 00 EF 74 C3,这组数据中前四个字节代表开始时间,后四字节代表结束时间,这里的开始时间的第一个字节01 是错误的,应该是00。每次发生错误都是00变为01,目前看到g_SysTime是在与接收设备通信之后发生变化的。
g_SysTime在与接收设备通信后会被校正,另外每10ms会自增一次,在定时器中断中进行。该变量已经定义为volatile,且被指定定义到了内存的起始地址0x0204,该地址前没有变量,该地址后有一个变量,上电后只操作一次。0x020E地址开始有一个数组,但检查了对该数组的操作,没有发现有指针越界的情况。
另外,在与接收设备通信后校正时间时使用了移位操作,直接使用g_SysTime进行了操作,现已修改为如下方式:
TimeTemp = RX_Sbuff[POSI_TIME_STAMP];
TimeTemp <<= 8;
TimeTemp += RX_Sbuff[POSI_TIME_STAMP+1];
TimeTemp <<= 8;
TimeTemp += RX_Sbuff[POSI_TIME_STAMP+2];
TimeTemp <<= 8;
TimeTemp += RX_Sbuff[POSI_TIME_STAMP+3];
g_SysTime = TimeTemp;
之前g_SysTime直接参与多次运算。是否是因为此时可能发生定时器中断,导致数据异常?
堆栈设置和内存使用情况:
RAM size:1024B
Stack size:160B
Data16 heap:120B
13 636 bytes of CODE memory
639 bytes of DATA memory (+ 87 absolute )
121 bytes of CONST memory (+ 16 absolute )
检查 Call Graph
Stack prev CSTACK 0x82B= 130B
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
问题已解决,谢谢大家!
最后确认问题是由于共享变量g_SysTime在赋值操作时没有进行保护,在赋值时恰好中断产生,导致数据被异常改变。在对该变量赋值时关闭定时器中断,问题没有再出现。
一周热门 更多>