分享

Autosar RTE S/R接口implicit与Explicit的实现与区别

 花信风zq 2023-07-05 发布于重庆
  • 前言

  • 接口的代码

    • implicit

    • Explicit

  • 区别与使用场景

  • 总结

前言

Autosar官方文档阅读起来比较费劲,一般从实际应用中来了解更多规范中的内容。本文介绍最常用的RTE S/R接口的implicit隐式与Explicit显式两种方式的实现与差别

接口的代码

implicit

图片

IRead

隐式的接口代码最显著的特征是使用IRead.
在Autosar标准中有介绍Rte_IRead函数
函数原型:

<return> Rte_[Byps_]IRead_<re>_<p>_<o>([IN Rte_Instance <instance>],
[OUT uint8* metaDataPtr] )

Rte_Instance应该是Rte的实例,一般都只有一个,所有基本不会生成。可选的OUT参数metaDataPtr包含指向要从COM或LdCom转发的元数据字节数组
Rte_IRead返回值提供对可变数据协议类型。Rte_IRead的返回类型取决于ImplementationDataType 的VariableDataPrototype,并且可以是一个值或指向可以访问该值的位置的指针。返回值一般都不使用宏定义直接传值
<re>表示Runnable的名称,<p>表示端口的名称,<o>表示data element的名称,[Byps_]是可选的中缀,当启用用于bypass支持的组件时会生成。
数据值总是可以读取的。提供所需的一致性API提供对数据元素副本的访问。
这保证了它在可运行实体的实际执行过程中永远不会改变。
SW-C的隐式数据读取访问应始终返回定义的数据。
以上是标准中的解释,通俗来说,就是隐式访问时需要将需要访问的数据拷贝到另一个副本中,保证读取时数据不会变化,以保证同一次读取接口的数据都是一致的
例如,使用该接口的Runnable是Runnable_10ms,Port名称为Port_Test,Data element名称为Data_Test则该接口生成的定义为:

 #  define Rte_IRead_Runnable_10ms_Port_Test_Data_Test()  (Test_Data)

此处只是示例,Test_Data是一个全局变量。正常生成的代码中还会加入Task,Runnable,Port等的定义
假设该接口是从CAN上获取的,则实际读取的代码实现:

      /* read implicit data */
      {
        uint8 local_Test_Data;
        (void)Com_ReceiveSignal(ComConf_ComSignal_Test_Data_Message_Rx, &local_Test_Data); 
        *((&Test_Data)) = local_Test_Data;
      }
      /* call runnable */
      Runnable_10ms(); 
     

可以看到,Rte_IRead函数读取的值是在runnable调用之前赋值的。

IWrite

隐式的接口代码最显著的特征是使用IWrite.
在Autosar标准中有介绍Rte_IWrite函数
函数原型:

void Rte_[Byps_]IWrite_<re>_<p>_<o>(
[IN Rte_Instance <instance>],
IN <data>,
[IN Std_TransformerForward forwardedStatus],
[IN uint8* metaDataPtr])

Rte_Instance和IWrite中一样
<re>表示Runnable的名称,<p>表示端口的名称,<o>表示data element的名称,[Byps_]是可选的中缀,当启用用于bypass支持的组件时会生成。
输入参数 data,可以为变量值,也可以为地址,为地址时必须要保证指针在该API函数调用返回前有效
可选IN参数forwardedStatus包含变压器应在变压器链内部重建的状态。请参见ASWS TransformerGeneral[26]
可选的IN参数metaDataPtr包含指向要转发到COM或LdCom的元数据字节数组。参见[SWS_Rte_03620]。
Rte_IWrite API函数保证具有恒定的执行时间,即调用API是在同一个函数内,保证每一次发送的数据都是一致的
例如,使用该接口的Runnable是Runnable_10ms,Port名称为Port_Test,Data element名称为Data_Test则该接口生成的定义为:

Rte_IWrite_Runnable_10ms_Port_Test_Data_Test(data)  \ 
  ( \
    Test_IWrite_Data = (data) \
  )

此处赋值的也是全局变量。
发送的函数

  Rte_IWrite_Runnable_10ms_Port_Test_Data_Test
    (loacal_Send_Data);

是一个临时变量,且是在同一函数内发送出去的,获取该临时变量值也是在同一函数内。
一般在生成的代码中,Write设置implicit属性后,除了IWrite函数,还会生成一个IWriteRef函数。该函数和IWrite的区别是不传递参数,而是直接宏定义获取变量地址,例如上述例子对应的IWriteRef函数为:

#  define Rte_IWriteRef_Runnable_10ms_Port_Test_Data_Test() \
  ( \
    &Test_IWrite_Data \
  )

一般都不会使用该函数

Explicit

图片

Read

显式的接口代码最显著的特征是使用Read.
在Autosar标准中有介绍Rte_Read函数
函数原型:

Std_ReturnType
Rte_[Byps_]Read_<p>_<o>(
[IN Rte_Instance <instance>],
OUT <data>,
[OUT Std_TransformerError transformerError],
[OUT uint8* metaDataPtr])

此处很明显的差异,Read函数中没有Runnable的定义,也就是说,Read函数和Runnable无关
调用接口读取时,是直接读取的参数值,没有经过中间变量,这样可以保证数据的实时性
此处Out <data>传回接收到的数据,通过指针进行传递。指针必须保持有效,直到API调用返回
返回值RTE_E_OK表示接收成功,RTE_E_INVALID表示数据无效,其他的可以参考规范,在传递数据时一般不会考虑返回值,在传递总线信号时,调用Com_ReceiveSignal可以参考返回值
其他的参数和上面的类似。一般也用不到。
例如,使用Port名称为Port_Test,Data element名称为Data_Test则该接口生成的定义为:

 #  define Rte_Read_Port_Test_Data_Test( data )  ((*(data)) = Rte_Rx_Test_Data)

读取代码:

  (void)Rte_Read_Port_Test_Data_Test(&Test_Read_Data);

调用时传递变量地址,提供给指针赋值。

Write

显式的接口代码最显著的特征是使用Write.
在Autosar标准中有介绍Rte_Write函数
函数原型:

Std_ReturnType
Rte_[Byps_]Write_<p>_<o>([IN Rte_Instance <instance>],
IN <data>,
[IN Std_TransformerForward forwardedStatus],
[IN uint8* metaDataPtr],
[OUT Std_TransformerError transformerError])

Write函数和Read函数一样,也没有Runnable的定义。通过传递IN <data>  来写入数据。
传递的类型可以是变量也可以是指针。例如,使用Port名称为Port_Test,Data element名称为Data_Test则该接口生成的定义为:

 #  define Rte_Write_Port_Test_Data_Test( data )  (Rte_Test_Write_Data = data)

写入代码:

    Rte_Write_Port_Test_Data_Test(Test_data);

此处传递的参数是值,如果是传递的数组的话,需要传递地址。

区别与使用场景

总结一下两种方式的差别:
1.定义名称不同,implicit方式API函数中会带I,且会加入Runnable的名称
2.implicit方式不直接操作数据,在进入runnable之前RTE为数据建立副本,在runnable运行结束之后RTE把副本数据拷贝到实际数据地址。而Explicit方式直接访问数据地址
使用场景:
implicit方式适用于有一致性要求的数据组,Explicit方式适用于实时性要求高的数据

总结

RTE作为SWC和BSW的交互接口,内容还是非常多的。有时间再慢慢总结用过的API。

若你觉得本文对你有帮助,欢迎点赞,关注,收藏,转发~~~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多