RTEMS第十章 中断管理器
10.1: 介绍
%A
%A 任何实时操作系统必须提供一种快速响应外部中断的机制以满足实时性需求。中断管理允许中断处理程序抢占当前任务对处理器的占有权。下面是中断处理程序提供的的系统函数。
%A
%A rtems_interrupt_catch- 建立 ISR
%A
%A rtems_interrupt_disable- 屏蔽中断
%A
%A rtems_interrupt_enable- 激活中断
%A
%A rtems_interrupt_flash- 清空中断
%A
%A rtems_interrupt_is_in_progress- 判断处理器是否正在进行ISR
%A 10.2.1: 中断处理
%A
%A 中断管理器管理了中断向量表,该表允许中断和对应的中断处理函数间形成一对一的映射。当中断产生,处理器会执行RTEMS的中断处理程序。RTEMS将保存处理器的寄存器然后转向中断处理程序(ISR)。ISR负责处理中断,并操作外部设备。
%A
%A rtems_interrupt_catch 函数将中断处理函数将中断向量和对应的中断处理函数联系起来。中断向量使用rtems_vector_number数据类型表示。
%A
%A 下面是中断处理函数的原型:
%A
%A rtems_isr user_isr(
%A
%A rtems_vector_number vector
%A
%A );
%A
%A 可以处理同一个设备的不同中断。举例来说,一个单一USB例程可以处理来自多个USB终端发出的中断请求。
%A
%A 为了尽量减少对低优先级中断的屏蔽,ISR 应该做得精简高效。与ISR关系不大的处理应该尽可能的放在应用层完成。当ISR结束,处理器的控制权将交换给RTMES中断管理器,由中断管理器负责恢复被中断任务的恢复工作。
%A
%A 为了将较低的或相等的优先级水平中断的屏蔽减到最少, ISR 应该运行必需维修中断的最小行动。 其他的非必要的行动应该被应用任务处理。 一经 ISR 已经完成的用户,在 ISR 被叫唤之前 , 它归还控制给 RTEMS 中断将会运行任务配送而且回复被解救的寄存器的管理器。
%A
%A RTEMS 中断管理器也保证了处理中断的时候,任务的调度不会受到影响。在处理中断的过程中,可能触发了某些条件导致有高优先级的任务变为就绪态。因此,当 ISR 完成的时候,被就需要对该任务进行调度。
%A
%A 为了任务能在中断后正确的调度,并能保证中断处理的高效,中断处理必须遵循下面的准则:
%A
%A 所有的ISR必须由中断管理器统一管理。
%A
%A 中断优先级高的任务可以将中断优先级低的任务中断,这称为中断嵌套,RTMES支持中断嵌套,为了提高中断嵌套的性能,在处理中断嵌套时,嵌套的中断中不会发生任务调度管理,只有当最外层中断处理结束,这些延时的中断处理才回开始执行。
%A 10.2.2: RTEMS 中断等级
%A
%A 许多处理器支援不同等级的中断(或称为中断优先级)。处理器支持的中断是千差万别的,在RTEMS中,逻辑上支持256个中断等级,这些中断等级被映射到处理器的实际的中断等级上。对于中断如何映射到实际的处理器中断等级上,需要参考芯片文档。
%A 10.2.3: 屏蔽RTEMS中断
%A
%A 在执行系统调用的时候,有些关键代码是不应该被中断的。当进入这些代码段的时候,需要尽可能的屏蔽外部中断,当关键代码执行完后,RTMES恢复外部中断。 RTEMS已经优化了中断屏蔽和恢复代码,所以在屏蔽和恢复终端上不会消耗什么时间。RTEMS能够屏蔽中断的时间和目标处理器有一定的关系,需要阅读对应的处理器手册。
%A
%A 不可屏蔽中断 (NMI) 不能被屏蔽掉,同时,在不可屏蔽中断等级上的ISR不应该使用RTEMS系统调用。否则,将会有不可预料的后果。这主要是因为RTMES的系统调用中没有屏蔽外部中断。
%A 10.3: 中断管理器函数接口
%A
%A 建立ISR
%A
%A ISR中允许进行的RTEMS系统调用
%A 10.3.1: 建立ISR
%A
%A rtems_interrupt_catch函数为系统建立ISR 。 ISR 的地址和它的关联的处理器中断向量在函数参数中被指定。该函数将RTEMS的中断处理和中断向量表中对应的表项相关连。同时函数可以返回以前中断向量表的值。
%A 10.3.2: 允许从ISR中调用的系统函数
%A
%A 中断管理器在ISR需要使用RTEMS系统调用的时候必须通知RTEMS。ISR可能使用系统调用与应用任务间实现同步。ISR可能使用消息、事件、信号等同步机制。ISR调用的系统函数必须是本地节点上的函数。下面是ISR可以调用的指令集:
%A
%A 任务管理
%A
%A task_get_note , task_set_note , task_suspend, task_resume
%A
%A 时钟管理
%A
%A clock_get, clock_tick
%A
%A 消息,事件和信号管理
%A
%A message_queue_send, message_queue_urgent
%A
%A event_send
%A
%A signal_send
%A
%A 信号量管理
%A
%A semaphore_release
%A
%A 双端内存管理
%A
%A port_external_to_internal, port_internal_to_external
%A
%A IO 管理
%A
%A io_initialize , io_open , io_close , io_read , io_write, io_control
%A
%A 错误管理
%A
%A fatal_error_occurred
%A
%A 多处理器
%A
%A multiprocessing_announc
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。