LINSlave¶
目的¶
本文档旨在通过一个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
新建完成的工程如下所示,步骤7中添加的模块已经被加入到工程中。
图 新建工程-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_Internal.c、ComM_EcuMBswM.h、ComM_Internal.h、ComM_MemMap.h、ComM_Nm.h |
通信栈源码 |
LinIf |
LinIf.c、LinIf.h、LinIf_Cbk.h、LinIf_Internal.h、LinIf_Slave.c、LinIf_Slave.h、LinIf_MemMap.h、LinIf_Types.h、LinTp.c、LinTp.h、LinTp_Internal.c、LinTp_Internal.h、LinTp_Slave.c、LinTp_Slave.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 |
无条件帧 |
0x0 |
Tx |
|
LinIfFrame_Rx1 |
无条件帧 |
0x1 |
Rx |
模块配置¶
EcuC模块配置¶
双击EcuC模块,打开EcuC模块配置界面。
图 EcuC配置-1
在EcucConfigSets栏目上右键,选择EcucConfigSet。再在EcucConfigSet上右键,选择New🡪EcucPduCollection。
图 EcuC配置-2
PduIdTypeEnum 选择UINT16.
PduLengthTypeEnum 选择UINT16。
在EcucPduCollection上右键,选择Pdu,会生成一个Pdu的配置界面。
图 EcuC配置-3
这里按照发送和接收,将Pdu名字改为报文的名字。
PduLength:Pdu长度,根据实际使用帧的长度设置。
根据步骤3的描述,配置其余报文的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配置参数说明¶ 参数名
设置值
说明
LinIfMainFunctionPeriod
0.005
LinIf Main函数的调度周期
LinIfSleepModeFrameDelay
4
节点进入睡眠模式后,再次发送帧(frame)之前需要等待的最小时间延迟
LinIfBusIdleTimeoutPeriod
4
总线空闲时间
LinIfGotoSleepConfirmationUL
LINSM
Go-to-sleep命令的确认通知,通知的上层模块
LinIfGotoSleepIndicationUL
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
按照步骤创建2个对象,根据章节(集成目标)修改名字,并将LinIfFrameId设置为对应值。
图 LinIf配置-4
下面对不同名称的帧各举一例说明配置参数。
LinIfFrame_Tx1报文LinFrame配置说明:
表 LinIfFrame_Tx1报文LinFrame配置说明¶ 参数名
设置值
说明
LinIfChecksumType
ENHANCED
报文使用的checksum类型(此处使用增强型校验)
LinIfFrameType
UNCONDITIONAL
报文帧的类型(此处设置为无条件帧)
LinIfFrameId
0x0
报文ID
LinIfFrame_Rx1报文LinFrame配置说明:
表 LinIfFrame_Rx1报文LinFrame配置说明¶ 参数名
设置值
说明
LinIfChecksumType
ENHANCED
报文使用的checksum类型(此处使用增强型校验)
LinIfFrameType
UNCONDITIONAL
报文帧的类型(此处设置为无条件帧)
LinIfFrameId
0x1
报文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关联起来
按照上面的步骤完成剩下LinIfFrame的配置。
表 其他报文LinIfFrame配置说明¶ 报文名
LinIfTxPdu\LinIfRxPdu
LinIfFrame_Tx1
LinIfTxPdu
LinIfFrame_Rx1
LinIfRxPdu
选择Lin节点模式,当前配置为从机。
图 LinIf配置-7
选择当前使用的Lin协议版本。
图 LinIf配置-8
新建一个Lin从节点的配置。
图 LinIf配置-9
LinSlave参数配置说明
表 LinSlave配置¶ 参数名
设置值
说明
LinIfConfiguredNAD
4
从节点配置的NAD
LinIfFunctionId
0
Function Id
LinIfInitialNAD
4
从节点初始化的NAD
LinIfNasTimeout
1.0
N_As超时时间,单位为秒。
LinIfSupplierId
5
Supplier Id
LinIfVariantID
0
Variant Id
校验配置,无错误信息,即配置完成。
Com模块配置¶
双击Com模块,打开Com模块的配置界面。
图 Com配置-1
ComGeneral标签页里面只需要配置ComSupportedIPduGroups参数,其余参数保持默认即可。ComSupportedIPduGroups是指IPduGroup的个数。IPduGroups会在ComConfig标签页中配置。后面的配置中将会配置2个IPduGroup,所以将这个参数配置为2。
图 Com配置-2
ComConfig下的两个参数不需要配置,保持默认即可。
图 Com配置-3
ComGwMapping为信号路由的配置,本次示例不需要信号路由,不需要创建对应对象。
新建2个ComIPdu对象,并修改名字。
根据前文中定义的报文,创建2个ComIPdu对象。由于ComIPdu属性配置需要关联其他的对象,ComIPdu的属性先暂时不配置,待添加了其它对象后再配置ComIPdu属性。(参照步骤)
图 Com配置-4
配置ComIPduGroup。
将IPdu加入IPduGroup可以方便的控制IPdu的状态,根据需要使能和禁止IPdu的收发。
添加两个ComIPduGroup对象,一个用于管理发送报文,一个用于管理接收报文,参数保持默认即可。
图 Com配置-5
配置ComSignal。
图 Com配置-6
ComSignal对象属性的配置(以信号ComSignal_Tx1为例):
参数名 |
设置值 |
说明 |
---|---|---|
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 |
参数名 |
设置值 |
说明 |
---|---|---|
ComIPduDirection |
SEND |
报文为发送报文 |
ComIPduSignalProcessing |
DEFERRED |
在周期函数中处理信号 |
ComIPduType |
NORMAL |
正常报文(非TP报文) |
ComIPduGroupRef |
Com_TxPduGroup_LinController_0 |
属于Com_TxPduGroup_LinController_0 |
ComIPduSignalGroupRef |
没有信号组,不需要配置 |
|
ComIPduSignalRef |
ComSignal_Tx1 |
将属于ComIPdu_Com_Lin_Tx1的信号关联进来 |
ComPduIdRef |
Com_LinIfFrame_Tx1 |
指向EcuC中定义的Pdu |
图 Com配置-8
图 Com配置-9
为发送报文配置ComTxIPdu,每个发送IPdu,必须要配置一个ComTxIPdu,参数保持默认值即可。只发送报文需要配置。
添加ComTxModeTrue对象,并将ComTxModeMode配置为None。
校验配置,无错误信息,Com模块即配置完成。
PduR模块配置¶
保持默认即可。
PduRBswModuler配置。
PduR模块的目的是实现上层模块到下层模块的路由。PduRBswModuler对象用来描述上层模块和下层模块属性。本示例中上层模块为Com,下层模块为LinIf,PduR模块将Com中的Pdu路由到LinIf中。所以需要新建2个PduRBswModuler对象,分别对应Com和LinIf。
图 PduR配置-2
图 PduR配置-3
PduRRoutingPaths配置。
该容器有4个配置选项,保持默认即可。
图 PduR配置-4
添加PduRDestPdus与PduRSrcPdus。
Pdu的接收或发送有源头也有目的地。发送报文,是从Com到LinIf,所以SrcPdu选择Com模块中关联的Pdu,DestPdu选择LinIf中关联的Pdu。
图 PduR配置-5
图 PduR配置-6
接收报文,是从LinIf到Com的,所以SrcPdu选择LinIf模块中关联的Pdu,DestPdu选择Com中关联的Pdu
图 PduR配置-7
图 PduR配置-8
配置PduRRoutingPaths。
由于有2个报文需要收发,所以需要配置2个路由路径。
图 PduR配置-9
图 PduR配置-10
校验配置,无错误信息,PduR模块即配置完成。
ComM模块配置¶
默认已经生成了一个ComMChannel对象ComMChannel_0和一个ComMUser对象ComMUser_0,修改以下几个参数,其余参数保持默认值。
校验配置,无错误信息,ComM模块即配置完成。
LinSM模块配置¶
参数名 |
设置值 |
说明 |
---|---|---|
ComMNetwork Handle Ref |
ComMChannel_0 |
指向ComM配置的通道 |
图 LinSM配置-2
校验配置,无错误信息,LinSM模块即配置完成。
代码工程介绍¶
项目交付给用户的工程目录结构如下:
Config目录,这个目录用来存放基础软件配置工具生成的配置文件。
模块相关的静态源代码,存放在各个模块的文件夹下。
应用配置文件¶
将章节(模块配置及代码生成)生成的配置文件复制到Config文件夹中。
添加初始化函数和周期调用函数。
1// 初始化Lin、LinIf、LinSM模块
2Lin_Init(&Lin_Config);
3LinIf_Init(NULL_PTR);
4LinSM_Init(NULL_PTR);
5
6
7// 初始化PduR模块
8/* Initialize the Pdur module */
9PduR_Init(&PduR_PBConfigData);
10
11
12// 初始化Com模块
13/* Initialize the Com module */
14Com_Init(&Com_PBConfigData);
15
16// 使能接收和发送IPduGroup
17Com_SetIpduGroup(ipduGroupVector, Com_RxPduGroup_LinController_0, TRUE);
18Com_SetIpduGroup(ipduGroupVector, Com_TxPduGroup_LinController_0, TRUE);
19
20Com_ReceptionDMControl(ipduGroupVector);
21Com_IpduGroupControl(ipduGroupVector, TRUE);
22
23
24// 初始化ComM模块
25/* Initialize the ComM module */
26ComM_Init(&ComM_Config);
27
28// 将配置的通道切换到FULL_COMMUNICATION
29ComM_RequestComMode(ComMUser_0, COMM_FULL_COMMUNICATION);
30ComM_CommunicationAllowed(ComMChannel_0, TRUE);
添加MainFunction函数
1/*Task_5ms_Dcpd: Core0(CPU0),Type = BASIC, Priority = 6*/
2TASK(Task_5ms_Dcpd)
3{
4 /* please insert your code here ... */
5 // 启用lin协议栈通信
6 ComM_MainFunction_ComMChannel_0();
7
8 Com_ReceiveSignal(ComSignal_Rx1, &u1_ComTest); // LIN信号的接收
9 Com_SendSignal(ComSignal_Tx1, &u1_ComTest); // LIN信号的发送
10
11 if (E_OK != TerminateTask())
12 {
13 while (1) {}
14 }
15}
16
17
18/*Task_50ms_Psc: Core0(CPU0),Type = BASIC, Priority = 5*/
19TASK(Task_50ms_Psc)
20{
21 /* please insert your code here ... */
22 // 调用LinIf主函数和LinSM主函数,处理LIN协议栈周期任务
23 LinIf_MainFunction();
24 LinSM_MainFunction();
25
26 if (E_OK != TerminateTask())
27 {
28 while (1)
29 {
30 /* dead loop */
31 }
32 }
33}
验证结果¶
根据集成目标,第5章一共配置了2个报文帧,其中1个周期发送报文,1个周期接收报文。