浅析AutoSAR CAN Stack在配置工具中的实现

电子说

1.3w人已加入

描述

CAN****模块的开发历程

当时在开发MCAL相关模块的时候,偶尔会看下CAN整个模块的配置,由于CAN相关的模块一直同事在配置,当时感觉内容好多,各种CANxxx模块在配置工具里,感觉如果能有机会配置下的话一定是一件非常伟大的事情,到了18年年底,我终于分到了CAN模块的配置任务,负责一个CAN通道的配置。由于前边同事已经配置了一个通道,我在他基础上继续配置,当时我已经处于无人管理的状态了,开始自己的瞎发挥,可能内容比较多,一直没有配置好,尝试了ECUM的Flex模式和Fix模式,手动修改了好多BSWM的Rules,当时也不是很懂,看程序在哪有问题就直接手动改代码,后来问同事,也知道了一些注意的地方,然后我就开始撸代码看,发现好多CAN通信的变量值没变化,后来在地铁上看COMM的AutoSAR文档,发现需要请求通道的通信,当时瞬间感觉找到了问题的所在,果然第二天一大早早早去公司试了下,居然成功了,当时别提多开心了,在自己稀里糊涂的琢磨了大概一个月终于看到了CAN的信号,当时真的很开心,因为这算是我自己独立搞出来的,成就感瞬间爆棚。也从这一刻开始心中对AutoSAR配置的害怕感渐渐的消失,大概从19年开始到7月份就一直在做CAN相关的配置。从CAN最底层的驱动到CANTrcv、CANIf、PDUR、COM、CANSM、ComM等基本的CAN相关的模块都配置了解了一遍,虽然中间做了一些架构相关的工作也支持了别的项目的开发,但是每天都会花点时间看一些CAN相关的技术资料,配一些基本的功能,并立马调试、撸代码、解决Bug,渐渐的对CAN通信在AutoSAR架构的实现理解也加深了。其中在CANSM的配置中也明白了CAN相关的BusOff以及恢复机制,虽然自己在大学学了一点CAN通信的东西,但一直到配置CAN模块的时候才算有了全面的了解,之前也做过一些STM32的CAN通信的程序,但是当时也并没有深入的研究,在和同事测试CAN BusOff以及恢复中渐渐的对CAN通信有了更深的理解,随后也通过抓取CAN总线上的波形对数据和时间进行了分析,理解了CAN总线的空闲、校验、位填充、位时间等概念。对于普通CAN信号不带相关协议和网络管理的信号)的传输模块配置可参考之前的公众号《浅析TC277CAN模块在AutoSAR的应用》。

除了做基本的CAN信号的配置(不带相关协议和网络管理的信号),在那段时间里也完成了J1939TP、XCP以及CANNM的配置。在配置J1939TP的时候当时连基本的J1939协议也不是完全懂,在磕磕碰碰中实现了J1939TP的功能,后来也对J1939协议结合在AutoSAR的实现有了基本的认识,虽然不是很透彻,但是基本的原理和实现都明白了。其中走J1939TP的CAN信号在CANIf层后不能直接到PDUR层,必须要经过J1939TP这个模块,然后将信号传输到PDUR,一般走特殊协议的CAN信号都会在CANIf与PDUR之间加一层特殊的协议模块(J1939TP、UDS等)。

为了满足一些测试的目的做了XCP的配置,在XCP的配置的过程中更加对AutoSAR的分层理念有了更深的理解,XCP的配置不同于其他的一般CAN信号,直接从CANIf层到XCP进行传输,然后与RTE、APP层进行交互。对CAN的一些基本的模块配置完成后,发现诊断和网络管理这两部分也是比较重要的,时至今日,对于诊断模块的配置也没有深入的研究,只是简单的看下课同事配置的CANTP和DCM的东西,这部分后期也会在公众号内分享。网络管理模块大概是19年4月份做的吧,一开始自己对网络管理和唤醒也不是很懂,刚开始认为唤醒就是网络管理把CAN模块的通信唤醒,只要CAN的通信能正常工作就达到了网络管理和唤醒的目的,后来渐渐的提高了自己的认知,唤醒就是把MCU从睡眠的状态进入到正常的工作模式,而网络管理更是一种整车层面的多个ECU的进行通信的策略,在某些特定的情况下实现部分ECU的休眠减少消耗。

之后开始将CANNM和NM功能集成到了配置环境中,并尝试了一些唤醒的功能,此时只是单纯的CAN信号层面实现报文的收发和总线休眠,那个时侯由于自己对整个AutoSAR下的BSWM、ECUM、OS等模块控制的下电过程还一无所知,因此只是实现了简单的CAN信号的禁用和开启,结合AutoSAR的网络管理流程基本上能跑的通,一些网络管理相关的状态机可以根据自己的测试和外部条件进行转换,后来自己做了整个系统的上下电功能后基本上也可以实现部分网络管理和唤醒的功能了。一直延续到19年7月份,在利用一些零碎或者特定的时间段下基本上对CAN相关的AutoSAr模块的整个配置(除了诊断)都熟悉了一遍。

在配置中有好几个时间段确实遇到了比较大的挑战,并且那段时间手上还有别的任务,好几次都在抱怨一群神经病发明了AutoSAR,大家好好手写代码不好吗,抱怨也好,发牢骚也罢,想到自己身上的房贷,想到当初自己从机械专业转入到汽车软件开发的初衷,想到未来还有很多人也会有我这样的烦躁和抱怨,就又老老实实的在看AutoSAR的技术手册,开始通过各种途径来请教别人,确实也得到了同事和好多未曾谋面人的帮助,这段配置阶段,我就想以后一定要分享一些自己的问题和遇到的坑,尽可能的帮助那些像我一样笨的AutoSAR开发工程师。有时候感觉从0做一些事情,对人的心理也是一个挑战。经历过整个CAN模块的配置后,感觉心理上对AutoSAR的害怕或者迷茫也减少了,基本知道了它的一些方法论和小窍门,在AutoSAR的配置中自信心也渐渐的增强了,也更加的喜欢和坚定了自己的选择。

说了几句废话,言归正传,下面简单总结下CAN相关的模块相关配置。

CAN

CAN模块的配置主要配置CAN的中断优先级(中断模式下使用)或者Polling模式下的周期处理函数;CAN消息在控制器中使用了多少个邮箱,进行收发数据;选择硬件上CAN消息的通道;唤醒功能的使能;CAN的滤波器;CAN通信的时钟;CANFD相关功能的配置等

CANTrcv

CANTrcv 模块主要配置CANTrcv外部芯片,一般CANTrcv芯片有两种模式,一种自带唤醒功能的CANTrcv和不带唤醒功能的CANTrcv。带有唤醒CANTrcv模块主要的是选择和唤醒功能相关Pin脚,Pin脚要与硬件上与CANTrcv芯片相连的引脚一一对应。如果是不带Wak功能的主要选择Rx的Pin即可。

CANIf

CANIf模块主要定义了上/下层的CAN信号在发送和接收时候的标准接口。AutoSAR中CANIf模块一个重要的功能就是和WakeUp有密切的关系,要根据实际情况进行配置。CANIf模块要对下层的CANDrv和CANTrcv进行定义,区分CANIf下层的交互模块。如果CANIf中对应的CAN通道配置了CANTrcv则要选择与之对应的CANTrcv通道,表明该CAN通道是通过CANTrcv发出去的,CANIf的状态变换也是与CANTrcv密切相关的。如果没有CANTrcv通道,那么该模块中不需要添加相应的CANTrcv。CANIf要定义数据接收和发送的Buffer,对于CAN信号收发采用的邮箱也需要定义。同时支持回调函数功能;对于CAN信号在CANIf这一层对上面一层交互的模块(XCP、PDUR、CANNM、CANTP/J1939等)也要定义清楚。根据实际信号在使用的时候的路由进行选择即可,XCP的就选XCP,J1939协议的选择J939TP等等。同时CANSM会对CANIf状态进行控制,达到对CAN信号的使能和禁用。

CANSM

CANSM配置模块中对CANSM与CANIf之间进行Mode边变化的时间做了限制,同时定义了BusOff处理的相关时间参数。定义相关CAN模块的BusOff段短恢复和长恢复机制。

COM

COM模块主要为应用层(或者RTE)模块提供信号传输的接口,提供的接口主要是以Signal的形式存在,同时也包含信号组的形式,信号组一般对应应用层的结构体变量,在COM层实现了Signal在I_PDU中的打包和解包;定义了信号传输的权限;信号传输的模式和信号传输的过滤器设置;信号传输的延迟时间;超时的监控机制;与其他模块的调用和被调用函数等。在COM层可以实现信号的组管理,实现信号使能或者禁用的成组控制。

ComM

ComM模块的主要作用在于:实现对总线的管理和控制。如果网络管理功能使能的情况下,实现对网络管理模式的配置和选择。

PDUR

在PDUR配置中,主要建立COM层与下面具体的传输层(CANTP、J1939、CANIf等)之间的路由。也可以将PDUR作为一个网关使用,实现不同ECU在PDUR层的信息传递,不需要再往上传输在APP做信号传输转换的网关。

XCP

将与XCP相关的PDU进行关联,XCP的信号可以直接被RTE调用,根据XCP相关的协议在XCP的配置中定义好具体的内容,定义XCP处理的时间相关的参数,时间周期、时间基准等。同时将XCP通信的处理放到特定的处理事件中;定义具体的XCP实现方式(DAQ、STIM等)。

J1939TP

在J1939TP模块中根据J1939协议的内容配置到具体的参数中即可。

CANNM

CANNM要关联到具体的CAN通道,同时特定帧唤醒的情况下要关联具体的CAN报文,定义周期的处理时间和超时时间等。根据实际的需求定义发送的网络管理报文的具体内容,发送的网络管理报文一般因OEM不同会有稍微的区别。对于PN网络管理的相关参数根据具体的需求进行使能和不定义。

NM

NM模块的主要适应ComM模块和各种总线的NM模块,实现函数的Call和Callback;定义是否使能总线网络管理的协调机制,参考的ComM的总线通道;定义ShutDown的时间,定义总线的同步机制等。由于这个模块是所有的总线相关的,在实际的配置中主要采用了它的CAN的网络管理的请求和释放通信功能。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分