水平触发和边沿触发(IO复用)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了水平触发和边沿触发(IO复用)相关的知识,希望对你有一定的参考价值。

参考技术A LT(Level Trigger,水平触发)模式和ET(Edge Trigger,边沿触发)模式是两种文件描述符准备就绪的通知模式。

epoll默认是水平触发

水平触发:读缓冲区非空就会一直触发,写缓冲区只要不满就会一直触发写事件。
边缘触发:读缓冲区空转非空(有新消息)的时候触发一次,写缓冲区从满到非满的时候(空出来可以写了)触发一次。

优点:当进行socket通信的时候,保证了数据的完整输出,进行IO操作的时候,如果还有数据,就会一直的通知你。

缺点:由于只要还有数据,内核就会不停的从内核空间转到用户空间,所有占用了大量内核资源,试想一下当有大量数据到来的时候,每次读取一个字节,这样就会不停的进行切换。内核资源的浪费严重。效率来讲也是很低的。

优点:每次内核只会通知一次,大大减少了内核资源的浪费,提高效率。

缺点:不能保证数据的完整。不能及时的取出所有的数据。

应用场景:处理大数据。使用non-block模式的socket。

在实践中大家还是更倾向于LT,因为ET容易漏数据不安全。

边沿触发和电平触发的区别

边沿触发和电平触发的区别 
当然不一样了
电平触发是在高或低电平保持的时间内触发,
而边沿触发是由高到低或由低到高这一瞬间触发
追问:
我总觉得都是在电平为某一值是而触发的。那边沿触发到底解决了电平触发哪点没有解决的问题呢?
追答:
边沿触发一般时间短,边沿触发一般时间都是us级的,响应要快的,而电平触发只须是高和低就可以了,没时间要求,比如10s 时间内总是低电平,那么它也是触发的,
比如中断计时或计数,最好用边沿触发,用电平触发误差会很大,电平触发一般用于简单报警,开关一类(时间要求不高的)
分类:
电平触发,就是只有高电平的时候才做指定的事, 
边沿触发,就是有高电平向低电平转换,或者翻过来转换,这个转换过程触发一个动作。 
上升沿,顾名思义,就是低电平向高电平转换的瞬间,比如 
_______ 
____/ ,这个图中,/部分就是上升沿, 

______ 
\_____ ,这个图中,部分就是下降沿


电平就是电压,高电平就是高电压,低电平就是低电压 
高电平触发就是当电压为高就触发 
边沿触发就是当电压由高变低或由低变高时触发 
上升沿触发 就是当电压从低变高时触发 
下降沿触发 就是当电压从高变低时触发


边沿触发:上升沿和下降沿,这个在学数电时都学过的,简单说就是电平变化那一瞬间。

电平触发:一般是指低电平,就是电平变为低了之后的全部时间里。

如果是下降沿触发,当从高至低电平转变时,触发产生。低电平保持多久都只产生一次。

如果是低电平触发,那么在低电平时间内中断一直有效。如果在电平没有恢复之前就退出中断程序,那么会在退出后又再次进入中断。只要不退出是不会重复触发的。我的做法是在退出前关闭中断,等后面有空时再打开。、

 

 

如:外部中断1中断中来检测按键。

void ISR_INT1(void) interrupt 2 
{

if(!INT1)    //INT1为外部中断1,INT1=P3^3.
{
DelayMs(10);//在此处可以添加动程序,防止按键抖动造成错误
if(!INT1)
while(!INT1);//等待按键释放
{
L1=!L1; 
}
}

 

来在外部中断中来检测按键。虽有一丢丢效果。
但不建议用外部中断来检测按键。
当你按下S2或S3时已经执行中断服务子程序去了,延时消抖是不可行的,只有采用硬件消抖。在实际应用中INT1和INT0接的应该是稳定数字数字信号,而不是按键产生有干扰的数字信号,有条件的话就用硬件消抖。

外部中断是用来检测要求响应速度高(微秒级)的外设的,而按键的动作时间都大于40毫秒,你可以测试一下。
虽然还是有很多做开发板的把按键做在中断上,但那只是验证是否好用,产品上尽量不要这样做。
按键消抖也不要用延时10ms再检测一次的办法,延时的这10ms实在是浪费控制器的资源,要知道时间对微控制器来说是非常宝贵的。
在做按键检测时,建议设置一个10ms的定时器中断作为时钟节拍,并在中断中设置标志。
程序的主循环中检测时钟节拍标志,检测到标志后清除标志并扫描按键,记录当前按键状态并和上次检测的结果做比较,并记录相同的次数,连续三次检测到同一个按键按下,则确认按键按下。
这样既可以消抖保证按键的准确,又较少的占用了微控制器的时间资源,稍微增加了点程序的空间,在单片机做的人机界面的系统中,应该是最合算的。































以上是关于水平触发和边沿触发(IO复用)的主要内容,如果未能解决你的问题,请参考以下文章

Linux IO多路复用模型

IO多路复用

Python之路PythonNet,第四篇,网络4

IO阻塞与IO非阻塞2

linux网络编程 - epoll边沿触发/水平触发内核实现代码分析

linux网络编程 - epoll边沿触发/水平触发内核实现代码分析