汽车电子学习笔记---AutoSAR之RTE

汽车电子学习笔记—AutoSAR之RTE

- 1、概念

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直接的通讯
      具体如下两种接口方式:

      • 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从队列中读取数据
          • 等待接收” 有超时处理
          • 接口图
            在这里插入图片描述
    • 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传输的接口函数:
      在这里插入图片描述

  • 3、生成阶段
    在这里插入图片描述

  • 22
    点赞
  • 169
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值