文章包含了AUTOSAR基础软件(BSW)中ComM模块相关的内容详解。本文从AUTOSAR规范解析,ISOLAR-AB配置以及模块相关代码分析三个维度来帮读者清晰的认识和了解ComM这一基础软件模块。文中涉及的ISOLAR-AB配置以及模块相关代码都是依托于ETAS提供的工具链来配置与生成的,与AUTOSAR规范之间可能会有些许的出入,但总体的功能要点与处理流程都应该是一致的。
ComM作为AUTOSAR提供的通信管理模块,提供了通信相关资源的管理功能。ComM模块首先管理网络连接状态,它会根据当前网络状态和模块请求情况,选择是否建立连接以及具体的连接方式。同时,当整个系统的网络状态发生变化的时候,ComM模块也会通知其他模块;ComM模块其次管理通信模式,包括全通信、只收、只发、高速和低速总线等,ComM会根据系统的实际需求和网络状况,选择合适的通信模式;ComM模块最后还会提供一些安全模式,确保系统数据安全和稳定性。例如它可以限制某些模块的网络访问权限,只允许授权的模块进行通信,防止非法侵入和数据泄露。同时,如果某个模块的通信异常,ComM也可以及时发现并进行处理,避免整个系统受到影响。
目录
AUTOSAR规范解析
概述
缩略语与概念
与其他模块的依赖
功能说明
PNC
ComM 通道状态机
时序图
发送与接收的启动(CAN)
被动唤醒(CAN)
网络关闭(CAN)
通信请求
ISOLAR-AB配置
ComM
ComMGeneral
ComMChannel
ComMUser
Components
System
RTE
代码解析
动态配置代码
集成代码
静态代码
AUTOSAR规范解析
概述
通信管理器模块(Communication Manager,ComM)是基本软件(BSW)的一个组件。它是一个针对通信的资源管理器模块,向上层提供封装了的底层通信服务控制APIs。ComM模块控制与通信相关的基础软件模块,而不是SWC(软件组件)或Runnable(可执行实体)。ComM模块从通信请求者(应用层可以是直接下发指令给ComM的模块,也可以是BswM、SWC、Runables)收集总线通信访问请求,并协调总线通信访问请求。针对不同类型的通信总线,ComM提供不同的控制访问接口。如下图所示。
ComM模块的功能目标是:
- 简化用户对不同总线的通信堆栈的使用。包括简化的网络管理处理。
- 协调一个ECU上多个独立软件组件的总线通信堆栈的可用性(允许发送和接收信号) 。用户无需知道硬件细节,例如应当使用哪个通道,只需要请求通信模式,ComM就会切换对应的通信通道状态。
- 提供一个API来禁用信号的发送,以防止ECU(主动)唤醒通信总线。在CAN上,每条消息都会唤醒总线(针对无法配置特定唤醒帧收发器),而在FlexRay上,只有通过所谓的唤醒模式才能唤醒总线的可能性。
- 通过为每个通道实现一个通道状态机来控制ECU的多个通信总线通道管理。ComM模块向相应的总线状态管理器模块请求通信模式,实际的总线状态由相应的总线的状态管理器模块控制。具体来讲就是ComM不参与具体的通信管理执行工作,只是将请求的通信模式给到CanSM或者EthSM等总线管理状态模块。
- 提供API强制让ECU进入No Communication状态。
- 通过为请求的通信模式分配所有必要的资源,简化了资源管理。例如,当用户请求“完全通信”模式时,检查是否允许通信,并防止ECU在通信期间关闭。
缩略语与概念
- BSW:Basic Software,基础软件。
- BswM:Basic Software Mode Manager,基础软件管理。
- ComM:Communication Manager,通信管理。
- DCM:Diagnostic Communication Manager,诊断通信管理。
- Det:Default Error Tracer。
- EcuM:ECU State Manager module。
- I-PDU:Information Protocol Data Unit。
- NM:Network Management。
- PDU:Protocol Data Unit。
- SW-C:Software Component。
- VMM:Vehicle Message Matrix,通信矩阵。
- DCM_ActiveDiagnostic indication:DCM模块管理当前诊断会话的状态。DCM模块会需要“full communication” = COMM_FULL_COMMUNICATION”用于诊断目的。
- Active wake-up:由ECU(例如传感器)引起的唤醒。
- Application signal scheduling:根据VMM发送应用程序提供的信号。通信模块执行CAN应用程序信号的调度,LIN接口模块执行LIN应用程序I-PDUS(包含信号的PDU)的调度,FlexRay接口模块执行 FlexRay应用程序 PDUs的调度。
- Bus sleep:无需在通信总线上进行任何活动(例如CAN bus sleep)。
- Bus communication messages:总线通信消息是指在通信总线上发送的所有消息。这既可以是诊断消息,也可以是应用消息。
- COM Inhibition status:定义是否允许完全通信、静默或唤醒。
- Communication Channel:用于将信息从发送者传送到接收者的媒介。
- Communication Mode:通信模式包含以下几种:
- “full communication” = COMM_FULL_COMMUNICATION
- “no communication” = COMM_NO_COMMUNICATION
- “silent communication” = COMM_SILENT_COMMUNICATION
- Diagnostic PDU scheduling:诊断PDU的发送。诊断模块执行CAN诊断PDU的调度,诊断模块和LIN接口模块执行LIN诊断PDU的调度,诊断模块和FlexRay接口模块执行FlexRay诊断PDU的调度。
- Fan-out:同一消息/指示被发送到多个目的地/接收者。
- Independent software component:单独开发的软件组件,用于执行一组连贯的功能,与ECU上的其他软件应用程序有最小数量的接口。这可以是基本软件组件或应用软件组件。
- Passive wake-up:由另一个ECU唤醒并传送(例如通过总线或唤醒线)至当前的ECU。
- System User:具有管理功能的用户(在ComM的内部上下文中生成的特定“用户”),用于提出默认请求并拒绝其他用户请求。
- User:EcuM和ComM模块的请求者概念。用户可以是BswM、可运行的实体、SW-C或一组 SW-C。
- User Request:用户可以从ComM请求不同的通信模式。
- Managed channel:一个通过ECUC参数ComMManageReference引用另一个ComM channel的ComM channel。
- Managing channel:一个通过ECUC参数ComMManageReference引用多个其他ComM channel的ComM channel。
与其他模块的依赖
与AUTOSAR其他模块的依赖关系如下:
下面介绍一个各个模块与ComM之间的依赖:
- RTE:每个用户都可以请求通信模式。RTE将用户请求传送到ComM模块,并将通信式指示从ComM通知到用户。
- EcuM:EcuM负责验证唤醒事件,如果唤醒被验证,则向ComM发送指示。通信的开启和关闭由EcuM和BswM共同处理。
- BswM:BswM实现了模式仲裁(Rules)和模式控制(模式对应的Action List),以允许应用层或者上下流程进行对应的模式管理。如果在Action List中配置了Com_IpduGroupControl的调用,则BswM可以控制AUTOSAR通信模块(COM)中的PDU群组的收发。
- NvM:ComM模块使用NVRAM管理器来存储和读取非易失性数据。注意需要NvM必须在上电或复位ECU后初始化,且在ComM之前初始化,因为当ComM初始化时,ComM假设NVRAM已经准备好使用,并且它可以回读非易失性配置数据。当ComM被去初始化时,它将非易失性数据写入NVRAM。
- DCM:DCM执行诊断PDU的调度。如果应执行诊断,DCM作为用户通过DCMActiveDiagnostic指示请求通信模式COMM_FULLCOMMUNICATION。
- xx State Manager:包括了具体的通信媒介的状态管理,如CanSM,LINSM, EthSM,,FrSM等,控制实际的总线状态,ComM请求xxSM进行相关的状态转换,并反应到具体总线上。
- NM:ComM模块使用NM实现对网络通信能力的同步控制(同步启动和关闭)。
- DET:DET提供用于报告开发、运行时的错误服务
- Com:AUTOSAR通信模块(COM)应使用COM信号获取PNCs的状态信息。
功能说明
通信管理器(ComM)模块简化了用户的资源管理,其中用户可以是可运行的实体、SW-C、BswM(例如通过BswM请求SW-C)或DCM(用于诊断目的的通信)。ComM应提供三种不同的通信模式,COMM_FULL_COMMUNICATION为最高的模式,COMM_NO_COMMUNICATION为最底,用户只能请求这两种模式,COMM_SILENT_COMMUNICATION只用于网络同步目的。ComM模块使用"highest wins"策略,来决定具体物理总线的通信是否对上层开放。
PNC
PNC(partial network cluster),是一些网络节点的集合。ComM为每个局部网络集群(PNC)实现一个状态机,以表示PNC的通信模式。因为工作项目里面没有使用PNC,所以下面就简单的介绍一下它的状态机。该状态机共包含 4 种状态,分别为:
- PNC_NO_COMMUNICATION
- PNC_PREPARE_SLEEP
- PNC_READY_SLEEP
- PNC_REQUESTED
状态机结构图如下:
我们要理解这个状态机,首先我们介绍两个概念:
- ERA:External RequestedArray,它只要用于网关模式,仅收集外部PNC请求的场景。网关会将外部PNC请求镜像回请求总线,同时将这个请求发送到其他的总线上。
- IRA:Internal Requested Array,代表ECU内部对于PNC状态的请求,既可以是SWC通过RTE直接请求ComM接口,或者在某种条件满足时,由BswM请求ComM接口。
通过上图可以看出,通信的开启和关闭都是由请求来驱动的,ComM根据EIRA(External Internal Request Array)来切换IPdu Group的状态。系统上电后整个PNC的状态在PNC_NO_COMMUNICATION。ComM的PNC状态机切换的事件可以来自于:
- 来自用户的请求ComM_RequestComMode()函数调用。
- 来自EcuM模块的唤醒通知ComM_EcuM_WakeUpIndication()。
- 来自Com模块的PNC值变化通知。
- ComM模块内部定时器超时事件。
下面我们来简单介绍一下PNC值变化这件事。如果主动唤醒节点直接请求FULL通信,或者作为网关节点控制的节点在收到网关下的ERA相关状态位,则直接从PNC-NO-COMMUNICATION进入到PNC-REQUESTED阶段。如果是被动唤醒的节点,则根据接收到唤醒报文中的PNC位状态切换到PNC_READY_SLEEP或者PNC_PREPARE_SLEEP,最后再由用户请求来切换到PNC-REQUESTED状态。PNC_READY_SLEEP(内部) PNC_PREPARE_SLEEP(外部)同样是准备进入休眠状态,但是来源是不一样的,所有的PNC操作都应在执行通道相关操作之前执行。
下图展示了User与PN以及Channel之间的关系。
可以从上图画×的例子看出,同一Channel不能既关联User,又关联该User下的PNC,用户想要控制总线接口,可以是从User->PNC->Channel这条线路,也可以是User->Channel。 User可以通过接口请求FULL_COM和NO_COM,此时所有该User映射的通道或PNC都会收到请求。由于一个通道或PNC可以映射多个User,因此只有当映射的所有User都请求了NO_COM时, ComM才会在该通道或PNC上禁止通信能力,否则只要有一个User请求的是FULL_COM ,ComM都会为该通道或 PNC保持通信能力。
ComM 通道状态机
状态机的整体结构如下图:
ComM总体上只提供了以下三种不同的通信模式:
我们可以由上图看出这三种状态对应的报文收发开关等特性,下面我们根据状态图中介绍这几种状态。
- COMM_NO_COMMUNICATION:上电后进入到COMM_NO_COMMUNICATION ,在该状态下具有下面两个子状态:COMM_NO_COM_NO_PENDING_REQUEST和COMM_NO_COM_REQUEST_PENDING
- COMM-NO_COM-NO-PENDING-REQUEST:在初始化完成ComM后进入该状态,该状态下总线不能进行任何的通信活动,需要等待FULL_COM请求切换状态,请求来源于用户请求User Request,DCM Notification激活对应的通道以及EcuM或者NM的Passive WakeUp通知。
- COMM_NO_COM_REQUEST_PENDING:收到FULL_COM请求后,会切换至COMM_NO_COM_REQUEST_PENDING状态,然后等待CommunicationAllowed的触发信号,只有"CommunicationAllowed=TRUE时"才能将通信模式转换为FULL_COM模式下进行数据通信,如果没有Allowed的使能,则对FULL_COM请求将不会被执行。
- COMM_FULL_COMMUNICATION:在该状态下总线可以进行正常的数据通信,而他其中包含的两个状态会根据NmVariant来变化。
- COMM_SILENT_COMMUNICATION:该状态主要用于支持NM的Sleep流程处理,是NM状态机的Prepare Sleep阶段,只有在NM进入到prepare Sleep模式下该状态才进入。
然后我们再来总结以下ComM的Channel状态机切换的原因:
- 来自User的请求ComM_RequestComMode()函数调用。
- 来自Dcm模 块的 ComM_DCM_ActiveDiagnostic()和ComM_DCM_InactiveDiagnostic()函数调用,当诊断仪与Dcm模块通信时,需要保证通道的正常可用状态,不能进入休眠。这时Dcm模块通过在适当的时机调用ComM模块的ComM_DCM_ActiveDiagnostic()来请求通道保持在FULL_COM状态。 完成诊断通信后, Dcm模块再调用ComM_DCM_InactiveDiagnostic()接口释放对通道的使用。
- 来 自Nm模块的网络状态 通 知ComM_Nm_NetworkMode()与ComM_Nm_PrepareBusSleepMode()和ComM_Nm_BusSleepMode()和ComM_Nm_RestartIndication()和ComM_Nm_NetworkStartindication()函数调用。
- 当某个通信通道发生唤醒事件后, EcuM会调用ComM_Wakeuplndication()函数通知ComM模块。该通知会作为通道正常工作的一个触发源,将该通道状态切换到FULL_COM模式。这时ComM会调用网络管理模块的Nm_PassiveStartup()唤醒网络管理模块。
- ComM模块内部定时器等
针对这个状态图,我们再单独从通信禁止的角度来聊一下通道状态切换。我们常说的通信禁止包含两个部分的内容。一种是限制通信,当通道处于 FULL_COM 模式时 ,用户可以调用 ComM_LimitChannelToNoComMode()或ComM_LimitECUToNoComMode()来强制某个通道或整个ECU所有通道进入NO_COM模式。这时ComM将忽略用户对通道的占用,调用 Nm_NetworkRelease()释放网络管理,当远程休眠条件满足时,通道将最终进入NO_COM模式。该功能称为限制通信。还有一方面是限制通信,在某些唤醒线路故障情况下,某些应用会错误地请求总线,从而错误地唤醒总线上其他ECU。我们可以通过调用ComM_PreventWakeUp()接口,忽略用户请求,从而避免系统错误。该功能称为禁止唤醒总线,这时即使有用户请求FULL_COM,该请求也会被暂时抑制。限制通信的优先级高于User对通道的请求。
DCM模块会使用某些通道作为诊断通道。它通过API激活该通道的通信能力。此时不论该通道映射的User请求何种模式,也不论该通道是否被限制通信,ComM都会为该通道保持通信能力,也就是说
DCM激活通道的优先级最高。ComM的一些配置状态和计数值可以保存到非易失存储器中,在下次上电后恢复。可以保存的内容包含:
- NoWakeup:ECU所有通道的禁止唤醒总线状态。
- EcuGroupClassification:ECU组分类。
- Inhibit counter:它记录由于系统已抑制通信模式而无法满足的用户请求数。
时序图
发送与接收的启动(CAN)
下图显示了CAN上ComM控制其他模块开始传输和接收的时序动作。对于LIN、FlexRay和以太网,只是API名称不同,行为是相同的。
被动唤醒(CAN)
下图显示了EcuM或CAN通道的Nm模块指示的唤醒后的行为,LIN、FlexRay和以太网与CAN的行为相同,只是API名称不同。
网络关闭(CAN)
下图显示了关闭CAN网络可能路径,它可以在最后一个用户释放COMM_FULLCOMMUNICATION请求时启动,或者COMM_LimitchannelToNocomMode()被调用。对于LIN、FlexRay和以太网,只是API名称不同,行为是相同的。
通信请求
下图显示了在CAN上启动COMM_FULL_COMMUNICATION的两种情况,一种为用户请求COMM_FULL_COMMUNICATION,另一种为DCM通知ComM_DCM_ActiveDiagnostic。LIN、FlexRay和以太网的行为相同,只是API名称不同。
ISOLAR-AB配置
ComM
ComMGeneral
这个容器包含一些ComM模块的一些通用配置,这里我们挑一些配置进行介绍。
- ComMDirectUserMapping:设置为true时,配置工具会根据ComMPnc和ComMChannel自动创建ComMUser。由于此配置参数而创建的ComMUser不能被swc使用(仅对BswM可用)。
- ComMEcuGroupClassification:定义模式抑制是否影响ECU。
- ComMModeLimitationEnabled:启动/失能模式限制功,可以通过ComM_GetlnhibitionStatus获取抑制状态。
下图是自动生成的ComM模块配置。
ComMChannel
这个容器包含了每个通道的配置,我们介绍以下几个:
- ComMBusType:总线类型,作者以前的项目ISOLAR版本为4.0.2,它包含CAN、CDD、ETH、FR、INTERNAL与LIN。
- ComMChannelId:通道ID,自动排序生成,集成商不应该随意配置。
- ComMFullCommRequestNotificationEnabled:定义是否为此通道的接口ComM_CurrentChannelReques提供SenderReceiver端口。
- ComMNoCom:是否允许改变ComM状态到COMM_FULL_COMMUNICATION或者C OMM_SILENT_COMMUNICATION。
下边是默认配置的截图:
可以看到它还包含ComMNetworkManagement和ComMUserPerchannel两个容器,前者包含networkmanagement的一些相关配置,后者包含下面定义的User引用,就不介绍配置内容了。
ComMUser
这个容器里边自动生成了User的ID。如下如所示。
Components
生成BSW会自动建立ComM的服务组件,如下图。
我们在Test2应用组件中建立一个ComM_UserRequest接口的Rport。如下图。
建立一个Runnables,添加对刚才建立的Port口下的GetCurrentComMode与RequestComMode的方法访问。
最后增加一个0.01s的TimingEvent,引用刚才建立的Runnable。
最后生成组件这个Runnable的代码,可以看到获取ComM的模式和设置模式接口,我们可以在这个代码的基础上添加逻辑来控制ComM的模式是Full还是No。
System
将ComM增加到部件中。
将ComM服务组件到ECU中。
最后完成连接。
RTE
将涉及的周期运行函数映射到任务上。
代码解析
动态配置代码
ComM模块生成的动态代码如下所示。
我们针对一些常用的进行说明:
- ComM_PBcfg.c:包含ComM模块Channel的配置。
/* *********************************************************************************************************************** * * Product Info * Isolar version: ISOLAR-AB 4.0.2 * Product release version: RTA-BSW 3.1.0 * *********************************************************************************************************************** */ /*<VersionHead> * This Configuration File is generated using versions (automatically filled in) as listed below. * * Generator__: ComM / AR42.4.0.0 Module Package Version * Editor_____: 9.0 Tool Version * Model______: 2.3.0.4 ECU Parameter Definition Version * </VersionHead>*/ /***********************************************************************************/ /* INCLUDES */ /***********************************************************************************/ #include "ComStack_Types.h" #include "ComM_Cfg.h" #include "ComM_PBcfg.h" #include "ComM_Priv.h" #include "Std_Types.h" /**************************************Start of channel data***************************************/ #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #if (COMM_PNC_ENABLED != STD_OFF) #endif /* #if (COMM_PNC_ENABLED == STD_ON) */ #if ((COMM_INHIBITION_ENABLED) &&(COMM_PNC_ENABLED != STD_OFF)) #endif #if (COMM_INHIBITION_ENABLED) static CONST(uint8, COMM_CONST) ComM_DirectUsersPerChannel_ComMChannel_Can_Network_ECAN_Channel[] = { ComMConf_ComMUser_ComMUser_Can_Network_ECAN_Channel}; #endif static CONST(uint8, COMM_CONST) ComM_AllUsersPerChannel_ComMChannel_Can_Network_ECAN_Channel[] = { ComMConf_ComMUser_ComMUser_Can_Network_ECAN_Channel }; #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" /**************************************End of channel data**************************************/ /********************************* Start of channel list *******************************************/ #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" CONST(ComM_ChannelType,COMM_CONST) ComM_ChanelList[] = { { /* Main function period is 10 */ /* Channel : ComMChannel_Can_Network_ECAN_Channel */ #if (COMM_PNC_ENABLED != STD_OFF) NULL_PTR, #endif /* #if (COMM_PNC_ENABLED != STD_OFF) */ #if ((COMM_INHIBITION_ENABLED) &&(COMM_PNC_ENABLED != STD_OFF)) NULL_PTR, #endif /* ((COMM_INHIBITION_ENABLED) &&(COMM_PNC_ENABLED != STD_OFF)) */ #if (COMM_INHIBITION_ENABLED) ComM_DirectUsersPerChannel_ComMChannel_Can_Network_ECAN_Channel, #endif /*#if (COMM_INHIBITION_ENABLED) */ ComM_AllUsersPerChannel_ComMChannel_Can_Network_ECAN_Channel, COMM_BUS_TYPE_CAN, NONE, #if (COMM_PNC_GW_ENABLED != STD_OFF) COMM_GATEWAY_TYPE_ACTIVE, #endif /* #if (COMM_PNC_GW_ENABLED != STD_OFF) */ 1000, 1, 0, #if ((COMM_INHIBITION_ENABLED) &&(COMM_PNC_ENABLED != STD_OFF)) 0, #endif /*#if ((COMM_INHIBITION_ENABLED) &&(COMM_PNC_ENABLED != STD_OFF)) */ #if (COMM_INHIBITION_ENABLED) 1, 0x3, #endif /* #if (COMM_INHIBITION_ENABLED) */ 1, #if (COMM_PNC_ENABLED != STD_OFF) FALSE, #endif /* #if (COMM_PNC_ENABLED == STD_ON) */ } }; #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" /*****************************************End of channel list*******************************************/ /*****************************************Start of user data*******************************************/ #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" static CONST(uint8,COMM_CONST) ComM_DirectChannelsPerUser_ComMUser_Can_Network_ECAN_Channel[] = { ComMConf_ComMChannel_ComMChannel_Can_Network_ECAN_Channel }; #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" /*****************************************Start of user list*******************************************/ #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" CONST(ComM_UsersType,COMM_CONST) ComM_UserList[] = { { ComM_DirectChannelsPerUser_ComMUser_Can_Network_ECAN_Channel, #if (COMM_PNC_ENABLED != STD_OFF) NULL_PTR, #endif /* #if (COMM_PNC_ENABLED != STD_OFF) */ 1, 1, #if (COMM_PNC_ENABLED != STD_OFF) 0 #endif /* #if (COMM_PNC_ENABLED != STD_OFF) */ } }; #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" /*****************************************End of user list*******************************************/ #if (COMM_PNC_ENABLED == STD_ON) /*****************************************Start of pnc data*******************************************/ #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #if(COMM_INHIBITION_ENABLED) #endif #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" /*****************************************End of pnc data*******************************************/ /*****************************************Start of pnc list*******************************************/ #if (COMM_PNC_ENABLED != STD_OFF) #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" CONST(ComM_PncConfigStruct_t,COMM_CONST) ComM_PncList[] = { }; #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #endif /* #if (COMM_PNC_ENABLED != STD_OFF) */ /*****************************************End of pnc list*******************************************/ #endif /* #if (COMM_PNC_ENABLED == STD_ON) */ #if (COMM_PNC_GW_ENABLED == STD_ON) #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #endif /* #if (COMM_PNC_GW_ENABLED == STD_ON) */ #if (COMM_PNC_ENABLED == STD_ON) #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" CONST(uint16, COMM_CONST) ComM_EIRA_RxSig[COMM_NO_OF_POSSIBLE_BUSTYPECH_WITH_EIRA][COMM_NO_OF_PNCS] = { { /* COMM_BUS_TYPE_CAN */ } }; #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #endif /* #if (COMM_PNC_ENABLED == STD_ON) */ #if (COMM_CONFIGURATION_VARIANT != COMM_VARIANT_PRECOMPILE) #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" /* Definition of Global config structure of ComM */ CONST(ComM_GlobalConfigType, COMM_CONST) ComM_GlobalConfigData_cs = { ComM_ChanelList, /* Pointer to channel list */ ComM_UserList, /* Pointer to user list */ #if(COMM_PNC_ENABLED != STD_OFF) ComM_PncList, /* Pointer to PNC list */ ComM_EIRA_RxSig, /* Pointer to EIRA Rx Signal table */ #if(COMM_PNC_GW_ENABLED != STD_OFF) ComM_ERA_RxSig, /* Pointer to ERA Rx Signal table */ #endif FALSE /* Actual value of PNC switch */ #endif }; #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" static CONST(Std_VersionInfoType, COMM_CONST) ComM_VersionInfo = { 6, 12, 4, 0, 0 }; #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #endif /* #if (COMM_CONFIGURATION_VARIANT != COMM_VARIANT_PRECOMPILE) */ #if (COMM_CONFIGURATION_VARIANT != COMM_VARIANT_PRECOMPILE) #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" /* Definition of Base config structure */ CONST(ComM_ConfigType, COMM_CONST) ComM_Config = { /* Void pointer initialised with pointer to an instance of structure ComM_GlobalConfigData_cs */ &ComM_GlobalConfigData_cs, &ComM_VersionInfo }; #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #endif /* #if (COMM_CONFIGURATION_VARIANT != COMM_VARIANT_PRECOMPILE) */
- ComM_Main.c:包含ComM主周期调度等跟Channel相关函数实现。
/* *********************************************************************************************************************** * * Product Info * Isolar version: ISOLAR-AB 4.0.2 * Product release version: RTA-BSW 3.1.0 * *********************************************************************************************************************** */ /*<VersionHead> * This Configuration File is generated using versions (automatically filled in) as listed below. * * Generator__: ComM / AR42.4.0.0 Module Package Version * Editor_____: 9.0 Tool Version * Model______: 2.3.0.4 ECU Parameter Definition Version * </VersionHead>*/ /* ---------------------------------------------------------------------*/ /* Inlcude section */ /* ---------------------------------------------------------------------*/ #include "ComM_Priv.h" #define COMM_START_SEC_CODE #include "ComM_Cfg_MemMap.h" /* * Name : ComM_MainFunction_ComMChannel_Can_Network_ECAN_Channel * Description : Main function for Bus Type COMM_BUS_TYPE_CAN channel ComMChannel_Can_Network_ECAN_Channel * */ FUNC(void,COMM_CODE) ComM_MainFunction_ComMChannel_Can_Network_ECAN_Channel(void) { ComM_LChannelMainFunction(0) ; } #define COMM_STOP_SEC_CODE #include "ComM_Cfg_MemMap.h" #if (COMM_PNC_GW_ENABLED == STD_ON) #endif /* #if (COMM_PNC_GW_ENABLED == STD_ON) */ #if (COMM_PNC_ENABLED == STD_ON) /* EIRA call backs are generated for all possible bus types, depending on the bus types configred in ComMChannel container. This is to ensure that call backs are always available in Post-build configuration. Precompile : same approach is followed to keep the code same. */ #define COMM_START_SEC_CODE #include "ComM_Cfg_MemMap.h" /* * Name : ComM_EIRACallBack_COMM_BUS_TYPE_CAN * Description : EIRA callback for bus type COMM_BUS_TYPE_CAN * This function will be called whenever EIRA signal for this bus type changes */ extern FUNC(void,COMM_CODE) ComM_EIRACallBack_COMM_BUS_TYPE_CAN(void); FUNC(void,COMM_CODE) ComM_EIRACallBack_COMM_BUS_TYPE_CAN(void) { ComM_EIRA_CallBack(0); } #define COMM_STOP_SEC_CODE #include "ComM_Cfg_MemMap.h" #endif /* #if (COMM_PNC_ENABLED == STD_ON) */ /*----------------------------------------------------------------------*/ /************************************************************************/
- ComM_Cfg.c:主要包含与下层模块的一些接口映射关系。
/* *********************************************************************************************************************** * * Product Info * Isolar version: ISOLAR-AB 4.0.2 * Product release version: RTA-BSW 3.1.0 * *********************************************************************************************************************** */ /*<VersionHead> * This Configuration File is generated using versions (automatically filled in) as listed below. * * Generator__: ComM / AR42.4.0.0 Module Package Version * Editor_____: 9.0 Tool Version * Model______: 2.3.0.4 ECU Parameter Definition Version * </VersionHead>*/ /***********************************************************************************/ /* INCLUDES */ /***********************************************************************************/ #include "ComStack_Types.h" #include "ComM_Cfg.h" #include "ComM_Priv.h" #include "Std_Types.h" #if(COMM_CAN == STD_ON) #include "CanSM_ComM.h" #endif #if(COMM_LIN == STD_ON) #include "LinSM.h" #endif #if(COMM_FLXRY == STD_ON) #include "FrSM.h" #endif #if(COMM_ETH == STD_ON) #include "EthSM.h" #endif #if(COMM_RTE_SUPPORT != STD_OFF) /*****************************************Start of user RTE data*******************************************/ #define COMM_START_SEC_CODE #include "ComM_Cfg_MemMap.h" FUNC(void, COMM_CODE) ComM_Rte_Switch_UM_currentMode(VAR(ComM_UserHandleType, AUTOMATIC) UserId, VAR(uint8, AUTOMATIC) lowestMode) { Std_ReturnType retVal; (void) lowestMode; switch (UserId) { case (ComMConf_ComMUser_ComMUser_Can_Network_ECAN_Channel): { retVal = Rte_Switch_UM_ComMUser_Can_Network_ECAN_Channel_currentMode(lowestMode); } break; default: { retVal = E_OK; } break; } (void)retVal; } #define COMM_STOP_SEC_CODE #include "ComM_Cfg_MemMap.h" #endif /**********************************Declaration and definition of dummy api's****************************/ #define COMM_START_SEC_CODE #include "ComM_Cfg_MemMap.h" static FUNC(Std_ReturnType, COMM_CODE) ComM_Dummy_RequestComMode ( VAR(NetworkHandleType, AUTOMATIC) NetworkHandle, VAR(ComM_ModeType, AUTOMATIC) ComM_Mode ); static FUNC(Std_ReturnType,COMM_CODE) ComM_Dummy_GetCurrentComMode ( VAR(NetworkHandleType, AUTOMATIC) NetworkHandle, P2VAR(ComM_ModeType, AUTOMATIC, COMM_APPL_DATA) ComM_ModePtr ); static FUNC(Std_ReturnType, COMM_CODE) ComM_Dummy_RequestComMode ( VAR(NetworkHandleType, AUTOMATIC) NetworkHandle, VAR(ComM_ModeType, AUTOMATIC) ComM_Mode ) { (void) NetworkHandle; (void) ComM_Mode; return E_OK; } static FUNC(Std_ReturnType,COMM_CODE) ComM_Dummy_GetCurrentComMode ( VAR(NetworkHandleType, AUTOMATIC) NetworkHandle, P2VAR(ComM_ModeType, AUTOMATIC, COMM_APPL_DATA) ComM_ModePtr ) { *ComM_ModePtr = ComM_ChannelStruct[NetworkHandle].ChannelMode_u8; return E_OK; } #define COMM_STOP_SEC_CODE #include "ComM_Cfg_MemMap.h" #define COMM_START_SEC_CONST_UNSPECIFIED #include "ComM_Cfg_MemMap.h" CONST(ComM_BusSmApiType, COMM_CONST) ComM_BusSmApi[] = { /* MR12 RULE 8.3 VIOLATION:Different <Bus>SM's use different parameters. Hence it is not possible to solve this warning */ { /* COMM_BUS_TYPE_CAN */ &CanSM_RequestComMode, &CanSM_GetCurrentComMode } , { /* COMM_BUS_TYPE_ETH */ &ComM_Dummy_RequestComMode, &ComM_Dummy_GetCurrentComMode } , { /* COMM_BUS_TYPE_FR */ &ComM_Dummy_RequestComMode, &ComM_Dummy_GetCurrentComMode } , { /* COMM_BUS_TYPE_INTERNAL */ &ComM_Dummy_RequestComMode, &ComM_Dummy_GetCurrentComMode } , { /* COMM_BUS_TYPE_LIN */ &ComM_Dummy_RequestComMode, &ComM_Dummy_GetCurrentComMode } }; #define COMM_STOP_SEC_CONST_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #if ((COMM_LIMIT_TO_NOCOM_ENABLED != STD_OFF)||(COMM_PREVENT_WAKEUP_ENABLED != STD_OFF)) #define COMM_START_SEC_CONST_8 #include "ComM_Cfg_MemMap.h" CONST(ComM_InhibitionStatusType, COMM_CONST) ComM_EcuGroupClassification_Init = 0x00; #define COMM_STOP_SEC_CONST_8 #include "ComM_Cfg_MemMap.h" #endif /* #if (COMM_MODE_LIMITATION != STD_OFF)||(COMM_WAKEUP_INHIBITION != STD_OFF) */
- ComM_Cfg_Internal.h:文件包含一些宏定义,结构体等,供内部静态代码使用。
/* *********************************************************************************************************************** * * Product Info * Isolar version: ISOLAR-AB 4.0.2 * Product release version: RTA-BSW 3.1.0 * *********************************************************************************************************************** */ /*<VersionHead> * This Configuration File is generated using versions (automatically filled in) as listed below. * * Generator__: ComM / AR42.4.0.0 Module Package Version * Editor_____: 9.0 Tool Version * Model______: 2.3.0.4 ECU Parameter Definition Version * </VersionHead>*/ #ifndef COMM_CFG_INTERNAL_H #define COMM_CFG_INTERNAL_H /***********************************************************************************/ /* INCLUDES */ /***********************************************************************************/ #include "ComM_Cfg.h" #define COMM_CAN STD_ON #define COMM_LIN STD_OFF #define COMM_FLXRY STD_OFF #define COMM_ETH STD_OFF #define COMM_NO_OF_USERS 1 #define COMM_NO_OF_CHANNELS 1 #define COMM_DEV_ERROR_DETECT STD_OFF #define COMM_SYNCHRONOUS_WAKE_UP STD_OFF #define COMM_VERSION_INFO_API STD_OFF /* Configure Nm Support */ #define COMM_NM_SUPPORT STD_OFF /* Configure DCM support */ #define COMM_DCM_SUPPORT STD_ON /* Configure RTE support */ #define COMM_RTE_SUPPORT STD_OFF /* PNC SUPPORT */ #define COMM_PNC_ENABLED STD_OFF /* PNC ERA SUPPORT */ #define COMM_PNC_GW_ENABLED STD_OFF /* LIMIT TO NOCOM SUPPORT */ #define COMM_LIMIT_TO_NOCOM_ENABLED STD_OFF /* PREVENT WAKEUP SUPPORT */ #define COMM_PREVENT_WAKEUP_ENABLED STD_OFF #if(COMM_NM_SUPPORT!= STD_OFF) /* If Nm is used, this switch determines the Nm Variant */ #define COMM_NM_VARIANT COMM_NM_VARIANT_FULL #endif /* Common inhibition switch */ #define COMM_INHIBITION_ENABLED ((COMM_PREVENT_WAKEUP_ENABLED != STD_OFF) || (COMM_LIMIT_TO_NOCOM_ENABLED != STD_OFF)) /* Reset After forcing to No Com */ #define COMM_RESET_AFTER_NO_COM STD_OFF #define COMM_MAX_NO_OF_PNCS (48) #define COMM_NO_OF_PNCS (0) /* Number of channels with ERA signals configured */ #define COMM_NO_OF_CH_WITH_ERA (0) /* Number of possible Bus types which have EIRA configured. The Const and RAM structures to store EIRA information is based on the ComMChannels configured rather than the actual EIRA Signals present. This is done to keep the implementation common for both pre-compile and post-build variants. */ #define COMM_NO_OF_POSSIBLE_BUSTYPECH_WITH_EIRA (1) /* BusSm API structure */ typedef struct { P2FUNC(Std_ReturnType, COMM_APPL_CODE, BusSm_RequestComMode)(NetworkHandleType, ComM_ModeType); P2FUNC(Std_ReturnType, COMM_APPL_CODE, BusSm_GetCurrentComMode)(NetworkHandleType, P2VAR(ComM_ModeType, AUTOMATIC, COMM_APPL_DATA) ComM_ModePtr); }ComM_BusSmApiType; /****************************************Users structure type**************************/ typedef struct { P2CONST(uint8,COMM_CONST,COMM_APPL_CONST) DirectChannels_p; #if (COMM_PNC_ENABLED != STD_OFF) P2CONST(uint8,COMM_CONST,COMM_APPL_CONST) Pncs_p; #endif /* #if (COMM_PNC_ENABLED != STD_OFF) */ uint8 NumDirectChannels_u8; uint8 NumAllChannels_u8; #if (COMM_PNC_ENABLED != STD_OFF) uint8 NumPnc_u8; #endif /* #if (COMM_PNC_ENABLED != STD_OFF) */ }ComM_UsersType; /****************************************Channels structure type**************************/ typedef struct ComM_ChannelTypeStruct { #if (COMM_PNC_ENABLED != STD_OFF) P2CONST(uint16,COMM_CONST,COMM_APPL_CONST) TxSigIdList_p; #endif /* #if (COMM_PNC_ENABLED != STD_OFF) */ #if ((COMM_INHIBITION_ENABLED) &&(COMM_PNC_ENABLED != STD_OFF)) P2CONST(uint8,COMM_CONST,COMM_APPL_CONST) Pncs_p; #endif #if (COMM_INHIBITION_ENABLED) P2CONST(uint8,COMM_CONST,COMM_APPL_CONST) DirectUsers_p; #endif P2CONST(uint8,COMM_CONST,COMM_APPL_CONST) AllUsers_p; ComM_BusType BusType_e; ComM_NMVariantType ComMNmVariant_e; #if (COMM_PNC_GW_ENABLED != STD_OFF) ComM_PncGatewayType PncGwType; #endif /* #if (COMM_PNC_GW_ENABLED != STD_OFF) */ uint32 NmLightTimeout_u32; uint16 TMinFullComModeDuration_u16; NetworkHandleType ComMChannelId_u8; #if ((COMM_INHIBITION_ENABLED) &&(COMM_PNC_ENABLED != STD_OFF)) uint8 numPncs_u8; #endif /*#if ((COMM_INHIBITION_ENABLED) &&(COMM_PNC_ENABLED != STD_OFF)) */ #if (COMM_INHIBITION_ENABLED) uint8 numDirectUsers_u8; uint8 InhibitionInitValue_u8; #endif /* #if (COMM_INHIBITION_ENABLED) */ uint8 numAllUsers_u8; #if(COMM_PNC_ENABLED != STD_OFF) boolean PncNmRequest; #endif /* #if (COMM_PNC_ENABLED == STD_ON) */ }ComM_ChannelType; /****************************************Pncs structure type**************************/ typedef struct ComM_PncStructType { P2CONST(uint8,COMM_CONST,COMM_APPL_CONST) Channels; /* Channels Per PNC */ #if(COMM_INHIBITION_ENABLED) P2CONST(uint8,COMM_CONST,COMM_APPL_CONST) Users_p; /* Users per PNC */ #endif /* #if (COMM_INHIBITION_ENABLED) */ uint16 PrepareSleepTimer; #if(COMM_INHIBITION_ENABLED) uint8 NumUsers_u8; #endif /*#if(COMM_INHIBITION_ENABLED) */ uint8 NumChannels; }ComM_PncConfigStruct_t; /* ComM global config type structure */ #if(COMM_CONFIGURATION_VARIANT != COMM_VARIANT_PRECOMPILE) #if(COMM_PNC_ENABLED != STD_OFF) // For Signal array type for ERA and EIRA Rx signals of PNC typedef const uint16 ComM_SignalArrayType[COMM_NO_OF_PNCS]; #endif /* #if(COMM_PNC_ENABLED != STD_OFF) */ /* Definition of Global config structure of ComM */ // Global config structure to store pointers to all config tables /*typedef struct { P2CONST(ComM_ChannelType,COMM_CONST,COMM_APPL_CONST) ChannelConfig_pcs; Holds pointer to channel list P2CONST(ComM_UsersType,COMM_CONST,COMM_APPL_CONST) UserConfig_pcs; Holds pointer to user list #if(COMM_PNC_ENABLED != STD_OFF) P2CONST(ComM_PncConfigStruct_t,COMM_CONST,COMM_APPL_CONST) PncConfig_pcs; Holds pointer to PNc list P2CONST(ComM_SignalArrayType,COMM_CONST,COMM_APPL_CONST) EiraSignalTable_pcs; Holds pointer to EIRA signal table #if(COMM_PNC_GW_ENABLED != STD_OFF) P2CONST(ComM_SignalArrayType,COMM_CONST,COMM_APPL_CONST) EraSignalTable_pcs; Holds pointer to ERA signla table #endif VAR(boolean,COMM_VAR) ComMPncEnabled_b; Holds actual status of PNC switch #endif }ComM_GlobalConfigType;*/ typedef struct { P2CONST(ComM_ChannelType,COMM_CONST,COMM_APPL_CONST) ChannelConfig_pcs; P2CONST(ComM_UsersType,COMM_CONST,COMM_APPL_CONST) UserConfig_pcs; #if(COMM_PNC_ENABLED != STD_OFF) P2CONST(ComM_PncConfigStruct_t,COMM_CONST,COMM_APPL_CONST) PncConfig_pcs; P2CONST(ComM_SignalArrayType,COMM_CONST,COMM_APPL_CONST) EiraSignalTable_pcs; #if(COMM_PNC_GW_ENABLED != STD_OFF) P2CONST(ComM_SignalArrayType,COMM_CONST,COMM_APPL_CONST) EraSignalTable_pcs; #endif VAR(boolean,COMM_VAR) ComMPncEnabled_b; #endif }ComM_GlobalConfigType; #endif /* #if(COMM_CONFIGURATION_VARIANT != COMM_VARIANT_PRECOMPILE) */ #if (COMM_RTE_SUPPORT != STD_OFF) extern FUNC(void, COMM_CODE) ComM_Rte_Switch_UM_currentMode(VAR(ComM_UserHandleType, AUTOMATIC) UserId, VAR(uint8, AUTOMATIC) lowestMode); #endif /*************************************** *Extern Definitions **************************/ #define COMM_START_SEC_CONST_8 #include "ComM_Cfg_MemMap.h" #if (COMM_INHIBITION_ENABLED) extern CONST(ComM_InhibitionStatusType, COMM_CONST) ComM_EcuGroupClassification_Init; #endif #define COMM_STOP_SEC_CONST_8 #include "ComM_Cfg_MemMap.h" #define COMM_START_SEC_CONST_UNSPECIFIED #include "ComM_Cfg_MemMap.h" extern CONST(ComM_BusSmApiType, COMM_CONST) ComM_BusSmApi[]; #define COMM_STOP_SEC_CONST_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #define COMM_START_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" extern CONST(ComM_ChannelType,COMM_CONST) ComM_ChanelList[]; extern CONST(ComM_UsersType,COMM_CONST) ComM_UserList[]; #if (COMM_PNC_ENABLED != STD_OFF) extern CONST(ComM_PncConfigStruct_t,COMM_CONST) ComM_PncList[]; extern CONST(uint16, COMM_CONST) ComM_EIRA_RxSig[][COMM_NO_OF_PNCS]; #if(COMM_PNC_GW_ENABLED != STD_OFF) extern CONST(uint16, COMM_CONST) ComM_ERA_RxSig[][COMM_NO_OF_PNCS]; #endif /* (COMM_PNC_GW_ENABLED != STD_OFF) */ #endif /* COMM_PNC_ENABLED != STD_OFF) */ #define COMM_STOP_SEC_CONFIG_DATA_POSTBUILD_UNSPECIFIED #include "ComM_Cfg_MemMap.h" #endif /* #ifndef COMM_CFG_H */
集成代码
ComM模块生成的集成代码模板如下图所示,都是各个基础模块通用的内容,这里就不再赘述了。
静态代码
主要介绍常见的静态代码涉及API说明,具体详细完整的介绍读者可以参考《AUTOSAR_SWS_COMManager.pdf》以及《RTA-BSWReferenceGuide.pdf》。
- ComM_MainFunction_<ComMChannel.ShortName>:针对每个ComM通道的专用主功能周期调用函数。
- ComM_Init/ComM_DeInit:ComM模块初始化与去初始化功能。
- ComM_GetStatus:返回ComM的初始化状态。
- ComM_RequestComMode:用户请求通信模式。用户只能请求Full与No。
- ComM_Nm_NetworkStartIndication:通知在总线睡眠模式中接收到NM消息(这表示网络中的一些节点已经进入网络模式)
- ComM_DCM_ActiveDiagnostic:DCM通知的当前活动状态。
十六宿舍 原创作品,转载必须标注原文链接。
©2023 Yang Li. All rights reserved.
欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。