文档

Generate Interrupt Service Routines

为了生成与示例RTO的特定VME中断级别关联的中断服务例程(ISR)(vxworks®), 使用一个sync Interrupt堵塞。这一个sync Interrupt块启用指定的中断级别,并安装调用连接函数调用子系统的ISR。

您也可以使用一个sync Interrupt模拟中的阻塞。它提供了一个可以启用并连接到模拟中断源的输入端口。

笔记

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

连接异步中断块

要生成ISR,请连接一个sync Interrupt块到控制输入

  • 功能调用子系统

  • 一个输入任务同步堵塞

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

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

要求和限制

注意以下要求和限制:

  • 一个sync Interrupt块支持VME万博1manbetx中断1至7。

  • 一个sync InterruptBlock使用以下系统调用示例RTO(VXWORKS):

    • Sysintenable

    • sysintdis

    • intConnect

    • intlock

    • Intunlock

    • tickget

性能考虑

在中断级别执行大型子系统可能会对系统中断和较低优先级中断的中断响应时间产生重大影响。通常,最好将ISR尽可能短。仅连接函数调用子系统,该系统包含少数块一个sync Interrupt堵塞。

大型子系统的更好解决方案是使用任务同步块将函数调用子系统的执行同步到RTOS任务。这任务同步块位于一个sync Interrupt块和功能调用子系统。这一个sync Interrupt块然后安装任务同步ISR块。synchronizati ISR版本on semaphore (performs asemGive)到任务,并立即从中断级别返回。然后,将任务安排并由示例RTO(VXWorks)运行。看产生和同步RTOS任务执行了解更多信息。

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

本节描述了双模型实时系统的开发和实施方法,包括ISRS。在这种方法中,您开发了一个模型,其中包括一个工厂和一个用于仿真的控制器,以及另一个仅包括代码生成控制器的模型。使用Simuli万博1manbetxnk®库,您可以同时实现对这两个模型的更改。下图显示了对工厂或控制器的变化如何(在库中都在图书馆中)传播到模型。

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

一个single-model方法也是可能的。在这种方法中,模型的植物成分仅在模拟中活跃。在代码生成期间,工厂组件有效地从系统中切换出来,并且仅针对模型的中断块和控制器部分生成代码。有关此方法的示例,请参阅rtwdemo_async模型。

双模型方法:仿真

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

模拟中断信号通过一个sync Interrupt堵塞's input port. Upon receiving a simulated interrupt, the block calls the connected subsystem.

During simulation, subsystems connected to一个sync Interrupt在示例RTO(VXWORKS)中,按其优先级执行块输出。如果两个或多个中断信号同时发生一个sync Interrupt块按中断级别指定的顺序执行下游系统(第7级获得最高优先级)。第一个输入元素映射到第一个输出元素。

您也可以使用一个sync Interrupt在模拟中阻止,而无需启用模拟输入。在这种情况下,一个sync Interrupt块继承了模型的基本速率,并按照其在RTO中的优先级来调用连接的子系统。(在这种情况下,一个sync Interrupt块的行为好像所有输入都收到了1同时。)

双模型方法:代码生成

In the generated code for the sample model,

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

  • 一个sync Interrupt块不使用其仿真输入

这地面堵塞s drive control input of the Environment Controller block, so code is not generated for that signal path. The code generator does not produce code for blocks that drive the simulation control input to the Environment Controller block because that path is not selected during code generation. However, the sample times of driving blocks for the simulation input to the Environment Controller block contribute to the sample times supported in the generated code. To avoid including unnecessary sample times in the generated code, use the sample times of the blocks driving the simulation input in the model where generated code is intended.

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

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

考虑到该模型生成的代码,假设一个sync Interrupt块参数的配置如下图所示。

初始化代码

在生成的代码中一个sync Interrupt块将代码安装在子系统块中,作为中断服务例程。中断向量的向量IRQ1andIRQ2存储在位置192and193相对于中断矢量表的基础,如VME中断向量偏移量范围。

安装ISR需要两个RTO(VXWorks)调用,int_connectandsysint_enable。这一个sync Interrupt块将这些调用插入模型_initialize函数,如以下代码摘录所示。

/ * vxworks中断块:'/async中断' *// *连接并启用ISR函数:ISR_NUM1_VEC192 */if(intConnect(inum_to_ivec(192),isr_num1_vec192,0)对于ISR 1. \ n”);} sysintenable(1);/ * vxworks中断块:'/async中断' *// *连接并启用ISR函数:ISR_NUM2_VEC193 */if(intConnect(inum_to_ivec(193),isr_num2_vec193,0)对于ISR2。\ n”);} sysintenable(2);

生成中断的硬件未由一个sync Interrupt堵塞。通常,中断源是VME I/O板,它为特定事件生成中断(例如,A/D转换的结尾)。VME中断级别和向量是在寄存器中或使用板上的跳线设置的。您可以使用mdlstart用户编写的设备驱动程序(s功能)的例程,以设置寄存器并在板上启用中断生成。您必须匹配中断级别,并在一个sync Interrupt块对话框到I/O板上的级别和向量设置。

生成的ISR代码

生成的实际ISRIRQ1在RTO(VXWORKS)中,如下所示。

/ * vxworks中断块:'/async中断' */void isr_num1_vec192(void){int_t lock;fp_context上下文;/*使用tickget()作为便携式tick计数器示例。使用硬件计数器 */ async_code_m-> timing.clocktick2 = tickget();/ *禁用中断(系统配置为非EVE) */ lock = intlock();/ *保存浮点上下文 */ fppsave(&context);/ *调用系统:/子系统a */count(0,0);/ *还原浮点上下文 */ fpprestore(&context);/ *重新启用中断 */ intunlock(锁);}

这re are several features of the ISR that should be noted:

  • 由于设置抢占旗parameter, this ISR is locked; that is, it cannot be preempted by a higher priority interrupt. The ISR is locked and unlocked in the example RTOS (VxWorks) by theint_lockandint_unlock功能。

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

  • 数数功能执行算法(模型)代码。因此,浮点上下文在整个调用中都保存并恢复数数

  • ISR保持其自身的绝对时间计数器,该计数与系统中的其他周期性基本率不同。维护定时数据,用于使用ISR内执行的任何块,这些块需要绝对或经过的时间。

    异步任务的计时器有关详细信息。

模型终止代码

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

/ *模型终止函数 */void async_code_terminate(void){/ * vxworks中断块:'/async中断' *// * ISR系统禁用ISR系统:ISR_NUM1_VEC192 */sysintdisable(1);/ * vxworks中断块:'/async中断' *// *禁用ISR系统中断:isr_num2_vec193 */sysintdisable(2);}

Related Topics

这个话题有帮助吗?