中断相关接口

为了尽量的使用户和系统底层异常、中断隔离开来,RT-Thread把中断和异常封装起来,以更友好的接口的形式提供给用户。(注:这部分的API由BSP提供,在某些处理器支持分支中并不一定存在,例如ARM Cortex-M0/M3分支中,请查询相关移植分支获得详细的实现情况)

装载中断服务例程

可调用如下的接口挂载一个新的中断服务例程:

  1. rt_isr_handler_t rt_hw_interrupt_install(int vector,
  2. rt_isr_handler_t handler,
  3. void *param,
  4. char *name);

调用rt_hw_interrupt_install后,系统将把用户的中断服务例程(new_handler)和指定的中断号关联起来,当这个中断源产生中断时,系统将自动调用装载的中断服务例程。如果old_handler不为空,程序则返回之前关联的这个中断服务例程。

函数参数


  1. 参数 描述

  1. int vector vector是挂载的中断号;
  2.  
  3. rt_isr_handler_t handler 新挂载的中断服务例程;
  4.  
  5. void *param param会作为参数传递给中断服务例程;
  6.  
  7. char *name 中断的名称。

函数返回

函数返回挂载这个中断服务例程之前挂载的中断服务例程。

注意事项

这个API并不会出现在每一个移植分支中,例如通常Cortex-M0/M3/M4的移植分支中就没有这个API。

屏蔽中断源

通常在ISR准备处理某个中断信号之前,我们需要先屏蔽该中断源,以保证在接下来的处理过程中硬件状态或者数据不会受到干扰,我们可调用下面这个函数接口:

  1. void rt_hw_interrupt_mask(int vector);

调用rt_hw_interrupt_mask函数接口后,相应的中断将会被屏蔽(通常当这个中断触发时,中断状态寄存器会有相应的变化,但并不送达到处理器进行处理)。

函数参数


  1. 参数 描述

  1. int vector vector是要屏蔽的中断号。

注意事项

这个API并不会出现在每一个移植分支中,例如通常Cortex-M0/M3/M4的移植分支中就没有这个API。

打开被屏蔽的中断源

在ISR处理完状态或数据以后,需要及时的打开之前被屏蔽的中断源,使得尽可能的不丢失硬件中断信号,我们可调用下面的函数接口:

  1. void rt_hw_interrupt_umask(int vector);

调用rt_hw_interrupt_umask函数接口后,如果中断(及对应外设)被正确时,中断触发后,将送到到处理器进行处理。

函数参数


  1. 参数 描述

  1. int vector vector是要打开屏蔽的中断号。

注意事项

这个API并不会出现在每一个移植分支中,例如通常Cortex-M0/M3/M4的移植分支中就没有这个API。

关闭中断

当需要关闭整个系统的中断时,可调用下面的函数接口:

  1. rt_base_t rt_hw_interrupt_disable(void);

当系统关闭了中断时,就意味着当前任务/代码不会被其他事件所打断(因为整个系统已经不再对外部事件响应),也就是当前任务不会被抢占,除非这个任务主动让出处理器。

函数返回

函数返回中断前的系统中断状态。

打开中断

打开中断往往是和关闭中断成对使用的,用于恢复关闭中断前的状态。调用的函数接口如下:

  1. void rt_hw_interrupt_enable(rt_base_t level);

调用这个函数接口将恢复调用rt_hw_interrupt_disable前的中断状态,level是上一次关闭中断时返回的值。

函数参数


  1. 参数 描述

  1. rt_base_t level level rt_hw_interrupt_disable函数返回的中断状态。

注意事项

调用这个接口并不代表着肯定打开中断,而是恢复关闭中断前的状态,如果调用rt_hw_interrupt_disable()前是关中断状态,那么调用此函数后依然是关中断状态。

与OS相关的中断接口

当整个系统被中断打断,进入中断处理函数时,OS需要知道当前已经进入到中断状态。针对这种情况,OS提供了两个函数:

  1. void rt_interrupt_enter(void);
  2. void rt_interrupt_leave(void);

rt_interrupt_enter函数用于通知OS,当前已经进入了中断状态;rt_interrupt_leave函数用于通知OS,已经离开中断状态。通常来说,OS需要知道这样的运行状态,这样在中断服务例程中,如果调用了OS相关的调用,OS好及时调整相应的行为,例如进行任务切换时应该采取中断中任务切换的策略,而不是立即进行切换。但是如果中断服务例程很显然、很必然地,它不会去调用OS相关的函数,这个时候,也可以不调用rt_interrupt_enter/leave函数。

  1. rt_uint8_t rt_interrupt_get_nest(void);

这个函数提供给上层应用,当前嵌套的中断深度。即,如果当前是中断上下文环境中,这个函数的返回值会大于0。

函数返回

函数返回当前系统中中断嵌套的深度,如果当前系统处于中断上下文环境中,返回值大于0。如果返回值大于1,说明当前出现了中断嵌套。