菜鸟很热心 发表于 2013-10-21 10:26:57

突然有一个疑问

8位单片机定义一个32位的数据,如果在主程序里读取这个32位数据的时候出现了中断,而中断里又将这个数据的值改变了,那么返回后会不会造成这个数据的字节读取错误。
举个例子:比如一个32位的数据 0x11223344,主程序中读取了0x1122的时候中断来了,中断将数据改变成0xAABBCCDD了,那么主程序返回后会不会读取成0x1122CCDD?
1,4字节的变量,没有完全读取的时候会不会进入中断?
2,如果会进入中断,那么会不会造成上面说的情况?
3,如果不会进入中断,请问单片机是怎么防止这种情况的?
谢谢!

longfeix86 发表于 2013-10-21 10:29:26

关键是读哪地方的数据

菜鸟很热心 发表于 2013-10-21 10:34:24

内存中的,或者寄存器中的,或者其他的地方

Wxy8030 发表于 2013-10-21 10:38:44

楼主的题目最好改一改,改成别人一看题目就知道你要问什么 ...... 发这种跟内容不相干的题目小心被封ID!

lcofjp 发表于 2013-10-21 10:38:49

是你说的第二种情况,可以在读写变量的时候禁止中断。

lcw_swust 发表于 2013-10-22 13:44:07

1.要看单片机的指令能处理几位,单片机在执行一条指令的过程中是不会被打断的.
2.会
3.为了防止这种情况,可以如5楼一样,操作前关中断(CLI),操作后开中断(SEI).

lans0625 发表于 2013-10-22 13:52:33

用C开发单片机的肯定有这样的疑问。用汇编的不会。。{:lol:}

laujc 发表于 2013-10-22 13:55:34

1.因为是8位单片机,读取4字节数据,肯定是多条指令读取.所以读取一半的时候,是可以进入中断的.

2.会,而且即使是一个1个字节变量,当读取后还没有来得及运算,进入中断后这个值改变,再回来计算时,也是得出错误的结果的.

3.方法1,让这个变量的值在中断时不会改变,即中断中不改变这个变量 .
   方法2,在读取的时候禁止中断.

sync765 发表于 2013-10-22 14:08:32

楼上说的全面
顶下

MarkTylor 发表于 2013-10-22 14:13:18

本帖最后由 MarkTylor 于 2013-10-22 14:29 编辑

俺刚看了点汇编的基础,不知道这么理解对不对:
单片机CPU在执行中断程序前有个“中断过程”的概念,在这部分cpu有保存当前运行现场的机制(其中包括
标志寄存器入栈和CS IP入栈等等),最后中断返回时要用这些恢复,而中断处理程序的结构一般有下面部分组成:
(1)保存用到的寄存器
(2)处理中断(ps,个人理解:这部分应该是开发者用C语言或其他语言写的真正处理代码)
(3)恢复用到的寄存器
(4)用iret指令返回
楼主的疑惑,可以用过程(1)和(3)解决。楼主如果在(2)中将某值改变了,在过程(3)中还要用(1)中保存的数据恢复,即相当于没有改变。

这么理解不知道对不对,期待高手指点。



这么理解貌似不对。因为实际上有很多被中断更改数据的情况。
上面这样的中断是标准的中断,一般用户自己的中断貌似没有涉及到保存用到的寄存器吧。

关注。。。

ananyjlo 发表于 2013-10-30 15:00:15

是要注意发帖规范。加油!!!

chiooo1 发表于 2013-10-30 16:03:17

页: [1]
查看完整版本: 突然有一个疑问