4134|9

5276

帖子

5

TA的资源

裸片初长成(中级)

楼主
 

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

当作休闲,整理官方和我的改编的程序的注释和框图,想起之前的一个疑惑,写下来问问,怕忘了

主程序循环中:
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,其中有官方链接,附件里也有

最新回复

是有风险,正如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
 
点赞 关注

回复
举报

1729

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
说一下我个人的理解:
第一IO口的中断程序中没有改变,tempAverage的值。如果你考虑中断的时间,就中断响应时间+中断服务程序,就都是us级的。而温度的变化也不可能那么快,所以我觉得是没有影响的。
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

板凳
 
中断不会发生在累加期间而在除以8之前么?那么tempCalibrated = tempAverage;会得到什么样的值呢?
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

4
 
原帖由 wangfuchong 于 2011-11-1 09:15 发表
中断不会发生在累加期间而在除以8之前么?那么tempCalibrated = tempAverage;会得到什么样的值呢?

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

点评

以为您是不是不好驳我的面子,所以我还是后来看了一下的 不过还是没明白,汇编不熟悉,能不能给解读一下? 本来想到官方找看看现在有没有最新的版本, 但是找了半天好像还没找到板载源代码现在的下载地方然后出  详情 回复 发表于 2013-3-7 15:15
 
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

5
 

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


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

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

看来我还得想想



[ 本帖最后由 wangfuchong 于 2011-11-1 14:34 编辑 ]
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

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

刚没明白你的意思,现在知道了。
你想说的是IO中断发生后,会将tempAverage 赋值给tempCalibrated,但是当前的tempAverage 是没有计算完的,
这个时候会发生错误。
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

7
 
单从逻辑上看,确实存在这样一个风险 。
可以做试验验证下,在以上for循环中设置一个断点(断点位置确定是for循环没有运行完)或者在右移3位前设置断点,代码运行到这里会停下来;并在port1的中断中设置断点,接着可以按下按键,然后运行代码,查看中断服务函数中变量的值
 
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

8
 
这个还用试吗

反正我在我的改编的程序中早就放到主程序是TIMER_UART_MODE的时候赋值了
 
 
 

回复

5276

帖子

5

TA的资源

裸片初长成(中级)

9
 
原帖由 wstt 于 2011-11-1 10:23 发表

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

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



也就 不再找了,还是那原来的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.       {
复制代码

点评

是有风险,正如7楼里面我说的。 这样修改 增加:关闭GIE for (i = 0; i < 8; i++) tempAverage += tempMeasured; tempAverage >>= 3; // Divide by 8 to get average 增加:打  详情 回复 发表于 2013-3-7 18:04
 
个人签名没工作,没女人老婆,没宽带 ,  没钱
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

10
 

回复 9楼 wangfuchong 的帖子

是有风险,正如7楼里面我说的。
这样修改
增加:关闭GIE
for (i = 0; i < 8; i++)
      tempAverage += tempMeasured;
    tempAverage >>= 3;                      // Divide by 8 to get average
增加:打开GIE
这样可能可以避免这个风险
或者这段处理干脆在ADC的中断里面做
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表