Ucos系统的中断详解

发布者:火星叔叔最新更新时间:2018-12-01 来源: eefocus关键字:Ucos系统  中断详解 手机看文章 扫描二维码
随时随地手机看文章

  在正常的情况下,是我们的主程序在运行,也就是我们的任务在运行,假设我们的主程序运行到某个地方的时候,产生了中断请求,产生了中断请求以后,CPU来响应这个中断,它在响应这个中断之前呢,首先要做一件事就是现场的保护,这个很好理解,为什么这样呢?


  因为当我们在执行完中断函数以后,我们还有退回到原来的主函数中去,开始接着往下执行,那这样的话,必须保护这个现场,如果不保护这个现场,我们以后从中断函数退出的时候,那捏怎么知道从什么地方执行呢?


  所以,在这里,我们中断函数以后,要进行一个现场的保护。现场保护要做的是什么事情呢?


  实际上就是保护CPU集成器,现场保护以后,CPU就转入中断函数执行,这个时候,就执行中断,执行中断也叫做ISR,执行完ISR以后,接下来我们要回到主程序执行,那它们之间的过程刚好是个相反的过程。刚刚我们进行了一个现场保护,那么现在我们要进行一个现场恢复,恢复完现场以后,接下来我们要干的事情就是执行主程序,这个是我们整个中断的过程。


1)中断延迟


  中断延迟指的是,从产生中断开始,到执行第一条中断函数,这个时间被称作中断延迟时间。也就是说,从这一时刻,我开始产生中断请求,到另一个时刻,我才执行中断函数,那么这段时间,就被称做中断延迟。在这个中断延迟中,它都干了些什么事情,实际上就是一个CPU的现场保护。


2)中断响应

  

比如说,某一个事件产生了,那件产生了多长时间以后才会来响应这个事件,这个就叫做中断响应过程,中断响应和中断延迟是有一定的区别的。我们刚刚说中断延迟是从产生到延迟到执行第一条中断函数服务,而中断响应指的是产生中的请求然后到对这个中断进行处理,这个时间叫做中断响应。

3)中断恢复


  中断恢复指的是这个中断函数执行完毕以后到我们的主程序去执行这一段时间就是中断恢复的时间。


  在我们不带操作系统的开发当中,也就是逻辑开发当中,我们中断延迟和中断响应是一样的。假设我们跑了操作系统以后,跑了一个OS以后,我们看一下这个会变成什么样。


  首先这个中断延迟还是一样的,那我们的这个主程序就相当于某个任务,这个任务在运行的过程中,产生了一个中断,产生了一个中断以后,还是CPU对现场进行一个保护,CPU保护完了以后,再进入我们的ISR,ISR执行完毕以后,接下来我们就退出,也就是中断恢复。


  接下来我们来看一下这个过程,首先对于一个中断延迟,中断延迟指的还是中断请求以后,然后到第一条中断函数指令的时间。中断响应指的是中断服务函数执行以后,我们中断申请以后开始来处理这个中断,这个叫做中断响应。那在os也就是跑了中断系统以后,我们在中断函数中执行的第一条代码时这个代码OS-IntEnter();这个函数有两个作用,第一个作用是告诉CPU我进入了中断服务,第二个作用是告诉CPU当前中断嵌套函数的层数是多少,比如说,在这个中断执行的过程中,又有一个优先级比它高的中断把它打断了,那这个时候,CPU会跑过去执行优先级较高的中断,在优先级较高的中断中,我们也来执行了OS-IntEnter(),这个时候CPU会根据OS-IntEnter()执行的次数,来判断我们当前中断嵌套函数的层数,这个是这个中断函数的过程。我们可以看到,在加了这个操作系统以后,我们很多时候执行这个函数,那这个时候,中断延迟,中断响应的时间,就变成了中断延迟时间加上一个OS-IntEnter()这个函数执行的时间,这段时间叫做中断响应。


  接下来是中断恢复,中断恢复和我们这个不带操作系统的也是有点区别的,首先,在中断恢复的时候,我们首先执行的指令是OS-IntExit(),这个函数也是有两个作用,第一个作用是告诉CPU我现在退出这个中断了,那出这个中断以后,我们是不是要跑去执行这个任务呢?那不一定,为什么呢?比如说,假设这里有一个中断嵌套,也就是这个中断打断的是上一个中断,那当这个中断退出以后,它就不能去执行任务,为什么呢?因为有别的中断还被它嵌套着,所以它要去执行上一个中断函数,当这个中断执行完了,它才会去执行任务。那也就是说,我们在中断恢复的时候,执行的是这个函数OS-IntExit(),那这个时候,它中断恢复的时间就变成OS-IntExit()它执行的时间,加上中断执行的时间,这是我们整个中断恢复的时间。


   那在这里,有可能就有人来问了,这两个函数执行的时间有多长呢?那我们首先来看一下这两个函数,这两个函数实际上本质是由3个代码,第一个代码是关中断,第二个代码是让一个全局变量加1,第三个代码是开中断。那我们这里为什么要关中断和开中断呢?因为让这个变量加1是属于这个临界段代码,那我们在以前讲过,在对临界段代码操作的时候,必须关中断和开中断,这样保护。实际上,在这里呢,我们也就是有一个中断计数器,比如叫做ISRCounter,这个全局变量初始化为0,当进入中断一次,我们调用这个函数:OS-IntEnter(),在这个过程中,我们把这个变量加1,就变成1了,当退出这个中断,执行中断函数:OS-IntExit(),那在这个函数中,我们让这个变量减1,那我们可以看到,初中断加1,表明我们处于一个中断,初中断减1,表明我们当前不再处于中断。


  那如果他是一个中断嵌套呢?比如说,另外一个中断把这个中断打断了,那这个时候,首先ISRCounter加1,加1以后进入下一个中断,它又进入OS-IntEnter(),在这个函数中,我们再让这个变量ISRCounter加1,那这个时候,它就变成2了。我们可以看到变量ISRCounte为0,表明没有中断,变量ISRCounte为1,表明中断嵌套层数是1,变量ISRCounte为2,表明中断嵌套层数是2,所以说,我们这个操作系统就是根据这个全局变量来判断当前是不是处于中断嵌套中,如果处于中断嵌套中,就优先执行中断。


  进入中断函数:OS-IntEnter();


  退出中断函数:OS-IntExit();


  在一个操作系统中,我们的中断时间是没办法估量的,但是,我们中断要遵循一个原则:


  注意,中断时间越短越好。


  为什么呢?因为如果中断的时间比较长,那对我们任务的响应就有问题了,因为中断是可以打断任务的,假设这个任务10毫秒执行一次,但是这个中断已经占用了20毫秒,那很显然,这个任务被打断以后,它20毫秒就不再执行了,就失去了它本身的实时性。所以说这个中断时间过长,会影响我们任务的实时性,但是,中断时间越短越好并不代表不使用中断就最好。


关键字:Ucos系统  中断详解 引用地址:Ucos系统的中断详解

上一篇:vxWorks内核解读四--中断
下一篇:通过形参获得函数返回值的问题

推荐阅读最新更新时间:2024-03-16 16:19

linux-2.6.26内核中ARM中断实现详解
看了一些网络上关于linux中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对一些问题的理解。先从函数注册引出问题吧。 一、中断注册方法 在linux内核中用于申请中断的函数是requeST_IRq(),函数原型在Kernel/irq/manage.c中定义: int request_irq(unsigned int irq, irq_handler_t handler, unsigned lONg irqflags, const char *devname, void *dev_id) irq是要申请的硬件中断号。 handler是向系统注册的中断处理函数,是一个回调函数,中断发
[单片机]
ARM中断寄存器详解
S3C2440的中断寄存器: 1.中断分两大类:内部中断和外部中断。 2.外部中断。24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体参考datesheet数据手册。 寄存器:EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23的触发方式。 EINTFLT0-EINTFLT3:控制滤波时钟和滤波宽度。 EINTPEND:这个是中断挂起寄存器,清除时要写1,后面还有几个是写1清除。当一个外部中断(EINT4-EINT23)发生后,那么相应的位会被置1。为什么没有EI
[单片机]
ARM<font color='red'>中断</font>寄存器<font color='red'>详解</font>
2440-中断寄存器详解
S3C2440的中断寄存器: 1.中断分两大类:内部中断和外部中断。 2.外部中断。24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,并且不要上拉。具体参考datesheet数据手册。 寄存器:EXTINT0-EXTINT2:三个寄存器设定EINT0-EINT23的触发方式。 EINTFLT0-EINTFLT3:控制滤波时钟和滤波宽度。 EINTPEND:这个是中断挂起寄存器,清除时要写1,后面还有几个是写1清除。当一个外部中断(EINT4-EINT23)发生后,那么相应的位会被置1。为什么没有EI
[单片机]
2440-<font color='red'>中断</font>寄存器<font color='red'>详解</font>
Realview MDK中编译器对中断处理的过程详解
在ARM程序的开发过程中,对中断的处理是很普遍的、也是相当重要的。Realview MDK使用的RVCT编译器提供了__irq关键字,用此关键字修饰的函数被作为中断出来函数编译,即在编译的过程中,编译器会自动添加中断处理过程中现场保护和恢复的代码,减小程序的开发难度,加快软件的开发过程。 在理解__irq关键字的作用之前,先看一下ARM核对异常的处理过程。当产生异常时, ARM核拷贝CPSR寄存器的内容SPSR_ mode 寄存器中,同时设置适当的CPSR 位、改变处理器状态进入ARM 态和处理器模式,从而进入相应的异常模式。在设置中断禁止位禁止相应中断(如果需要)后,ARM核保存返回地址到LR_ mode ,同时设置PC为相应的异
[单片机]
51单片机中断详解(中)
一.外部中断相关寄存器 1.定时器/计数器控制寄存器控制寄存器(TCON) IT0:外部中断0触发方式控制位 当IT0=0时,为电平触发方式(低电平有效) 当IT0=1时,为边沿触发方式(下降沿有效) IT1:外部中断1触发方式控制位 当IT1=0时,为电平触发方式(低电平有效) 当IT1=1时,为边沿触发方式(下降沿有效) 2.中断允许控制寄存器(IE) EX0:外部中断0允许位; EX1:外部中断1允许位; EA :CPU中断允许(总允许)位。 二.外部中断的处理过程 1、设置中断触发方式,即IT0=1或0,IT1=1或0 2、开对应的外部中断,即EX0=1或EX1=1; 3、开总中断,即EA=1; 4、等待外部设备
[单片机]
MiniARM2300电脑自动打铃器设计与实现ucos操作系统
单片机源程序如下: /****************************************Copyright (c)**************************************************** ** Guangzhou ZHIYUAN electronics Co.,LTD. ** ** **--------------File Info--------------------------------------------------------------------------------- ** File name
[单片机]
Linux内核中ARM中断实现详解request_irq()、free_irq()
Request_irq()调用的定义: int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long irqflags, const char * devname, void *dev_id); irq是要申请的硬件中断号。具体应是何值参见博文 http://blog.csdn.net/songqqnew/article/details/6791602 。 handler 是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递给它
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved