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

您所在的位置:网站首页 嵌入式应用层和底层的关系 [AutoSar]RTE运行逻辑、通信逻辑与接口实现

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

2023-10-16 09:39| 来源: 网络整理| 查看: 265

文章目录 1、RTE 介绍2、具体实现1)RTE 事件触发Runnable2)通讯2.1 Sender-Receiver(S/R方式)2.2 Client-Server(C/S方式) SWC内部通信ECU和ECU之间通讯 生成阶段参考

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 ],…[IN/OUT | OUT ]) 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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3