整型赋值 中断

[复制链接]
5245|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位单片机
dingy 发表于 2011-7-11 11:27 | 显示全部楼层
感觉好像在钻牛角啊,唉~~~
pengf 发表于 2011-7-11 13:55 | 显示全部楼层
中断修改数据,外面再把数据写回去。

这个讨论没有意义

编译器不同,代码的长度不同,概率就不一样。
renyaq 发表于 2011-7-11 14:09 | 显示全部楼层
是啊,临界资源本来就要求加保护
supernan 发表于 2011-7-11 14:14 | 显示全部楼层
在test=0x08fe;之前,中断能不能让test的值加翻转到0x0800,这个就只有看外中断发生的频率多少了。
 楼主| 栩栩如生 发表于 2011-7-11 15:31 | 显示全部楼层
这个和外中断发生的频率,无关,就算设定为1HZ,也会有一定机率翻转到0x0800。
这个本身就是讨论中断中的整型数据保护。
 楼主| 栩栩如生 发表于 2011-7-11 16:25 | 显示全部楼层
这个只是一个简单的例子,在中断中的整型数据改变,在非中断中任何地方调用这个数据,都会出现问题
chuxh 发表于 2011-7-11 16:41 | 显示全部楼层
是存在这个问题,但LZ的表述不怎么恰当。
 楼主| 栩栩如生 发表于 2011-7-11 16:56 | 显示全部楼层
是我没表达清楚。怎么处理这种数据?EA=0;  EA=1;能解决吗?
llljh 发表于 2011-7-11 17:05 | 显示全部楼层
你看清楚,你的初值赋值语句是在while循环里面,中断一退出来,主循环就把test变量复位了。你把问题想复杂了,对待临界资源的办法非常简单,就是加锁。

评分

参与人数 1威望 +1 收起 理由
sxhhhjicbb + 1

查看全部评分

llljh 发表于 2011-7-11 17:05 | 显示全部楼层
你看清楚,你的初值赋值语句是在while循环里面,中断一退出来,主循环就把test变量复位了。你把问题想复杂了,对待临界资源的办法非常简单,就是加锁。
 楼主| 栩栩如生 发表于 2011-7-11 17:23 | 显示全部楼层
不明白???说具体点
llljh 发表于 2011-7-11 17:49 | 显示全部楼层
while循环是一只在执行的,单片机不是在执行while循环就是在执行中断,现在你在while里给test赋初值,就是不停在给他赋值刷新,你说中断如果跑得不是足够快,哪里可能达到if的条件呢。
ahgao 发表于 2011-7-11 18:07 | 显示全部楼层
这个只是一个简单的例子,在中断中的整型数据改变,在非中断中任何地方调用这个数据,都会出现问题
栩栩如生 发表于 2011-7-11 16:25
这句话不准确,并且和楼主的程序不相干。而且显然楼主不知道什么是volatile类型。
 楼主| 栩栩如生 发表于 2011-7-11 18:07 | 显示全部楼层
我条件是成立的,我是说中断会至整型数据进位丢失,
 楼主| 栩栩如生 发表于 2011-7-11 20:03 | 显示全部楼层
唉   ,是我没表达清除,正常情况下条件无论如何是达不成的,我是说在由于在赋值是产生中断至进位丢失的情况下出错才会至temp==0x0800
先传高位后进入中断,低位ff进位退出中断位,进位的数据传到低位。
司徒老鹰 发表于 2011-7-11 20:17 | 显示全部楼层
楼主应该把WHILE里面的句子放进中断里,这位数据上会错位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

310

主题

2657

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部