打印

整型赋值 中断

[复制链接]
3723|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
栩栩如生|  楼主 | 2011-7-11 10:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
两个全局变量uword test;
uword temp;

main()
{
  while(1)
    {

test=0x08fe;

temp=test;

if(temp==0x0800)

{

led=1;

}
    }


}


xxxx() interrupt ex0int   //外部中断

   test++;


led=1;  有多大可能性执行到,怎么解决?
沙发
dingy| | 2011-7-11 10:55 | 只看该作者
中断好像没开吧

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

使用特权

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

使用特权

评论回复
地板
栩栩如生|  楼主 | 2011-7-11 11:19 | 只看该作者
2:设定单片位机为8位单片机

使用特权

评论回复
5
dingy| | 2011-7-11 11:27 | 只看该作者
感觉好像在钻牛角啊,唉~~~

使用特权

评论回复
6
pengf| | 2011-7-11 13:55 | 只看该作者
中断修改数据,外面再把数据写回去。

这个讨论没有意义

编译器不同,代码的长度不同,概率就不一样。

使用特权

评论回复
7
renyaq| | 2011-7-11 14:09 | 只看该作者
是啊,临界资源本来就要求加保护

使用特权

评论回复
8
supernan| | 2011-7-11 14:14 | 只看该作者
在test=0x08fe;之前,中断能不能让test的值加翻转到0x0800,这个就只有看外中断发生的频率多少了。

使用特权

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

使用特权

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

使用特权

评论回复
11
chuxh| | 2011-7-11 16:41 | 只看该作者
是存在这个问题,但LZ的表述不怎么恰当。

使用特权

评论回复
12
栩栩如生|  楼主 | 2011-7-11 16:56 | 只看该作者
是我没表达清楚。怎么处理这种数据?EA=0;  EA=1;能解决吗?

使用特权

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
sxhhhjicbb + 1
14
llljh| | 2011-7-11 17:05 | 只看该作者
你看清楚,你的初值赋值语句是在while循环里面,中断一退出来,主循环就把test变量复位了。你把问题想复杂了,对待临界资源的办法非常简单,就是加锁。

使用特权

评论回复
15
栩栩如生|  楼主 | 2011-7-11 17:23 | 只看该作者
不明白???说具体点

使用特权

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

使用特权

评论回复
17
ahgao| | 2011-7-11 18:07 | 只看该作者
这个只是一个简单的例子,在中断中的整型数据改变,在非中断中任何地方调用这个数据,都会出现问题
栩栩如生 发表于 2011-7-11 16:25
这句话不准确,并且和楼主的程序不相干。而且显然楼主不知道什么是volatile类型。

使用特权

评论回复
18
栩栩如生|  楼主 | 2011-7-11 18:07 | 只看该作者
我条件是成立的,我是说中断会至整型数据进位丢失,

使用特权

评论回复
19
栩栩如生|  楼主 | 2011-7-11 20:03 | 只看该作者
唉   ,是我没表达清除,正常情况下条件无论如何是达不成的,我是说在由于在赋值是产生中断至进位丢失的情况下出错才会至temp==0x0800
先传高位后进入中断,低位ff进位退出中断位,进位的数据传到低位。

使用特权

评论回复
20
司徒老鹰| | 2011-7-11 20:17 | 只看该作者
楼主应该把WHILE里面的句子放进中断里,这位数据上会错位

使用特权

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

本版积分规则

310

主题

2657

帖子

0

粉丝