主要内容

将RTOS中的异步事件作为输入传递给引用模型

这个例子展示了如何在实时多任务系统上模拟和生成异步事件的代码。

关于示例模型

打开示例模型rtwdemo_async_mdlreftop

open_system (“rtwdemo_async_mdlreftop”);

该模型模拟中断源,并包含中断源异步中断块和引用模型。的异步中断块创建两个Versa模块欧洲卡(VME)中断服务例程(ISRs),将中断信号传递给引用模型的导入块1和2。

你可以在异步中断块之间的模拟中断源和这些模型元素之一:

  • 函数调用子系统

  • 任务同步

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

  • 对象的引用模型轮廓尺寸连接到前面模型元素之一的块

在这个示例模型中,异步中断Block传递异步事件(函数调用触发信号),Interrupt1而且Interrupt2,到参考模型通过轮廓尺寸1号和2号街区。

代码生成器生成为VxWorks操作系统量身定制的代码。重新配置异步中断块为替代应用程序运行时环境生成代码。

打开引用的模型。引用的模型包括这两个轮廓尺寸接收中断的块,每个连接到一个异步任务说明block,函数调用子系统Count和Algorithm,以及率转换块。的异步任务说明块,结合一个空间级别轮廓尺寸块,允许引用模型接收异步函数调用输入。要使用该块:

  1. 连接异步任务说明块到根级的输出端口轮廓尺寸块,它输出一个函数调用触发器。

  2. 选择输出函数调用参数。轮廓尺寸块来指定它接受函数调用信号。

  3. 的参数对话框中异步任务说明控件关联的异步任务的任务优先级轮廓尺寸块。请指定整数或[]。类型发起的中断的优先级必须匹配异步中断块在父模型。如果指定[],则优先级不必匹配。

异步任务说明块为高优先级中断,interrupt1,连接到函数调用子系统表示一个简单的中断服务程序(ISR)。第二个异步任务说明块连接到子系统算法,其中包含了更多的内容。它包含多个块并产生两个输出值。两个子系统都在中断级上执行。

对象指定的每个中断级别异步中断块在父模型中,块生成一个执行连接子系统的VME ISR,任务同步方块,或图表。

在示例顶层模型中,异步中断block被配置为VME中断1和2,使用中断向量偏移量192和193。中断1被连接到触发子系统.中断2被连接到触发子系统算法

率转换块处理端口之间以不同速率运行的数据传输。在两种情况下,块保护数据传输(防止它们被抢占和损坏)。在另一个实例中,没有发生特殊行为。

数据传输假设

  • 数据传输发生在一个读任务和一个写任务之间。

  • 对字节大小的变量的读或写操作是原子的。

  • 当两个任务交互时,只有一个任务可以抢占另一个任务。

  • 对于周期性任务,速率高的任务优先级高于速率低的任务优先级。速率较快的任务抢占速率较慢的任务。

  • 任务运行在单个处理器上。不允许进行时间切片。

  • 进程不会崩溃和重新启动,特别是在任务之间传输数据时。

模拟模型

模拟模型。默认情况下,模型配置为以不同颜色显示采样时间。输入和输出的离散采样时间分别显示为红色和绿色。常数是洋红色的。异步中断是紫色的。的率转换混合的块(输入和输出采样时间可以不同)显示为黄色。

生成代码和报告

为模型生成代码和代码生成报告。异步中断块和任务同步块生成的代码是为示例RTOS (VxWorks)。但是,您可以修改这些块来为另一个运行时环境生成代码。

1.为构建和检查过程创建临时文件夹。

currentDir = pwd;[~,cgDir] = rtwdemodir();

2.构建模型。

rtwbuild (“rtwdemo_async_mdlreftop”);
###开始构建串行模型参考代码
警告:Simuli金宝appnk Coder:龙卷风。TLC目标将在未来的版本中删除。
成功更新了rtwdemo_async_mdlrefbot的模型参考代码生成目标
警告:Simuli金宝appnk Coder:龙卷风。TLC目标将在未来的版本中删除。
# # #成功完成代码生成:rtwdemo_async_mdlreftop构建代码生成目标构建:总结模型重建行动的理由  ==================================================================================== rtwdemo_async_mdlrefbot生成rtwdemo_async_mdlrefbot.c代码不存在。高级模型目标构建:模型重建行动的理由  =========================================================================================== rtwdemo_async_mdlreftop代码生成的代码生成信息文件不存在。构建2个模型中的2个(0个模型已经更新)构建持续时间:0h 0m 51.204s

检查初始化代码

打开生成的源文件rtwdemo_async_mdlreftop.c.初始化代码连接并启用ISRisr_num1_vec192用于中断1和ISRisr_num2_vec193用于中断2。

cfile = fullfile(cgDir,“rtwdemo_async_mdlreftop_tornado_rtw”“rtwdemo_async_mdlreftop.c”);rtwdemodbtype(用...'static void rtwdemo_async_mdlreftop_initialize(void)'.../*模型终止函数*/...1,0);
static void rtwdemo_async_mdlreftop_initialize(void) {/* Start for S-Function (vxinterrupt1): '/Async Interrupt' */ /* 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);/*结束Start for S-Function (vxinterrupt1): '<根>/Async Interrupt' */ /* SystemInitialize for ModelReference: '<根>/Model'合并:*输入:'<根>/In1_60hz' *输入:'<根>/In3_60hz' *输出:'<根>/Out1' *输出:'<根>/Out2' *输出:'<根>/Out3' */ rtwdemo_async_mdlrefbot_Init(&rtwdemo_async_mdlreftop_Y.Out1);rtwdemo_async_mdlrefbot_Enable ();}

审查ISR代码

在生成的源文件中rtwdemo_async_mdlreftop.c,检讨ISRs的程式码isr_num1_vec192而且isr_num2_vec293.每个ISR:

  • 禁用中断。

  • 保存浮点上下文。

  • 调用为连接到引用模型的子系统生成的代码轮廓尺寸接收中断的块。

  • 恢复浮点上下文。

  • 允许中断。

cfile = fullfile(cgDir,“rtwdemo_async_mdlreftop_tornado_rtw”“rtwdemo_async_mdlreftop.c”);rtwdemodbtype(用...“空白isr_num1_vec192(空白)...“time_T rt_SimUpdateDiscreteEvents”...1,0);
void isr_num1_vec192(void) {int_T锁;FP_CONTEXT上下文;/*禁用中断(系统配置为非抢占)*/ lock = intLock();/* fppSave(&context);/*调用系统:'<根>/Model' */ {/* S-Function (vxinterrupt1): '<根>/Async Interrupt' */ /* ModelReference: '<根>/Model'合并:*输入:'<根>/In1_60hz' *输入:'<根>/ in2_60hz ' *输入:'<根>/In3_60hz' *输出:'<根>/Out1' *输出:'<根>/Out2' *输出:'<根>/Out3' */ rtwdemo_async_mdlrefbot_Interrupt1(&rtwdemo_async_mdlreftop_Y.Out1);/* End of Outputs for S-Function (vxinterrupt1): '/Async Interrupt' */} /* restore float point context */ fppRestore(&context);/*重新启用中断*/ intUnlock(lock);} /* VxWorks Interrupt Block: '/Async Interrupt' */ void isr_num2_vec193(void) {FP_CONTEXT context;/* fppSave(&context);/*调用系统:'<根>/Model' */ {/* S-Function (vxinterrupt1): '<根>/Async Interrupt' */ /* ModelReference: '<根>/Model'合并:*输入:'<根>/In1_60hz' *输入:'<根>/ in2_60hz ' *输入:'<根>/In3_60hz' *输出:'<根>/Out1' *输出:'<根>/Out2' *输出:'<根>/Out3' */ rtwdemo_async_mdlrefbot_Interrupt2(); /* End of Outputs for S-Function (vxinterrupt1): '/Async Interrupt' */ } /* restore floating point context */ fppRestore(&context); }

审查任务终止代码

任务同步块生成以下终止代码。

cfile = fullfile(cgDir,“rtwdemo_async_mdlreftop_tornado_rtw”“rtwdemo_async_mdlreftop.c”);rtwdemodbtype(用...'static void rtwdemo_async_mdlreftop_terminate(void)'...'/*========================================================================*'...1,0);
static void rtwdemo_async_mdlreftop_terminate(void) {/* Terminate for S-Function (vxinterrupt1): '/Async Interrupt' */ /* VxWorks Interrupt Block: '/Async Interrupt' */ /*为ISR系统禁用中断:isr_num1_vec192 */ sysIntDisable(1);/* VxWorks Interrupt Block: '/Async Interrupt' */ /*禁止ISR系统中断:isr_num2_vec193 */ sysIntDisable(2);/* End for S-Function (vxinterrupt1): '/Async Interrupt' */}

相关信息

bdclose (“rtwdemo_async_mdlreftop”);rtwdemoclean;cd (currentDir)

相关的话题