编辑推荐: |
本文主要介绍了RTE运行逻辑、通信逻辑与接口实现相关内容。希望对你的学习有帮助。
本文来自于CSDN,由火龙果软件Linda编辑,推荐。 |
|
1、RTE 介绍
1)RTE是AutoSAR虚拟功能总线(Virtual Function
Bus,VFB)的接口的实现,它为应用程序软件组件之间的通信提供了基本的服务,同时也便于访问包含OS的基本软件组件
2)提供基础的通信服务,支持AutoSAR的软件组件间、基础软件间、软件组件与基础软件之间的通信
3)从逻辑上RTE可以分为两部分:
软件组件间的通信
软件组件的调度
2、具体实现
1)RTE 事件触发Runnable
AutoSAR SWC不能直接访问OS,在AutoSAR应用程序中没有TASK的概念,取而代之的是被RTE所管理的构件运行体,即Runnable。但实际code中还是沿用了task形式,具体可以查看rte.c
定时器event:设定一个个周期定时器,如1ms,2ms,10ms,20ms登,时间到了触发。
FUNC(Std_ReturnType, RTE_CODE) Rte_Start(void)
{
... ...
/* activate the tasks */
(void)ActivateTask(App_Task);
(void)ActivateTask(Task10ms);
(void)ActivateTask(Task1ms);
(void)ActivateTask(Task20ms);
... ...
//设置定时alarm,1ms, 2ms, 10ms ... ...
(void)SetRelAlarm(Rte_Al_TE_Task1ms_0_1ms, RTE_MSEC_SystemTimer(0) + (TickType)1, RTE_MSEC_SystemTimer(1));
(void)SetRelAlarm(Rte_Al_TE_Task2ms_0_2ms, RTE_MSEC_SystemTimer(0) + (TickType)1, RTE_MSEC_SystemTimer(2));
(void)SetRelAlarm(Rte_Al_TE_App_AppRunnable, RTE_MSEC_SystemTimer(0) + (TickType)1, RTE_MSEC_SystemTimer(10));
... ...
}
//RTE controlled tasks
//App_Task
TASK(App_Task)
{
EventMaskType ev;
for(;;)
{
(void)WaitEvent(Rte_Ev_Run_DemoApp _DemoRunnable);
(void)GetEvent(App_Task, &ev);
(void)ClearEvent(ev & (Rte_Ev _Run_DemoApp_DemoRunnable));
if ((ev & Rte_Ev_Run_DemoApp_DemoRunnable) != (EventMaskType)0)
{
/* call runnable */
AppRunnable();
}
}
}
TASK(Task10ms)
{
EventMaskType ev;
for(;;)
{
(void)WaitEvent(Rte_Ev_Cyclic_Task10ms_0_10ms);
(void)GetEvent(Task10ms, &ev);
(void)ClearEvent(ev & (Rte_Ev_Cyclic _Task10ms_0_10ms));
if ((ev & Rte_Ev_Cyclic_Task10ms_0_10ms) != (EventMaskType)0)
{
//10ms swc runnable
AppSiganlRunnable();
AppConfigRunnable();
AppInputRunnable();
... ...
}
}
|
SWCs with runnables
2)通讯
可以通过RTE接口实现SWC和SWC或者SWC和BSW直接的通讯
具体如下两种接口方式:
2.1 Sender-Receiver(S/R方式)
1、S/R方式支持1:n(即一个发送方,多个接收方),n:1(即多个发送方,一个接收方)通信
2、直接调用,实际就是相当于RTE定义了一个全局变量,swc读写此变量
3、实际流程图
4、Sender/Receiver 通信 -> 不使用队列(直接访问)
RTE直接访问数据地址
1:n通信
初始值即为默认值
适用于实时性要求高的数据
接口图
5、Sender/Receiver 通信 -> 不使用队列(缓存访问)
在进入runnable之前RTE为数据建立副本
在runnable运行结束之后RTE把副本数据拷贝到实际数据地址
在runnable运行过程中只操作副本,实际数据不会改变
适用于有一致性要求的数据组
接口图
6、Sender/Receiver 通信 -> 使用队列
“查询接收” 或 “等待接收”
RTE从队列中读取数据
等待接收” 有超时处理
2.2 Client-Server(C/S方式)
1)Client调用Server端操作
2)Server端SWC中的操作一般是runnables
3)通讯方式支持同步/异步调用
同步通信
1、等待Server 端响应(Client在等待过程中停止)
2、接口
Server runnable:void GetXXXSts(XXX);
RTE Client API:Std_ReturnType Rte_Call__GetXXXSts(XXX)
异步通信
1、Client不会停止运行 (不等待结果)
2、Client 通过Rte_Result… 获得Server端响应:Polling或waiting、超时处理
3、RTE Client API:
Std_ReturnType Rte_Result_PXXX_OXXX ([IN/OUT | OUT
<param_1>],…[IN/OUT | OUT <param_n>])
4、RTE可以通过接收到响应来激活Client端的runnable
SWC内部通信
同一个SWC内的、存在运行在不同Task上的runnable之间的通信,如何保证数据的一致性?(不同SWC之间的通信,无论是ECU内部还是ECU之间,都不会遇到这个问题,因为RTE会负责保证数据一致性)
解决办法:
1)专用区域(Exclusive Areas )
Entire block or RTE protected
Rte_Enter_name()
Rte_Exit_name()
2)内部变量(Inter-runnable variables)
Only variable protected
Rte_IrvWrite__
ECU和ECU之间通讯
跨ECU的数据传输,在runnable中使用Rte_Write__()这样的函数后,会需要走runnable
(ECU1) ->RTE (ECU1) ->BSW (ECU1) ->外部总线->BSW
(ECU2) ->RTE (ECU2) ->runnable (ECU2)
COM传输的接口函数:
生成阶段
|