主要内容

生成中断服务例程

为示例RTOS(例如VxWorks)生成与特定VME中断级别关联的中断服务例程(ISR)®),使用异步中断块。的异步中断block启用指定的中断级别,并安装一个调用已连接的函数调用子系统的ISR。

你也可以使用异步中断块在模拟。它提供了一个输入端口,您可以启用并连接到模拟中断源。

请注意

本节中演示的操作系统集成技术使用中断模板块库中的块。该库中的块提供了起点示例,以帮助您为目标环境开发自定义块。

连接异步中断块

方法的输出连接,以生成ISR异步中断块的控制输入:

  • 函数调用子系统

  • a的输入任务同步

  • 状态流的输入®为函数调用输入事件配置的图表

示例模型rtwdemo_async显示了一个异步中断配置为服务两个中断源的块。两个输出信号中的每一个都连接到一个函数调用子系统。

示例模型rtwdemo_async,它显示了一个配置为服务两个输入中断源的异步中断块

要求和限制

  • 异步中断block支金宝app持VME中断1到7。

  • 异步中断block使用这些系统调用示例RTOS (VxWorks):

    • sysIntEnable

    • sysIntDisable

    • intConnect

    • intLock

    • intUnlock

    • tickGet

性能考虑

在中断级别上执行大型子系统会对系统中同等优先级和较低优先级中断的中断响应时间产生重大影响。最好使isr尽可能短。只将包含少量块的函数调用子系统连接到异步中断块。

对于大型子系统,更好的解决方案是使用任务同步块将函数调用子系统的执行同步到RTOS任务。把任务同步块之间的异步中断块和函数调用子系统。的异步中断块安装任务同步block作为ISR。ISR释放一个同步信号量(执行一个semGive)到任务,并立即从中断级别返回。然后由RTOS (VxWorks)调度和运行任务。看到生成和同步执行RTOS任务获取更多信息。

开发包含isr的实时系统的双模型方法

在开发包含isr的实时系统时,可以考虑使用问题的对偶模型的方法。开发一个模型,其中包含一个设备和一个用于模拟的控制器,另一个模型只包含用于代码生成的控制器。通过使用Simulin金宝appk®库,您可以同时实现对两个模型的更改。该图显示了对库中的工厂或控制器所做的更改如何传播到模型。

异步中断块用于仿真和代码生成的双模型使用

一个单模方法也是可能的。模型的Plant组件仅在模拟期间是活动的。对于代码生成,您从系统中切换出Plant组件,并且仅为模型的中断块和控制器部分生成代码。

双模型方法:仿真

示例模型rtwdemo_async展示了建模的双模型方法。在模拟过程中,脉冲发生器模块提供模拟中断信号。

示例模型rtwdemo_async,它显示了一个配置为服务两个输入中断源的异步中断块

在模拟:

  • 当输入端口的值非零时,Simulink通过在中断发生的地方无条件地调用目标函数来模拟每个中金宝app断的行为。

  • 子系统连接到异步中断block输出端口在RTOS(本例中为VxWorks)中按优先级顺序执行。如果两个或多个中断信号同时发生,则会触发异步中断Block按照中断级别指定的顺序执行下游系统(级别7优先级最高)。第一个输入元素映射到第一个输出元素。

您可以使用异步中断块,而不启用模拟输入。的异步中断块继承模型的基本速率,并按RTOS中的优先级顺序调用连接的子系统。(在这种情况下,异步中断Block的行为就好像输入接收了一个1同时)。

双模型方法:代码生成

在为示例模型生成的代码中:

  • 地面块为Variant Source块提供输入信号

  • 异步中断块不使用它的模拟输入

Ground块驱动Variant Source块的控制输入,因此代码生成器不会为该信号路径生成代码。代码生成器不会为驱动模拟控制输入到Variant Source块的块生成代码,因为在代码生成期间没有选择该路径。然而,模拟输入到Variant Source块的驱动块的采样时间构成了生成代码中支持的采样时间。金宝app为了避免在生成的代码中包含不必要的采样时间,在生成代码的地方使用驱动模型中模拟输入的块的采样时间。

示例模型rtwdemo_async,它显示了一个配置为服务两个输入中断源的异步中断块

代码生成器为isr生成独立函数,中断向量表如下所示:

抵消
192 &isr_num1_vec192 ()
193 &isr_num2_vec193 ()

考虑从该模型生成的代码,假设异步中断块参数配置如下图所示。

初始化代码

在代码生成期间,异步中断block在为子系统块生成的代码中安装中断代码,作为中断服务例程。的中断向量IRQ1而且IRQ2储存在192而且193方法指定的,相对于中断向量表的基VME中断矢量偏移量(s)参数。

安装ISR需要两次RTOS (VxWorks)调用,int_connect而且sysInt_Enable.的异步中断块中插入这些调用模型_initialize函数,如此代码片段所示。

/* VxWorks Interrupt Block: '/Async Interrupt' */ /*连接并启用ISR功能:isr_num1_vec192 */ if(intConnect(INUM_TO_IVEC(192), isr_num1_vec192, 0) != OK) {printf("intConnect failed for ISR 1.\n");} sysIntEnable (1);/* VxWorks Interrupt Block: '/Async Interrupt' */ /*连接并启用ISR功能:isr_num2_vec193 */ if(intConnect(INUM_TO_IVEC(193), isr_num2_vec193, 0) != OK) {printf("intConnect failed for ISR 2.\n");} sysIntEnable (2);

异步中断块不配置产生中断的硬件。通常,中断源是一个VME I/O板,它为特定事件生成中断(例如,在模拟到数字转换的末尾)。您可以在寄存器中设置VME中断级别和矢量,或者在电路板上使用跳线。您可以使用mdlStart用户编写的设备驱动程序(S-function)的例程,用于设置寄存器并在电路板上启用中断生成。方法中指定的中断级别和向量必须匹配异步中断块参数对话框将电平和矢量设置在I/O板上。

生成的ISR代码

生成的实际ISRIRQ1在RTOS (VxWorks)中列出如下。

/* VxWorks Interrupt Block: '/Async Interrupt' */ void isr_num1_vec192(void) {int_T lock;FP_CONTEXT上下文;/*使用tickGet()作为便携式tick计数器的例子。使用硬件计数器*/ Async_Code_M->Timing可以获得更高的分辨率。clockTick2 = tickGet();/*禁用中断(系统配置为非ive) */ lock = intLock();/* fppSave(&context);/*调用系统:/子系统A */ Count(0,0);/*恢复浮点上下文*/ fppRestore(&context);/*重新启用中断*/ intUnlock(lock);}

请注意ISR的这些特性:

  • 因为的设置抢占国旗(s)参数,ISR被锁定;也就是说,它不能被更高优先级的中断抢占。在示例RTOS (VxWorks)中,通过调用函数来锁定和解锁ISRint_lock而且int_unlock

  • 连接的子系统,,从ISR内部调用。

  • 函数执行算法(模型)代码。因此,在对的调用中保存和恢复浮点上下文

  • ISR维护自己的绝对时间计数器,这与系统中的其他周期基准速率或子速率计数器不同。计时数据由为ISR内执行的块生成的代码维护,这些块需要绝对时间或经过时间。

    看到异步任务中的定时器获取详细信息。

型号终止代码

模型终止函数禁止RTOS (VxWorks)中的中断:

/*模型终止函数*/ void Async_Code_terminate(void) {/* VxWorks Interrupt Block: '/Async Interrupt' */ /*禁止ISR系统中断:isr_num1_vec192 */ sysIntDisable(1);/* VxWorks Interrupt Block: '/Async Interrupt' */ /*禁止ISR系统中断:isr_num2_vec193 */ sysIntDisable(2);}

相关的话题