打印

c51重量级问题,高人们都过来看看 整型赋值 中断

[复制链接]
3267|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaobaoping|  楼主 | 2010-5-29 11:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两个全局变量uword test;
uword temp;

main()
{
  while(1)
    {

test=0x08fe;

temp=test;

if(temp==0x0800)

{

led=1;

}
    }


}


xxxx() interrupt ex0int   //外部中断

   test++;


led=1;  有多大可能性执行到,怎么解决?

相关帖子

沙发
一棵小草| | 2010-5-29 12:52 | 只看该作者
中断好像没开吧

中断不清零,貌似永远都中断,没有可能性 led = 1

使用特权

评论回复
板凳
xiaobaoping|  楼主 | 2010-5-29 13:00 | 只看该作者
这不是全部程序,只是一个假设
1:设定外部中断的一定频率的方波脉冲,在每个上升测或下降沿产生中断。

使用特权

评论回复
地板
xiaobaoping|  楼主 | 2010-5-29 13:01 | 只看该作者
2:设定单片位机为8位单片机

使用特权

评论回复
5
一棵小草| | 2010-5-29 14:41 | 只看该作者
感觉好像在钻牛角啊,唉~~~

使用特权

评论回复
6
NE5532| | 2010-5-29 14:57 | 只看该作者

1

本帖最后由 NE5532 于 2010-5-29 14:59 编辑

1

使用特权

评论回复
7
NE5532| | 2010-5-29 14:59 | 只看该作者
中断修改数据,外面再把数据写回去。

这个讨论没有意义

1.编译器不同,代码的长度不同,概率就不一样。
2.临界资源本来就要求加保护。
3.楼主钻牛角尖。 ...
NE5532 发表于 2010-5-29 14:57 [/quote]

使用特权

评论回复
8
NE5532| | 2010-5-29 15:02 | 只看该作者
再加一句,就是说在test=0x08fe;之前,中断能不能让test的值加翻转到0x0800,这个就只有看外中断发生的频率多少了。

使用特权

评论回复
9
xiaobaoping|  楼主 | 2010-5-29 16:06 | 只看该作者
这个和外中断发生的频率,无关,就算设定为1HZ,也会有一定机率翻转到0x0800。
这个本身就是讨论中断中的整型数据保护。

使用特权

评论回复
10
xiaobaoping|  楼主 | 2010-5-29 16:10 | 只看该作者
这个只是一个简单的例子,在中断中的整型数据改变,在非中断中任何地方调用这个数据,都会出现问题

使用特权

评论回复
11
numLiu| | 2010-5-29 18:31 | 只看该作者
是存在这个问题,但LZ的表述不怎么恰当。

使用特权

评论回复
12
xiaobaoping|  楼主 | 2010-5-29 19:02 | 只看该作者
是我没表达清楚。怎么处理这种数据?EA=0;  EA=1;能解决吗?

使用特权

评论回复
13
NE5532| | 2010-5-29 19:11 | 只看该作者
这个和外中断发生的频率,无关,就算设定为1HZ,也会有一定机率翻转到0x0800。
这个本身就是讨论中断中的整型数据保护。
xiaobaoping 发表于 2010-5-29 16:06


你看清楚,你的初值赋值语句是在while循环里面,中断一退出来,主循环就把test变量复位了。你把问题想复杂了,对待临界资源的办法非常简单,就是加锁。

使用特权

评论回复
14
xiaobaoping|  楼主 | 2010-5-29 19:20 | 只看该作者
你看清楚,你的初值赋值语句是在while循环里面,中断一退出来,主循环就把test变量复位了。你把问题想复杂了,对待临界资源的办法非常简单,就是加锁。


不明白???说具体点

使用特权

评论回复
15
NE5532| | 2010-5-29 19:31 | 只看该作者
while循环是一只在执行的,单片机不是在执行while循环就是在执行中断,现在你在while里给test赋初值,就是不停在给他赋值刷新,你说中断如果跑得不是足够快,哪里可能达到if的条件呢。

使用特权

评论回复
16
numLiu| | 2010-5-29 19:43 | 只看该作者
这个问题据说在操作系统中也存在,就是主程序和中断共用多字节变量。解决方法有二:在条件语句前关中断,判断之后再开中断;申请另一个保护变量,在条件判断式前将共用变量赋给保护变量,条件式中用保护变量。
你的例子中的确有可能条件不会成立。NE5532兄弟也是正解。在不影响的情况下把if(temp==0x0800)改为if(temp>=0x0800)可能会更好。

使用特权

评论回复
17
numLiu| | 2010-5-29 19:44 | 只看该作者
这两种方法都是有缺陷的。十全十美不容易,要有牺牲。

使用特权

评论回复
18
xiaobaoping|  楼主 | 2010-5-29 20:00 | 只看该作者
我条件是成立的,我是说中断会至整型数据进位丢失,

使用特权

评论回复
19
xiaobaoping|  楼主 | 2010-5-29 20:05 | 只看该作者
while循环是一只在执行的,单片机不是在执行while循环就是在执行中断,现在你在while里给test赋初值,就是不停在给他赋值刷新,你说中断如果跑得不是足够快,哪里可能达到if的条件呢。


唉   ,是我没表达清除,正常情况下条件无论如何是达不成的,我是说在由于在赋值是产生中断至进位丢失的情况下出错才会至temp==0x0800
先传高位后进入中断,低位ff进位退出中断位,进位的数据传到低位。

使用特权

评论回复
20
a6632001| | 2010-5-29 22:06 | 只看该作者
楼主应该把WHILE里面的句子放进中断里,这位数据上会错位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

11

帖子

1

粉丝