[AutoSar]RTE运行逻辑、通信逻辑与接口实现

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传输的接口函数:
在这里插入图片描述

生成阶段

在这里插入图片描述

参考

链接:https://blog.csdn.net/weixin_42399934/article/details/106913441

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值