>>>点我返回《AUTOSAR专栏》目录
目录
- 回顾Client-Server通信的特点
- 同步调用
- 异步调用
- 同步和异步达芬奇工具中的体现
1. 回顾Client-Server通信的特点
- 支持多对1的调用(n:1),多个模块调用1个函数
- 客户端(client)调用服务端(Server)的Runable
- 同步和异步两种方式都支持
- Server Runable要么运行在Task上下文(在另外一个task中运行),要么运行在调用上下文(Server Runable跟调用者在同一个task)
2. 同步调用
- 等待Server的响应,这时候Client是阻塞的,没有继续运行
- Server的返回结果,通过OUT(输出型参数返回给Client)
调用接口:
1 2 3 4 5 6 | Std_ReturnType Rte_Call_<p>_<o>( IN | IN/OUT | OUT <param_1>, IN | IN/OUT | OUT <param_2>, IN | IN/OUT | OUT <param_3>, ... IN | IN/OUT | OUT <param_n> ) |
代表Operation,操作的意思。
举个例子:
Client要调用Server端的GetSeed()函数获取车速
Client端:
1 | Std_ReturnType Rte_Call_<p>_GetSpeed(uint32 *Speed) |
Server端:
1 | Std_ReturnType GetSpeed(uint32 *Speed) |
3. 异步调用
-
Client不会阻塞等Server的结果,而是继续运行、
-
Client通过调用另外一个函数获取Server的结果,另外一个函数可以选择等待,并且也可以选择有超时处理,还可以Server运行完了,然后通知Client端的Runable。
轮询:轮询或者等待,注意这里的等待区分和同步的阻塞的区别,是调用获取Server执行后的结果函数的等待。
超时:时间到了去读取Server的结果,对Client端来说,是主动性质的。
通知:Server执行完了,产生事件触发Client的Runable去读取结果,这种对Client端来说,是被动性质的。
获取Server结果函数如下:
1 2 3 4 5 6 | Std_ReturnType Rte_Result_<p>_<o>( IN | IN/OUT | OUT <param_1>, IN | IN/OUT | OUT <param_2>, IN | IN/OUT | OUT <param_3>, ... IN | IN/OUT | OUT <param_n> ) |
举个在Runable中调用的例子
1 2 3 4 5 6 7 8 9 | Ruanble1() { uint32 speed; Rte_Call_<p>_GetSpeed(); //可以做其它的事情 //最后调用下面这个函数获取Spped的结果 speed = Rte_Result_GetSpeed_Speed() } |
4.在Davinci工具中的体现
1)同步
在Port Access中设置,选同步的时候,watting是灰色的
生成的接口如下:
1 2 3 4 5 6 | Client/Server Interfaces: * ========================= * Server Invocation: * ------------------ * Std_ReturnType Rte_Call_GetAngle_Angle(uint8 angle) * Synchronous Server Invocation. Timeout: None |
2)异步
异步,结果轮询
生成的代码如下:
1 2 3 4 5 6 7 8 | * Server Invocation: * ------------------ * Std_ReturnType Rte_Call_GetAngle_Angle(uint8 angle) * Asynchronous Server Invocation * * Server Result: * -------------- * Std_ReturnType Rte_Result_GetAngle_Angle(void) |
异步等待设置20ms超时
1 2 3 4 5 6 7 8 9 10 11 | * Client/Server Interfaces: * ========================= * Server Invocation: * ------------------ * Std_ReturnType Rte_Call_GetAngle_Angle(uint8 angle) * Asynchronous Server Invocation * * Server Result: * -------------- * Std_ReturnType Rte_Result_GetAngle_Angle(void) * Blocking Result. Timeout: 20ms |
>>>点我返回《AUTOSAR专栏》目录
扫描下方的二维码关注“汽车软件攻城狮”可第一时间获取更新!