Client-Server 接口和Sender-Receiver接口是AUTOSAR中最经常被使用的两类基础接口,在基于Sender-Receiver接口通信的上下文中使用的四种RTE Event已经在上一篇介绍,本篇介绍基于Client-Server接口通信的上下文中涉及到的两种RTE Event,OperationInvokedEvent 和AsynchronousServerCallReturnsEvent 。
Client-Server Interface
Server是提供服务的一方,Client是请求服务的一方,Client-Server接口中的元素是操作(Operation),为了方便理解我们可以认为是函数调用的关系,AUTOSAR中给出了一个简单的同步请求的例子,作为客户端的无线密钥处理模块(WirelessKeyHandling)通过通信系统向加密模块请求解码加密的无线密钥数据,具体如下图所示
OperationInvokedEvent
在Client-Server接口定义时,会设置Operation函数的参数和返回值,这个过程只是在声明一个接口类,Operation的实现需要依赖SWC内部的Runnable Entity,OperationInvokedEvent就是用来触发Operation关联的这个Runnable Entity。一个特定OperationInvokedEvent只能和一个CS的Operation关联。OperationInvokedEvent关联的Client端如果采用的是同步请求的方式,OperationInvokedEvent不需要映射到具体的TASK,只需要在调用的上下文执行即可。
AsynchronousServerCallReturnsEvent
在CS接口异步通信的方式中会使用该事件,异步通信的方式客户端只是发起请求,不管Server端是否马上响应,程序不会阻塞在调用的地方而是继续运行。Server端处理完客户端的异步请求后,通过AsynchronousServerCallReturnsEvent通知客户端其已经处理结束。采用异步通信的SWC,Server SWC内部的Runnable需要映射到特定的Task。
在异步通信的过程中,AsynchronousServerCallReturnsEvent具体实现可以直接触发一个Runnable运行也可以触发一个RTE Event, Client SWC的内部等待这个RTE Event的到来。
Example
/* Client SWC */
void RE_Client_func (void)
{
...
/* Trigger AsynchronousServerCall */
Rte_Call_XXX ();
/* wait event from the server*/
WaitEvent(Event_Asy_Call);
...
}
/* Server SWC*/
void RE_Server_func(void)
{
...
/* do something*/
/*trigger the event to client swc*/
SetEvent(Event_Asy_Call);
...
}