AutoSAR系列讲解(入门篇)3.4-RTE对Ports的支撑(下)

一、C/S接口的实现

之前在第二章AppL中讲过了C/S接口,这里再更加深入的说明一下其实现的原理:首先,C/S接口就是客户/服务接口,这个接口就是客户来调用服务 端的操作的一个接口。也就是我写着写着,发现我想要调用一个函数,这个函数在其他的C文件中,就让RTE帮忙调用。

还是举个例子

我,客户,我想要执行一个函数,这个函数写在服务端上的。由于我和服务端有隔阂(SWC之间不能直接通信),这时,我就悄悄告诉RTE,我想要 执行那个函数,RTE就会帮我告诉服务端,让服务端执行该函数。 而这里又有两种方式:异步和同步:

  • 同步就是说我这个人很懒,我要等服务端运行完了这个函数,RTE返回这个函数的结果后,我才开始继续我的工作;
  • 异步就是我这个人很勤快,我通知RTE让它帮忙告诉服务端运行函数后,我就继续干我的事了,等过一段时间后,我估摸着函数运行结束了,我 再请求函数结果

二、C/S接口的不同方式

同步和异步调用不是通过函数区别的,这必须是事先配置好由RTE生成的,所以在Davinci中配置runnable的port时是有这个选项的(当然要C/S接口 才有)

1、同步调用

从上文的例子,可以看出,同步调用其实就是我们平时调用函数是一样的,就是等同于将被调函数代码嵌入当前调用的函数代码中运行即可。

我们也用代码实际说明一下

//假如我们的被调函数是:

Std_ReturnType RunnableServer(int *param)

//那我们的客户中应该写的调用函数就是:

Std_ReturnType Rte_Call_Port>_RunnableServer(int *param)

//这个param就是我们希望被调函数操作的变量

2、异步调用

异步调用相当于有两个线程,一个线程运行我们的原函数中的内容,另一个执行被调函数的内容。然后可以过一段时间去读取一下被调函数的返回结 果

扫描二维码关注公众号,回复: 15528992 查看本文章

而这时,如何知道被调函数是否执行完了呢?有三种方法:

1. 循环检测,就是在那一直等,等到返回值为止,这样的话和同步就差不多了,意义不大

2. 超时检测,定一个时间,时间到了就去读取,没到的时候继续运行我的程序

3. 事件触发,当服务函数运行结束,RTE可以触发原函数,告诉它被调函数运行完了,你可以读取返回值了 读取函数也用代码实际说明一下

//执行下面的函数后就能将参数返回回来了

Std_ReturnType Rte_Result_Port>_RunnableServer(int *param)

猜你喜欢

转载自blog.csdn.net/qq_42700289/article/details/131404720