Autosar RTE C/S接口实现及synchronous与asynchronous的区别

这篇具有很好参考价值的文章主要介绍了Autosar RTE C/S接口实现及synchronous与asynchronous的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在之前的一篇文章中,介绍了RTE中的S/R接口,也是RTE中使用最多的接口。在Autosar定义的Interface中,分为Require Ports(需求接口,对应的S/R接口中的Receiver接口,C/S接口中的Client接口)和Provide Ports(提供接口,对应S/R接口中的Sender接口,C/S接口中的Server接口)。
S/R接口主要针对数据传输,而C/S接口主要是针对操作。一般C/S接口以函数调用和函数的形式存在。Client调用Server端的操作,一般以Runnable形式存在。

Server接口

对于Server接口来说,实际就是一个功能函数的实现,在Autosar中,大部分时候都是通过Client接口调用对应的Server的函数。

此处演示在Simulink中如何创建一个Server接口,其他RTE设计工具中也是类似的选项

设计server接口

创建好一个Autosar类型的Model后,Ctrl+Shift+C打开Autosar SW Component,然后打开Autosar Dictionary

Autosar RTE C/S接口实现及synchronous与asynchronous的区别
通过C/S Interface创建一个接口名为TestCSIf_server,然后创建对应的Operation, Operation即为对应的操作名称,Operation后面会关联到Runnable上。

此处操作名称为TestFunc_server.

接着通过Arguments配置操作的参数,此处示例配置两个输入和一个输出

Autosar RTE C/S接口实现及synchronous与asynchronous的区别
此处只是定义了部分函数原型,具体的实现需要在Simulink中做,或者生成代码后自己再手动在Runnable中编写。

创建好接口后,需要创建serverPorts

Autosar RTE C/S接口实现及synchronous与asynchronous的区别
将之前创建的C/S Interface与ServerPort映射

然后创建server对应的runnable,此处函数名称为TestFunc_server

Autosar RTE C/S接口实现及synchronous与asynchronous的区别
Runnable选择Event为OperationInvokedEvent,且选择Event Trigger为之前创建的server的Operation,进行了Operation与Runnable的映射

Autosar RTE C/S接口实现及synchronous与asynchronous的区别

Simulink实现server函数

使用Simulink Function实现函数,示例如下

Autosar RTE C/S接口实现及synchronous与asynchronous的区别

Autosar RTE C/S接口实现及synchronous与asynchronous的区别
可以在信号属性中设计输入输出的数据类型

mapping Function

在Autosar SW Component中的Function界面进行Runnable和Function的mapping

Autosar RTE C/S接口实现及synchronous与asynchronous的区别

生成的代码

生成的代码中关于server,只有一个对应的Runnable函数。关于Interface和Port的信息,都在Arxml中体现。

/* Output function */
void TestFunc_server(uint8 Input1, uint8 Input2, uint8 *Output)
{
  /* Outputs for Function Call SubSystem: '<Root>/Simulink Function' */
  /* SignalConversion generated from: '<S1>/Output' incorporates:
   *  SignalConversion generated from: '<S1>/Input1'
   *  SignalConversion generated from: '<S1>/Input2'
   *  Sum: '<S1>/Add'
   */
  *Output = (uint8)((uint32)Input1 + Input2);

  /* End of Outputs for SubSystem: '<Root>/Simulink Function' */
}

实际使用中,将Client接口与Server接口正确连接后,Client即可调用对应的Server函数了。C/S接口的map需要在Autosar RTE设计工具中配置。

Client接口

标题中的synchronous和asynchronous都是针对Client接口的,表示调用Server的方式。在Simulink没有配置同步还是异步,默认都是同步。

此处演示在Simulink中如何创建一个Client接口

设计Client接口

和Server接口一样,创建Client Interface,名为TestCSIf_client,然后创建Operation,接着创建参数,示例如下:

Autosar RTE C/S接口实现及synchronous与asynchronous的区别
然后创建Client Ports,如下所示:

Autosar RTE C/S接口实现及synchronous与asynchronous的区别
此处接口就建立好了。

Simulink实现Client

在Simulink中的10ms的Runnable中使用Function Caller模块实现Client,示例如下:

Autosar RTE C/S接口实现及synchronous与asynchronous的区别

Function Caller Mapping

将刚刚建立的Function Caller和之前创建的Client Port进行map

Autosar RTE C/S接口实现及synchronous与asynchronous的区别

生成的代码

生成的代码其实就是在10ms的Runnable中调用Client接口,此处默认是同步调用,接口为Rte_Call类型

/* Model step function for TID1 */
void Runable_10ms(void)                /* Explicit Task: Runnable_10ms */
{
  uint8 rtb_FunctionCaller;

  /* RootInportFunctionCallGenerator generated from: '<Root>/Runnable_10ms' incorporates:
   *  SubSystem: '<Root>/Subsystem'
   */
  /* FunctionCaller: '<S2>/Function Caller' incorporates:
   *  Inport: '<Root>/In1'
   *  Inport: '<Root>/In2'
   */
  Rte_Call_cPort_TestFunc_client(Rte_IRead_Runable_10ms_Input1_Val(),
    Rte_IRead_Runable_10ms_Input2_Val(), &rtb_FunctionCaller);

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

  /* Outport: '<Root>/Out1' */
  Rte_IWrite_Runable_10ms_Output_Val(rtb_FunctionCaller);
}

实际使用中,大部分应该都是同步调用。

Rte_Call

该函数为标准中的API函数,原型如下:

Std_ReturnType
Rte_[Byps_]Call_<p>_<o>([IN Rte_Instance <instance>],
[IN|IN/OUT|OUT] <data_1>...
[IN|IN/OUT|OUT] <data_n>,
[OUT Std_TransformerError transformerError])

接口中<p>表示port名称,<o>表示operation名称,IN|IN/OUT|OUT表示输入输出参数,其他参数用的比较少。

假设Port名称为cPort,operation名称为TestFunc,则生成的Rte_Call接口名称示例如下:

Rte_Call_cPort_TestFunc

在同步通信中,输入和输出可以同时存在。而在异步通信中,调用Rte_Call时,输出参数应该被省略,需要使用Rte_Result来获取输出结果

规范中解释如下:

在异步通信情况下:

•Rte_Call只包括IN和IN/OUT参数。

•Rte_Result只包含IN/OUT和OUT参数来收集服务器调用的结果。

•Rte_Call期间提供的IN/OUT参数可以是与Rte_Result期间传递的IN/OUT参数不同的地址。

标准中的同步通信过程:
Autosar RTE C/S接口实现及synchronous与asynchronous的区别
实际Client调用Server时应该还有一个超时返回的功能,但是一般生成的代码中都没有体现(可能是我没有用对)

Rte_Result

该函数为标准中的API函数,原型如下:

Std_ReturnType
Rte_[Byps_]Result_<p>_<o>([IN Rte_Instance <instance>],
[IN/OUT|OUT <param 1>]...
[IN/OUT|OUT <param n>],
[OUT Std_TransformerError transformerError])

可以看出该函数中没有包含IN的参数,只有OUT或IN/OUT,也对应其名称Result,就是用来获取之前函数运行的结果的。

在异步通信中,Client调用Rte_Call函数后可以先返回,然后通过Rte_Result函数来获取结果

Autosar RTE C/S接口实现及synchronous与asynchronous的区别
标准中的异步通信过程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vOCV0QLE-1687527971221)(null)]

Autosar RTE C/S接口实现及synchronous与asynchronous的区别
异步通信主要可以提高运行效率。

CFG中配置异步通信:

Autosar RTE C/S接口实现及synchronous与asynchronous的区别
Polling:循环读取结果

Waiting:设置一个等待时间,时间到了之后读取结果

None:配置为事件触发,server运行完后会触发该事件,以触发client的响应,读取结果

实际使用中,还没有使用过异步通信,可能描述的不一定准确。

总结

C/S接口一般在NVM或DEM中使用较多,SWC使用时一般都以Client的形式去调用BSW的API函数,后面有空会继续分享相关内容。文章来源地址https://www.toymoban.com/news/detail-497922.html

到了这里,关于Autosar RTE C/S接口实现及synchronous与asynchronous的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AutoSAR(基础入门篇)7.3-使用DEV配置SWC&RTE

    目录 一、实验概览 1、实验目的 2、实验内容 二、步骤一:配置SWC

    2024年02月22日
    浏览(36)
  • [AutoSar]基础部分 RTE 05 Port的实例化和初始化

       嵌入式、C语言、autosar、Rte 项目 Value OS autosar OS autosar厂商 vector 芯片厂商 TI 编程语言 C,C++ 编译器 HighTec (GCC) 回到总目录    如下图所示,端口类型有多种,不论哪种类型的端口都是用来在component间交互使用的。具体每种端口用法在后续SWC中会详细描述。 命名规则参

    2024年01月22日
    浏览(45)
  • AutoSAR配置与实践(基础篇)2.5 RTE对数据一致性的管理

    -返回总目录- 数据一致性:当多个操作同时读写同一个数据,由于任务的抢占,出现了数据被篡改的情况,造成非预期的数据结果。 在抢占式调度RTOS系统中,可能会出现任务抢占导致的一致性问题#x

    2024年02月12日
    浏览(48)
  • AUTOSAR CP标准的RTE和BSW各模块的设计及开发工作

    AUTOSAR(Automotive Open System Architecture) 是一种开放的汽车电子系统架构标准,旨在提供一种统一的软件架构,以实现汽车电子系统的模块化和可重用性。 AUTOSAR标准中的两个重要模块是RTE(Runtime Environment)和BSW(Basic Software)。 RTE(Runtime Environment) 模块的设计和开发工作主要

    2024年02月16日
    浏览(53)
  • 《ReentrantLock与synchronized的区别》

    目录 Synchronized同步锁 synchronized的用法: ReentrantLock ReentrantLock和Synchronized的区别   Synchronized同步锁         使用Synchronized将一段代码锁起来,同一时间只允许一个线程访问。只有获取了这把锁的线程才能访问这段代码,并且只有一个线程拥有这把锁。这样就保证了代

    2024年02月16日
    浏览(35)
  • Lock和synchronized的区别

    1、Lock是一个接口,而synchronized是一个Java,synchronized是内置的语言实现,Lock是代码层面的实现 2、Lock可以选择性的获取锁,如果一段时间获取不到,咋可以不要了。synchronized不行,不达目的不罢休。借助这个特性,Lock可以避免死锁,而synchronized不惜通过谨慎的设计才

    2024年02月08日
    浏览(39)
  • lock 和synchronized 的区别

    1  lock是接口实现,synchronized是内置方法native实现 2 lock可以主动释放锁,synchronized只能是加锁的代码块执行完毕或者遇到异常退出被动的释放锁 3 性能方面,如果竞争资源不是很激烈的情况,两者的性能差不太多,如果是在竞争资源激烈的情况下,lock的性能要优于synchronize

    2024年02月08日
    浏览(42)
  • ReentrantLock与synchronized的区别

    synchronized 基于代码块的方式控制加锁与解锁 ReentrantLock 基于 lock(加锁) 与 unlock(解锁) 方式控制加锁与解锁 synchronized 只是单纯的加锁与解锁 ReentrantLock 对于 加锁成功 与synchronized 并无区别 ReentrantLock 对于 加锁失败 提供了额外的 tryLock方法 通过tryLock方法可以直接返回false, 由程

    2023年04月10日
    浏览(61)
  • Java——》Synchronized和Lock区别

    推荐链接:     总结——》【Java】     总结——》【Mysql】     总结——》【Redis】     总结——》【Kafka】     总结——》【Spring】     总结——》【SpringBoot】     总结——》【MyBatis、MyBatis-Plus】     总结——》【Linux】     总结——》【MongoDB】    

    2024年02月09日
    浏览(41)
  • Synchronized和Lock接口

    Synchronized Synchronized回顾 synchronized是java中的,是一种同步锁。它修饰的目标有以下几种: 1.修饰一个代码块,被修饰的代码块称为同步代码块,其作用的范围是大括号{},括起来的代码,作用的对象是调用这个代码块的对象,synchronized不能修饰静态代码块。 2.修

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包