General
本文主要介绍如何配置LIN Stack , 对于LIN Stack的功能介绍还请参见AUTOSAR LIN Introduction
本文配置内容以VECTOR 工具为基础,不过对于其他工具也是一样的配置方法。
很多朋友可能有疑问认为很多工具都支持自动导入LIN LDF 文件,所有配置都可以自动生成,为什么还需要了解细节和手动配置这部分内容。
我是这么理解这个问题的:
- 理解这些属性的原理和配置底层逻辑,可以使你摆脱工具的限制,避免出现换了工具就不会了这种情况
- 目前AUTOSAR 整个功能对应复杂功能安全的设计并不是很完备,有时一个复杂的项目需要我们结合自身的情况做配置更改,如果过于依赖自动配置将是我们设计复杂架构方案受到局限
- 自动导入配置生成,过于依赖输入文件的准确性,如果输入文件存在不正确,可能需要大量时间弥补
- 从产品安全的角度来说,我个人认为自动导入的配置因为没有工程人员的“复核” 是不安全的,就好像是别人写的代码未经过我们review 是不可信的原因一致。当然如果我们要“复核‘也是需要知道这里面的细节的,也是需要了解底层逻辑的。
- 从业务角度来说,我更希望结合业务功能做自动配置生成的工具的开发,不单关心底层AUTOSAR配置生成,而是上层APP 逻辑也配套生成,这样能更加高效
Data Flow
应用报文: LIN – LINIF – PDUR – COM - APP
诊断报文: LIN – LINIF – LINTP – PDUR - CDD(DCM)
EcuC
每个非诊断LIN FRAME 都需要一个ECUC(ECUC_NORMAL) 用于映射LINIF与COM
如果有LIN 诊断报文,则需要LIN SLAVE 数量*2 个ECUC ( ECUC_TP_MASTER_XXX and ECUC_TP_SLAVE_XXX) 用于映射LINTP 与CDD(或DCM)
ComM
创建一个新的COMM映射LIN CHANNEL
ComMUser
ComMChannel
LinIf
LinIfGeneral
LinIfGlobalConfig
TimeBase: Global的时间基数,对于Frame 之间的delay 需要更能够整除Timebase
LinChannel
位置是LinIfGlobalConfig/LinChannel
Channel Ref: 引用LinDriver
ComM Network Handle Ref: 引用ComM
Goto Sleep Confirmation UI: Sleep Confirmation状态通知给哪个Upper Layer
Schedule Request Confirmation UI: Schedule Request Confirmation状态通知给哪个Upper Layer
Startup State:如果不支持LIN WAKEUP 功能选择NORMAL,反之选择SLEEP
Wakeup Confirmation UI: Sleep Confirmation状态通知给哪个Upper Layer
LinSlaves
定义所有的Slave 信息
对于这部分内容来自Lin ldf file
LinMaster
对于这部分内容来自Lin ldf file
Cluster Time Base:将决定LinIf_Mainfunction的周期
LinFrames
定义所有的LIN Frame这部分也来自Lin Ldf file
Checksum Type: 分为Classic / Enhanced
Frame Type:
UNCONDITIONAL: 无条件帧
EVENT TRIGGERD: 触发帧
SPORADIC :偶发帧
MRF: Master Diagnosis Request Frame
SRF: Slave Diagnosis Response Frame
PID: Protected ID, 与Frame ID映射关系如下
LinPduDirection
对于Normal RX LIN FRAME ,需要选择LinIfRxPdu
Rx Indication:选择PDUR
Rx Pdu Ref: 需要和COM /PDU 共同引用这个ECUC
对于Normal TX LIN FRAME ,需要选择LinIfTxPdu
User Tx UI:选择PDUR
Tx Pdu Ref: 需要和COM /PDU 共同引用这个ECUC
对于诊断报文,选择LinIfInternalPdu 即可
LinScheduleTables
创建完成Lin Frame,需要结合LIN LDF file中对于LIN Schedule Table的定义进行配置
Schedule Table Index: 从1开始,线性变化(0 作为NULL Schedule Table)
Resume Position:
Schedule Table(RunMode = Continuous)回复执行时可以选择从头重新执行或者从被打断的地方继续执行, 对于无条件帧(RunMode = Once)和MRF / SRF 都会打断Schedule Table(RunMode = Continuous)运行
Run Mode:
- Continuous
如果RunMode = Continuous, 那么所关联的Schedule Table 一旦被请求将会被周期的执行
如果当前Schedule Table(RunMode = Continuous,如果其他Schedule Table (RunMode = Continuous)被请求, 则需要等待当前Schedule Table 本轮调度完成(包含的所有Entry都运行完成 )才可以执行下一个Schedule Table的请求
- Once
如果RunMode = Once, 那么所关联的Schedule Table 只会执行一次
如果当前Schedule Table(RunMode = Continuous)正在运行时,如果其他Schedule Table (RunMode = ONCE)被请求, 则立刻会打断当前正在运行的Schedule Table,执行这个Schedule Table(RunMode = ONCE)的请求, 当新的Schedule Table(RunMode = ONCE)执行完成之后,如果没有新的Schedule Table(RunMode = ONCE)被请求,则会继续执行上个被打断的Schedule Table(RunMode = Continuous),执行的策略需要参考resume Position属性
如果RunMode = Once, 所关联的Schedule Table正在运行时,如果其他Schedule Table (RunMode = Once)被请求, 则需要等待当前Schedule Table调度完成(才可以执行下一个Schedule Table的请求
Schedule Mode :
LINTP_APPLICATIVE_SHEDULE: 对于非诊断Schedule Table 可以选择这个
LINTP_DIAGREQUEST: Master 诊断报文选择
LINTP_DIAGRESPONSE: SALVE 诊断回复选择
LinIfEntry
每一个schedule Table包含若干个Lin Frame, 如下内容定义在LDF file中
按照以上内容,完成LinIfEntry的配置
Delay: 紧临的LinIfEntry 之间的发送delay
Frame Ref: 所关联的LIN Frame
Collision Resolving Ref: 对于事件帧如果产生冲突所引用的Schedule Table
Entry Index: 从0开始,线性变化
LinSM
LinSMGeneral
Main Processing Period: LINSM_Mainfunction的调度周期
LinSMChannel
位置是LinSMConfigSet/LinSMChannel
Transceiver Passive Mode : Selects STANDBY (true) or SLEEP (false) transceiver mode when entering LINSM_NO_COM.
LinSMSchedules
这里定义所有供APP 请求的Schedule
Schedule Index: 从1开始,线性变化(0 作为NULL Schedule Table)
Schedule Index Ref: 引用LINIF 中定义的schedule Table
LinTp
LinTpGlobalConfig
Max Number of Resp Pending Frame: 最大返回PENDING 次数
P2 Max: Pending Frame 返回的时间间隔
LinTpRxNSdus
针对我们的例子我们有4个SLAVE, Master 要分别和这4个Slave进行诊断通信
DL: 最小Data Length
Rx NSdu Channel Ref: 引用LinIfChannel
Rx NSdu Pdu Ref: 引用ECUC_TP_SLAVE_XXX,用于连接Lintp和 与Cdd
Rx NSdu Id:从0开始,线性变化
Rx NSdu Nad: Slave Nad
LinTpTxNSdus
Tx NSdu Nad: 与master 通信的Slave NAD
Tx NSdu Id:从0开始,线性变化
Rx NSdu Pdu Ref: 引用ECUC_TP_MASTER_XXX,用于连接Lintp和 与Cdd
PduR
正如在前面Data Flow中介绍的一样LINTP/LINIF 和CDD/COM 交互需要通过PduR,且LINTP/LINIF 属于Lower Layer, CDD 属于Upper Layer
PduRBswModules
PduRRoutingTable
Note:详细介绍见AUTOSAR PDUR Introduction 一文
Com
当LIN Frame通过PduR 传递给COM Layer 我们需要将LIN frame中的内容映射到COM
LIN FRAME -> COM.PDU
LIN SIGNAL -> COM.SIGNAL
在这里不做COM Layer更多的配置介绍