疑似内存操作错误导致数据异常,请大家帮忙分析

[复制链接]
1968|8
 楼主| gdmgb520 发表于 2014-1-6 10:27 | 显示全部楼层 |阅读模式
大家好,最近一个数据异常变化的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


 楼主| gdmgb520 发表于 2014-1-6 12:20 | 显示全部楼层
大家有没有什么建议??
 楼主| gdmgb520 发表于 2014-1-6 17:22 | 显示全部楼层
自己顶一个!
dirtwillfly 发表于 2014-1-6 20:48 | 显示全部楼层
楼主说的我有点晕,能否上传代码看一看?
MSP430F2272芯片内的存储结构如下图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| gdmgb520 发表于 2014-1-8 09:53 | 显示全部楼层
dirtwillfly 发表于 2014-1-6 20:48
楼主说的我有点晕,能否上传代码看一看?
MSP430F2272芯片内的存储结构如下图:
...

谢谢!

g_SysTime 变量的定义如下:
  1. __no_init volatile u32 g_SysTime@(u16)0x0204; //系统时间戳,单位10ms

TB1中断改变 g_SysTime代码如下:
  1. #pragma vector=TIMERB1_VECTOR
  2. __interrupt void Timer_B1_ISR(void)
  3. {

  4. switch( TBIV )
  5. {
  6. case TBIV_TBCCR1: // TBCCR1 use for a 10ms time interrupt,keep the interrupt enable and reset
  7. TBCCTL1 &= ~CCIFG;
  8. TBCCR1 = TBR + TabCCRCont[ACLK_10MS];
  9. g_SysTime += 1;
  10. break;
  11. case TBIV_TBCCR2: // TBCCR2 use for a long time interrupt
  12. TBCCTL2 &= ~CCIFG;
  13. TBCCTL2 &= ~CCIE;
  14. g_bFlexTimer_标志寄存器 = TRUE;
  15. break;
  16. case TBIV_TBIFG: // overflow
  17. NOP();
  18. break;
  19. }
  20. }

通信过程中对时操作修改g_SysTime的过程:
  1. static void adjust_timer_in_com(void)
  2. {
  3. u16 Temp = 0;
  4. u16 Temp2 = 1638 * (DeviceID[2]-1) + 328; //60ms * (VsID-1) + 10ms
  5. u16 LocalTAR = TAR;
  6. int DVal = 0;
  7. u32 TimeTemp;

  8. Temp |= RX_Sbuff[POSI_SYS_TIME+1];
  9. Temp <<= 8;
  10. Temp |= RX_Sbuff[POSI_SYS_TIME+2];
  11. Temp += RF_AIR_DELAY; //考虑RF传输延迟

  12. if ( Temp >= Temp2)
  13. {
  14. Temp = Temp - Temp2;
  15. TAR = Temp;
  16. }
  17. else
  18. {
  19. DVal = Temp2 - Temp;
  20. TAR = 0;
  21. while (TAR < DVal);
  22. TAR = 0;
  23. }

  24. TimeTemp = RX_Sbuff[10];
  25. TimeTemp <<= 8;
  26. TimeTemp += RX_Sbuff[10+1];
  27. TimeTemp <<= 8;
  28. TimeTemp += RX_Sbuff[10+2];
  29. TimeTemp <<= 8;
  30. TimeTemp += RX_Sbuff[10+3];
  31. DIS_TB1_INT();
  32. g_SysTime = TimeTemp;
  33. EN_TB1_INT();
  34. }

另外还有一些地方会读取g_SysTime的值,读取时没有关闭中断。发现g_SysTime在与接收设备通信后会出错,但是接收到接收设备下发的时间是没有错的。


 楼主| gdmgb520 发表于 2014-1-8 09:53 | 显示全部楼层
论坛现在贴代码好像不怎么好啊
dirtwillfly 发表于 2014-1-21 20:20 | 显示全部楼层
楼主的问题解决了吗?
smilingangel 发表于 2014-1-21 21:29 | 显示全部楼层
这些倒妈的我看着比较头疼的,虽然我也是写代码的啊:D;P
 楼主| gdmgb520 发表于 2014-2-18 16:00 | 显示全部楼层
dirtwillfly 发表于 2014-1-21 20:20
楼主的问题解决了吗?

问题已解决,谢谢大家!

最后确认问题是由于共享变量g_SysTime在赋值操作时没有进行保护,在赋值时恰好中断产生,导致数据被异常改变。在对该变量赋值时关闭定时器中断,问题没有再出现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:了解新东西才知道自己的不足。 www.elecbench.com

67

主题

452

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部