主要内容

生成中断服务例程

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

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

请注意

中演示的操作系统集成技术使用一个或多个块vxlib1图书馆。这些块提供了起点示例,以帮助您为目标环境开发自定义块。

连接异步中断块

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

  • 函数调用子系统

  • a的输入任务同步

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

下一个图显示了一个异步中断配置为服务两个中断源的块。输出(信号宽度2)连接到两个函数调用子系统。

要求和限制

注意以下要求和限制:

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

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

    • sysIntEnable

    • sysIntDisable

    • intConnect

    • intLock

    • intUnlock

    • tickGet

性能考虑

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

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

在模拟和代码生成中使用异步中断块

本节介绍问题的对偶模型开发和实施包括isr在内的实时系统的方法。在这种方法中,您将开发一个模型,其中包含用于模拟的设备和控制器,而另一个模型只包含用于代码生成的控制器。使用Simuli金宝appnk®库,您可以同时实现对两个模型的更改。下一个图显示了对库中的工厂或控制器所做的更改如何传播到模型。

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

一个单模方法也是可能的。在这种方法中,模型的Plant组件仅在模拟中是活动的。在代码生成期间,Plant组件被有效地切换出系统,并且仅为模型的中断块和控制器部分生成代码。有关此方法的示例,请参见rtwdemo_async模型。

双模型方法:仿真

下面的方框图展示了一个简单的模型,它说明了建模的双模型方法。在模拟过程中,脉冲发生器模块提供模拟中断信号。

模拟中断信号通过异步中断块的输入端口。在接收到模拟中断时,块调用连接的子系统。

仿真时,子系统连接到异步中断块输出在示例RTOS (VxWorks)中按优先级顺序执行。在两个或多个中断信号同时发生的情况下异步中断Block按照中断级别指定的顺序执行下游系统(级别7优先级最高)。第一个输入元素映射到第一个输出元素。

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

双模型方法:代码生成

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

  • 地面块为环境控制器块提供输入信号

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

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

独立函数作为isr安装,中断向量表如下:

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

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

初始化代码

在生成的代码中异步中断block将代码作为中断服务例程安装在子系统块中。的中断向量IRQ1IRQ2储存在192193方法所指定的,相对于中断向量表的基VME中断矢量偏移量(s)参数。

安装ISR需要两次RTOS (VxWorks)调用,int_connectsysInt_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板,它为特定事件生成中断(例如,a /D转换的结束)。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)中,ISR被命令锁定和解锁int_lockint_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);}

相关的话题