打印

串口中断种添这两句话有什么用?

[复制链接]
15861|75
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2009-12-11 21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个帖子https://bbs.21ic.com/viewthread.php?tid=40962&highlight=%E4%B8%B2%E5%8F%A3


static void UartInterruptService(void) interrupt 4
{
ES = 0;
RI = 0;
uart_process(SBUF);
ES=1;
}
原帖说
为了防止在处理数据过程中不受干扰,通常在处理接受数据前关闭中断,处理完后再开。


真不知道什么干扰?

加入这两句话“ES = 0”“ES = 1”有什么用?

是不是对自己的程序不自信?还是惯性!??

我看除了如存在更高级别中断,啥种情况能形成干扰?

多谢

相关帖子

沙发
lxyppc| | 2009-12-11 21:44 | 只看该作者
那贴66楼有个说明
这个可以不加

使用特权

评论回复
板凳
xlsbz|  楼主 | 2009-12-11 21:56 | 只看该作者
那贴66楼有个说明
这个可以不加
lxyppc 发表于 2009-12-11 21:44


不太明白你说得意思!!

关键是加了有没有用?

没有用为什么要加?

使用特权

评论回复
地板
desert_hawk| | 2009-12-11 22:12 | 只看该作者
不太明白你说得意思!!

关键是加了有没有用?

没有用为什么要加?
xlsbz 发表于 2009-12-11 21:56

这个程序又不是教科书上的,难免有不成熟的地方。
按作者的意思,大概是担心在处理串口中断的过程中被其它中断所抢占。但关闭串口中断允许(ES=0)根本起不到保护这个中断不被抢占的作用。
其实如果怕串口中断被其它中断抢占,把它配置为高中断优先级就可以了,51就两级中断优先级,配置为高优先级的就不可能被抢占了。

使用特权

评论回复
5
yzhj| | 2009-12-11 22:22 | 只看该作者
我感觉更多的 ctrl+v 惹得祸。直接复制了以前的一段代码。

这种用法的本身含义是:中断已经响应,但是还有比这更重的事情要处理,暂时不能把缓冲区内的数据导出。同时又害怕收到新的数据冲掉了现有的数据,只好暂时关掉中断。

只是从楼主提供的这段代码看,实在是没有必要。首先这是在中断响应中,其次也没有其他的事情要处理,除非“ uart_process(SBUF)”写的很复杂。。。。。。。。。。。

使用特权

评论回复
6
xlsbz|  楼主 | 2009-12-11 22:43 | 只看该作者
我感觉更多的 ctrl+v 惹得祸。直接复制了以前的一段代码。

这种用法的本身含义是:中断已经响应,但是还有比这更重的事情要处理,暂时不能把缓冲区内的数据导出。同时又害怕收到新的数据冲掉了现有的数据,只好暂时 ...
yzhj 发表于 2009-12-11 22:22


哦 看样子还是有必要的!因为确实是很复杂!:lol

使用特权

评论回复
7
lxyppc| | 2009-12-11 23:12 | 只看该作者
我的意思是说那个贴子的66楼有说这个加不加的问题的

我的观点是不加,因为如果不加会导致数据被冲掉,那加了只是掩盖了问题,除非这个中断能自己打断自己
如果处理的时间(包括所有优先级比它高的中断的处理时间的总和)大于一个BYTE收发的时间,就不应该用uart_process中的方法来处理数据

假如能找到一个ES=0真正起作用的案例,我觉得用这个案例同样可以说明ES=0没有作用
如果从中断跳转到执行ES=0是可以被更高优先级的中断打断的话

使用特权

评论回复
8
yzhj| | 2009-12-11 23:16 | 只看该作者
to:6楼
"static void UartInterruptService(void) interrupt 4"
这是在中断中啊!!
有事不能出来说吗!!
这里置起一个标志位什么的!

使用特权

评论回复
9
desert_hawk| | 2009-12-11 23:18 | 只看该作者
不同意5楼的看法。
首先,关闭串口中断没有什么作用,51的中断机制,决定了它一旦响应了某个优先级的中断,在执行RETI之前是不可能响应同级别的其它中断的,所以,在退出本次串口中断服务前,不可能再次响应串口中断,所以没必要关闭串口中断。
第二,关闭串口中断并不能保护SBUF中的数据不被覆盖,只要串口接收到的数据超过2个,而且SBUF中的数据还未被读取,则肯定会有旧的数据被覆盖,不管此时串口中断是否打开。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
10
yzhj| | 2009-12-11 23:26 | 只看该作者
7楼:
说实话这种用法本身就有不自信的成分。
假设有用,也就意味着要发生数据丢失的情况。如果这次通讯不是一个字节,那么这次通讯就废了,或者引起其他的错误了。
这种问题最好通过提高运行速度、降低波特率、增加校验等方式解决。
把中断一关了之,不是什么好办法,除非万不得已。

使用特权

评论回复
11
xwj| | 2009-12-11 23:28 | 只看该作者
4楼和8楼是对的。

而且“害怕收到新的数据冲掉了现有的数据,只好暂时关掉中断。”是不能避免数据覆盖的,正确的方法是先缓存。
再说,串口传输速度那么慢,接收一字节的时间都没处理好一字节数据?程序真要写成这样的话也该打PP了。


中断中怕被打断关闭IE还勉强说得过去,但也不是什么好的习惯哦~

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
xlsbz + 1
12
lxyppc| | 2009-12-11 23:36 | 只看该作者
我觉得原作者本意并非是怕SBUF被冲掉,而是怕uart_process被打断
即便如此,关中断也是没有必要的
因为能证明关中断有用的情况同时也能证明关中断没有用

使用特权

评论回复
13
lxyppc| | 2009-12-12 00:08 | 只看该作者
为什么能说得过去?

怎么感觉根本就一点也说不过去啊?
xlsbz 发表于 2009-12-11 23:50


非原子操作修改全局变量了时候,怕被别的中断抢了半截

使用特权

评论回复
14
xlsbz|  楼主 | 2009-12-12 10:04 | 只看该作者
非原子操作修改全局变量了时候,怕被别的中断抢了半截
lxyppc 发表于 2009-12-12 00:08


什么原子不原子的。不就是说高优先级么?我楼主位都说了啊!





“非原子操作修改全局变量了时候”,解释解释啥意思?

你看了jhc的帖子?

使用特权

评论回复
15
5880527| | 2009-12-12 10:05 | 只看该作者
一个字节都没处理完下一字节又进来了,就跟XWJ说的该打PP。完全没必要关串口中断,通讯过来的东西在收到帧尾字节之前任何地方都不得去使用它,就跟赵本山跟酒店服务员说的:你开,开,开什么玩笑。听话要听全,否则会出现致命错误

使用特权

评论回复
16
lelee007| | 2009-12-12 11:05 | 只看该作者
就算uart_process被打断也没什么

有8级中断堆栈了

个人觉得一般情况下这两句要不要都不会有什么影响

以前没遇到过能列出来的反例,现在也想不到

使用特权

评论回复
17
xlsbz|  楼主 | 2009-12-12 11:14 | 只看该作者
16# lelee007 大概
唯一的反例就是lxyppc提到的原子粒子了吧!

jhc发个贴说: 判断一个16位的数时,

编译器给编译成了 2个8位。

恰好,在运行到第一个8位时,被打搅了(如高中断),返回后,编译器没有对剩下的那一个8位判断。 于是判断失误!

使用特权

评论回复
18
yxb0310| | 2009-12-12 12:44 | 只看该作者
程序不对,估计他是想在中断里泡妞,时间较长,

使用特权

评论回复
19
鲜为人知| | 2009-12-12 17:22 | 只看该作者
1.(假如你要将你接受到的数据通过串口发送)&&(没有关中断),那么可能你还没有发送完就又开始来了接收中断,那你发送的将是一串乱数据。所以要关闭中断,当你把已经通过串口接收的数据发送完后在允许中断。
2.当缓冲器接收完一字节的结束位后,硬件自动将RI置1,但是是不会自动清零的,那就意味着如果你在接受完这字节数据后不清的话将无法判断以后字节的数据是否“真的”到来。

使用特权

评论回复
20
desert_hawk| | 2009-12-12 17:33 | 只看该作者
感觉楼上没有看明白楼主的意思。你的第一条是错的。第二条,估计没有人会在进中断后不清除中断标志就退出。

使用特权

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

本版积分规则

190

主题

1614

帖子

4

粉丝