文档

生成和同步执行RTOS任务

这个示例演示了如何在实时多任务系统上模拟和生成异步事件的代码。该模型包含一个异步中断块,一个任务同步块,异步执行的子系统算法,和速率转换块。异步中断块创建两个Versa Module Eurocard (VME)中断服务例程(ISRs),将中断信号传递给子系统和任务同步块。|计数|在中断水平执行。算法作为异步任务执行。代码生成器为子系统生成的代码是为VxWorks®操作系统量身定制的。

关于范例模型

打开示例模型rtwdemo_async

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

  • 函数调用子系统

  • 任务同步块

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

  • 一个引用的模型,它有一个连接到前面模型元素之一的import块

异步中断和任务同步块使子系统能够异步执行。重新配置异步中断和任务同步块,以为替代运行时环境生成代码。

表示在中断级别执行的简单中断服务例程(ISR)。最好让isr尽可能简单。这个子系统只包括一个离散时间积分器块。

算法包括更多的物质。它包含多个块并产生两个输出值。在中断级别上执行较大的子系统会显著影响系统中同等优先级和较低优先级中断的响应时间。对于较大的子系统,一个更好的解决方案是使用Task Sync块来表示函数调用子系统的ISR。

异步中断块生成对isr的调用。将该块放置在一个模拟中断源和下列一个中断源之间:

  • 函数调用子系统

  • 任务同步块

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

对于每个指定的中断级别,块生成一个执行连接子系统、任务同步块或图表的Versa模块Eurocard (VME) ISR。

在示例模型中,为VME中断1和2配置了异步中断块,使用中断向量偏移量192和193。中断1直接连接到子系统.中断2连接到一个任务同步块,它作为ISR算法.将任务同步块放置在以下位置之一:

  • 在异步中断块和函数调用子系统或statflow®图表之间。

  • 在具有事件的statflow®图表的输出端口,输出仿真软件金宝app,可以配置为函数调用。

在示例模型中,任务同步块位于异步中断块和函数调用子系统之间算法.任务同步块配置了任务名称任务(),优先级为50,堆栈大小为8192,与调用方任务同步的任务数据传输。生成的任务使用一个信号量来同步任务的执行。Async Interrupt块触发任务信号量的释放。

四个速率转换块处理在不同速率的端口之间的数据传输。在两个实例中,Protected Rate Transition块保护数据传输(防止它们被抢占和损坏)。在其他两个实例中,未保护速率转换块没有引入特殊行为。它们的存在通知Simulink®速率转变。金宝app

为异步中断和任务同步块生成的代码是为示例RTOS (VxWorks®)量身定制的。但是,您可以修改代码块以生成特定于您的运行时环境的代码。

数据传输的假设

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

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

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

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

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

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

模拟模型

模拟模型。默认情况下,模型被配置为以不同颜色显示样本时间。输入和输出的离散采样时间分别出现红色和绿色。reddish-blue常量。异步中断和任务是紫色的。速率转换块是一种混合速率(它们的输入和输出样本时间可以不同),是黄色的。

生成代码和报告

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

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

2.构建的模型。

### Starting build procedure for model: rtwdemo_async金宝appTLC靶标将在未来的版本中被删除。###成功完成模型的代码生成

检查初始化代码

打开生成的源文件rtwdemo_async.c.初始化代码:

1.创建并初始化同步信号量Task0_semaphore

* (SEM_ID *) rtwdemo_async_DW.SFunction_PWORK。SemID = semBCreate(SEM_Q_PRIORITY, SEM_EMPTY);如果(rtwdemo_async_DW.SFunction_PWORK。semBCreate == NULL) {printf("semBCreate call failed for block Task0.\n");}

2.生成任务task0并分配任务优先级50。

rtwdemo_async_DW.SFunction_IWORK。TaskID = taskSpawn(“Task0”,50.0,VX_FP_TASK, 8192.0, (FUNCPTR) Task0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);如果(rtwdemo_async_DW.SFunction_IWORK。taskkid == ERROR) {printf("taskSpawn调用失败的块Task0.\n");} /* Start for S-Function (vxtask1): '/S-Function' */ /* VxWorks Interrupt Block: '/Async Interrupt' */ /* Connect and enable ISR function: 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' */ /* Connect and enable ISR function: isr_num2_vec193 */ if (intConnect(INUM_TO_IVEC(193), isr_num2_vec193, 0) != OK) {printf("intConnect failed for ISR 2.\n");} sysIntEnable (2);

3.连接并启用ISRisr_num1_vec192对于中断1和ISRisr_num2_vec193对于中断2。

{int32_T I;/ *用于InitializeConditions RateTransition: '<根> /受保护的RT1' * /对(I = 0;我<60; i ++在){rtwdemo_async_DW.ProtectedRT1_Buffer [I] = 0.0;} / * InitializeConditions为RateTransition结束: '<根> /受保护的RT1' * / / * InitializeConditions为RateTransition: '<根> /受保护的RT2'/为*(I = 0;我<60; i ++在){rtwdemo_async_DW。ProtectedRT2_Buffer [I] = 0.0;} / * InitializeConditions为RateTransition结束: '<根> /受保护的RT2' * / / * SystemInitialize为S-功能(vxinterrupt1): '<根> /异步中断' 包含:*子系统: '<根> /计数'* / / *系统初始化函数调用系统: '<根> /计数' * / / * InitializeConditions为DiscreteIntegrator: ' /集成' * / rtwdemo_async_DW.Integrator_DSTATE_l = 0.0;rtwdemo_async_DW.Integrator_PREV_U_o = 0.0;/ *用于SystemInitialize OUTPORT: '<根> /输出1' 包含:* OUTPORT: '输入/输出' * / rtwdemo_async_Y.Out1 = 0.0;/ * SystemInitialize为S-功能(vxinterrupt1): '<根> /异步中断' 包含:*子系统: ' /子系统' * / / *系统初始化函数调用系统: ' /子系统'* / / * SystemInitialize为S-功能(vxtask1): ' / S-函数' 包含:*子系统: '<根> /算法' * / / *系统初始化函数调用系统:“<根>/算法” * / rtwdemo_async_M-> Timing.clockTick2 = rtwdemo_async_M-> Timing.clockTick4;/ *用于DiscreteIntegrator InitializeConditions: ' /集成' * / rtwdemo_async_DW.Integrator_DSTATE = 0.0; /* InitializeConditions for Sum: '/Sum1' incorporates: * DiscreteIntegrator: '/Integrator' */ rtwdemo_async_DW.Integrator_PREV_U = 0.0; /* SystemInitialize for Outport: '/Out1' */ memset(&rtwdemo_async_B.Sum[0], 0, 60U * sizeof(real_T)); /* SystemInitialize for Outport: '/Out3' incorporates: * Outport: '/Out2' */ rtwdemo_async_Y.Out3 = 0.0; /* End of SystemInitialize for S-Function (vxtask1): '/S-Function' */ /* End of SystemInitialize for S-Function (vxinterrupt1): '/Async Interrupt' */ } /* Enable for S-Function (vxinterrupt1): '/Async Interrupt' incorporates: * SubSystem: '/Count' */ /* Enable for function-call system: '/Count' */ rtwdemo_async_DW.Count_RESET_ELAPS_T = true; /* Enable for DiscreteIntegrator: '/Integrator' */ rtwdemo_async_DW.Integrator_SYSTEM_ENABLE_h = 1U; /* Enable for S-Function (vxinterrupt1): '/Async Interrupt' incorporates: * SubSystem: '/Subsystem' */ /* Enable for function-call system: '/Subsystem' */ /* Enable for S-Function (vxtask1): '/S-Function' incorporates: * SubSystem: '/Algorithm' */ /* Enable for function-call system: '/Algorithm' */ rtwdemo_async_M->Timing.clockTick2 = rtwdemo_async_M->Timing.clockTick4; rtwdemo_async_DW.Algorithm_RESET_ELAPS_T = true; /* Enable for DiscreteIntegrator: '/Integrator' */ rtwdemo_async_DW.Integrator_SYSTEM_ENABLE = 1U; /* End of Enable for S-Function (vxtask1): '/S-Function' */ /* End of Enable for S-Function (vxinterrupt1): '/Async Interrupt' */ } /* Model terminate function */ static void rtwdemo_async_terminate(void) { /* Terminate for S-Function (vxinterrupt1): '/Async Interrupt' */ /* VxWorks Interrupt Block: '/Async Interrupt' */ /* Disable interrupt for ISR system: isr_num1_vec192 */ sysIntDisable(1); /* VxWorks Interrupt Block: '/Async Interrupt' */ /* Disable interrupt for ISR system: isr_num2_vec193 */ sysIntDisable(2); /* End of Terminate for S-Function (vxinterrupt1): '/Async Interrupt' */ /* Terminate for S-Function (vxinterrupt1): '/Async Interrupt' incorporates: * SubSystem: '/Subsystem' */ /* Termination for function-call system: '/Subsystem' */ /* Terminate for S-Function (vxtask1): '/S-Function' */ /* VxWorks Task Block: '/S-Function' (vxtask1) */ /* Destroy task: Task0 */ taskDelete(rtwdemo_async_DW.SFunction_IWORK.TaskID); /* End of Terminate for S-Function (vxtask1): '/S-Function' */ /* End of Terminate for S-Function (vxinterrupt1): '/Async Interrupt' */ } /*========================================================================* * Start of Classic call interface * *========================================================================*/ void MdlOutputs(int_T tid) { rtwdemo_async_output(tid); } void MdlUpdate(int_T tid) { rtwdemo_async_update(tid); } void MdlInitializeSizes(void) { } void MdlInitializeSampleTimes(void) { } void MdlInitialize(void) { } void MdlStart(void) { rtwdemo_async_initialize(); } void MdlTerminate(void) { rtwdemo_async_terminate(); } /* Registration function */ RT_MODEL_rtwdemo_async_T *rtwdemo_async(void) { /* Registration code */ /* initialize non-finites */ rt_InitInfAndNaN(sizeof(real_T)); /* initialize real-time model */ (void) memset((void *)rtwdemo_async_M, 0, sizeof(RT_MODEL_rtwdemo_async_T)); /* Initialize timing info */ { int_T *mdlTsMap = rtwdemo_async_M->Timing.sampleTimeTaskIDArray; mdlTsMap[0] = 0; mdlTsMap[1] = 1; rtwdemo_async_M->Timing.sampleTimeTaskIDPtr = (&mdlTsMap[0]); rtwdemo_async_M->Timing.sampleTimes = (&rtwdemo_async_M->Timing.sampleTimesArray[0]); rtwdemo_async_M->Timing.offsetTimes = (&rtwdemo_async_M->Timing.offsetTimesArray[0]); /* task periods */ rtwdemo_async_M->Timing.sampleTimes[0] = (0.016666666666666666); rtwdemo_async_M->Timing.sampleTimes[1] = (0.05); /* task offsets */ rtwdemo_async_M->Timing.offsetTimes[0] = (0.0); rtwdemo_async_M->Timing.offsetTimes[1] = (0.0); } rtmSetTPtr(rtwdemo_async_M, &rtwdemo_async_M->Timing.tArray[0]); { int_T *mdlSampleHits = rtwdemo_async_M->Timing.sampleHitArray; int_T *mdlPerTaskSampleHits = rtwdemo_async_M->Timing.perTaskSampleHitsArray; rtwdemo_async_M->Timing.perTaskSampleHits = (&mdlPerTaskSampleHits[0]); mdlSampleHits[0] = 1; rtwdemo_async_M->Timing.sampleHits = (&mdlSampleHits[0]); } rtmSetTFinal(rtwdemo_async_M, 0.5); rtwdemo_async_M->Timing.stepSize0 = 0.016666666666666666; rtwdemo_async_M->Timing.stepSize1 = 0.05; rtwdemo_async_M->solverInfoPtr = (&rtwdemo_async_M->solverInfo); rtwdemo_async_M->Timing.stepSize = (0.016666666666666666); rtsiSetFixedStepSize(&rtwdemo_async_M->solverInfo, 0.016666666666666666); rtsiSetSolverMode(&rtwdemo_async_M->solverInfo, SOLVER_MODE_MULTITASKING); /* block I/O */ rtwdemo_async_M->blockIO = ((void *) &rtwdemo_async_B); (void) memset(((void *) &rtwdemo_async_B), 0, sizeof(B_rtwdemo_async_T)); /* states (dwork) */ rtwdemo_async_M->dwork = ((void *) &rtwdemo_async_DW); (void) memset((void *)&rtwdemo_async_DW, 0, sizeof(DW_rtwdemo_async_T)); /* external inputs */ rtwdemo_async_M->inputs = (((void*)&rtwdemo_async_U)); (void)memset(&rtwdemo_async_U, 0, sizeof(ExtU_rtwdemo_async_T)); /* external outputs */ rtwdemo_async_M->outputs = (&rtwdemo_async_Y); (void) memset((void *)&rtwdemo_async_Y, 0, sizeof(ExtY_rtwdemo_async_T)); /* Initialize Sizes */ rtwdemo_async_M->Sizes.numContStates = (0);/* Number of continuous states */ rtwdemo_async_M->Sizes.numY = (3); /* Number of model outputs */ rtwdemo_async_M->Sizes.numU = (60); /* Number of model inputs */ rtwdemo_async_M->Sizes.sysDirFeedThru = (0);/* The model is not direct feedthrough */ rtwdemo_async_M->Sizes.numSampTimes = (2);/* Number of sample times */ rtwdemo_async_M->Sizes.numBlocks = (20);/* Number of blocks */ rtwdemo_async_M->Sizes.numBlockIO = (7);/* Number of block outputs */ return rtwdemo_async_M; } /*========================================================================* * End of Classic call interface * *========================================================================*/

这些操作的顺序很重要。在代码生成器启用激活任务的中断之前,它必须生成任务。

检查任务和任务同步代码

在生成的源文件中rtwdemo_async.c,检查任务和任务同步代码。

代码生成器生成函数的代码Task0从任务同步块。该函数包含少量中断级代码,并作为RTOS任务运行。

任务无限地等待着循环,直到系统释放一个同步信号。如果系统释放信号量,则该函数更新其任务计时器并调用为算法子系统。

在示例模型中将此任务的数据传输与调用者任务同步设置“任务同步”块的参数。此参数设置更新与任务同步块关联的计时器(rtM - > Timing.clockTick2)与异步中断块(rtM - > Timing.clockTick3)维护。因此,代码块在算法子系统使用基于最近中断的时间而不是最近激活的计时器值Task0

{/ *为信号量等待由系统释放:rtwdemo_async /任务同步* /对(;;){如果(!semTake(*(SEM_ID *)rtwdemo_async_DW.SFunction_PWORK.SemID,NO_WAIT)= ERROR){logMsg(“费率任务Task0()太快\ n”,0,0,0,0,0,0)。#if stoponoverrun logmsg(“中止实时仿真。\ n”,0,0,0,0,0,0);半决日(STOPSEM);返回(错误);#endif} else {semtake(*(sem_id *)rtwdemo_async_dw.sfunction_pwork.semid,wait_forever);} / *使用上游时钟刻度计数器进行此任务。* / rtwdemo_async_m-> timing.clocktick2 = rtwdemo_async_m-> timing.clocktick4;/ *调用系统:' / algorithm' * / {{int32_t tmp;Int32_t i; /* RateTransition: '/Protected RT1' */ tmp = rtwdemo_async_DW.ProtectedRT1_ActiveBufIdx * 60; for (i = 0; i < 60; i++) { rtwdemo_async_B.ProtectedRT1[i] = rtwdemo_async_DW.ProtectedRT1_Buffer[i + tmp]; } /* End of RateTransition: '/Protected RT1' */ /* S-Function (vxinterrupt1): '/Async Interrupt' */ /* S-Function (vxtask1): '/S-Function' */ /* Output and update for function-call system: '/Algorithm' */ { int32_T i; rtwdemo_async_M->Timing.clockTick2 = rtwdemo_async_M->Timing.clockTick4; if (rtwdemo_async_DW.Algorithm_RESET_ELAPS_T) { rtwdemo_async_DW.Algorithm_ELAPS_T = 0U; } else { rtwdemo_async_DW.Algorithm_ELAPS_T = rtwdemo_async_M->Timing.clockTick2 - rtwdemo_async_DW.Algorithm_PREV_T; } rtwdemo_async_DW.Algorithm_PREV_T = rtwdemo_async_M->Timing.clockTick2; rtwdemo_async_DW.Algorithm_RESET_ELAPS_T = false; /* DiscreteIntegrator: '/Integrator' */ if (rtwdemo_async_DW.Integrator_SYSTEM_ENABLE == 0) { rtwdemo_async_DW.Integrator_DSTATE += 0.016666666666666666 * (real_T) rtwdemo_async_DW.Algorithm_ELAPS_T * rtwdemo_async_DW.Integrator_PREV_U; } /* End of DiscreteIntegrator: '/Integrator' */ /* Outport: '/Out3' incorporates: * SignalConversion generated from: '/Out2' */ rtwdemo_async_Y.Out3 = rtwdemo_async_DW.Integrator_DSTATE; /* Sum: '/Sum1' */ rtwdemo_async_DW.Integrator_PREV_U = -0.0; for (i = 0; i < 60; i++) { /* Sum: '/Sum' incorporates: * Constant: '/Offset' */ rtwdemo_async_B.Sum[i] = rtwdemo_async_B.ProtectedRT1[i] + 1.25; /* Sum: '/Sum1' */ rtwdemo_async_DW.Integrator_PREV_U += rtwdemo_async_B.Sum[i]; } /* Update for DiscreteIntegrator: '/Integrator' */ rtwdemo_async_DW.Integrator_SYSTEM_ENABLE = 0U; } /* End of Outputs for S-Function (vxtask1): '/S-Function' */ /* End of Outputs for S-Function (vxinterrupt1): '/Async Interrupt' */ } { int32_T i; /* Update for RateTransition: '/Protected RT2' */ for (i = 0; i < 60; i++) { rtwdemo_async_DW.ProtectedRT2_Buffer[i + (rtwdemo_async_DW.ProtectedRT2_ActiveBufIdx == 0) * 60] = rtwdemo_async_B.Sum[i]; } rtwdemo_async_DW.ProtectedRT2_ActiveBufIdx = (int8_T) (rtwdemo_async_DW.ProtectedRT2_ActiveBufIdx == 0); /* End of Update for RateTransition: '/Protected RT2' */ } } } } /* VxWorks Interrupt Block: '/Async Interrupt' */ void isr_num1_vec192(void) { int_T lock; FP_CONTEXT context; /* Use tickGet() as a portable tick counter example. A much higher resolution can be achieved with a hardware counter */ rtwdemo_async_M->Timing.clockTick3 = tickGet(); /* disable interrupts (system is configured as non-preemptive) */ lock = intLock(); /* save floating point context */ fppSave(&context); /* Call the system: '/Count' */ { /* S-Function (vxinterrupt1): '/Async Interrupt' */ /* Output and update for function-call system: '/Count' */ if (rtwdemo_async_DW.Count_RESET_ELAPS_T) { rtwdemo_async_DW.Count_ELAPS_T = 0U; } else { rtwdemo_async_DW.Count_ELAPS_T = rtwdemo_async_M->Timing.clockTick3 - rtwdemo_async_DW.Count_PREV_T; } rtwdemo_async_DW.Count_PREV_T = rtwdemo_async_M->Timing.clockTick3; rtwdemo_async_DW.Count_RESET_ELAPS_T = false; /* DiscreteIntegrator: '/Integrator' */ if (rtwdemo_async_DW.Integrator_SYSTEM_ENABLE_h == 0) { rtwdemo_async_DW.Integrator_DSTATE_l += 0.016666666666666666 * (real_T) rtwdemo_async_DW.Count_ELAPS_T * rtwdemo_async_DW.Integrator_PREV_U_o; } /* End of DiscreteIntegrator: '/Integrator' */ /* Outport: '/Out1' incorporates: * SignalConversion generated from: '/Out' */ rtwdemo_async_Y.Out1 = rtwdemo_async_DW.Integrator_DSTATE_l; /* Update for DiscreteIntegrator: '/Integrator' incorporates: * Constant: '/Constant' */ rtwdemo_async_DW.Integrator_SYSTEM_ENABLE_h = 0U; rtwdemo_async_DW.Integrator_PREV_U_o = 1.0; /* End of Outputs for S-Function (vxinterrupt1): '/Async Interrupt' */ } /* restore floating point context */ fppRestore(&context); /* re-enable interrupts */ intUnlock(lock); } /* VxWorks Interrupt Block: '/Async Interrupt' */ void isr_num2_vec193(void) { /* Use tickGet() as a portable tick counter example. A much higher resolution can be achieved with a hardware counter */ rtwdemo_async_M->Timing.clockTick4 = tickGet(); /* Call the system: '/Subsystem' */ { /* S-Function (vxinterrupt1): '/Async Interrupt' */ /* Output and update for function-call system: '/Subsystem' */ /* S-Function (vxtask1): '/S-Function' */ /* VxWorks Task Block: '/S-Function' (vxtask1) */ /* Release semaphore for system task: Task0 */ semGive(*(SEM_ID *)rtwdemo_async_DW.SFunction_PWORK.SemID); /* End of Outputs for S-Function (vxtask1): '/S-Function' */ /* End of Outputs for S-Function (vxinterrupt1): '/Async Interrupt' */ } }

代码生成器为isr生成代码isr_num1_vec192isr_num2_vec293.ISRisr_num2_vec192

  • 禁用中断。

  • 保存浮点上下文。

  • 调用为与参考模型Inport块连接的子系统生成的代码,该块接收中断。

  • 恢复浮点上下文。

  • 允许中断。

void isr_num1_vec192(void) {int_T锁;FP_CONTEXT上下文;/*使用tickGet()作为一个可移植的tick计数器示例。可以使用硬件计数器* / RTWDEMO_ASYNC_M-> TIMING.CLOCKTICK3 = TICKET()来实现更高的分辨率。/*禁用中断(系统配置为非抢占)*/ lock = intLock();/*保存浮点上下文*/ fppSave(&context);/*调用系统:'/Count' */ {/* S-Function (vxinterrupt1): '/Async Interrupt' */ /*输出和更新函数调用系统:'/Count' */ /*Count_ELAPS_T u = 0;} else {rtwdemo_async_dw.count_elaps_t = rtwdemo_async_m-> timing.clocktick3  -  rtwdemo_async_dw.count_prev_t;} RTWDEMO_ASYNC_DW.COUNT_PREV_T = RTWDEMO_ASYNC_M-> TIMING.CLOCKTICK3;RTWDEMO_ASYNC_DW.COUNT_RESET_ELAPS_T = false; /* DiscreteIntegrator: '/Integrator' */ if (rtwdemo_async_DW.Integrator_SYSTEM_ENABLE_h == 0) { rtwdemo_async_DW.Integrator_DSTATE_l += 0.016666666666666666 * (real_T) rtwdemo_async_DW.Count_ELAPS_T * rtwdemo_async_DW.Integrator_PREV_U_o; } /* End of DiscreteIntegrator: '/Integrator' */ /* Outport: '/Out1' incorporates: * SignalConversion generated from: '/Out' */ rtwdemo_async_Y.Out1 = rtwdemo_async_DW.Integrator_DSTATE_l; /* Update for DiscreteIntegrator: '/Integrator' incorporates: * Constant: '/Constant' */ rtwdemo_async_DW.Integrator_SYSTEM_ENABLE_h = 0U; rtwdemo_async_DW.Integrator_PREV_U_o = 1.0; /* End of Outputs for S-Function (vxinterrupt1): '/Async Interrupt' */ } /* restore floating point context */ fppRestore(&context); /* re-enable interrupts */ intUnlock(lock); } /* VxWorks Interrupt Block: '/Async Interrupt' */

ISRisr_num2_vec293维护一个计时器,存储中断发生时的滴答计数。更新定时器后,ISR释放激活的信号量Task0

/ *以优先级引发:50 * / void task0(void){/ *等待Systems释放的信号量:RTWDEMO_ASYNC /任务同步* / for(;;){if(*(sem_id *)rtwdemo_async_dw.sfunction_pwork.semid,no_wait)!=错误){logmsg(“任务任务的速率0()太快。\ n”,0,0,0,0,0,0);#if stoponoverrun logmsg(“中止实时仿真。\ n”,0,0,0,0,0,0);半决日(STOPSEM);返回(错误);#endif} else {semtake(*(sem_id *)rtwdemo_async_dw.sfunction_pwork.semid,wait_forever);} / *使用上游时钟刻度计数器进行此任务。* / rtwdemo_async_m-> timing.clocktick2 = rtwdemo_async_m-> timing.clocktick4;/ *调用系统:' / algorithm' * / {{int32_t tmp;Int32_t i;/ * ratetransition:' / protected rt1' * / tmp = rtwdemo_async_dw.protedrt1_activebufidx * 60; for (i = 0; i < 60; i++) { rtwdemo_async_B.ProtectedRT1[i] = rtwdemo_async_DW.ProtectedRT1_Buffer[i + tmp]; } /* End of RateTransition: '/Protected RT1' */ /* S-Function (vxinterrupt1): '/Async Interrupt' */ /* S-Function (vxtask1): '/S-Function' */ /* Output and update for function-call system: '/Algorithm' */ { int32_T i; rtwdemo_async_M->Timing.clockTick2 = rtwdemo_async_M->Timing.clockTick4; if (rtwdemo_async_DW.Algorithm_RESET_ELAPS_T) { rtwdemo_async_DW.Algorithm_ELAPS_T = 0U; } else { rtwdemo_async_DW.Algorithm_ELAPS_T = rtwdemo_async_M->Timing.clockTick2 - rtwdemo_async_DW.Algorithm_PREV_T; } rtwdemo_async_DW.Algorithm_PREV_T = rtwdemo_async_M->Timing.clockTick2; rtwdemo_async_DW.Algorithm_RESET_ELAPS_T = false; /* DiscreteIntegrator: '/Integrator' */ if (rtwdemo_async_DW.Integrator_SYSTEM_ENABLE == 0) { rtwdemo_async_DW.Integrator_DSTATE += 0.016666666666666666 * (real_T) rtwdemo_async_DW.Algorithm_ELAPS_T * rtwdemo_async_DW.Integrator_PREV_U; } /* End of DiscreteIntegrator: '/Integrator' */ /* Outport: '/Out3' incorporates: * SignalConversion generated from: '/Out2' */ rtwdemo_async_Y.Out3 = rtwdemo_async_DW.Integrator_DSTATE; /* Sum: '/Sum1' */ rtwdemo_async_DW.Integrator_PREV_U = -0.0; for (i = 0; i < 60; i++) { /* Sum: '/Sum' incorporates: * Constant: '/Offset' */ rtwdemo_async_B.Sum[i] = rtwdemo_async_B.ProtectedRT1[i] + 1.25; /* Sum: '/Sum1' */ rtwdemo_async_DW.Integrator_PREV_U += rtwdemo_async_B.Sum[i]; } /* Update for DiscreteIntegrator: '/Integrator' */ rtwdemo_async_DW.Integrator_SYSTEM_ENABLE = 0U; } /* End of Outputs for S-Function (vxtask1): '/S-Function' */ /* End of Outputs for S-Function (vxinterrupt1): '/Async Interrupt' */ } { int32_T i; /* Update for RateTransition: '/Protected RT2' */ for (i = 0; i < 60; i++) { rtwdemo_async_DW.ProtectedRT2_Buffer[i + (rtwdemo_async_DW.ProtectedRT2_ActiveBufIdx == 0) * 60] = rtwdemo_async_B.Sum[i]; } rtwdemo_async_DW.ProtectedRT2_ActiveBufIdx = (int8_T) (rtwdemo_async_DW.ProtectedRT2_ActiveBufIdx == 0); /* End of Update for RateTransition: '/Protected RT2' */ } } } } /* VxWorks Interrupt Block: '/Async Interrupt' */ void isr_num1_vec192(void) { int_T lock; FP_CONTEXT context; /* Use tickGet() as a portable tick counter example. A much higher resolution can be achieved with a hardware counter */ rtwdemo_async_M->Timing.clockTick3 = tickGet(); /* disable interrupts (system is configured as non-preemptive) */ lock = intLock(); /* save floating point context */ fppSave(&context); /* Call the system: '/Count' */ { /* S-Function (vxinterrupt1): '/Async Interrupt' */ /* Output and update for function-call system: '/Count' */ if (rtwdemo_async_DW.Count_RESET_ELAPS_T) { rtwdemo_async_DW.Count_ELAPS_T = 0U; } else { rtwdemo_async_DW.Count_ELAPS_T = rtwdemo_async_M->Timing.clockTick3 - rtwdemo_async_DW.Count_PREV_T; } rtwdemo_async_DW.Count_PREV_T = rtwdemo_async_M->Timing.clockTick3; rtwdemo_async_DW.Count_RESET_ELAPS_T = false; /* DiscreteIntegrator: '/Integrator' */ if (rtwdemo_async_DW.Integrator_SYSTEM_ENABLE_h == 0) { rtwdemo_async_DW.Integrator_DSTATE_l += 0.016666666666666666 * (real_T) rtwdemo_async_DW.Count_ELAPS_T * rtwdemo_async_DW.Integrator_PREV_U_o; } /* End of DiscreteIntegrator: '/Integrator' */ /* Outport: '/Out1' incorporates: * SignalConversion generated from: '/Out' */ rtwdemo_async_Y.Out1 = rtwdemo_async_DW.Integrator_DSTATE_l; /* Update for DiscreteIntegrator: '/Integrator' incorporates: * Constant: '/Constant' */ rtwdemo_async_DW.Integrator_SYSTEM_ENABLE_h = 0U; rtwdemo_async_DW.Integrator_PREV_U_o = 1.0; /* End of Outputs for S-Function (vxinterrupt1): '/Async Interrupt' */ } /* restore floating point context */ fppRestore(&context); /* re-enable interrupts */ intUnlock(lock); } /* VxWorks Interrupt Block: '/Async Interrupt' */

检查任务终止代码

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

static void rtwdemo_async_terminate(void) {/* Terminate for S-Function (vxinterrupt1): '/Async Interrupt' */ /* VxWorks中断块:'/Async Interrupt' */ /*为ISR系统禁用中断:isr_num1_vec192 */ sysIntDisable(1);/* VxWorks Interrupt Block: '/Async Interrupt' */ /*为ISR系统禁用中断:isr_num2_vec193 */ sysIntDisable(2);/* Terminate for S-Function (vxinterrupt1): '/Async Interrupt' */ /* Terminate for S-Function (vxinterrupt1): '/Async Interrupt' includes: * SubSystem: '/ SubSystem ' */ /* Terminate for S-Function (vxtask1): '/S-Function' */ /* VxWorks任务块:'/S-Function' (vxtask1) */ /* Destroy task: Task0 */ taskDelete(rtwdemo_async_DW.SFunction_IWORK.TaskID);/* End of Terminate for S-Function (vxtask1): '/S-Function' */ * End of Terminate for S-Function (vxinterrupt1): '/Async Interrupt' */}

相关信息

相关的话题