LinMaster_集成手册
目的
本文档旨在通过一个LIN通信的示例工程的配置,向用户展示通信栈的集成过程。
由于各项目的需求不同,集成示例不会针对于特定的商业项目做详细讲解。
缩写词和术语
** 缩写词/术语** |
描述 |
BSW |
Basic Software 基础软件 |
BswM |
Basic Software Mode Manager 基础软件模式管理 |
MCAL |
Microcontroller Abstraction Layer 微控制器抽象层 |
LinIF |
LIN Interface LIN接口 |
LinSM |
LIN State Manager LIN状态管理 |
ComM |
Communication Manager 通信管理 |
EcuM |
ECU State Manager ECU状态管理 |
SchM |
Scheduler Manager 调度管理 |
参考文档
[1]参考手册_PduR.pdf
[2]参考手册_Com.pdf
[3]参考手册_EcuC.pdf
[4]参考手册_ComM.pdf
[5]参考手册_LinSM.pdf
[6]参考手册_LinIf.pdf
协议栈集成
项目交付的内容为:通信栈源码和ORIENTAIS Configurator配置工具。通信栈细分为通信栈的各模块及其对应的配置工具模块。
通信栈各配置模块的功能介绍,参见表 4 1通信栈各配置模块介绍。
使用通信栈源码和配置工具,进行通信栈的集成的步骤,参见表 4 2 通信栈集成的步骤。
模 块名 |
功能 |
Lin |
Lin驱动配置。(由MCAL工具导入) |
LinIf |
LinIf模块主要处理上层模块与底层驱动的之间 PDU的传递,为上层模块提供统一的接口来管理不同的Lin硬件模块 |
EcuC |
用于辅助配置工具完成配置的模块。主 要提供Pdu的定义,其它模块通过关联EcuC中Pdu,相互关联起来。 |
PduR |
PDU Router主要为通讯接口模块(LINIF)、传输协议模块(LIN TP、J1939 TP)、诊断通讯管理模块(DCM、J1939DCM)以及通讯模块(C OM、LDCOM)以及IPDUM、SECOC等模块提供基于I-PDU的路由服务。 |
Com |
COM模块主要提供I-PDU和信号相关管理功能 |
ComM |
ComM模块主要进行通信的管理功能。 ComM模块收集用户的总线访问请求,并把请求转发到不同的总线。 |
LinSM |
主要功 能是与通信硬件抽象层和系统服务层产生交互,为每一个Lin通信 总线定义一个总线相关的状态管理,并为相关的总线提供流控制。 |
步 骤 * |
操作 |
说明 |
1 |
ORIENTAIS Configurator配置工具 工程搭建和通信栈模块加载 |
若配置工具已经搭建 ,则仅需进行通信栈模块的加载操作。 |
2 |
模块配置及配置文件生成 |
NA |
3 |
代码集成 |
现有工程、 通信栈源代码和配置生成文件的集成。 |
4 |
验证测试 |
NA |
注意:通信栈集成之前,用户须确保已经有基础工程,且本通信栈相关的其他通信栈能正常工作。
新建ORIENTAIS工程
安装软件后,双击软件图标打开软件
菜单栏File🡪New🡪Project,新建工程
在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next
在弹出的窗口中输入工程名,选择Finish
在弹出的窗口中选择Yes。
在工程的[Bsw_Builder]项目上右键,选择New ECU Configuration
在弹出的窗口中输入一个ECU名,然后选择Next
在弹出的窗口中勾选需要添加的模块,点击Finish。
新建完成的工程如下所示,步骤⑦中添加的模块已经被加入到工程中。
模块配置及代码生成
4.2.1模块配置
模块的配置,取决于具体的项目需求。通信栈各模块配置项的详细介绍,参见表4-3相关文档
4.2.2配置代码生成
在工程上右键会弹出校验整个工程和生成整个工程所有模块配置文件的菜单。
首先选择Validate All,没有错误提示信息即校验通过。
然后选择Generate All,生成配置文件。右下角的输出框中会输出生成的配置文件信息。
在工程Config文件夹下即可查看生成的配置文件。
功能集成
4.3.1代码集成
通信栈代码包括两部分:项目提供的通信栈源码和ORIENTAIS Configurator配置生成代码。通信栈集成包括通信栈源码(LIN、LinIf、PduR、ComM、LinSM等)、定时器源码和部分其他模块源码,具体文件见表4-4。
用户须将通信栈源码和章节4.2.2生成的源代码添加到集成开发工具的对应文件夹。通信栈集成的文件结构,参见章节5.3。
移库 文件夹 |
移库文件 |
说明 |
ComM |
ComM .c、ComM.h、ComM_BusSM.h、ComM_Com.h、ComM _Dcm.h、ComM_EcuMBswM.h、ComM_Internal.c、 ComM_Internal.h、ComM_MemMap.h、ComM_Nm.h |
通信栈源码 |
LinIf |
LinIf.c、LinIf. h、LinIf_Cbk.h、LinIf_Internal.h、LinIf_Ma ster.c、LinIf_Master.h、LinIf_MemMap.h、Li nIf_Types.h、LinTp.c、LinTp.h、LinTp_Inter nal.c、LinTp_Internal.h、LinTp_Master.c、L inTp_Master.h、LinTp_Types.h、SchM_LinIf.h |
|
LinSM |
LinSM .c、LinSM.h、LinSM_Cbk.h、LinSM_MemMap.h、 |
|
PDUR |
PduR_LinIf.h、PduR_ Com.h、PduR_Internal.c、PduR_Internal.h、P duR_MemMap.h、PduR_Types.h、PduR.c、PduR.h |
|
Com |
Com.c、Com .h、Com_Cbk.h、Com_GwInternal.c、Com_Inter nal.c、Com_Internal.h、Com_MemMap.h、Com_R xInternal.c、Com_TxInternal.c、Com_Types.h |
|
F reeRTimer |
FreeRTimer.c、FreeRTimer.h |
定时器源码 |
SchM |
SchM.c、SchM.h、SchM_Com.h 、SchM_ComM.h、SchM_LinIf.h、SchM_PduR.h、 |
Sc hM部分源码 |
BswM |
B swM.c、BswM.h、BswM_LinSM.h、BswM_ComM.h、 |
Bs wM部分源码 |
EcuM |
EcuM_Types.h、EcuM.h、 |
Ec uM部分源码 |
注意:通信栈集成之前,用户须确保已经有基础工程,且本通信栈相关的其他通信栈能正常工作。
4.3.2集成注意事项
对于集成过程中,通信栈特殊要求和用户经常出现的问题,归类总结形成表 4‑5通信栈集成约束清单。用户需逐一排查表中的约束项,以避免集成问题出现。
编 号 * |
类别* |
约束限制 |
1 |
中断 |
通信栈 有中断、轮询或混合三种工作模式。若选取中断或混合模 式,用户需在通信栈配置对应的中断并填充中断服务API。 |
2 |
堆栈 |
用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间。 |
3 |
头文件 |
栈代码之后,用户需更新集成开发工具中的头文件路径。
|
4 |
初始化 |
以LIN通信 为例,通信栈的初始化顺序为:Lin_Init、LinIf_Init、 PduR_Init、Com_Init、LinSM_Init。 |
5 |
周 期函数 |
Co m_MainFunctionRx、Com_MainFunctionTx、LinIf_MainFun ction、LinSM_MainFunction需要被周期性任务函数调用。 |
集成示例
集成目标
集成后的工程为LIN主节点,集成完成后的工程可以进行两个无条件帧的发送、两个无条件帧的接收。
开启一个周期调度表进行循环调度发送。
通信报文配置如表5-1:
**帧名称 ** |
** 帧类型** |
I D |
Tx \Rx |
关联帧 |
Li nIfFrame_Tx1 |
无条件帧 |
0x1 |
Tx |
|
Li nIfFrame_Tx2 |
无条件帧 |
0x2 |
Tx |
|
Li nIfFrame_Rx1 |
无条件帧 |
0x3 |
Rx |
|
Li nIfFrame_Rx2 |
无条件帧 |
0x4 |
Rx |
模块配置
5.2.1 EcuC模块配置
双击EcuC模块,打开EcuC模块配置界面。
在EcucConfigSets栏目上右键,选择EcucConfigSet。再在EcucConfigSet上右键,选择New🡪EcucPduCollection。
PduIdTypeEnum 选择UINT16.
PduLengthTypeEnum 选择UINT16。
在EcucPduCollection上右键,选择Pdu,会生成一个Pdu的配置界面。
这里按照发送和接收,将Pdu名字改为报文的名字。
PduLength:Pdu长度,根据实际使用帧的长度设置。
根据步骤③的描述,配置其余报文的Pdu。
报文需要PDUR路由,每个方向需要配置2个Pdu。
ECUC模块到此配置结束。在模块上右键,然后选择校验,查看是否配置有错误。
5.2.2 Lin模块配置
如果Lin驱动使用的是MCAL配置,那么将MCAL生成的arxml配置文件导入到BSW工具选择对应的Lin模块即可。
5.2.3 LinIf模块配置
双击LinIf模块,打开LinIf模块的配置界面。
LinIfGeneral标签页保持默认值即可。
在LinIfGlobalConfig标签页下依次打开LinIfGlobalConfigs ->LinIfGlobalConfig ->LinIfChannel_0进行如下配置。
LinIfChannel_0配置参数说明:
参数名 |
设置值 |
说明 |
Li nIfGotoSleepConfirmationUL |
LINSM |
Go-to-sleep命令的确 认通知,通知的上层模块 |
LinIfSch eduleRequestConfirmationUL |
LINSM |
调 度表切换成功执行后的通 知函数,通知的上层模块 |
LinIfStartupState |
NORMAL |
Li n通道在启动后所处的状态 |
LinIfWakeupConfirmationUL |
LINSM |
Wakeup通 知函数,通知的上层模块 |
LinIfChannelRef |
LinChannel_0 |
LinIf的 通道对应的Lin驱动的通道 |
LinIfComMNetworkHandleRef |
C omMChannel_0 |
LinI f的通道对应的ComM的通道 |
然后右击LinIfChannel_0新建LinIfFrame对象。
按照步骤创建4个对象,根据章节5.1集成目标修改名字,并将LinIfFrameId设置为对应值。
下面对不同名称的帧各举一例说明配置参数。
LinIfFrame_Tx1报文LinFrame配置说明:
参数名 |
设置值 |
说明 |
LinIfChecksumType |
ENHANCED |
报文使用的checksum类型 (此处使用增强型校验) |
LinIfFrameType |
UNCONDITIONAL |
报文帧的类型 (此处设置为无条件帧) |
LinIfFrameId |
0x1 |
报文ID |
LinIfFrame_Rx1报文LinFrame配置说明:
参数名 |
设置值 |
说明 |
LinIfChecksumType |
ENHANCED |
报文使用的checksum类型 (此处使用增强型校验) |
LinIfFrameType |
UNCONDITIONAL |
报文帧的类型 (此处设置为无条件帧) |
LinIfFrameId |
0x3 |
报文ID |
点击LinIfFrame_Tx1左边的三角,展开子配置页面,右键新建一个LinPduDirection对象,如果前面的LinIfFrame为Tx类型,则选择LinTxPdu,如果前面的LinIfFrame为Rx类型,则选择LinRxPdu。
点击新建的LinTxPdu然后选择右边LinIfTxPduRef对象,要求和LinIfFrame名称对应,如LinIfFrame_Tx1对应LinIfFrame_Tx1。
以LinIfFrame_Tx1为例配置LinTxPdu配置参数:
参数名 |
设置值 |
说明 |
LinIfUserTxUL |
PDUR |
用于确定触发LinTxPdu发送的 上层模块,并在发送成功后通知该模块。 |
LinIfTxPduRef |
Li nIfFrame_Tx1 |
指向一个ECUC中 定义的PDU,将LinIfTxPdu和Pdu关联起来 |
按照上面的步骤完成剩下LinIfFrame的配置。
报文名 |
LinIfTxPdu\LinIfRxPdu |
LinIfFrame_Tx1 |
LinIfTxPdu |
LinIfFrame_Tx2 |
LinIfTxPdu |
LinIfFrame_Rx1 |
LinIfRxPdu |
LinIfFrame_Rx2 |
LinIfRxPdu |
展开LinIfScheduleTables,右击LinIfScheduleTable_0新建一个LinIfEntry对象。
LinIfScheduleTable_0配置说明:
参数名 |
设置值 |
说明 |
LinIfR esumePosition |
STAR T_FROM_BEGINNING |
定义调度表被中断后从头开始运行 (也可以设置为从断点处接着运行) |
LinIfRunMode |
RUN_CONTINUOUS |
定义调度表执行的次数 |
新建完成之后进行如下重命名,并在右边配置栏中配置LinIfFrameRef选项。要求与前面名称对应。
LinIfDelay:到调度表的下一个Entry之间的延时时间(单位:秒)
LinIfFrameRef:指向本Entry对应的Frame
按照步骤创建剩下的LinIfEntry,并配置右边LinIfFrameRef选项。
校验配置,无错误信息,即配置完成。
5.2.4 Com模块配置
双击Com模块,打开Com模块的配置界面。
ComGeneral标签页里面只需要配置ComSupportedIPduGroups参数,其余参数保持默认即可。ComSupportedIPduGroups是指IPduGroup的个数。IPduGroups会在ComConfig标签页中配置。后面的配置中将会配置2个IPduGroup,所以将这个参数配置为2。
ComConfig下的两个参数不需要配置,保持默认即可。
ComGwMapping为信号路由的配置,本次示例不需要信号路由,不需要创建对应对象。
新建4个ComIPdu对象,并修改名字。
根据前文中定义的报文,创建4个ComIPdu对象。由于ComIPdu属性配置需要关联其他的对象,ComIPdu的属性先暂时不配置,待添加了其它对象后再配置ComIPdu属性。(参照步骤)
配置ComIPduGroup。
将IPdu加入IPduGroup可以方便的控制IPdu的状态,根据需要使能和禁止IPdu的收发。
添加两个ComIPduGroup对象,一个用于管理发送报文,一个用于管理接收报文,参数保持默认即可。
配置ComSignal。
ComSignal对象属性的配置(以信号ComSignal_Tx1为例):
参数名 |
设置值 |
说明 |
ComBitPosition |
0 |
根 据实际使用帧的Startbit参数填写 |
ComBitSize |
64 |
根据实际使用帧的Length参数填写 |
ComSignalEndianness |
L ITTLE_ENDIAN |
Motorola格式设为BIG_ENDIAN Intel格式设置为LITTLE_ENDIAN |
ComSignalInitValue |
0x00 |
根据实际使用帧的Initial Value参数填写 |
ComSignalType |
UINT64 |
根据实际使用帧的Length参数填写 |
Com RxDataTimeoutAction |
NONE |
当信号属 于发送报文时,设置为NONE当信号 属于接收报文时,配置为NONE,超 时后不做处理,配置为REPLACE, 超时后用初始化值代替接收值,配 置为SUBSTITUTE,超时后使用Com TimeoutSubstitutionValue值替换 |
ComInitialValueOnly |
False |
设置为True后, 初始化后不会再更新这个信号的值 |
ComTransferProperty |
PENDING |
根据 DBC中GenSigSendType参数设置: Cycle 对应 PENDING OnWrite 对应 TRIGGER OnChange 对TRIGGER_ON_CHANGE |
配置ComTimeBase, ComGwTimeBase定义信号网关处理函数的周期,ComRxTimeBase定义接收处理的周期,ComTxTimeBase定义发送处理的周期。
配置ComIPdu属性。以IPDU_COM_LIN_Tx1为例说明:
参数名 |
设置值 |
说明 |
ComIPduDirection |
SEND |
报文为发送报文 |
C omIPduSignalProcessing |
DEFERRED |
在周期函数中处理信号 |
ComIPduType |
NORMAL |
正常报文(非TP报文) |
ComIPduGroupRef |
Com_TxPduGro up_LinController_0 |
属于Com_TxPdu Group_LinController_0 |
ComIPduSignalGroupRef |
没 有信号组,不需要配置 |
|
ComIPduSignalRef |
ComSignal_Tx1 |
将属于IPDU_COM_ LIN_Tx1的信号关联进来 |
ComPduIdRef |
Com_LinIfFrame_Tx1 |
指向EcuC中定义的Pdu |
为发送报文配置ComTxIPdu(以IPDU_COM_LIN_Tx1为例)。每个发送IPdu,必须要配置一个ComTxIPdu,参数保持默认值即可。只发送报文需要配置。
添加ComTxModeTrue对象(以IPDU_COM_LIN_Tx1为例)。
发送报文必须要配置ComTxModeTrue对象。
ComTxMode配置参数说明:
参数名 |
设置值 |
说明 |
ComTxModeMode |
NONE |
非周期报文(由调度表管理发送) |
校验配置,无错误信息,Com模块即配置完成。
5.2.5 PduR模块配置
双击PduR模块,打开PduR模块配置界面。
PduRGeneral配置。
保持默认即可。
PduRBswModuler配置。
PduR模块的目的是实现上层模块到下层模块的路由。PduRBswModuler对象用来描述上层模块和下层模块属性。本示例中上层模块为Com,下层模块为LinIf,PduR模块将Com中的Pdu路由到LinIf中。所以需要新建2个PduRBswModuler对象,分别对应Com和LinIf。
PduRRoutingTables配置。
该容器有4个配置选项,保持默认即可。
配置路由表。
由于有4个报文需要收发,所以需要配置4个路由路径。
配置发送路由表。
每个路由表下有一个SrcPdu,有一个DestPdu。发送报文,是从Com到LinIf,所以SrcPdu选择Com模块中关联的Pdu,DestPdu选择LinIf中关联的Pdu。
配置接收路由表。
发送报文,是从LinIf到Com,所以SrcPdu选择LinIf模块中关联的Pdu,DestPdu选择Com中关联的Pdu。
校验配置,无错误信息,PduR模块即配置完成。
5.2.6 ComM模块配置
双击ComM模块,打开ComM模块配置界面。
ComMGeneral标签页中的参数保持默认即可。
ComMConfigSet配置。
默认已经生成了一个ComMChannel对象ComMChannel_0和一个ComMUser对象ComMUser_0,修改以下几个参数,其余参数保持默认值。
校验配置,无错误信息,ComM模块即配置完成。
5.2.7 LinSM模块配置
双击LinSM模块,打开LinSM模块配置界面。
LinSMGeneral标签页内各参数保持默认值。
LinSMConfigSet标签页参数说明如表5-11。其余参数保持默认值。
参数名 |
设置值 |
说明 |
ComMNetwork Handle Ref |
ComMChannel_0 |
指向ComM配置的通道 |
Schedule Index Ref |
LinIf ScheduleTable_0 |
指 向LinIf中所配置的调度表 |
校验配置,无错误信息,LinSM模块即配置完成。
代码工程介绍
项目交付给用户的工程目录结构如下:
Config目录,这个目录用来存放基础软件配置工具生成的配置文件。
模块相关的静态源代码,存放在各个模块的文件夹下。
应用配置文件
将4.2章节生成的配置文件复制到Config文件夹中。
添加初始化函数和周期调用函数。
Lin_Init(&Lin_Config); 初始化Lin、LinIf、LinSM模块 LinIf_Init(NULL_PTR); LinSM_Init(NULL_PTR); /* Initialize the Pdur module */ 初始化PduR模块 PduR_Init(&PduR_PBConfigData); /* Initialize the Com module */ 初始化Com模块 Com_Init(&Com_PBConfigData); Com_SetIpduGroup(ipduGroupVector,Com_RxPduGroup_LinController_0, TRUE); Com_SetIpduGroup(ipduGroupVector,Com_TxPduGroup_LinController_0, TRUE); Com_ReceptionDMControl(ipduGroupVector); 使能接收和发送IPduGroup Com_IpduGroupControl(ipduGroupVector, TRUE); /* Initialize the ComM module */ 初始化ComM模块 ComM_Init(&ComM_Config); ComM_RequestComMode(ComMUser_0, COMM_FULL_COMMUNICATION); ComM_CommunicationAllowed(ComMChannel_0, TRUE); 将配置的通道切换到FULL_COMMUNICATION |
添加MainFunction函数
/*Task_5ms_Dcpd: Core0(CPU0),Type = BASIC, Priority = 6*/ TASK(Task_5ms_Dcpd) 启用lin协议栈通信 { /* please insert your code here … */ ComM_MainFunction_ComMChannel_0(); Com_ReceiveSignal(ComSignal_Rx1,&u1_ComTest); Com_SendSignal(ComSignal_Tx1,&u1_ComTest); Com_ReceiveSignal(ComSignal_Rx2,&u2_ComTest); Com_SendSignal(ComSignal_Tx2,&u2_ComTest); LIN信号的发送和接收 if (E_OK != TerminateTask()) { while (1) { } } } /*Task_50ms_Psc: Core0(CPU0),Type = BASIC, Priority = 5*/ ComM_ModeType old_LinSM_State = COMM_NO_COMMUNICATION; ComM_ModeType new_LinSM_State = COMM_NO_COMMUNICATION; TASK(Task_50ms_Psc) { /* please insert your code here … */ LinIf_MainFunction(); 调用LinIf主函数和LinSM主函数 LinSM_MainFunction(); LinSM_GetCurrentComMode(3,&new_LinSM_State); 获取当前通信模式 if ((COMM_NO_COMMUNICATION == old_LinSM_State) && (COMM_FULL_COMMUNICATION == new_LinSM_State)) { 更新调度表 LinSM_ScheduleRequest(3,1); old_LinSM_State = new_LinSM_State; } if (E_OK != TerminateTask()) { while (1) { /* dead loop */ } } } |
验证结果
根据集成目标,第5章一共配置了4个报文帧,其中2个周期发送报文,2个周期接收报文。
根据前文的配置,这里将PLIN进行如下设置:
接通PLIN可以在Receive窗口看到主机发送来的报文
在Publish窗口创建两个从机发送报文,并发送数据,可以在Receive 窗口看到主机收到的报文: