Temperature Sensor中的按键中断如果发生在温度平均计算中间会影响么?

wangfuchong   2011-10-31 22:28 楼主
当作休闲,整理官方和我的改编的程序的注释和框图,想起之前的一个疑惑,写下来问问,怕忘了

主程序循环中:
for (i = 0; i < 8; i++)
tempAverage += tempMeasured;
tempAverage >>= 3; // Divide by 8 to get average

按键中断:
if (applicationMode == APP_APPLICATION_MODE)
{
tempCalibrated = tempAverage;
calibrateUpdate = 1;
}

如果中断发生在for循环中间会有影响么?

官方主程序没有或者一下在找不到的可到https://bbs.eeworld.com.cn/thread-308725-1-1.html,其中有官方链接,附件里也有

回复评论 (9)

说一下我个人的理解:
第一IO口的中断程序中没有改变,tempAverage的值。如果你考虑中断的时间,就中断响应时间+中断服务程序,就都是us级的。而温度的变化也不可能那么快,所以我觉得是没有影响的。
点赞  2011-11-1 08:45
中断不会发生在累加期间而在除以8之前么?那么tempCalibrated = tempAverage;会得到什么样的值呢?
点赞  2011-11-1 09:15
引用: 原帖由 wangfuchong 于 2011-11-1 09:15 发表
中断不会发生在累加期间而在除以8之前么?那么tempCalibrated = tempAverage;会得到什么样的值呢?

也说是我的理解,中断可以在任意条指令执行处发生,但是发生后所用到的寄存器全部会压栈(这个时候肯定有些变量的值还没计算完,所以可以认为是“错误”的值),中断执行完后,数据弹出,继续刚才的计算。所以对于这个代码应该没有大的影响。
点赞  2011-11-1 10:23

引用: 原帖由 wstt 于 2011-11-1 10:23 发表 也说是我的理解,中断可以在任意条指令执行处发生,但是发生后所用到的寄存器全部会压栈(这个时候肯定有些变量的值还没计算完,所以可以认为是“错误”的值),中断执行完后,数据弹出,继续刚才的计算。所以对于 ...


啊啊啊!
难道这的如此?当看到回帖我以为wstt开玩笑可能在耍弄别人呢,连德州仪器在线都这样回答呀
我说的是tempCalibrated的值呀,按键的作用应该就是将tempCalibrated值设为当前的平均温度empAverage值呀,如果在主程序for循环中发生中断,tempCalibrated可能就是近似于平均温度的倍数了

我开始还是故意发这个帖子认为肯定是bug无疑呢,虽然委婉地有点过分,不过还是可以看看德州仪器是否够大气,这也没有什么大不了的,德州那么多产品,工程师可能也很忙,再说这个小东西也不是什么对工程师也不一定放在心上,最多是管理还带进一步加紧不能懈怠,应该是给个奖品给我比遮掩强的

看来我还得想想



[ 本帖最后由 wangfuchong 于 2011-11-1 14:34 编辑 ]
点赞  2011-11-1 14:29
引用: 原帖由 wangfuchong 于 2011-11-1 14:29 发表
啊啊啊!难道这的如此?当看到回帖我以为wstt开玩笑可能在耍弄别人呢,连德州仪器在线都这样回答呀我说的是tempCalibrated的值呀,按键的作用应该就是将tempCalibrated值设为当前的平均温度empAverage值呀,如果在主 ...

刚没明白你的意思,现在知道了。
你想说的是IO中断发生后,会将tempAverage 赋值给tempCalibrated,但是当前的tempAverage 是没有计算完的,
这个时候会发生错误。
点赞  2011-11-1 16:27
单从逻辑上看,确实存在这样一个风险 。
可以做试验验证下,在以上for循环中设置一个断点(断点位置确定是for循环没有运行完)或者在右移3位前设置断点,代码运行到这里会停下来;并在port1的中断中设置断点,接着可以按下按键,然后运行代码,查看中断服务函数中变量的值
点赞  2011-11-1 16:41
这个还用试吗

反正我在我的改编的程序中早就放到主程序是TIMER_UART_MODE的时候赋值了
点赞  2011-11-1 16:57
引用: 原帖由 wstt 于 2011-11-1 10:23 发表

也说是我的理解,中断可以在任意条指令执行处发生,但是发生后所用到的寄存器全部会压栈(这个时候肯定有些变量的值还没计算完,所以可以认为是“错误”的值),中断执行完后,数据弹出,继续刚才的计算。所以对于 ...
以为您是不是不好驳我的面子,所以我还是后来看了一下的
不过还是没明白,汇编不熟悉,能不能给解读一下?

本来想到官方找看看现在有没有最新的版本,
但是找了半天好像还没找到板载源代码现在的下载地方然后出现:

捕获.JPG

也就 不再找了,还是那原来的LauchPad源代码slac435c
  1. while(1)
  2.   {   
  3.     ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
  4.     __bis_SR_register(CPUOFF + GIE);        // LPM0 with interrupts enabled
  5.    
  6.    
  7.     /* Moving average filter out of 8 values to somewhat stabilize sampled ADC */
  8.     tempMeasured[tempMeasuredPosition++] = ADC10MEM;
  9.     if (tempMeasuredPosition == 8)
  10.       tempMeasuredPosition = 0;
  11.     tempAverage = 0;
  12.     for (i = 0; i < 8; i++)
  13.       tempAverage += tempMeasured[i];
  14.     tempAverage >>= 3;                      // Divide by 8 to get average
  15.    
  16.     if ((--uartUpdateTimer == 0) || calibrateUpdate )
  17.     {
  18.       ConfigureTimerUart();
  19.       if (calibrateUpdate)
  20.       {
捕获1.JPG
没工作,没女人老婆,没宽带 ,  没钱
点赞  2013-3-7 15:15

回复 9楼 wangfuchong 的帖子

是有风险,正如7楼里面我说的。
这样修改
增加:关闭GIE
for (i = 0; i < 8; i++)
      tempAverage += tempMeasured;
    tempAverage >>= 3;                      // Divide by 8 to get average
增加:打开GIE
这样可能可以避免这个风险
或者这段处理干脆在ADC的中断里面做
点赞  2013-3-7 18:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复