http://blog.csdn.net/chychc/article/details/8313458

http://www.cnblogs.com/RandyQ/archive/2013/04/14/3020771.html

eCos中断模型(1)ISR和DSR

英文全称 Interrupt Service Routine

中断处理是实时操作系统一个重要部分。及时地处理中断源是很重要的,但一些必须被视为原子操作(不能被中断)的动作对保证及时性带来了十分严重的影响。因
为执行这些动作时,都要disable中断。为了最大限度地减少这种动作,确保最可能少的中断延迟,eCos使用了一种分割式中断处理机制,在这种机制
中,中断处理被分为两部分。第一部分是大家都知道的中断服务例程(ISR),第二部分是延迟服务例程(DSR)。明显地,这种分割允许中断被
enabled的情形下运行DSRs,因此在处理较低优先级的中断时,允许别的潜在的更高优先级的中断发生和处理。

为了使这种中断模型能够工作起来,ISR应当快速运行。如果中断引起的服务量少,ISR可以单独处理这个中断而不需要DSR。当然,如果中断服务比较复
杂,DSR就派上了用场。将会在稍后合适的时间执行这个DSR,在这个时候允许进行线程调度。推迟到这个时候运行DSRs使得kernel可以使用简单的
同步方式。

此外,这种受控的调用方式—当允许进行线程调度的时侯--意味着DSR可以和内核打交道,比如向内核发出信号:一个异步操作结束了。

为了可以在中断被enabled的情形下运行DSRs,对应于特定中断源(或硬件)的ISR必须作出安排保证这个中断不会再次发生,直到DSR结束。在有
的情况下,硬件完成这个动作:一旦一个中断被递送出去,别的中断将不会发生,除非中断被重新enabled。但是,一般情况下,是ISR来强迫这个行为的
发生。ISR将会屏蔽掉这个中断源,防止了再次产生中断。只有当DSR执行结束时,这个DSR将会unmask这个中断,这样如果新的中断再次发生了,允
许递送这个中断。

另外,如果每次中断时ISR要做的动作很少,比如传递内存上的一个字节到一个IO设备上,每一次“传递”结束时,它可能只需要与系统的其它部分打交道。在这种情况下,多次执行了ISR后,等到处理完这个缓冲区,这个ISR才真的需要请求执行它的DSR。

如果中断源是爆发性的,在执行一个被请求的DSR之前,可能产生了多个中断并且多次调用了这个ISR,这是正常的;内核记录下被posted的DSR的个
数。在这种情况下,这个DSR将会最终被调用,其中一个参数告诉它有多少个ISR请求执行这个DSR。编码时必须小心处理这种情形,因为一次对DSR的调
用需要完成好几次DSR的任务。

正如上面所说,这个DSR将会在稍后的时间得到执行。与系统的状态有关,它可能会在更迟的时间得到执行。执行一定的内核操作时,在某些时期内线程调度被禁
止,这使得不能执行DSR。eCos内核有意识地尽可能地限制了这些时期,尽管它们依然存在。另外,同时用户线程有能力挂起调度,因此影响了可能的DSR
执行延迟。如果不能足够快地执行一个DSR,这个中断源可能overrun。这应当视为系统失败。

eCos中断模型(2)用户栈和中断栈

系统设计者面临的一个问题是为每个线程应当分配多大的堆栈空间。eCos并没有指定线程堆栈的大小,它留给用户在创建线程的时候决定。堆栈的大小不但与线
程需求有关,也与一些固定的系统开销有关。这个系统开销是能够存放全部线程状态的足够的堆栈空间(它的实际数量与CPU结构有关)。抽象硬件层的
CYGNUM_HAL_STACK_SIZE_MINIMUM给出了所需的最小堆栈空间。

嵌套中断是这种机制潜在的一个问题。既然处理一个中断时它的DSR部分重新enable了中断,这样在处理DSR时,有可能来了一个新的中断
(hopefully来自别的中断源)。当处理这个新的中断时,被中断的状态信息将会存放在堆栈上。被中断的状态信息的数量依赖于具体的CPU结构,有时
候数量很多。这意味着堆栈空间应当足够大能够存放“N”个中断框架(被中断的状态信息)。对于有很多线程的实时系统来说,这是一个不能容忍的局面。为了解
决这个问题,在处理中断时,eCos应用了一个独立的中断栈。这个栈需要足够大能够存放“N”个中断框架(被中断的状态信息),而每个线程堆栈只需单个中
断状态的开销。这是因为线程状态被保存在自己的堆栈上,包括导致这个线程被调度的中断的状态信息。这是一个好得多的结局,既然只有这个中断栈需要足够大以
处理潜在的中断服务需求。

eCos允许中断栈完全地可配置。用户可以选择不使用这个独立的中断栈。这需要所有的线程堆栈足够大,但是在中断处理时,这省去了切换栈的开销。如果内存很紧张,每次处理中断时以几个机器周期(cycle)为代价,选择一个独立的中断栈应当是warranted(必要,值得)。

eCos中断模型(3)overrun问题

在mn10300模拟器上,观察到如下与中断有关的问题:当DSR重新enabled了中断,马上就来了下一个中断。既然一个中断被处理完到下一个中断出
现之前,不可能有任何(有意义的)处理,这种现象应当被视为一种中断overrun,系统完全饱和了。产生了问题是因为栈溢出。这是用户栈溢出,因为
DSR是在用户栈上执行的。对这个问题的分析导致重新修改了中断处理方式,尤其是进行中断处理时(ISR和DSR),对独立中断栈的使用。栈溢出依然会发
生,但这回它只限制在中断栈上。如果系统设计者事先知道overrun是有限的,例如以串口设备为例,它可能是一些FIFO的depth,他可以为此做出
相应调整给出适当大的中断栈。任何情况下,overrun必须避免,但使用中断栈使得这种failure可以很简单地检测出来。

eCos中断模型的更多相关文章

  1. request_irq() | 注册中断服务函数【转】

    本文转载自:http://blog.csdn.net/wealoong/article/details/7566546#t0 参考  : ARM Linux 中断机制分析.pdf linux-2.6. ...

  2. Linux驱动设计—— 中断与时钟@request_irq参数详解

    request_irq函数定义 /*include <linux/interrupt.h>*/ int request_irq(unsigned int irq, irq_handler_ ...

  3. LPC2478的外部中断使用

    LPC2478外部中断 2478的外部中断模型如下 也就是说,port0和2支持外部中断,EINT0-2是三个独立管脚的中断,而EINT3则是port0和2的所有中断共同拥有的向量 对于port0和2 ...

  4. linux-2.6.26内核中ARM中断实现详解(转)

    转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...

  5. request_irq() | 注册中断服务

    一.中断注册方法 在linux内核中用于申请中断的函数是request_irq(),函数原型在Kernel/irq/manage.c中定义: int request_irq(unsigned int ...

  6. 【转】详细分析Java中断机制

    原文地址:http://www.infoq.com/cn/articles/java-interrupt-mechanism 1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制 ...

  7. 详细分析Java中断机制(转)

    1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...

  8. Java多线程——中断机制

    前言:在Java多线程中,中断一直围绕着我们,当我们阅读各种关于Java多线程的资料.书籍时,“中断”一词总是会出现,笔者对其的理解也是朦朦胧胧,因此非常有必要搞清楚Java多线程的中断机制. 1.J ...

  9. 详细分析Java中断机制-转载

    1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...

随机推荐

  1. java程序执行顺序

    原来自己一直都没弄明白Java程序的执行顺序问题,今天,自己写了个测试,果然与自己考虑的有差距 测试代码: 一个父类Animal 一个子类Dog 测试类Test 运行结果: 所以执行顺序是: 父类An ...

  2. 如何用java实现使用电子邮件控制你的电脑

    上两天看到一篇文章,用python实现电子邮件控制电脑的有趣的小程序 python 实现微信控制电脑     python版的视频教程 但是苦于自己没接触过python于是想到能不能用java实现,于 ...

  3. git subtree

    语法:git subtree split -P <被裁减的目录> -b <分支> git subtree split -P SDK/CustomUI(需要裁减的) -b Cus ...

  4. Mysql - 解决Access denied for user ''@'localhost' to database 'mysql'问题

    http://361324767.blog.163.com/blog/static/11490252520124454042468/ 首先我想说一句话: 我极度鄙视国内搞IT的人,简直无语,同样是解决 ...

  5. HW—指定字符替换Java(replace)---动态和静态定义字符串数组;

    总结: 语法层面上:这里主要用到Java字符串的替换函数,str.replaceAll("待替换的","替换成的").replaceAll接受的是正则花的reg ...

  6. EasyUI的DataGrid 分页栏英文改中文解决方案

    (一)分页栏英文改中文解决方案 这个问题其实很简单,就是引入文件jquery-easyui-1.3/locale/easyui-lang-zh_CN.js . 注意这个文件要放在本页js的后面,放在最 ...

  7. oracle创建存储过程并返回结果集(附C#调用代码)

    使用存储过程中,最常用的莫过于查询数据表,并返回结果集. 在SQL SERVER 中,这类操作最简单,通过简单的select * from xx 即可完成.但是在Oracle中并不支持这种写法,那么我 ...

  8. 在 Eclipse 中使用 JSHint 检查 JavaScript 代码

    JSHint Home: http://www.jshint.com/ JSHint Options: http://www.jshint.com/options/ JSHint For Eclips ...

  9. String练习

    /*1,模拟一个trim方法,去除字符串两端的空格.    思路:    1,判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止.        结尾处判断空格也是如此.    2, ...

  10. JS中undefined和null的区别

    在写JS脚本的时候,经常会碰到“为空”的判断,其中主要有null和undefined的判断.这两个为空判断的主要区别是: 1) null是JS的关键字,是语法特性.undefined是全局对象的属性, ...