RT_Thread应用20—中断管理

第二十五章 中断管理

RT_Thread应用20—中断管理_第1张图片

一、异常与中断理解

1、异常

异常:导致处理器脱离正常运行转向执行特殊代码的任何事件,指任何打断处理器正常执行,并且迫使处理器进入一个由有特权的特殊指令执行的事件。
危害:如果不及时进行处理,轻则系统出错,重则会导致系统毁灭性瘫痪。
避免:提高软件鲁棒性(稳定性)
RT_Thread应用20—中断管理_第2张图片

2、中断

a. 中断含义

RT_Thread应用20—中断管理_第3张图片
RT_Thread应用20—中断管理_第4张图片
注意:
线程中有不少临界段的部分,不允许中断打扰,这样会造成一定影响。
比如,某个时候有一个线程在运行中,并且该线程部分程序将中断屏蔽掉,也就是进入临界段中,这个时候如果有一个紧急的中断事件被触发,这个中断就会被挂起,不能得到及时响应,必须等到中断开启才可以得到响应, 如果屏蔽中断时间超过了紧急中断能够容忍的限度,将造成很大影响。

因此,操作系统的中断在某些时候会有适当的中
断延迟,因此调用中断屏蔽函数进入临界段的时候,也需快进快出。

b. 中断介绍

RT_Thread应用20—中断管理_第5张图片
RT_Thread应用20—中断管理_第6张图片

c. 名词解释

RT_Thread应用20—中断管理_第7张图片

d. 中断管理的运作机制

RT_Thread应用20—中断管理_第8张图片
中断使得 CPU 可以在事件发生时才给予处理,而不必让 CPU 连续不断地查询是否有相应的事件发生。
通过两条特殊指令:关中断和开中断可以让处理器不响应或响应中断,在关闭中断期间,通常处理器会把新产生的中断挂起,当中断打开时立刻进行响应,所以会有适当的延时响应中断,故用户在进入临界区的时候应快进快出。
RT_Thread应用20—中断管理_第9张图片

  • 中断发生环境—— 中断发生在线程上下文
  • 线程在工作的时候,如果此时发生了一个中断,无论中断的优先级是多大,都会打断当前线程的执行,从而转到对应的中断服务函数中执行
  • RT_Thread应用20—中断管理_第10张图片
    (1)、(3):在线程运行的时候发生了中断,那么中断会打断线程的运行,那么操作系统将先保存当前线程的上下文环境,转而去处理中断服务函数。
    (2)、(4):当且仅当中断服务函数处理完的时候才恢复线程的上下文环境,继续运行线程。
  • 中断发生环境—— 中断服务函数处理上下文
  • 在执行中断服务例程的过程中,如果有更高优先级别的中断源触发中断,由于当前处于中断处理上下文环境中,根据不同的处理器构架可能有不同的处理方式,
  • 比如新的中断等待挂起直到当前中断处理离开后再行响应;或新的高优先级中断打断当前中断处理过程,而去直接响应这个更高优先级的新中断源,后面这个称为中断嵌套。
  • 在硬实时环境中,前一种情况是不允许发生的,不能使响应中断的时间尽量的短。而在软件处理(软实时环境)上,RT-Thread 允许中断嵌套,即在一个中断服务例程期间,处理器可以响应另外一个优先级更高的中断,
    -RT_Thread应用20—中断管理_第11张图片
    (1) :当中断 1 的服务函数在处理的时候发生了中断 2,由于中断 2 的优先级比中断 1 更高,所以发生了中断嵌套,那么操作系统将先保存当前中断服务函数的上下文环境,并且转向处理中断 2,当且仅当中断 2 执行完的时候(2) ,才能继续执行中断 1。

e. 中断延迟

——对于中断的处理仍然存在着中断延迟响应的问题
RT_Thread应用20—中断管理_第12张图片

  • 识别中断时间
    RT_Thread应用20—中断管理_第13张图片
  • 等待中断打开时间
    RT_Thread应用20—中断管理_第14张图片
    允许中断嵌套的实时操作系统中::中断也是基于优先级的,允许高优先级中断抢断正在处理的低优先级中断,所以,如果当前正在处理更高优先级的中断,即使此时有低优先级的中断,也系统不会立刻响应,而是等到高优先级的中断处理完之后,才会响应。
    不支持中断嵌套::即中断是没有优先级的,中断是不允许被中断的
  • 关闭中断时间
    RT_Thread应用20—中断管理_第15张图片

e. 中断管理的应用场景

含义
在计算机执行程序的过程中,由于出现某个特殊情况(或称为“特殊事件”),使得系统暂时中止现行程序,而转去执行处理这一特殊事件的程序,处理完毕之后再回到原来程序的中断点继续向下执行。
例子
假如你正在给朋友写信,电话铃响了,这时你放下手中的笔去接电话,通话完毕再继续写信。这个例子就表现了中断及其处理的过程:电话铃声使你暂时中止当前的工作,而去处理更为急需处理的事情——接电话,当把急需处理的事情处理完毕之后,再回过头来继续原来的事情。

  • 电话铃声就可以称为“中断请求”,
  • 而你暂停写信去接电话就叫作“中断响应”,
  • 那么接电话的过程就是“中断处理”
  • 如果
    就为了接电话,而傻等待,什么都不做就会浪费时间,可以去做其他事情,可设置电话铃声,等铃声响再来接电话。
    ————CPU 也是一样,如果时间都浪费在查询的事情上,那这个 CPU 啥也干不了,要他何用。在嵌入式系统中合理利用中断,能更好利用 CPU 的资源。

f. 中断管理讲解

前提
ARM Cortex-M 内核的中断是不受 RT-Thread 管理的,所以 RT-Thread 中的中断使用其实跟裸机差不多的,需要我们自己配置中断,并且使能中断,编写中断服务函数,
应用
在中断服务函数中使用内核 IPC 通信机制,一般建议使用信号量、消息或事件标志组等标志事件的发生,将事件发布给处理线程,等退出中断后再由相关处理线程具体处理中断。
由于中断不受 RT-Thread 管理,所以不需要使用 RT-Thread 提供的函数(中断屏蔽与使能除外)。
ARM Cortex-M NVIC 支持中断嵌套功能

  • 当一个中断触发并且系统进行响应时,处理器硬件会将当前运行的部分上下文寄存器自动压入中断栈中,(这部分的寄存器包括 PSR,
    R0,R1,R2,R3 以及 R12 寄存器。)
  • 当系统正在服务一个中断时,如果有一个更高优先级的中断触发,那么处理器同样的会打断当前运行的中断服务例程,然后把老的中断服务例程上下文的 (PSR,R0,R1,R2,R3 和 R12 寄存器自动保存到中断栈中)。
    这些部分上下文寄存器保存到中断栈的行为完全是硬件行为,这一点是与其他 ARM 处理器最大的区别(以往都需要依赖于软件保存上下文)。
  • 在 ARM Cortex-M 系列处理器上,所有中断都采用中断向量表的方式进行处理,即当一个中断触发时,处理器将直接判定是哪个中断源,然后直接跳转到相应的固定位置进行处理。
  • 而在 ARM7、ARM9 中,一般是先跳转进入 IRQ 入口,然后再由软件进行判断是哪个中断源触发,获得了相对应的中断服务例程入口地址后,再进行后续的中断处理。
    -————好处:有统一的入口地址,便于 OS 的统一管理

你可能感兴趣的:(RT_Thread应用20—中断管理)