搜索
bottom↓
回复: 12

GCC全局变量在中断中某个全局变量的值改变,如何在任务函数中判断这个值一直没有变?

[复制链接]

出0入0汤圆

发表于 2007-9-10 15:48:45 | 显示全部楼层 |阅读模式
芯片M64
一个全局变量x=5

中断()
{
  x在此改变了 //打印到led显示看的x!=5
}

任务()
{
   while(x==5);
   {
        delay(100ms)
        display(x)//此处 打印字符到屏幕一直是5   
   }
   
}
//===================
清问大侠是什么原因?(类似在中断中某个全局变量的值改变,而在任务函数中判断这个值一直没有变)



以下蓝色文字由站长:armok 于:2007-09-10,17:04:10 加入。
你的原标题:“<font color=black>GCC使用请教
” 不合符规定。请更改成能说明帖子大意的标题
试想一下,如果本论坛的帖子标题清一色的‘帮助!’,‘ADC求救!’等笼统的标题,你在阅读的过程中会造成许多麻烦。
所以本论坛规定:一定要起一个能说明帖子大意的标题。不允许“关于 AVR 的 ADC 使用!”这种笼统标题。作为标题,必须说明清楚:
 ①你是在请教问题,还是在介绍有关的知识?
 ②ADC的问题有许多,你是想说那方面的内容?
注意以上两点,标题应该改成如:“请教:ADC 可以不使用中断吗?”。
起一个能说明帖子大意的标题,除了减轻我们的帖子分类整理工作,还方便其它人阅读,节省大家的时间。
注:使用合格的标题,对你来说只是举手之劳,但却会为我们的管理工作提供很大的便利。谢谢你的支持。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入42汤圆

发表于 2007-9-10 15:54:32 | 显示全部楼层
用关键字"volatile",比如:volatile uint8_t x;

出0入0汤圆

发表于 2007-9-10 16:04:43 | 显示全部楼层
任务()
{
   while(x==5);
   {
        delay(100ms)  //....确定100ms后X的值会被改变???
        display(x)//此处 打印字符到屏幕一直是5   
   }
    //...在此处打印display(x)看看是不是你要的结果。
}

出0入0汤圆

 楼主| 发表于 2007-9-10 16:30:16 | 显示全部楼层
用关键字"volatile"也不行,

    回楼上,在delay(100ms)  //....确定100ms后X的值会被改变??? 在中断x变了,可是在这儿是死等的

出0入0汤圆

 楼主| 发表于 2007-9-10 16:39:02 | 显示全部楼层
各位大侠以前遇到过这样的情况吗?
我一直老是遇到这个情况,不知道是哪儿设置错拉?还是makefile有哪些地方不对?

出0入0汤圆

 楼主| 发表于 2007-9-10 17:22:07 | 显示全部楼层
其实我的程序不是上述,是个例子
真正程序如下:
///////////////////////////////////////////////////////
   i=0;
   while( (rx_buffer1_p==0x00) && (i<100) )
   {                                   
      _delay_ms(1);
      i++;
   }      
在这个程序中(rx_buffer1_p在串口程序中指示接受数据的个数),在这儿判断,
rx_buffer1_p每次都是超时退出循环的。在以前用GCC的时候也出现过这样的情况
但是程序改为如下:
//========改成如下===========
i=0;
   while( (Readrx_buffer1_p()==0x00) && (i<100) )
   {                                   
      _delay_ms(1);
      i++;
   }      
unsigned char Readrx_buffer1_p(void)
{
    unsigned char x;
        x = rx_buffer1_p;
        return x;
}
这样程序在这儿就能按照我的思路执行。我以前用的是CodeVisionAVR,没有出现过这样的情况
就用GCC的时候出现过(好几次),不知道这种错误是我程序处理不好,还是一些设置没有对,还是
makefile没有对(这个都是从网上下的)。还请各位大侠 指教!

出0入0汤圆

 楼主| 发表于 2007-9-10 17:26:06 | 显示全部楼层
谢谢armok 站长,站长辛苦了
以后我一定注意。

出0入0汤圆

 楼主| 发表于 2007-9-12 10:01:38 | 显示全部楼层

出0入0汤圆

发表于 2009-12-1 00:31:11 | 显示全部楼层
遇到同样的问题
求解

出0入0汤圆

发表于 2009-12-1 00:39:00 | 显示全部楼层
将rx_buffer1_p的前面加上“volatile”修饰符。

出0入0汤圆

发表于 2010-4-26 20:56:43 | 显示全部楼层
我也遇到过,
原程序被我一顿化简如下(GCC):
uint SignalD1;//定义参数

SIGNAL(SIG_INTERRUPT0) //中断
{
  if(PIND&_BV(PD4))
   {
      SignalD1=1;      //在中断里改变参数的值
      PORTB|=_BV(PB0);
   }
  if(!(PIND&_BV(PD4)))
   {
      SignalD1=0;
      PORTB&=~_BV(PB0);
    }
}

if(SignalD1==0)           //任务函数里对变量的判断
{
   PORTD|=_BV(PD6);
}
if(SignalD1==1)
{
  PORTD&=~_BV(PD6);
}

整了半天都没对,看了论坛里的volatile,用了就对了,哎,可惜的是我以前竟然从来没用过这个“关键字”

出0入0汤圆

发表于 2010-4-26 23:24:26 | 显示全部楼层
学习了 我也遇到过这样的问题

出0入0汤圆

发表于 2010-5-7 09:16:24 | 显示全部楼层
MARK
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表