网站常用布局方法,安装wordpress到服务器,wordpress 主题函数生成,沈阳网红基础软件往往需要建立一些“代理”SWC来完成一些驱动的抽象工作#xff08;Complex_Device_Driver_Sw或者Ecu_Abstraction_Sw等#xff09;#xff0c;或建立Application Sw Component来补齐基础软件需要提供的功能实现。当面对具体的项目时#xff0c;基础软件开发人员还可… 基础软件往往需要建立一些“代理”SWC来完成一些驱动的抽象工作Complex_Device_Driver_Sw或者Ecu_Abstraction_Sw等或建立Application Sw Component来补齐基础软件需要提供的功能实现。当面对具体的项目时基础软件开发人员还可能需要建立一些Application Sw Component来实现一些板级功能要求诸如系统软/硬件状态管理存储管理特殊的通信协议适配等功能。 本文从创建软件组件讲起并针对软件组件中的常用功能以实例为基础进行了详尽的说明帮助读者能够使用ISOLAR这个工具建立并使用SWC。在为应用层补齐必要的SWC之后还能在符合AUTOSAR架构的工程中在RTE之上添加一部分“手写代码”实现逻辑。 目录
创建软件组件
软件组件说明
组件内部行为
组件端口
组件运行实体
组件事件
组件代码生成
基础软件常用“代理”SWC
CDD
IOAbstraction
Diagnosis
State_Management
Memory_Management
XXX_Protocol
XXX_Supplemented 创建软件组件
首先我们通过ISOLAR-AB新建SWC。打开ISOLAR-AB之后在AR Explorer页签下的Software中的Components右键新建SWC如下图所示下图建立的是应用SWC。 软件组件取名为Test3并为其新建一个arxml。 完成之后即可以在Components下看到这个新建的SWC。 如果后期需要将arxml移动位置以方便管理工程文件可以利用虚拟文件功能我这里在工程目录外先新建一个ASW文件夹然后把Test3.arxml剪切进去然后再ISOLAR中的Filesystem Navigator中的工程名中右键选择Import。 然后选择File System。 然后将ASW加入到工程目录中如下图。 最后可以看到ASW被添加到了Filesystem中且Compoments中也有了这个软件组件在之前的剪切工作之后Refresh之后组件就会在Compoments消失添加完这个路径之后又会再有。 当然最直接的方式是直接在工程目录下粘贴一个空的SWC模板如下。
?xml version1.0 encodingUTF-8?
AUTOSAR xmlnshttp://autosar.org/schema/r4.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://autosar.org/schema/r4.0 AUTOSAR_00044.xsdAR-PACKAGESAR-PACKAGESHORT-NAMETest3/SHORT-NAMEELEMENTSAPPLICATION-SW-COMPONENT-TYPESHORT-NAMETest3/SHORT-NAMEADMIN-DATASDGSSDG GIDMasterSDtrue/SD/SDG/SDGS/ADMIN-DATA/APPLICATION-SW-COMPONENT-TYPE/ELEMENTS/AR-PACKAGE/AR-PACKAGES
/AUTOSAR 软件组件说明
组件内部行为
这个容器包含了软件组件除了Ports之外的Runnables、OperationlnvokedEvent和TimingEvent等软件组件的组成部分。右键当前的SWC进行创建创建方法如下图。 组件端口
软件组件的端口按方向分为PPortsRPorts等在建立Ports的时候需要选择对应的接口这样在系统连接的时候就能根据同一接口下的两个P/Rport进行连接并且在Runnables中就可以根据接口中VDP或者CSO的添加Access Points以及Server Call Points。下图建立一个S/R类型的RPorts他会包含VDP用于在两个组件间传递数据关系。 下图在建立一个C/S类型的Rports接口包含CSO用于提供服务函数的调用关系。 最后建立一个C/S类型的Pports后边我们需要实现这个服务供别人调用。 Port的名称可以根据表意需要进行修改。 组件运行实体
组件运行实体可以完成一对多的访问多个接口的VDP或者CSO的访问。
下面首先建立第一个运行实体完成对之前建立Rport的VDP读取。 要完成对之前建立Rport的VDP读取还需要添加Access Points。添加时每一个接口下边的VDP都有一下三种不同的添加方法DataReadAccess、DataReceivePointByArguments和DataReceivePointByValues。 要理解这三种访问的不同我们先回顾一下AUTOSAR对显性和隐性访问的区别。隐性方式不直接操作数据在进入runnable之前RTE为数据建立副本Rte_Rx_xxx在runnable运行结束之后RTE把副本数据拷贝到实际数据Rte_ImplicitBufs.isa_CoreX_XX.Rte_CoreX_OsTask_ASW_XXms.sbufXXX.value中。而显性方式直接访问数据Rte_ImplicitBufs.isa_CoreX_XX.Rte_CoreX_OsTask_ASW_XXms.sbufXXX.value。隐性方式适用于有一致性要求的数据组显性方式适用于实时性要求高的数据。
DataReadAccess这种数据访问方式会直接访问实际数据RTE生成的宏定义直接对应实际数据。DataReceivePointByArguments与DataReceivePointByValues则同属于隐形方式不同的是DataReceivePointByArguments访问方式需要传递一个变量地址RTE将数据回填到这个地址下的变量DataReceivePointByValues访问方式为宏定义直接对应副本数据Rte_Rx_xxx。
我们再建立一个运行实体用于调用之前建立的Rport中的CSO。建立的方式一般分为同步调用和异步调用我们一般选择同步调用。这里简单回顾一下他们的区别在同步通信中输入和输出可以同时存在。而在异步通信中调用Rte_Call时输出参数应该被省略需要使用Rte_Result来获取输出结果。 最后我们再建立一个运行实体用于再Events中跟C/S类型的Pports进行绑定。 组件事件
所有的Runnables都需要对应一种事件我们首先新建两个TimingEvent把刚才访问数据与调用接口的两个Runnable与一个1秒周期事件绑定。 然后我们新建一个OperationinvokedEvent事件并将刚才建立的C/S类型的Pports中的名称为Start的CSO进行绑定。 组件代码生成
右键组件选择生成代码如下图。 选择一个.C文件对应一个组件所有Runnables也可以一个Runnables对应一个.C文件。 选择生成目录以及填写文件名称。 最终生成的代码如下。用户可以在这个模板基础上根据获取的数据进行逻辑判断运算并输出数据也可以通过不同的参数调用别的SWC提供的函数或者提供根据不同入参执行不同逻辑的函数原型供别人调用。
/* ****************************************************************************** BEGIN: Banner*-----------------------------------------------------------------------------* ETAS GmbH* D-70469 Stuttgart, Borsigstr. 14*-----------------------------------------------------------------------------* Administrative Information (automatically filled in by ISOLAR) *-----------------------------------------------------------------------------* Name: * Description:* Version: 1.0*-----------------------------------------------------------------------------* END: Banner******************************************************************************* Project : TestCsdn* Component: /Test3/Test3* Runnable : All Runnables in SwComponent****************************************************************************** Tool Version: ISOLAR-AB 4.0.2* Author: geekl* Date : 星期六 一月 11 18:20:13 2025****************************************************************************/#include Rte_Test3.h/*PROTECTED REGION ID(FileHeaderUserDefinedIncludes :RunnableEntity_77_func) ENABLED START */
/* Start of user defined includes - Do not remove this comment */
/* End of user defined includes - Do not remove this comment */
/*PROTECTED REGION END *//*PROTECTED REGION ID(FileHeaderUserDefinedConstants :RunnableEntity_77_func) ENABLED START */
/* Start of user defined constant definitions - Do not remove this comment */
/* End of user defined constant definitions - Do not remove this comment */
/*PROTECTED REGION END *//*PROTECTED REGION ID(FileHeaderUserDefinedVariables :RunnableEntity_77_func) ENABLED START */
/* Start of user variable defintions - Do not remove this comment */
/* End of user variable defintions - Do not remove this comment */
/*PROTECTED REGION END */
#define Test3_START_SEC_CODE
#include Test3_MemMap.h
FUNC (void, Test3_CODE) RunnableEntity_77_func/* return value FctID */
(void
)
{EcuM_ShutdownTargetType shutdownTarget1;EcuM_ShutdownModeType shutdownMode2;Std_ReturnType syncCall1;/* Local Data Declaration *//*PROTECTED REGION ID(UserVariables :RunnableEntity_77_func) ENABLED START *//* Start of user variable defintions - Do not remove this comment *//* End of user variable defintions - Do not remove this comment *//*PROTECTED REGION END */Std_ReturnType retValue RTE_E_OK;/* -------------------------------------- Data Read ----------------------------------------- *//* -------------------------------------- Server Call Point -------------------------------- */syncCall1 Rte_Call_RPortPrototype_1_GetLastShutdownTarget(shutdownTarget1,shutdownMode2);/* -------------------------------------- CDATA --------------------------------------------- *//* -------------------------------------- Data Write ---------------------------------------- *//* -------------------------------------- Trigger Interface --------------------------------- *//* -------------------------------------- Mode Management ----------------------------------- *//* -------------------------------------- Port Handling ------------------------------------- *//* -------------------------------------- Exclusive Area ------------------------------------ *//* -------------------------------------- Multiple Instantiation ---------------------------- *//*PROTECTED REGION ID(User Logic :RunnableEntity_77_func) ENABLED START *//* Start of user code - Do not remove this comment *//* End of user code - Do not remove this comment *//*PROTECTED REGION END */}#define Test3_STOP_SEC_CODE
#include Test3_MemMap.h
#define Test3_START_SEC_CODE
#include Test3_MemMap.h
FUNC (Std_ReturnType, AUTOMATIC) RunnableEntity_F001_func/* return value FctID */
(VAR(Dcm_OpStatusType, AUTOMATIC) OpStatus,CONSTP2VAR(Dcm_StartDataOut_DcmDspRoutine_F001_DcmDspStartRoutineOutSignalType, AUTOMATIC, RTE_APPL_DATA) DataOut_DcmDspStartRoutineOutSignal,CONSTP2VAR(Dcm_NegativeResponseCodeType, AUTOMATIC, RTE_APPL_DATA) ErrorCode
)
{/* Local Data Declaration *//*PROTECTED REGION ID(UserVariables :RunnableEntity_F001_func) ENABLED START *//* Start of user variable defintions - Do not remove this comment *//* End of user variable defintions - Do not remove this comment *//*PROTECTED REGION END */Std_ReturnType retValue RTE_E_OK;/* -------------------------------------- Data Read ----------------------------------------- *//* -------------------------------------- Server Call Point -------------------------------- *//* -------------------------------------- CDATA --------------------------------------------- *//* -------------------------------------- Data Write ---------------------------------------- *//* -------------------------------------- Trigger Interface --------------------------------- *//* -------------------------------------- Mode Management ----------------------------------- *//* -------------------------------------- Port Handling ------------------------------------- *//* -------------------------------------- Exclusive Area ------------------------------------ *//* -------------------------------------- Multiple Instantiation ---------------------------- *//*PROTECTED REGION ID(User Logic :RunnableEntity_F001_func) ENABLED START *//* Start of user code - Do not remove this comment *//* End of user code - Do not remove this comment *//*PROTECTED REGION END */}#define Test3_STOP_SEC_CODE
#include Test3_MemMap.h
#define Test3_START_SEC_CODE
#include Test3_MemMap.h
FUNC (void, Test3_CODE) RunnableEntity_88_func/* return value FctID */
(void
)
{boolean iRead1;/* Local Data Declaration *//*PROTECTED REGION ID(UserVariables :RunnableEntity_88_func) ENABLED START *//* Start of user variable defintions - Do not remove this comment *//* End of user variable defintions - Do not remove this comment *//*PROTECTED REGION END */Std_ReturnType retValue RTE_E_OK;/* -------------------------------------- Data Read ----------------------------------------- */iRead1 Rte_IRead_RunnableEntity_88_RPortPrototype_0_VDP_boolean();/* -------------------------------------- Server Call Point -------------------------------- *//* -------------------------------------- CDATA --------------------------------------------- *//* -------------------------------------- Data Write ---------------------------------------- *//* -------------------------------------- Trigger Interface --------------------------------- *//* -------------------------------------- Mode Management ----------------------------------- *//* -------------------------------------- Port Handling ------------------------------------- *//* -------------------------------------- Exclusive Area ------------------------------------ *//* -------------------------------------- Multiple Instantiation ---------------------------- *//*PROTECTED REGION ID(User Logic :RunnableEntity_88_func) ENABLED START *//* Start of user code - Do not remove this comment *//* End of user code - Do not remove this comment *//*PROTECTED REGION END */} 基础软件常用“代理”SWC 基础软件建立SWC的需要主要来自于以下三个方面
首先就是loAbstraction和CDD的需要前者需要建立的是Ecu Abstraction的SWC它为ECU内部的IO资源提供抽象供其他应用SWC使用而后者需要建立的是Complex Device Driver 的SWC它为片外的芯片驱动功能提供抽象提供Port口以让其他SWC使用片外芯片功能 。这两种“代理”SWC都是符合AUTOSAR架构的往往都是必须的涉及的“手写代码”仅要求能够正确使用CDD和ECU驱动对外API即可。其次就是为某些基础软件做一些必要的扩展比如常见的针对诊断我们需要实现软/硬复位以及跳转到Bootloader的实现还包括例Routines的实现等等这些也往往都是必须的涉及的“手写代码”往往相对简单。最后是那些因为项目上进度或者人员配置的特殊性实现的诸如Tbox协议等特殊协议适配或是针对某些基础软件组件做一些功能扩展或者“补丁”诸如通信或硬件状态管理等。这部分往往会跟着不同的项目有所差异且需要“手写”逻辑代码。
下图是一个项目涉及中基础软件涉及的常用“代理”SWC脑图。 因为这些SWC往往会根据不同的项目有很大的不同下面我们针对这些常见的SWC进行一些概括性的分析。 CDD
CDD对应的SWC在ISOLAR中以Complex_Device_Driver_Sw_Component_Type建立。它主要包含C/S与S/R类型的Pports。前者用于应用层组件使用复杂驱动的APIs控制片外板载芯片完成动作例如驱动高驱开关打开/关闭抑或是驱动射频完成无线信号发射后者则向应用层传递当前片外板载芯片采集的信息诸如六轴加速度若应用层需要实时获取采集信息则还是使用C/S类型的Pports需要使用ADP为OUT这样采集的信息可以回填到调用函数传入的不同数据类型的指针中。这里组件涉及的API仅仅是用于与应用层在实现ECU功能相关的API有很多CDD甚至都不需要与应用层有交集诸如电源芯片或者收发器的复杂驱动。PS. 这里针对获取传感器的组件也可以专门建立类型为Sensor_Actuator_Sw_Component_Type来区分。 IOAbstraction
IOAbstraction对应的SWC在ISOLAR中以Ecu_Abstraction_Sw_Component_Type建立。它同样主要包含C/S Pports。主要用于对板子内部的GPIO、PWM、ADC、ICU等芯片的IO口进行控制和信息读取控制时接口内包含的ADP为IN采集时ADP为OUT对实时采集要求不高的也可以使用S/R类型的Pports周期往应用层传。这块各个项目都比较常见就不赘述了。 Diagnosis
Diagnosis对应的SWC在ISOLAR中以应用软件组件创建即可其内容主要包括
DCM的软/硬重启JumpToBootloader等状态API实现。各个DcmDspRoutine的API实现。DcmDspDataReadFnc与DcmDspDataWriteFnc等Did相关函数实现。DEM故障事件SetEventStatus调用。DcmDspSecurityCompareKeyFnc与DcmDspSecurityGetSeedFnc等安全等级相关函数实现。 State_Management
State_Management对应的SWC在ISOLAR中以应用软件组件创建即可其内容主要包括
休眠唤醒相关状态管理休眠部分根据应用层传入的标志位与唤醒源进行综合判断确定进入唤醒之后进行通知BswM走休眠流程。唤醒部分若硬件实现则不需要软件接入若软件实现Polling模式则休眠流程会最终走到循环判断唤醒源代码处若唤醒源有效则通知BswM走唤醒流程。指示灯管理根据当前软硬件状态控制板载指示灯进行不同频率的闪烁方便做目测故障排查。通信管理 CAN节点丢失根据报节点中对应报文中信号的ComTimeoutNotification来判断节点是否丢失需要根据丢失的次数与丢失与恢复时间阈值判断CAN节点状态。CAN通道状态通知从CanSM中获取通道BussOff状态并向上位机通知。硬件状态管理管理片内IP核与片外芯片状态机完成故障上报与故障尝试恢复功能并回读接插件部分引脚状态做故障管理。软件状态管理管理当前MCU使用率以及任务执行耗时情况管理当前软件状态并在出现死机等异常时保护现场至预留的存储区。 Memory_Management
Memory_Management对应的SWC在ISOLAR中以应用软件组件创建即可第一需要完成NvM_Block的读写操作避免应用层在运行期间对Flash的频繁操作。第二需要完成基于FlashLoader等Dflash驱动对Dflash按照需要进行读写操作完成参数的安全存储与读取。 XXX_Protocol
基于COM传上来的信号内容完成对手件私有协议的适配包括鉴权等工作然后将有效信息传递给应用层然后根据应用层下发的信息进行私有协议的适配然后再通过COM发送出去。 XXX_Supplemented
这里就涉及到一些组件的“补丁”工作。例如有的时候导入的DBC计算方法失效就不直接把COM上的系统信号与应用层进行连接而是做个SWC先把系统信号接过来做了特殊的计算方法之后再上传到应用层。又诸如诊断不是在这个CAN通道做的但是想实现读取VIN码的功能可以在这个CAN通道上将诊断报文接过来进行相应的处理和响应涉及到接到请求然后发送首帧接到流控帧然后发送连续帧的过程实现 十六宿舍 原创作品转载必须标注原文链接。 ©2023 Yang Li. All rights reserved. 欢迎关注 『十六宿舍』大家喜欢的话给个更多关于嵌入式相关技术的内容持续更新中。