QNX手册学习笔记————中断机制

继续学习QNX_Neutrino_RTOS_Archituecture的interrupt部分。
刚开始学习就遇到了ISR的概念和Interrupt handler 概念的区别问题。查阅维基百科,ISR与Interrupt handler是同一个概念,都是由interrupt引发的callback函数。类似于C#中的event,当我们敲击键盘或移动鼠标时,会产生一个事件,而该事件可以被多个中断监听,从而执行各个callback的回调操作。在linux等操作系统中,优先级的执行分为第一优先级ISR和第二优先级ISR。第一优先级,即interrupt service routine;当它执行时,通常会屏蔽中断,直至执行结束,因此会引起jitter(我的理解是,每个实时任务的执行时间可能长也可能短)。为了减小jitter,应该尽量减少ISR的执行时间;如果有更加复杂的任务,应该放到第二优先级ISR中去执行。第一优先级的执行,包括处理器的context切换等。第二优先级ISR通常指的是process或thread,执行较为复杂的任务,时间限制没有规定得那么死。
  Interrupt的内容在QNX的微内核的最后一节。通常情况下,一个教为重要的延迟是interrupt latency,即从interrupt 发生至interrupt handler的执行,如下图中的Til,产生这个延迟时间是由于操作系统内核中存在屏蔽中断的临界代码。但是QNX将这个时间限制得小。
    QNX手册学习笔记————中断机制_第1张图片

 另外一个重要的延迟是schedule latency,如下图中的Tsl。该延迟在有不同优先级线程切换时产生,包括IR和pc等context资源的保存和加载所占用的时间。Tsl仅是偶尔发生。

例如通过串口发送数据时,每次中断都发送一个数据,都不会产生Tsl。仅当发送缓存快为空时,会引发sigEvent事件产生线程或进程的切换,让新的线程对发送缓存进行装载。
   QNX手册学习笔记————中断机制_第2张图片
     同时QNX中断机制还支持多重中断(Nested interrupt)机制, 即中断在未屏蔽的情况下,这在在执行的
event handler可以被更高优先级的硬中断而中断。但是具体的thread中的task的执行,需要各个中断的event handler执行完毕后,统一调度执行。如下图所示。
   QNX手册学习笔记————中断机制_第3张图片
 QNX手册中详细阐述了两个接口InterruptAttach,和InterruptEventAttach两个常用的接口。通过他们来绑定eventhandler。值得注意的是,一个中断可以绑定多个event handler。
文中给了一个InterruptAttach的例子。该例子是一个循环定时器中断引起eventhandler对thread中的计数器轮询增加的例子。该例子可以看出,event handler 是包含在线程中的;event handler 可以运用和更改thread中的资源变量,并作为条件进行判断;当handler中满足某个条件时,可以向内核返回event,从而引起不同有限级线程之间的切换。为了更好地实现实时效果,应该尽量减少event handler中的程序执行的时间,而将复杂的程序放在线程中处理,这与维基百科中的说法是一致的。即减少硬中断执行的时间,增加软中断的执行时间。
InterruptEventAttach 是一个有限选择的方法,因为使用该方法,在event handler中不能执行用户自己写的代码,从而避免了浪费时间,从而降低实时性。该方法直接将event送给相应的线程执行。
另外,还有内存映射放在线程中而不是放在内核中;最长中断时间可以计算;除中断实现线程导切外,还可通过event hook相关的线程和进程的方式。例如当没有其他认为执行时,系统会通过传递event的方式,执行最低优先级的空闲线程(idle task)。将低功耗线程hook到该event,可以实现低功耗。

你可能感兴趣的:(【QNX】)