• 469查看
  • 0回复

[Autosar] 五千字长文介绍AUTOSAR RTE功能

[复制链接]

  • TA的每日心情
    无聊
    1-7-2015 18:46
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 10-2-2025 20:10:13 | 显示全部楼层 |阅读模式

    汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


    来源:AUTOSAR_BSW02_Autosar_RTE_RTE的功能介绍(万字解读),作者一片绿叶。

    五千字长文介绍AUTOSAR RTE功能w1.jpg

    一、什么是RTE

    RTE的作用有点像一个快递中转站或者说是电话接线员(就是上个世界那种要先打电话到接线员那里,然后通过接线员转接电话线到目的地),其作用就是将一个SWC的信息通过RTE连接到其他SWC或者BSW上。且RTE具有管理这些信息的功能,比如接收的SWC正忙(您所拨打的用户正忙),那么RTE负责让发送信息的SWC等待,或者做其他处理;RTE还能触发SWC,就像是这时接收的SWC在睡觉,这时发送的SWC发信息来了,那么RTE就要把接收的SWC叫醒起床。一句话概括就是RTE提供了SWC的运行环境。二、RTE的作用

    提供跨ECU/ECU内部的通信管理。

    提供对runnable的管理功能(触发、唤醒等,简单说就是runnable需要映射到Task上运行嘛,而这个映射就是通过RTE具体实现的),之前我们不是提到了VFB(虚拟功能总线),RTE就是VFB的具体实现。
    在Vector的工具链中,RTE是自动生成的下面这种图,我们将其再做细化,就能很清楚的看出其关联关系了。这里的RTE就是统一的管理,具体那些连接时怎么连的,我们是不需要在RTE中关心的(因为AppL中配好,RTE就自动生成嘛)。
    五千字长文介绍AUTOSAR RTE功能w2.jpg
    三、RTE对Runnables的运行支撑

    1)作为运行环境的主要功能点
    五千字长文介绍AUTOSAR RTE功能w3.jpg
    通过RTE给runnable提供触发事件。之前说过了runnable是可以被触发的,就是需要通过RTE来实现这个触发和调用runnable,具体在下面讲解通过RTE给runnable提供所需资源。就是之前说的接口通信(Ports那节),将runnable需要的一些资源通过接口传输给它将BSW和SWC做隔绝。因此OS和runnables也被隔绝了,runnable的运行条件由RTE提供,不能由OS直接提供2)Runnables的触发条件RTE给runnables提供触发条件,也就是runnable在设计的时候,需要有触发条件,不然无法运行,也就没有意义了。触发条件就是一些特定的事件,AutoSAR中主要规定了以下一些触发条件(图中是DaVinci软件中的配置项,灰色是因为我没有配置,不用在意):
    五千字长文介绍AUTOSAR RTE功能w4.jpg
      初始化事件:初始化自动触发定时器事件:给一个周期定时器,时间到了就触发接收数据事件(S/R):Receiver Port 一旦收到数据,就触发接收数据错误事件(S/R)数据发送完成事件(S/R):Send Port 发送完成,就触发操作调用事件(C/S):当调用到了该函数的时候异步服务返回事件(C/S):之前说过C/S可以在异步下运行,就是说当我调用一个Server函数,但是我是异步调用的。那么该被掉函数作为一个线程和当前的运行程序并行运行,当被调函数运行结束返回(Return)的时候,这时触发异步服务返回事件模式切换事件
      模式切换应答事件
    三 RTE对Ports的支撑(上)

    1)扮演SWCs和BSW的交流途径

    还是老生常谈的那么几点:

      作为VFB的具体实现

      作为S/R接口的通信实现

      作为C/S接口的通信实现

      ECU内部通信/跨ECU(通过COM)

      实现AR-COM的回调功能,具体实现是在SWC中完成的,RTE负责完成这个回调机制

    2)其他特征

      提供了实现数据一致性的机制(所谓的数据一致性,就是说简单一点:当多个SWC同时操作同一个数据时,可能会发生一些不想看到的问题,数据一致性要求不能发生这些问题)

      支持简单和复杂的数据类型

      对SWC类型(SWC type,和SWC不同,SWC type是指SWC的一个类型,用这个类型可以实例化一个SWC,就好像用int这个类型实例化一个count一样)的实例化

    3)S/R接口的不同方式

    以下调用,在配置好Davinci后,是会自动生成到runnable上方的,可以直接复制。比如我复制了一段DaVinci生成的SWC中的代码,可以看到,其中的 Rte_ 的函数都是列出来在runnable上方的

    /**********************************************************************************************************************
    **
    Runnable Entity Name: RAB_Core0_100us
    **
    ---------------------------------------------------------------------------------------------------------------------
    **
    Executed if at least one of the following trigger conditions occurred:
    * - triggered on TimingEvent every 100us
    **
    *********************************************************************************************************************
    **
    Input Interfaces:
    * =================
    * Explicit S/R API:
    * -----------------
    * Std_ReturnType Rte_Read_AppPI_Can_ReceiverCore0_DEP_Can_Receiver(Idt_Can_Receiver *data)
    **
    Output Interfaces:
    * ==================
    * Explicit S/R API:
    * -----------------
    * Std_ReturnType Rte_Write_AppPI_Can_SenderCore0_DEP_Can_Sender(Idt_Can_Sender data, Rte_TransformerError *transformerError)
    **
    Service Calls:
    * ==============
    * Service Invocation:
    * -------------------
    * Std_ReturnType Rte_Call_ComM_UserRequest_GetCurrentComMode(ComM_ModeType *ComMode)
    * Synchronous Service Invocation. Timeout: None
    * Returned Application Errors: RTE_E_ComM_UserRequest_E_NOT_OK
    * Std_ReturnType Rte_Call_ComM_UserRequest_GetMaxComMode(ComM_ModeType *ComMode)
    * Synchronous Service Invocation. Timeout: None
    * Returned Application Errors: RTE_E_ComM_UserRequest_E_NOT_OK
    * Std_ReturnType Rte_Call_ComM_UserRequest_GetRequestedComMode(ComM_ModeType *ComMode)
    * Synchronous Service Invocation. Timeout: None
    * Returned Application Errors: RTE_E_ComM_UserRequest_E_NOT_OK
    * Std_ReturnType Rte_Call_ComM_UserRequest_RequestComMode(ComM_ModeType ComMode)
    * Synchronous Service Invocation. Timeout: None
    * Returned Application Errors: RTE_E_ComM_UserRequest_E_MODE_LIMITATION, RTE_E_ComM_UserRequest_E_NOT_OK
    **
    ********************************************************************************************************************/
    /**********************************************************************************************************************
    * DO NOT CHANGE THIS COMMENT! << Start of documentation area >> DO NOT CHANGE THIS COMMENT!
    * Symbol: RAB_Core0_100us_doc
    *********************************************************************************************************************/
    /**********************************************************************************************************************
    * DO NOT CHANGE THIS COMMENT! << End of documentation area >> DO NOT CHANGE THIS COMMENT!
    *********************************************************************************************************************/
    FUNC(void, SWCCore0Basic_Type_CODE) RAB_Core0_100us(void) /* PRQA S 0850 */ /* MD_MSR_19.8 */
    {/
    **********************************************************************************************************************
    * DO NOT CHANGE THIS COMMENT! << Start of runnable implementation >> DO NOT CHANGE THIS COMMENT!
    * Symbol: RAB_Core0_100us
    *********************************************************************************************************************/
    /**********************************************************************************************************************
    * DO NOT CHANGE THIS COMMENT! << End of runnable implementation >> DO NOT CHANGE THIS COMMENT!
    *********************************************************************************************************************/
    }

      直接调用(Direct)

    相当于有一个全局变量,runnable可以直接读写这个变量

    五千字长文介绍AUTOSAR RTE功能w5.jpg
    用的是下面的语法:(注意 <data> 和 data 的区别,带<>的是指全局data的名字,不带<>的data是局部变量的名字,这里使用指针,就是说操作的是同一个地址,没有复制使用;同时,这些函数都是在runnable中使用的,不要看是Rte,就以为是RTE中的代码,因为调用的是RTE的机制,所以这里是Rte)Std_ReturnType Rte_Read_<port>_<data> (<DataType> *data)
    Std_ReturnType Rte_Write_<port>_<data> (<DataType> data)

      缓存调用(Buffered)
    相当于将全局变量先复制到一个runnable的局部变量中,再操作这个局部变量,最后把这个局部变量再赋值到全局变量中。在runnable操作这个局部变量期间,全局变量是不会改变的。
    五千字长文介绍AUTOSAR RTE功能w6.jpg

    使用方法如下:(都是由RTE管理的,用户只需要正确调用函数就ok)

    <DataType> Rte_IRead_<r>_<port>_<data> (void)

    void Rte_IWrite_<r>_<port>_<data> (<DataType> data)

      队列调用(Queued)

    因为数据不止一个,是一组队列的数据,就像我们常用的串口FIFO。因此,可以设置循环接收或者等待接收,等待的话是有超时管理的。

    调用代码如下:

    Std_ReturnType Rte_Receive_<port>_<data> (<DataType> *data)

    Std_ReturnType Rte_Send_<port>_<data> (<DataType> data)
    4)跨ECU的方式

    假如是跨ECU的数据传输。那么,我在runnable中使用 Rte_Write_<port>_<Data>() 这样的函数后,会需要走runnable(ECU1) ->RTE (ECU1) ->BSW (ECU1) ->外部总线->BSW (ECU2)->RTE (ECU2) ->runnable (ECU2),这里也列出了用于COM传输的两个函数名:

      Com_SendSignal()

      Com_ReceiveSignal()

    四、RTE对Ports的支撑(下)

    1)C/S接口的实现

    之前在第二章AppL中讲过了C/S接口,这里再更加深入的说明一下其实现的原理:首先,C/S接口就是客户/服务接口,这个接口就是客户来调用服务端的操作的一个接口。也就是我写着写着,发现我想要调用一个函数,这个函数在其他的C文件中,就让RTE帮忙调用。还是举个例子:

    我,客户,我想要执行一个函数,这个函数写在服务端上的。由于我和服务端有隔阂(SWC之间不能直接通信),这时,我就悄悄告诉RTE,我想要执行那个函数,RTE就会帮我告诉服务端,让服务端执行该函数。

    而这里又有两种方式:异步和同步:

      同步就是说我这个人很懒,我要等服务端运行完了这个函数,RTE返回这个函数的结果后,我才开始继续我的工作;

      异步就是我这个人很勤快,我通知RTE让它帮忙告诉服务端运行函数后,我就继续干我的事了,等过一段时间后,我估摸着函数运行结束了,我再请求函数结果

    2)C/S接口的不同方式

    同步和异步调用不是通过函数区别的,这必须是事先配置好由RTE生成的,所以在Davinci中配置runnable的port时是有这个选项的(当然要C/S接口才有)

    五千字长文介绍AUTOSAR RTE功能w7.jpg

      同步调用
    从上文的例子,可以看出,同步调用其实就是我们平时调用函数是一样的,就是等同于将被调函数代码嵌入当前调用的函数代码中运行即可。
    五千字长文介绍AUTOSAR RTE功能w8.jpg
    我们也用代码实际说明一下//假如我们的被调函数是:Std_ReturnType RunnableServer(int *param)//那我们的客户中应该写的调用函数就是:Std_ReturnType Rte_Call_<Port>_RunnableServer(int *param)
    //这个param就是我们希望被调函数操作的变量
      异步调用
    异步调用相当于有两个线程,一个线程运行我们的原函数中的内容,另一个执行被调函数的内容。然后可以过一段时间去读取一下被调函数的返回结果
    五千字长文介绍AUTOSAR RTE功能w9.jpg

    而这时,如何知道被调函数是否执行完了呢?有三种方法:

      循环检测,就是在那一直等,等到返回值为止,这样的话和同步就差不多了,意义不大

      超时检测,定一个时间,时间到了就去读取,没到的时候继续运行我的程序

      事件触发,当服务函数运行结束,RTE可以触发原函数,告诉它被调函数运行完了,你可以读取返回值了

    读取函数也用代码实际说明一下

    //执行下面的函数后就能将参数返回回来了

    Std_ReturnType Rte_Result_<Port>_RunnableServer(int *param)
    五、RTE对数据一致性的管理
    1)什么是数据一致性

    引用百度百科:数据一致性,就是当多个用户试图同时访问一个数据库,它们的事务同时使用相同的数据时,可能会发生以下四种情况:丢失更新、未确定的相关性、不一致的分析和幻想读。

    说的通俗一点:就是当多个操作同时读写同一个数据的时候,很有可能出bug(实际是由于优先级的问题,可能出现我们的数据被篡改的情况,造成作者不想看到的数据结果)

    2)数据一致性的实现机制
    利用RTE管理这部分类容之前说过了,就是利用RTE来管理这里的数据,防止bug出现。比如IRead,大家都操作的是数据的备份,不直接操作原数据2、SWC内部变量这个内部变量就比较神奇了,因为它可以直接在DaVinci中配置,runnable可以直接调用,就类似于一个c文件中定义的全局变量,没有被extern出去。在c文件中定义的函数时可以直接使用的。那么这时就会出问题了,同一个c文件中的函数是可能被放在不同Task上运行的,就可能出现这些函数在同一时刻运行的状况,那么在调用这个全局变量的时候,就可能出bug。那么要如何解决呢?AutoSAR做了以下两种方式:
      EAs(Exclusive Areas,专用区域):就是下面两句代码,相当于一个关中断,调用变量的语句放在里面,运行时不能有更高级的Task打断被保护的语句
        Rte_Enter_<name>();    //这里放置被保护的语句    Rte_Exit_<name>();
      IRVs(Inter-runnable variables,跨函数变量):还是两句代码,上面的EAs是整段代码段都被保护了,而这里的两句就相当于在改变变量的时候被保护,也就是这两句话执行的时候被保护
        Rte_IrvWrite_<re>_<name>()    Rte_IrvRead_<re>_<name>()六、RTE与Interface接口

    1)Interface接口总览
    少说废话,先上图
    五千字长文介绍AUTOSAR RTE功能w10.jpg
    上图将所有的接口以及其分布的位置都详细的标识了出来,还是用的原来的那张ECU的图添加的,方便大家做对比
    七、AutoSAR接口

    一句话概括:之前说的S/R和C/S接口就是AutoSAR接口

      特征:接口函数名可变,例如之前说过的 Std_ReturnType Rte_Read_<port>_<data> (<DataType> *data) 这中形式的S/R函数,其中的 <port> <data> 就是,用户自己配置的名字,因此,这些接口的函数名都是可以改变的,但大体的形式是不变的。

      位置:SWC<>RTE、RTE<>CDD、RTE<>ECU AB(这里提一句,ECUAB之前没有讲到,其实很多的传感器、执行器都放在这里,是ECU的抽象,也是可以看作是SWC的,IoHwAb就在这里面)。说明白一点,就是

    只要能看成是SWC处理的,就是AutoSAR接口。

    八、标准接口

    一句话概括:就是AutoSAR规定的C语言API

    特征:接口函数名是固定不变的,是AutoSAR规定好的。比如:Com_SendSignal() WaitEvent() 这类都是API函数名,可以有上层调用,但是一般是使用工具配置生成的,做上层应用的一般是不用关心其具体实现的位置:第一张图中棕色的就是标准接口,说白了就是对函数API的调用。

    需要特殊说明一点的是:下图中两个红圈中的箭头,OS和COM是唯一的两个标准接口允许直接和RTE相连的。因为RTE的很多功能是需要基于这两个模块来实现的

    五千字长文介绍AUTOSAR RTE功能w11.jpg

    九、标准AutoSAR接口

    一句话概括:就是AutoSAR接口,不过名称是由AutoSAR官方规定不能修改

    特征:就是标准接口和AutoSAR接口的特征它都有一部分。首先是和AutoSAR接口一样,提供的是C/S、S/R接口;然后又和标准接口一样,函数名是不可变的。说白了就是官方规定好的C/S、S/R接口,咱们就当成是AutoSAR接口就行了,函数名字什么不用管它位置:RTE<>Services,就这么一个地方。



    本文作者:一片绿叶,欢迎关注作者的知乎,创作不易,欢迎点赞再看收藏关注!

    汽车研发交流群,有兴趣的朋友请添加群主:prOmiseyes,备注:公司+职务入群。仅限汽车从业人员。
    

    该用户从未签到

    发表于 11-3-2025 01:08:00 | 显示全部楼层
    尊敬的作者一片绿叶先生/女士:

    AUTOSAR RTE(运行时间环境)作为汽车软件的底层架构之一,其功能强大且关键。其核心作用在于建立软件组件间的通信桥梁,同时管理和调度各类信息传输。简而言之,RTE像是通信的枢纽,确保各个软件组件间的信息交互顺畅无误。其特点在于处理信息的灵活性和高效性,如遇到信息接收方忙碌时,能够智能调度发送方等待或采取其他处理方式;触发功能也可在必要时唤醒休眠的接收软件组件。该机制确保系统的协同运作,保证车辆的智能和安全性能。详细的深入解读或将在AUTOSAR RTE的深度剖析文章中得到呈现。关于您所提供的这篇关于AUTOSAR RTE的长文介绍,我们期待您为读者带来更详细的专业解析,进一步探索其深层功能与重要性。如有疑问或讨论之处,可查阅AUTOSAR官方文档或专业论坛进行交流探讨。感谢您的分享!

    [内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
    回复 支持 反对

    使用道具 举报

    

    该用户从未签到

    发表于 11-3-2025 01:08:00 | 显示全部楼层
    尊敬的作者一片绿叶先生/女士:

    AUTOSAR RTE(Runtime Environment)是汽车开放系统架构中的核心组件之一,扮演着连接和协调各个软件组件(SWC)的重要角色。其功能主要包括信息的传递、管理和触发。RTE就像一个信息中转站,负责将不同SWC间的数据和信息进行传递,确保各组件间的通信畅通无阻。同时,它还具有管理这些信息的功能,确保在接收方忙碌时做出恰当处理,如信息排队等待或采取其他措施。此外,RTE还能在接收方处于休眠状态时触发相应的SWC开始工作。总的来说,AUTOSAR RTE功能确保了车载电子系统各部分间的协同工作,为汽车提供稳定、高效的运行环境。感谢您的分享,为我们提供了深入了解AUTOSAR RTE功能的机会。

    [内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
    回复 支持 反对

    使用道具 举报

    

    该用户从未签到

    发表于 11-3-2025 01:08:00 | 显示全部楼层
    尊敬的作者一片绿叶先生关于AUTOSAR RTE功能的介绍一文极为详细和专业,为此我表示诚挚的敬意。下面是我的专业回复:

    AUTOSAR RTE(运行时环境)作为AUTOSAR架构中的关键部分,其功能是扮演一个中间媒介的角色,将SWC(软件组件)的信息通过RTE中转连接到其他SWC或BSW(基础软件)上。它的核心作用包括信息的传递与管理,确保系统的协调运作。具体而言,当某一SWC发送信息而接收方正忙时,RTE负责处理这些请求,保证信息的传递流程得以顺畅进行。此外,RTE还能触发休眠状态的SWC,确保在任何情况下系统通信的及时性。总之,AUTOSAR RTE在车辆电子系统中起到了信息桥梁的重要作用,是确保系统各部分协同工作的关键所在。感谢您的分享,为我们提供了深入了解AUTOSAR RTE功能的宝贵机会。

    后续建议可以根据文章中所述继续探讨RTE的实际应用场景、与其他模块之间的交互关系等细节问题,以便更全面地理解AUTOSAR架构中的这一核心模块。

    [内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
    回复 支持 反对

    使用道具 举报

    

    该用户从未签到

    发表于 11-3-2025 01:08:00 | 显示全部楼层
    尊敬的作者一片绿叶先生/女士:

    AUTOSAR RTE(Runtime Environment)作为汽车系统的基础软件架构中的关键部分,主要功能在于确保各个软件组件(SWC)之间信息的快速准确传输及管理系统状态。其作用如同一个高效的通讯中枢,在软件组件与基础软件之间搭建沟通的桥梁,确保信息的顺畅流通与处理。其主要功能包括以下几点:

    一、信息传递与路由。RTE负责接收并传递来自不同软件组件的信息,并根据目的地路由到其他软件组件或基础软件。

    二、状态管理。当目标软件组件忙碌时,RTE会负责接收的信息进行暂时存储,确保信息的及时准确处理或重新安排传输。如SWC接收者状态繁忙或未就绪时,RTE会负责调度和管理信息等待队列。同时,还能触发某些处于休眠状态的软件组件进行工作。此过程中涉及多种技术策略与细节设计,如信号映射、内存管理等。在AUTOSAR架构中,RTE是保障整个系统稳定高效运行的关键环节。通过专业精准的操控,确保汽车智能化和安全性不断提升。更多细节内容建议查阅AUTOSAR官方文档或专业书籍进行深入了解。如有疑问,随时交流探讨。谢谢阅读。

    [内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
    回复 支持 反对

    使用道具 举报

    
    该用户已被删除
    发表于 11-3-2025 01:08:00 | 显示全部楼层
    AUTOSAR(汽车开放系统架构)中的RTE(运行时环境)是汽车软件架构中的核心组件之一。其主要功能是实现软件组件(SWC)与基础软件(BSW)之间的通信。关于AUTOSAR RTE的详细介绍如下:

    一、什么是RTE?
    RTE,即运行时刻环境,在汽车系统中扮演着信息传递与管理的角色。它像一个信息中转站或电话接线员,连接不同的SWC和BSW,确保信息的准确传递。其主要功能包括:

    1. 信息传递:将SWC的信息传递给其他SWC或BSW。
    2. 信息管理:管理信息的传输过程,如处理接收方SWC忙碌时的情况,使发送方SWC等待或进行其他处理。
    3. 触发管理:在接收方SWC休眠时,触发其被唤醒并处理信息。

    二、AUTOSAR RTE的重要性
    RTE是AUTOSAR架构中不可或缺的部分,它确保了软件组件间的协同工作,提高了系统的可靠性和效率。同时,RTE还提供了标准化的接口,简化了软件的维护和升级。

    三、AUTOSAR RTE的具体功能

    1. 标准化接口:提供统一的接口规范,确保不同软件组件之间的互操作性。
    2. 消息传递:实现不同软件组件间的消息传递,包括状态信息、控制指令等。
    3. 状态管理:管理软件组件的状态,如启动、停止、休眠等。
    4. 错误处理:在出现错误时,进行错误识别、报告和处理。
    5. 安全性管理:确保信息传输的安全性,防止被非法获取或篡改。

    总之,AUTOSAR RTE在车辆电子系统中起到了至关重要的作用,确保了软件组件之间的协同工作,提高了系统的可靠性和效率。对于理解AUTOSAR架构和汽车软件开发来说,深入了解RTE的功能和工作原理是非常必要的。

    [内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
    回复 支持 反对

    使用道具 举报

    快速发帖

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

    GMT+8, 19-8-2025 02:19 , Processed in 0.393721 second(s), 40 queries .

    Powered by Discuz! X3.5

    © 2001-2013 Comsenz Inc.