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 Studio配置工具。通信栈细分为通信栈的各模块及其对应的配置工具模块。
通信栈各配置模块的功能介绍,参见表 通信栈各配置模块介绍。
使用通信栈源码和配置工具,进行通信栈的集成的步骤,参见表 通信栈集成的步骤。
模块名 |
功能 |
---|---|
Lin |
Lin驱动配置。(由MCAL工具导入) |
LinIf |
LinIf模块主要处理上层模块与底层驱动的之间PDU的传递,为上层模块提供统一的接口来管理不同的Lin硬件模块 |
EcuC |
用于辅助配置工具完成配置的模块。主要提供Pdu的定义,其它模块通过关联EcuC中Pdu,相互关联起来。 |
PduR |
PDU Router主要为通讯接口模块(LINIF)、传输协议模块(LIN TP、J1939 TP)、诊断通讯管理模块(DCM、J1939DCM)以及通讯模块(COM、LDCOM)以及IPDUM、SECOC等模块提供基于I-PDU的路由服务。 |
Com |
COM模块主要提供I-PDU和信号相关管理功能 |
ComM |
ComM模块主要进行通信的管理功能。ComM模块收集用户的总线访问请求,并把请求转发到不同的总线。 |
LinSM |
主要功能是与通信硬件抽象层和系统服务层产生交互,为每一个Lin通信总线定义一个总线相关的状态管理,并为相关的总线提供流控制。 |
步骤 |
操作 |
说明 |
---|---|---|
1 |
ORIENTAIS Stuido配置工具工程搭建和通信栈模块加载 |
若配置工具已经搭建,则仅需进行通信栈模块的加载操作。 |
2 |
模块配置及配置文件生成 |
NA |
3 |
代码集成 |
现有工程、通信栈源代码和配置生成文件的集成。 |
4 |
验证测试 |
NA |
Note
通信栈集成之前,用户须确保已经有基础工程,且本通信栈相关的其他通信栈能正常工作。
新建ORIENTAIS工程¶
安装软件后,双击软件图标打开软件
图 新建工程-1
菜单栏File🡪New🡪Project,新建工程
图 新建工程-2
在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next
图 新建工程-3
在弹出的窗口中输入工程名,选择Finish
图 新建工程-4
在弹出的窗口中选择Yes。
图 新建工程-5
在工程的[Bsw_Builder]项目上右键,选择New ECU Configuration
图 新建工程-6
在弹出的窗口中输入一个ECU名,然后选择Next
图 新建工程-7
在弹出的窗口中勾选需要添加的模块,点击Finish。
图 新建工程-8
新建完成的工程如下所示,步骤⑦中添加的模块已经被加入到工程中。
图 新建工程-9
模块配置及代码生成¶
模块配置¶
模块的配置,取决于具体的项目需求。通信栈各模块配置项的详细介绍,参见表 相关文档
模块 |
参考文档及其章节 |
说明 |
---|---|---|
LIN |
MCAL对应的LIN配置手册 |
|
LinIf |
集成手册_LinIf.pdf 章节5 |
|
PduR |
集成手册_PduR.pdf 章节5 |
|
Com |
集成手册_Com.pdf 章节5 |
|
LinSM |
集成手册_LinSM.pdf 章节5 |
|
EcuC |
集成手册_EcuC.pdf 章节5 |
|
ComM |
集成手册_ComM.pdf 章节5 |
配置代码生成¶
功能集成¶
代码集成¶
通信栈代码包括两部分:项目提供的通信栈源码和ORIENTAIS Studio配置生成代码。通信栈集成包括通信栈源码(LIN、LinIf、PduR、ComM、LinSM等)、定时器源码和部分其他模块源码,具体文件见表。
用户须将通信栈源码和章节(配置代码生成)生成的源代码添加到集成开发工具的对应文件夹。通信栈集成的文件结构,参见章节(代码工程介绍)。
移库文件夹 |
移库文件 |
说明 |
---|---|---|
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_Master.c、LinIf_Master.h、LinIf_MemMap.h、LinIf_Types.h、LinTp.c、LinTp.h、LinTp_Internal.c、LinTp_Internal.h、LinTp_Master.c、LinTp_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、PduR_MemMap.h、PduR_Types.h、PduR.c、PduR.h |
|
Com |
Com.c、Com.h、Com_Cbk.h、Com_GwInternal.c、Com_Internal.c、Com_Internal.h、Com_MemMap.h、Com_RxInternal.c、Com_TxInternal.c、Com_Types.h |
|
FreeRTimer |
FreeRTimer.c、FreeRTimer.h |
定时器源码 |
SchM |
SchM.c、SchM.h、SchM_Com.h、SchM_ComM.h、SchM_LinIf.h、SchM_PduR.h、 |
SchM部分源码 |
BswM |
BswM.c、BswM.h、BswM_LinSM.h、BswM_ComM.h、 |
BswM部分源码 |
EcuM |
EcuM_Types.h、EcuM.h、 |
EcuM部分源码 |
Note
通信栈集成之前,用户须确保已经有基础工程,且本通信栈相关的其他通信栈能正常工作。
集成注意事项¶
对于集成过程中,通信栈特殊要求和用户经常出现的问题,归类总结形成表 通信栈集成约束清单。用户需逐一排查表中的约束项,以避免集成问题出现。
编号 |
类别 |
约束限制 |
---|---|---|
1 |
中断 |
通信栈有中断、轮询或混合三种工作模式。若选取中断或混合模式,用户需在通信栈配置对应的中断并填充中断服务API。 |
2 |
堆栈 |
用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间。 |
3 |
头文件 |
|
4 |
初始化 |
以LIN通信为例,通信栈的初始化顺序为:Lin_Init、LinIf_Init、 PduR_Init、Com_Init、LinSM_Init。 |
5 |
周期函数 |
Com_MainFunctionRx、Com_MainFunctionTx、LinIf_MainFunction、LinSM_MainFunction需要被周期性任务函数调用。 |
集成示例¶
集成目标¶
集成后的工程为LIN主节点,集成完成后的工程可以进行两个无条件帧的发送、两个无条件帧的接收。
开启一个周期调度表进行循环调度发送。
通信报文配置如表:
帧名称 |
帧类型 |
ID |
Tx\Rx |
关联帧 |
---|---|---|---|---|
LinIfFrame_Tx1 |
无条件帧 |
0x1 |
Tx |
|
LinIfFrame_Tx2 |
无条件帧 |
0x2 |
Tx |
|
LinIfFrame_Rx1 |
无条件帧 |
0x3 |
Rx |
|
LinIfFrame_Rx2 |
无条件帧 |
0x4 |
Rx |
模块配置¶
EcuC模块配置¶
双击EcuC模块,打开EcuC模块配置界面。
图 EcuC配置-1
在EcucConfigSets栏目上右键,选择New EcucConfigSet。再在EcucConfigSet上右键,选择New🡪EcucPduCollection。
图 EcuC配置-2
PduIdTypeEnum 选择UINT16.
PduLengthTypeEnum 选择UINT16。
在EcucPduCollection上右键,选择Pdu,会生成一个Pdu的配置界面。
图 EcuC配置-3
这里按照发送和接收,将Pdu名字改为报文的名字。
PduLength:Pdu长度,根据实际使用帧的长度设置。
根据表的描述,配置其余报文的Pdu。
图 EcuC配置-4
报文需要PDUR路由,每个方向需要配置2个Pdu。
ECUC模块到此配置结束。在模块上右键,然后选择校验,查看是否配置有错误。
Lin模块配置¶
如果Lin驱动使用的是MCAL配置,那么将MCAL生成的arxml配置文件导入到BSW工具选择对应的Lin模块即可。
LinIf模块配置¶
双击LinIf模块,打开LinIf模块的配置界面。
图 LinIf配置-1
LinIfGeneral标签页保持默认值即可。
在LinIfGlobalConfig标签页下依次打开LinIfGlobalConfigs ->LinIfGlobalConfig,右键新建LinIfChannel_0进行如下配置。
图 LinIf配置-2
LinIfChannel_0配置参数说明:
表 LinIfChannel_0配置参数说明¶ 参数名
设置值
说明
LinIfGotoSleepConfirmationUL
LINSM
Go-to-sleep命令的确认通知,通知的上层模块
LinIfScheduleRequestConfirmationUL
LINSM
调度表切换成功执行后的通知函数,通知的上层模块
LinIfStartupState
NORMAL
Lin通道在启动后所处的状态
LinIfWakeupConfirmationUL
LINSM
Wakeup通知函数,通知的上层模块
LinIfChannelRef
LinChannel_0
LinIf的通道对应的Lin驱动的通道
LinIfComMNetworkHandleRef
ComMChannel_0
LinIf的通道对应的ComM的通道
然后右击LinIfChannel_0新建LinIfFrame对象。
图 LinIf配置-3
按照步骤创建4个对象,根据章节(集成目标)修改名字,并将LinIfFrameId设置为对应值。
图 LinIf配置-4
下面对不同名称的帧各举一例说明配置参数。
LinIfFrame_Tx1报文LinFrame配置说明:
表 LinIfFrame_Tx1报文LinFrame配置说明¶ 参数名
设置值
说明
LinIfChecksumType
ENHANCED
报文使用的checksum类型(此处使用增强型校验)
LinIfFrameType
UNCONDITIONAL
报文帧的类型(此处设置为无条件帧)
LinIfFrameId
0x1
报文ID
LinIfFrame_Rx1报文LinFrame配置说明:
表 LinIfFrame_Rx1报文LinFrame配置说明¶ 参数名
设置值
说明
LinIfChecksumType
ENHANCED
报文使用的checksum类型(此处使用增强型校验)
LinIfFrameType
UNCONDITIONAL
报文帧的类型(此处设置为无条件帧)
LinIfFrameId
0x3
报文ID
点击LinIfFrame_Tx1左边的三角,展开子配置页面,右键新建一个LinPduDirection对象,如果前面的LinIfFrame为Tx类型,则选择LinTxPdu,如果前面的LinIfFrame为Rx类型,则选择LinRxPdu。
图 LinIf配置-5
点击新建的LinTxPdu然后选择右边LinIfTxPduRef对象,要求和LinIfFrame名称对应,如LinIfFrame_Tx1对应LinIfFrame_Tx1。
图 LinIf配置-6
以LinIfFrame_Tx1为例配置LinTxPdu配置参数:
表 LinIfFrame_Tx1报文LinTxPdu配置说明¶ 参数名
设置值
说明
LinIfUserTxUL
PDUR
用于确定触发LinTxPdu发送的上层模块,并在发送成功后通知该模块。
LinIfTxPduRef
LinIfFrame_Tx1
指向一个ECUC中定义的PDU,将LinIfTxPdu和Pdu关联起来
按照上面的6、7步骤完成剩下LinIfFrame的配置。
表 其他报文LinIfFrame配置说明¶ 报文名
LinIfTxPdu\LinIfRxPdu
LinIfFrame_Tx1
LinIfTxPdu
LinIfFrame_Tx2
LinIfTxPdu
LinIfFrame_Rx1
LinIfRxPdu
LinIfFrame_Rx2
LinIfRxPdu
点击LinIfScheduleTables,右键选择New_LinIfScheduleTable,新建LinIfScheduleTable_0
图 LinIf配置-6
点击LinIfScheduleTable_0,右键新建一个LinIfEntry对象。
图 LinIf配置-7
LinIfScheduleTable_0配置说明:
表 LinIfScheduleTable_0配置说明¶ 参数名
设置值
说明
LinIfResumePosition
START_FROM_BEGINNING
定义调度表被中断后从头开始运行(也可以设置为从断点处接着运行)
LinIfRunMode
RUN_CONTINUOUS
定义调度表执行的次数
新建完成之后进行如下重命名,并在右边配置栏中配置LinIfFrameRef选项。要求与前面名称对应。
图 LinIf配置-8
LinIfDelay:到调度表的下一个Entry之间的延时时间(单位:秒)
LinIfFrameRef:指向本Entry对应的Frame
按照10、11步骤创建剩下的LinIfEntry,并配置右边LinIfFrameRef选项。
点击LinIfNodeTypes,右键新建LinIfNodeType,在LinIfNodeType下根据主从配置选择新建LinIfMaster或者LinIfSlave
图 LinIf配置-9
配置LinIfIitter时间
图 LinIf配置-10
LinMaster配置说明:
参数名 |
设置值 |
说明 |
---|---|---|
LinIfJitter |
0.0 |
抖动指定从时间基准tick到报头发送起点(以秒为单位)的最大和最小延迟之间的差异。 |
校验配置,无错误信息,即配置完成。
Com模块配置¶
双击Com模块,打开Com模块的配置界面。
图 Com配置-1
ComGeneral标签页里面只需要配置ComSupportedIPduGroups参数,其余参数保持默认即可。ComSupportedIPduGroups是指IPduGroup的个数。IPduGroups会在ComConfig标签页中配置。后面的配置中将会配置2个IPduGroup,所以将这个参数配置为2。
ComConfig下的两个参数不需要配置,保持默认即可。
图 Com配置-2
ComGwMapping为信号路由的配置,本次示例不需要信号路由,不需要创建对应对象。
新建4个ComIPdu对象,并修改名字。
根据前文中定义的报文,创建4个ComIPdu对象。由于ComIPdu属性配置需要关联其他的对象,ComIPdu的属性先暂时不配置,待添加了其它对象后再配置ComIPdu属性。
图 Com配置-4
配置ComIPduGroup。
将IPdu加入IPduGroup可以方便的控制IPdu的状态,根据需要使能和禁止IPdu的收发。
添加两个ComIPduGroup对象,一个用于管理发送报文,一个用于管理接收报文,参数保持默认即可。
图 Com配置-5
配置ComSignal。
图 Com配置-6
ComSignal对象属性的配置(以信号ComSignal_Tx1为例):
表 ComSignal属性配置说明¶ 参数名
设置值
说明
ComBitPosition
0
根据实际使用帧的Startbit参数填写
ComBitSize
64
根据实际使用帧的Length参数填写
ComSignalEndianness
LITTLE_ENDIAN
Motorola格式设为BIG_ENDIAN
Intel格式设置为LITTLE_ENDIAN
ComSignalInitValue
0x00
根据实际使用帧的Initial Value参数填写
ComSignalType
UINT64
根据实际使用帧的Length参数填写
ComRxDataTimeoutAction
NONE
当信号属于发送报文时,设置为NONE当信号属于接收报文时,配置为NONE,超时后不做处理,配置为REPLACE,超时后用初始化值代替接收值,配置为SUBSTITUTE,超时后使用ComTimeoutSubstitutionValue值替换
ComInitialValueOnly
False
设置为True后,初始化后不会再更新这个信号的值
ComTransferProperty
PENDING
根据DBC中GenSigSendType参数设置:
Cycle 对应 PENDING
OnWrite 对应 TRIGGER
OnChange 对TRIGGER_ON_CHANGE
配置TX与RX的周期处理函数的周期(根据实际需要填写)
图 Com配置-7
配置ComIPdu属性。以ComIPdu_Com_LinIf_Tx1为例说明:
表 ComIPdu属性配置说明¶ 参数名
设置值
说明
ComIPduDirection
SEND
报文为发送报文
ComIPduSignalProcessing
DEFERRED
在周期函数中处理信号
ComIPduType
NORMAL
正常报文(非TP报文)
ComIPduGroupRef
Com_TxPduGroup_LinController_0
属于Com_TxPduGroup_LinController_0
ComIPduSignalGroupRef
没有信号组,不需要配置
ComIPduSignalRef
ComSignal_Tx1
将属于IPDU_COM_LIN_Tx1的信号关联进来
ComPduIdRef
Com_LinIfFrame_Tx1
指向EcuC中定义的Pdu
图 Com配置-8
图 Com配置-9
为发送报文配置ComTxIPdu(以ComIPdu_Com_LinIf_Tx1为例)。每个发送IPdu,必须要配置一个ComTxIPdu,参数保持默认值即可。只发送报文需要配置。
图 Com配置-10
添加ComTxModeTrue对象(以ComIPdu_Com_LinIf_Tx1为例)。
发送报文必须要配置ComTxModeTrue对象。
图 Com配置-11
ComTxMode配置参数说明:
表 ComTxMode配置说明¶ 参数名
设置值
说明
ComTxModeMode
NONE
非周期报文(由调度表管理发送)
校验配置,无错误信息,Com模块即配置完成。
PduR模块配置¶
双击PduR模块,打开PduR模块配置界面。
图 PduR配置-1
PduRGeneral配置。
保持默认即可。
PduRBswModuler配置。
PduR模块的目的是实现上层模块到下层模块的路由。PduRBswModuler对象用来描述上层模块和下层模块属性。本示例中上层模块为Com,下层模块为LinIf,PduR模块将Com中的Pdu路由到LinIf中。所以需要新建2个PduRBswModuler对象,分别对应Com和LinIf。
图 PduR配置-2
配置PduRDestPdus与PduRSrcPdus。
Pdu的接收或发送有源头也有目的地。发送报文,是从Com到LinIf,所以SrcPdu选择Com模块中关联的Pdu,DestPdu选择LinIf中关联的Pdu。
图 PduR配置-3
图 PduR配置-4
接收报文,是从LinIf到Com的,所以SrcPdu选择LinIf模块中关联的Pdu,DestPdu选择Com中关联的Pdu。
图 PduR配置-5
图 PduR配置-6
按照以上配置方式,配置剩余Pdu。
配置PduRRoutingPaths。
因为配置了2个接收,2个发送报文,所以需要配置4个路由路径
图 PduR配置-7
图 PduR配置-8
校验配置,无错误信息,PduR模块即配置完成。
ComM模块配置¶
LinSM模块配置¶
双击LinSM模块,打开LinSM模块配置界面。
图 LinSM配置-1
LinSMGeneral标签页内各参数保持默认值。
LinSMConfigSet标签页参数说明如表。其余参数保持默认值。
表 LINSM配置参数说明¶ 参数名
设置值
说明
ComMNetwork Handle Ref
ComMChannel_0
指向ComM配置的通道
Schedule Index Ref
LinIfScheduleTable_0
指向LinIf中所配置的调度表
图 LinSM配置-2
图 LinSM配置-3
校验配置,无错误信息,LinSM模块即配置完成。
代码工程介绍¶
项目交付给用户的工程目录结构如下:
Config目录,这个目录用来存放基础软件配置工具生成的配置文件。
模块相关的静态源代码,存放在各个模块的文件夹下。
应用配置文件¶
将章节(模块配置及代码生成)生成的配置文件复制到Config文件夹中。
添加初始化函数和周期调用函数。
1// 初始化Lin、LinIf、LinSM模块 2Lin_Init(&Lin_Config); 3LinIf_Init(NULL_PTR); 4LinSM_Init(NULL_PTR); 5 6// 初始化PduR模块 7/* Initialize the Pdur module */ 8PduR_Init(&PduR_PBConfigData); 9 10// 初始化Com模块 11/* Initialize the Com module */ 12Com_Init(&Com_PBConfigData); 13// 使能接收和发送IPduGroup 14Com_SetIpduGroup(ipduGroupVector, Com_RxPduGroup_LinController_0, TRUE); 15Com_SetIpduGroup(ipduGroupVector, Com_TxPduGroup_LinController_0, TRUE); 16 17Com_ReceptionDMControl(ipduGroupVector); 18Com_IpduGroupControl(ipduGroupVector, TRUE); 19 20// 初始化ComM模块 21/* Initialize the ComM module */ 22ComM_Init(&ComM_Config); 23// 将配置的通道切换到FULL_COMMUNICATION 24ComM_RequestComMode(ComMUser_0, COMM_FULL_COMMUNICATION); 25ComM_CommunicationAllowed(ComMChannel_0, TRUE);
添加MainFunction函数
1/*Task_5ms_Dcpd: Core0(CPU0),Type = BASIC, Priority = 6*/ 2/* 启用lin协议栈通信 */ 3void TASK(Task_5ms_Dcpd) 4{ 5 /* please insert your code here ... */ 6 ComM_MainFunction_ComMChannel_0(); 7 8 // LIN信号的发送和接收 9 Com_ReceiveSignal(ComSignal_Rx1, &u1_ComTest); 10 Com_SendSignal(ComSignal_Tx1, &u1_ComTest); 11 Com_ReceiveSignal(ComSignal_Rx2, &u2_ComTest); 12 Com_SendSignal(ComSignal_Tx2, &u2_ComTest); 13 14 15 if (E_OK != TerminateTask()) 16 { 17 while (1) {} 18 } 19} 20 21/*Task_50ms_Psc: Core0(CPU0),Type = BASIC, Priority = 5*/ 22ComM_ModeType old_LinSM_State = COMM_NO_COMMUNICATION; 23ComM_ModeType new_LinSM_State = COMM_NO_COMMUNICATION; 24TASK(Task_50ms_Psc) 25{ 26 /* please insert your code here ... */ 27 // 调用LinIf主函数和LinSM主函数 28 LinIf_MainFunction(); 29 LinSM_MainFunction(); 30 31 // 获取当前通信模式 32 LinSM_GetCurrentComMode(3, &new_LinSM_State); 33 if ((COMM_NO_COMMUNICATION == old_LinSM_State) && 34 (COMM_FULL_COMMUNICATION == new_LinSM_State)) 35 { 36 // 更新调度表 37 LinSM_ScheduleRequest(3, 1); 38 old_LinSM_State = new_LinSM_State; 39 } 40 41 if (E_OK != TerminateTask()) 42 { 43 while (1) { /* dead loop */ } 44 } 45}
验证结果¶
根据集成目标,第5章一共配置了4个报文帧,其中2个周期发送报文,2个周期接收报文。