所处架构位置
后面专门出一篇讲架构的,这里先看RTE所在位置,它相当于是中间层,链接APP和BSW。
SWC通过task mapping到ECU里面。
functionality提供通讯服务。
这里我们看到RTE提供的通讯:SWC和SWC之间,SWC和BSW之间。
RTE生成依据
需要将下图两个runnable,AP_Init和AP_Dim映射到OS Task里面,依靠RTE来配置触发event运行,AP_Init是start触发,AP_Dim是read触发。
RTE里面有个执行表格来task调度,也要配置OS,包括task/event/alarm。
所以RTE完全是根据SWC和BSW生成的,如果有改变,RTE就需要重新生成。
譬如在这里,RTE根据各个模块生成的接口如下图,port其实是RTE提供的。
RTE触发runnable方式
有下列几种方式:
Init只会在开始的时候触发一次
TimingEvent定时触发
DataReceivedEvent(S/R)接收到数据触发
DataReceiveErrorEvent(S/R)接收到数据错误触发,譬如信号丢失
DataSendCompletedEvent(S/R)数据发送完成触发
OperationInvokedEvent(C/S)操作触发
AsynchronousServerCallRetÃrnsEvent(C/S)异步回调返回触发
ModeSwitchEvent和ModeSwitchAckEvent在ECU模式管理模块里面用到,跳转模式的时候触发。
ExternalTriggerOccurredEvent在另一个SWC的runnable里面触发,没有数据传输
InternalTriggerOccurredEvent在同一个SWC的runnable里面触发,没有数据传输
BackgroundEvent优先级很低的触发
对应的就是达芬奇的develop里面的配置
RTE接口
生成SR接口和SC接口,通过BSW的COM模块实现不同ECU之间的内部通讯。
其他特征:
确保数据一致性,支持复杂数据类型,一种类型实例化多个对象。
举一个实际例子,RTE触发了ECU1里面的runnable,调用Rte_Write_<Port>_<Data>()接口传到BSW层的COM模块,COM层调用Com_Sendsignal()发送数据到总线上。这时候ECU2接收到数据,COM层调用Com_ReceiveSignal()传给上面,RTE接收到数据后调用runnable2里面的Rte_Read_<Port>_<Data>()接口来把数据接收上来。
Sender/Receiver传输
Direct模式
操作都是最后的一个数据,使用RTE提供的buffer,支持1对多的传输,操作接口也是一样的。
缺点就是确定不了是谁的数据,这时候就带出了Buffered模式。
Buffered模式
该模式虽然也是操作最后一个数据,但是它在写入的时候指定了由谁来读取,转移到全局buffer里面,保证中间传输过程当中不会被修改,读写两方是确定的。它处理的接口会多一个I
Queue模式
使用队列的方式来处理数据传输,从指定的接收队列里面读取,队列深度要自己配置。有polling和waiting两种方式,waiting有超时处理。返回值是队列状态,满、空、正常。
错误/无效数据元素处理
只适用于SR传输,SC是没有的。而且只能用在不使用队列的模式,也就是Direct模式或者Buffered模式。
设置无效值的接口为Rte_Invalidate_<p>_<d>()
通过判断std_ReturnType类型返回结果是否为RTE_E_INVALID
Direct模式下接口为Rte_Read_<p>_<d>()
Buffered模式下接口为Rte_Istatus_<re>_<p>_<d>()
使用的触发模式为DataReceiveErrorEvent
Client/Server传输
只能1一对一或者多对一,Client需要Server做一些事情,就会调用Server接口去操作,做完之后把结果返回给Client。可以同步或者异步调用。
接口格式如下
同步传输
Client发起调用后一直等待Server完成。
譬如RTE提供给Client调用的接口为
Std ReturnType Rte_Call_<Port>_GetTime(uint32 *hour,uint32 *minute,uint32*second)
Server的runnable为Std ReturnType GetTime(uint32 *hour,uint32 *minute, uint32*second)
异步传输
Client是不阻塞的,有polling和waiting两种模式,waiting的话就会有超时处理。
RTE提供的接口为
Std ReturnType Rte_Result_<p>_<o>([IN/OUT | OUT<param 1>]..[IN/OUT IOUT’<param n>])
这时候就是使用AsynchronousServerCallRetÃrnsEvent(C/S)异步回调返回触发方式。
RTE保护数据一致性机制
这里只是了解一下,一般不需要我们配置。为了解决高优先级任务和低优先级任务共用一个资源被篡改的问题,RTE使用了两种解决方案。
EAs
全名Exclusive Areas,有个一专属区域,在enter和exit之间增加保护处理,譬如中断锁、资源分配之类的。需要的话在Configurator里面配置。
Rte_Enter_<name>();
/*protected statements*/
Rte_Exit_<name>();
IRVs
全名Inter-runnable variables,增加内部变量,通过调用接口来改变变量的值。需要的话在develop里面配置。
Rte_IrvWrite_<re>_<name>
Rte_IrvRead_<re>_<name>