使用Simulink中的IsUpdated获取Rport的更新状态

发布于:2025-03-02 ⋅ 阅读:(103) ⋅ 点赞:(0)

前言

应用层开发过程中,对于接收到的信号,有一部分是来自于CAN上的,并不是每个周期数据都会更新,如果报文周期小于Runnable周期,则部分读取实际是没有意义的,所以有一个Update的标志,是非常有必要的。本文介绍在Simulink中配置Update flag及其使用。

建立带Update flag的模型

Update flag只针对于ExplicitReceive的Rport,下面的模型中已经建立好一个Rport,还需要新增:
1.一个bool类型的输入端口
2.一个Enabled Subsystem模块
3.将bool类型的输入端口作为Enabled Subsystem模块的触发
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Enabled Subsystem中不需要什么处理,如下
在这里插入图片描述

需要特别注意:新增的Enabled Subsystem需要放到Runnable中,否则会报错:模块 ‘rterunnable/receiverport_uptdateflag’ 只能连接到函数调用子系统

Autosar接口配置

配置新增的updateflag映射到IsUpdated,且关联同一个Rport及data element,如下:
在这里插入图片描述
配置好之后,就可以生成代码了

生成代码分析

对于新增了updateflag的代码,在Read函数前加了一个读取updateflag的函数调用,如下所示:


void RunnableTest_10ms(void)           /* Explicit Task: RunnableTest_10ms */
{
  boolean tmpIsUpdated;

  /* Inport: '<Root>/ReceiverPort_Uptdateflag' */
  tmpIsUpdated = Rte_IsUpdated_TestRport_Val();

  /* RootInportFunctionCallGenerator generated from: '<Root>/RunnableTest_10ms' incorporates:
   *  SubSystem: '<Root>/RunnableTest_10ms_call'
   */
  /* Outputs for Enabled SubSystem: '<S1>/Enabled Subsystem' incorporates:
   *  EnablePort: '<S3>/Enable'
   */
  if (tmpIsUpdated) {
    /* SignalConversion generated from: '<S3>/ReceiverPort' incorporates:
     *  Inport: '<Root>/ReceiverPort'
     */
    (void)Rte_Read_TestRport_Val(&rtARID_DEF.ReceiverPort);
  }

  /* End of Outputs for SubSystem: '<S1>/Enabled Subsystem' */

  /* Outport: '<Root>/SenderPort' incorporates:
   *  Constant: '<S1>/Constant'
   *  Sum: '<S1>/Sum'
   */
  (void)Rte_Write_PRportTest_Val((uint8)(rtARID_DEF.ReceiverPort + 1));

  /* End of Outputs for RootInportFunctionCallGenerator generated from: '<Root>/RunnableTest_10ms' */
}

通过调用Rte_IsUpdated_TestRport_Val接口来获取Read数据的更新状态,只有在update有效时,才会进行read的动作,且会在Read函数中,将更新状态进行清0,以等待下一次更新标志置位后的读取。

总结

此处只介绍到Simulink及配置,对于生成的arxml中,也有对应的配置生成,导入Autosar配置工具之后,便可以查看对应的更新标志配置,及后面的接口mapping工作。