年关将至,很多同学都开始摩拳擦掌,准备来年换个地方了。很多同学做过很多项目,但是不善于表达。因此将推出几篇面试中常见的autosar问题及参考回答,大家有其他遇见的问题也欢迎私信我,到时候我整理后一并发出来。希望大家共同进步,赢得高薪。
1 简述一下CAN/ETH协议栈涉及到的BSW模块及数据流向。
CAN:CAN<->CanIf<->PduR<->Com
ETH:ETH<->EthIf<->TcpIP<->SoAd<->PduR<->Com/LdCom
2 以太网各个分层的作用及TCP/UDP传输比较。
Autosar以太网框架见<<
TCP/IP由ARP、IPv4、IPv6、ICMPv4、ICMPv6、NDP、UDP、TCP、DHCPv6和DHCPv4组成。IP(网络协议层)主要负责将数据分发到不同的目的地址,它隐藏了网络接口层的物理信息。ARP(地址解析协议,处于IPv4协议中)的主要功能是根据IP地址获取物理地址(如MAC地址)。
SoAd主要的作用是为使用PDU的Autosar的通信模块(如PDUR)和TCP/IP提供一个接口。它为Pdu ID和socket连接做一个映射。
3 UDS升级流程。
4 Autosar OS的任务切换机制。
关于Autosar OS我们也写了很多文章,如<<多核单片机中Autosar OS 任务调度实现原理和配置>>。一般是主核有一个GPT(通用定时器模块)作为OS的滴答时钟,当中断触发时,会判断当前正在执行的任务的优先级与已就绪的任务优先级,这与其他开源OS类似,但是Autosar OS由于使用的是配置生成,也就是说在代码运行前就已经确定好所有任务和优先级,因此它不同于其他OS需要使用繁琐的机制来判断当前就绪的最高任务优先级,而可以使用一系列数组的形式将每个时刻要执行的任务排好,其实也就是空间换时间。对于多核单片机来说,当判断当前任务属于其他核时,则触发其他核的软中断,其他核(slave核)在软中断中执行保存上文核切换下文等操作。
5 怎么理解Autosar OS的基础任务与扩展任务。
关于基础任务与扩展任务,我们已在<<Autosar OS及其他OS的任务间通信机制>>一文中详细叙述。
基础任务基本过程为:Suspend-> Ready-> Running-> Suspend (循环)。扩展任务相对于基础任务多了一个等待态,基本过程为:Suspend-> Ready-> Running-> waiting-> Ready (循环)。extend task相对basic task,在waiting的时候还消耗堆栈资源,如果所有的task共用一块堆栈是会一定程度上影响性能的(栈分析见<<从开源OS到Autosar OS的栈管理机制>>).
6 Autosar BswM模块的作用
BswM模块已在<<一文搞懂Autosar BswM模块的原理和配置>>一文中详细分析。BSWM模块通俗来说就是BSW模块间的状态管理模块,负责读取各个BSW模块和SWC模块的状态,然后对这些状态进行判断,再根据判断的结果决定接下来执行什么动作,因此主要需要配置三个方面的内容读取信息、判断、根据判断结果执行动作。
7 Dcm模块的作用。
Dcm模块的介绍详见<<UDS(下)之DCM模块配置>>. DCM模块为诊断服务提供一系列通用的API接口,它确保了诊断的数据流、管理会话和安全等诊断状态。
由DSL(Diagnostic Session Layer)、DSD(Diagnostic Service Dispatcher)和DSP(Diagnostic Service Processing)三个子模块组成。DSL负责确保诊断请求和回复的数据流向、监控和确保协议定时以及管理诊断状态等;DSD模块负责处理接收和发送的诊断数据并分发给相应的处理模块。DSP负责诊断服务的具体处理。
8 UDS中数据快照(DTCSnapshot)与扩展数据(DTCExtendedData)的区别。
快照数据(有时也会叫冻结帧freeze frames)是存储在服务端内存中,并与故障码相关的具体数据记录,典型场景就是一旦检测到系统故障便存储数据。系统故障发生瞬间,一系列的数据值便会被冻结(快照)下来,如故障发生时的时间、电压、行驶里程和车速等。扩展数据的典型用法就是用来存储与故障码相关的动态数据,如:故障码发生次数,统计在驾驶循环中故障码状态位Bit1(“TestFailed”)被上报的次数;故障码老化次数,自故障码最近一次失效以来统计驾驶循环的次数,不包括未报出"testPassed" 或者"testFailed"的驾驶循环;最近发生时间;测试失效次数,统计"testFailed"汇报次数;未完成次数、故障测试最近一个完成后驾驶循环的次数。
9 UDS中DTC的各个状态位的含义及关系。
Bit0 testFailed
表示最近的测试结果,置1表示最近一次测试失败(故障处于Failed状态)了。置位后,可以通过清除故障信息服务(0x14)复位(清0).当测试结果为Passed时,也会清0.
Bit1 testFailedThisOperationCycle
表示在当前循环测试发生了失败(故障确认发生,Failed)。置位后,可以通过清除故障信息服务(0x14)复位(清0).当本次循环结束时,也会清0.
Bit2 pendingDTC
当测试结果为Failed时,置位。这个时候状态都已经存储在NVM中了,当至少1次测试结果为Passed或者接收到清除故障信息请求后复位(清0).
Bit3 confirmedDTC
故障持续发生至少1次(测试持续出现至少1次Failed)时置位。这个位不能表明在当前循环中发生了故障,而testFailedThisOperationCycle可以表示在当前循环中出现了这个故障。可以通过清除故障信息服务(0x14)复位(清0)。当达到老化阈值(连续多次测试Passed)也会清0.当然,这个时候DTC是要存储在NVM的,假如NVM空间不足,此时又有更高优先级的DTC要存储,那么这个存储的信息也会被复位(清0).
Bit4 testNotCompletedSinceLastClear
自从上次清除故障信息后,测试是否已经完成。0表示测试已经完成(结果可能是Passed或者Failed),1表示测试未完成(可能是未满足条件还没开始,也可能是测试还在进行中)。
Bit5 testFailedSinceLastClear
自从上次清除故障信息后,测试是否出现了Failed的情况。和TestFailed一样,一般置位后需要通过清除故障信息服务复位。
Bit6 testNotCompletedThisOperationCycle
当前循环测试是否未完成。0表示测试已经完成(果可能是Passed或者Failed),1表示未完成。当测试完成时,接收到清除故障信息的服务,该位会置1.
Bit7 warningIndicatorRequested
某些DTC置位后,会触发如仪表盘上的指示灯量起。当这类DTC出现failed情况该Bit将置位为TRUE,而对于不关联DTC该Bit将不会使用,保持为FALSE状态。几个位之间的关系举例如下图所示。
图中所示检测Passed还是Failed就是基于debounce来做的,当在时刻1时,表明测试处于完成状态(complete)且结果为Passed,此时testNotComplete SincLastClear和testNotComplete ThisOperationCycle清0.当错误检测的计数值(Fault Detection Counter)在0~127或者-128~0之间时,测试未完成且结果分别为PreFailed或者Prepassed。当在时刻2时,一次test sample返回的结果出现了failed,此时错误计数值变成了大于0的数值。随着不断的测试样本出现错误,在时刻3时,达到了128,此时测试结果为Failed,那么testFaied、testFailed ThisOperationCycle、pendingDTC、confirmedDTC(假如1个循环的测试Failed就确认DTC)和testFailed SinceLastClear都会置1.假如在这个循环内测试样本的结果一直都没有错误(或者不出错的次数大于出错的次数),当错误计数值为-128(时刻7)时,testFailed清0。此后,这个操作循环结束,新的操作循环开始后,testFailed ThisOperationCycle和testNotComplete ThisOperationCycle都会清0.在时刻9,错误计数值为-128,表明这个循环一个test完成了且结果为Passed,那么testNotComplete ThisOperationCycle又会再次置1。
10 Autosar OS任务优先级数值与优先级的关系
对于Autosar OS和FreeRTOS而言都是优先级数值越大,优先级越高,而μcos则是优先级数值越小,优先级越高。