前言
应用层开发过程中,对于接收到的信号,有一部分是来自于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工作。