尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AUTOSAR学习笔记(2)--RTE层(实时运行环境)

AUTOSAR学习笔记(2)--RTE层(实时运行环境) 下面这篇文章 是我对AUTOSAR-RTE 的一些总结RTE是什么RTE就是AUTOSAR架构的中枢神经所有的SWC信号都要通过RTE才能进行交互。比如上一个笔记中写到 S/R;C/S接口 读写数据 执行操作 都是在RTE中去实现的。RTE就像一个转接员或者中转站就像我上一个笔记提到的 os调度task然后RTE检测到信号 SWC去执行RTE的作用1.RTE的管理数据在RTE中无论是什么接口通信格式都是标准化的写数据接口:Rte_Write_Port_Data;读数据接口:Rte_Read_Port_Data;调用服务接口:Rte_Call_Port_Operation;由OS系统触发Task 然后通知 RTE RTE触发执行SWC所有 SWC 都遵循同一套 RTE 接口规则不同厂商开发的 SWC 能无缝对接比如博世的诊断 SWC 能和大陆的控制 SWC 通信这就让不同SWC解耦了2.RTE对Runnable的管理功能我们上一个笔记提到了OS 触发 Task 然后RTE检测 触发相应的RunnableOS只负责调度Task 它并不知道要调用哪个Runnable 就像定时器内设置Flag一样我这里只做基础的概述 后续内容会继续讲到。所以RTE就是对Runnable的唤醒和触发我用STM32裸机开发的代码为大家简单介绍一下uint8 flag_100ms 0; void TIM_IRQHandle() { if(TIM_GetITStatus(TIM1, TIM_IT_Update) ! RESET) { flag_100ms 1; // 置 flag标记“该执行100ms任务了” TIM_ClearITPendingBit(TIM1, TIM_IT_Update); } } //对应SWC runnable函数 读取RTC S/R接口 与os100ms Task绑定 uint8 Runnable_Get_Speed_100ms() { uint8 speed; speed Rte_ReadSpeed(); return speed; } while()//对应RTE 环境 { if(flag_100ms) { Runnable_Get_Speed_100ms(); flag_100ms 0; } }这就相当于SWC 的runnable 被 RTE管理了 没有RTE环境 runnable的task即使被 os触发了依旧不会触发3.RTE对Runnable的支撑这个我就不多说了没有RTE就不会执行Runnable4.RTE对Ports的支撑1.S/R C/S 接口的通信实现2.通过COM实现 不同ECU之间的通信3.实现数据的一致性不同的SWC同时操作同一个数据时可能会导致数据发生篡改当具有数据写入SWC1的某一个数据 通过Provide Port写入RTE后其他的只有数据读出SWC必须通过 Receiver Port读取这一点很关键 这是 RTE-PORT 强制的约束流程Runnable与S/R(存在于RTE层内)接口交互的不同方式1.直接调用(Direct)S/R接口相当于一个全局变量 但是我们的Runnable不能直接篡改必须经过RTE对这个全局变量进行写入Provide Runnable通过Rte_Write 对 S/R接口进行数据写入RTE 完成权限 / 数据校验、双缓冲区同步后存入专属存储区Receiver Runnable 通过 Rte_Read读取数据保证数据的完整性这里我自己写两个AUTOSAR规定 RTE 接口函数 Func(std_returntype)Rte_Read_SpeedPort(); Func(std_returntype)Rte_Write_SpeedPort();2.缓存调用(Buffered)相当于赋值把speed变为局部变量 这时候假如全局变量local被修改了依旧不影响局部变量的计算我继续写参考代码方便理解 void Runnable_Buffered() { uint8 speed; speed Rte_Read_SpeedPort(localSpeed); Rte_Write_SpeedPort(speed); }这个图片可能有点偏差在Autosar架构中 Senter数据是通过RTE写入ComBuffer的这里Autosar手册没有显示可能是Rte复用了Com Buffer那么肯定会有人疑惑这两个操作S/R接口 不都是对 地址进行读写吗有什么区别。这也是我疑惑的一点我在查找相关资料之后总结出一个原因:Direct是实时传输要求延时极低像传输300里加急的信号在Direct方式下,数据在传输的时候有可能会遇到 runnable发送方Senter Port再写数据的时候接收方Receiver 会直接进行数据传输直接读 S/R Port源地址如果读取的时候Senter在写就会导致内存数据冲突。假如S/R port只有2个字节的数据第一次Data10x1818;此时直接触发中断 Receiver直接接收数据0x1818;但是在读的过程中Senter继续触发中断写入 data可能就变了 我们的原始数据就变了 此时就是两个runnable抢占中断资源无论哪一方优先级高都会导致两个runnable抢占一个共享内存导致出错。因此Autosar规定了Direct做Data Consistency(也就是上面提到的数据一致性)检验防止读的时候写写的时候读。而Buffer则是通过RTE存入ComBufferCom模块缓冲区其实Direct模式下 Senter发送的数据也是进入ComBuffer 但是Receiver直接读因此不产生缓冲区内存占用。而在Buffer模式下Senter发送的数据 写入S/R接口存入ComBuffer由OS调度规定了Receiver什么时候接收接收方不能直接读取源地址。为什么要多一个临时变量呢因为在Buffered模式下发送方Senter在给S/R口写数据的时候可能会被其他优先级更高的打断数据错误从而要把数据读出来放到临时变量的空间去中断结束后在进行操作假如没有局部变量 我需要将车速原始值10 假如由SWC2的Runnable提供车速S/R接口 Func(std_returntype)Rte_Buffered_Write_SpeedPort() { Rte_Write(Ret_Read_SpeedPort()10); //此时如果优先级更高的抢占进来 会导致写入的数据异常 从而存到ComBuffer的数据不是我们想要的数据 return E_OK } 这是加了局部变量的 Func(std_returntype)Rte_Buffered_Write_SpeedPort() { uint8 v_speed Rte_Read_SpeedPort(); //此时如果优先级更高的抢占进来 也不会影响我们的逻辑 v_speed10; Rte_Write(v_speed); return E_OK }这就是我对于这个的理解对于CS接口 我打算在下一个笔记做出总结参考文献AUTOSAR中文手册
返回列表