Rtems--c_user--中断管理

写在前面的话:初学Rtems,英语水平也有限,错误在所难免,请各位大牛不吝赐教,完善c_user的翻译。便于大家受益,在此谢过!

 

6.中断管理

6.1引言

任何一个实时执行体都必须要提供一种可以快速响应外部中断的以满足应用程序对时间严格限制的机制。该管理器为RTEMS提供了这样的机制。该管理器接受快速响应时间...中断管理器包括了以下函数:

 

rtems_interrupt_catch - Establish an ISR

rtems_interrupt_disable - Disable Interrupts

rtems_interrupt_enable - Enable Interrupts

rtems_interrupt_flash - Flash Interrupt

rtems_interrupt_is_in_progress - Is an ISR in Progress

 

6.2 背景

6.2.1 处理一个中断

中断管理器允许应用程序通过调用一个函数去获取中断向量表。当一个中断产生时,处理器将自动形成一个中断号给Rtems。Rtems保护现场和保存所有由目标处理器产生的普通c调用中没有保存的寄存器的值。然后执行用户的中断处理程序。用户的中断处理程序处理中断是合理的,必要的时候清空中断,完成设备具体操作。

 

rtems_interrupt_catch函数将中断处理程序和中断向量表联系上。中断向量号使用rtems_vector_number数据类型管理。

 

中断服务例程是假定遵守这些约定的。函数原型如下:

rtems_isr user_isr(

rtems_vector_number vector

);

 

中断向量号参数由Rtems提供,用于给应用程序识别中断源。这个常常用来允许一个中断服务例程可以为多个同一种设备服务。比如,单个串口中断例程可以响应多个串口的中断,利用中断号可以辨别是哪个串口需要中断服务

 

为了减少对低等级或同等级的中断的屏蔽。ISR应该执行最低优先级的中断服务例程。其他不必要的服务程序由应用程序挂起。一旦用户中断服务例程执行完成,控制权交给Rtems的中断管理器。中断管理器将执行任务调度,给寄存器重新附上在中断服务程序调用的之前的值(恢复现场)。

 

在ISR结束的时候,Rtems中断管理器保证了适合的调度和调度的执行。ISR将产生系统调用激活一个比当前中断优先级更高的中断。因此,当ISR完成后,被推迟的调度处理将被执行...

 

如果有适合的任务调度或调度被执行,应用程序必须遵守下面的规则:

中断管理器必须可以用于所有的中断服务程序。通过调用Rtems的函数,优先级最高的ISR将被响应。

 

考虑一种处理器,其允许低等级的中断去中断高等级的中断。在这种情况下,如果Rtems的函数被用在中断等级4的中断上,这时所有执行的等级为0-4的中断必须使用中断管理器。

 

中断嵌套发生在当有其他ISR执行时,又有一个中断产生。Rtems支持有效的中断嵌套通过允许嵌套的ISR终止不执行调度处理。只有当最外层的ISR终止时,被推迟的调度才会被执行。

 

6.2.2 Rtems的中断等级

许多处理器支持多级中断。具体的中断等级数依赖于具体的处理器。Rtems支持256级中断,映射到处理器的中断等级。关于Rtems和具体处理器间的映射,参考具体目标处理器应用补充文档的中断处理章节。

 

6.2.3 通过Rtems屏蔽中断

在执行函数调用的时候,代码的关键部分应该被执行。当这些部分遭遇了中断,Rtems在执行之前将屏蔽所有中断,在完成那些代码后,重新恢复被屏蔽的中断到之前的等级。Rtems已经被优化了确保中断被屏蔽的时间最短。由Rtems控制的中断屏蔽的最长时间依赖于具体的处理器。具体目标处理器应用补充文档的...章节有详细叙述。

 

非屏蔽型中断不能被屏蔽。在这个等级上执行的ISR,永远都不能向Rtems系统出发系统调用。如果一个函数被调用了,由于Rtems没有能力保护关键的部分而产生不可以预见的结果。然而,如果ISR没有产生系统调用,那么作为非屏蔽调用,它可以安全执行。

 

6.3 操作

6.3.1 建立一个中断

rtems_interrupt_catch函数将为系统建立一个函数。中断地址和相关联的CPU中断向量号在该函数都有规定。这个函数将在中断向量表中安排改Rtems中断以及用户的中断服务程序在中断向量表中的地址。该函数返回在中断向量表中的特定向量以前的内容。

 

6.3.2 ISR中的函数允许

使用中断管理器允许Rtems知道何时一个函数被ISR调用。该ISR这时可以使用系统调用将其自身和应用程序同步。这种同步可能包括消息、事件、需要产ISR的任务传递的信号。ISR产生的函数仅仅能操作局部节点的对象。下面就是Rtems系统调用列表,可产生于一个中断服务程序:

 

Task Management

- rtems task get note

- rtems task set note

- rtems task suspend

- rtems task resume

Interrupt Management

- rtems interrupt enable

- rtems interrupt disable

- rtems interrupt flash

- rtems interrupt is in progress

- rtems interrupt catch

Clock Management

rtems clock set

rtems clock get

rtems clock get tod

rtems clock get tod timeval

rtems clock get seconds since epoch

rtems clock get ticks per second

rtems clock get ticks since boot

rtems clock get uptime

rtems clock set nanoseconds extension

rtems clock tick

Message, Event, and Signal Management

- rtems message queue send

- rtems message queue urgent

- rtems event send

- rtems signal send66 RTEMS C User’s Guide

Semaphore Management

- rtems semaphore release

Dual-Ported Memory Management

- rtems port external to internal

- rtems port internal to external

IO Management

entry point may or may not be.

- rtems io initialize

- rtems io open

- rtems io close

- rtems io read

- rtems io write

- rtems io control

Fatal Error Management

- rtems fatal error occurred

Multiprocessing

- rtems multiprocessing announce

 

6.4 函数

6.4.1 INTERRUPT CATCH --建立一个ISR

调用序列:

rtems_status_code rtems_interrupt_catch(

rtems_isr_entry new_isr_handler,

rtems_vector_number vector,

rtems_isr_entry *old_isr_handler

);

 

函数状态代码:

RTEMS_SUCCESSFUL - ISR成功建立

RTEMS_INVALID_NUMBER - 非法向量号

RTEMS_INVALID_ADDRESS - 非法的ISR入口或无效old_isr_handler

 

描述:

该函数为特定的中断向量号建立中断服务程序。参数new_isr_handler为ISR的入口地址。先前的一个中断服务程序的入口地址返回给old_isr_handler。

为了释放一个中断,当某中断向量是首次获得,传递老的处理函数的地址。

 

注意:

该函数不会使得调用的任务变成抢占式的。

 

6.4.2 INTERRUPT DISABLE --屏蔽中断

调用序列:

void rtems_interrupt_disable(

rtems_interrupt_level level

);

/*该函数通过宏实现*/

 

函数状态代码:

 

描述:

该函数可以屏蔽所有的可屏蔽型中断,返回前一优先级。后面要介绍的rtems_interrupt_enable的作用是恢复中断优先级。

 

注意:

该函数不会使得调用的任务变成抢占式的。该函数通过宏实现,会修改level参数。

 

6.4.3 中断恢复

调用序列:

void rtems_interrupt_enable(

rtems_interrupt_level level

);

 

函数状态代码:

 

描述:

该函数可以恢复所有被屏蔽可屏蔽型中断,恢复先前被函数rtems_interrupt_disable屏蔽的中断。

 

注意:

该函数不会使得调用的任务变成抢占式的。

 

6.4.4 INTERRUPT FLASH--清空中断

调用序列:

void rtems_interrupt_flash(

rtems_interrupt_level level

);

 

函数状态代码:

 

描述:

该函数可激活可屏蔽型中断,恢复先前被函数rtems_interrupt_disable屏蔽的中断。立即调用这个函数,可屏蔽型中断必须由rtems_interrupt_disable函数屏蔽...

 

注意:

该函数不会使得调用的任务变成抢占式的。

 

6.4.5 INTERRUPT IS IN PROGRESS--中断服务程序是否正在被执行

调用序列:

bool rtems_interrupt_is_in_progress( void );

 

函数状态代码:

 

描述:

如果处理器正在执行一个中断服务程序,函数将返回TRUE,否则返回FALSE。返回值为TRUE表明是由中断服务例程调用的,而不是一个任务。此时,中断服务程序中可调用的函数是有限的。

 

注意:

该函数不会使得调用的任务变成抢占式的。

(转载请注明出处)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值