首先,要恭喜各位,最为枯燥难懂的一章你已经看完了。也许现在你还是一头雾水,但是相信大部分人都差不多,不必着急,因为AutoSAR单纯看理论最终也就只能看到这个程度了。所以看不太懂的小伙伴在这里先给自己一个定位:
1. 我已经认认真真的看完了前面的内容,并且基本掌握了BSW中每个模块是干嘛的,在脑海中已经能将每个功能需要哪些模块大致给画出来了。那么掌握到这种程度就可以继续往下看,之后就可以进入下一章了,关于BSW更加细节的东西就要在实践篇中继续深入了。
2. 我基本上了解了BSW是做什么的,并且对其中的一部分模块有一定了解了,但是要画出每个功能的构成还有点难度。那么这种情况我建议你再回头看看,一定要认真掌握I/O、Memory和Communication章节的内容再进入之后的学习。
3. 如果还不太了解BSW是做什么的。建议再将本章从头看过,切忌走马观花的看,一定要尽量使自己理解每个功能和其对应模块是做啥的
一、关于功能
功能和模块并非是一对一的,很多同学会一开始误解的认为一个功能就只拥有自己的那些模块,可实际上是,一个功能可能还会调用很多看似不属于自己的模块。比如CAN Driver,在Communication和Diagnostic中都有用到,因为它们都需要通信的功能。只不过Communication是ECU之间的通信,Diagnostic是ECU和诊断仪之间的通信。所以模块是模块,功能是功能,要区分开。就好像我们人体有功能,也有很多部件。我们的部件有手,脚,大脑等等。我们要实现两个功能,比如打篮球和敲代码:其实都会用到一些共同的部件(比如手,脑),但是也有一些不会都用到(比如脚)。所以模块就那么些,要实现一个功能可能会用到一些横向的模块,而并非绝对的竖向。所以一开始的这张图,大家就应该要理解虚线中其实只是该功能的主要模块,而非全部模块,要看每个功能有哪些模块,就要回头查看每个功能的章节了。
二、关于实际工程
相信下面这张图大家在之前已经看过了,但是这是为了大家方便理解。实际的工程还有些不太相同,这里我们来做具体的对比
由于工程结构是自己定义的,博主是用了一个很有经验的工程师的现成工程,应该比较有参考意义。
下面都是重点,请对照上图理解:
这里首先需要给大家说明一点,DaVinci配置工具配置出的AutoSAR架构主要分为两部分,一是源代码,二是配置代码。上图中由于无法一一映射,所以图中没有画映射箭头
- 源代码: 主要是每个模块的具体功能实现(比如是用CAN还是CAN FD),里面定义了我们配置了或者没有配置的所有功能,源代码是固定不变的。那么这就要问了,源码固定不变,那我们还配置啥,岂不是都一模一样了?其实,在源码中,基本每个具体功能都有很多的 #ifdef #end 这样的语句,我们只需要 #define 这些定义,就可以使能该具体的功能,反之失能
- 配置代码:配置代码中主要就是 #define ,我们在DaVinci中某个功能的使能框中打一个勾或者配置了某一项,配置代码中就 #define 一个定义。配置DaVinci最终只生成配置代码,这些代码里就基本是 #define ,控制着源代码中哪些函数可以使用,哪些不能使用。同时,DaVinci中配置了一些数据,比如Can波特率,在配置代码中也是类似 #define CanBaudRate XXXX 这样的定义,最终的实现还是在源代码中
1. 上图左边是我们之前的那个工程结构,右边是按照Vector的结构配置的实际项目中的工程结构。其实讲道理,左边的结构更加贴近AutoSAR本来的结构。但是由于代码生成的一些关系,最终我们还是得按Vector的来。图中的 ...... 是代表这里还有一些同类文件,由于太多了,图中省略掉。
2. 真实的工程主要分为两大块:AppL和BSW。AppL中存放的就是我们的配置代码和我们的手写代码;而BSW中就是我们的源代码。
3. BSW中又为了Bsw和Mcal两个部分(注意在这里区分BSW和Bsw),由于DaVinci中的Mcal配置是由非Vector的第三方工具EB配置生成的。因此工程中也是将Mcal和非Mcal源代码分开了。在Bsw中就主要是像BswM、COM、CANIf、NvM这些模块的配置,在Mcal中就主要是Adc Drv、Dio Drv和McuDrv等这些底层驱动模块(也有一部分是在DaVinci中配置的,比如Can Drv)。
4. AppL中分为GenData和Source两部分,GenData就是存放配置代码的地方(下面马上会讲到),而Source中就是存放我们手写代码的地方(或者Simulink生成代码,这里DaVinci会生成一个初始的框架,里面也有runnable函数名,但是函数里都是空的,需要手动添加)。只有这一部分是用户可以手动修改的,其他部分都不允许手动修改。
5. GenData是配置生成的,同样不允许手动修改;要改动的话,就要进配置工具中配置再重新生成。GenData中inc、mak和src就是Mcal的配置代码和其头文件(mak是存放makefile文件的,用于手动编译);Components主要存放Source里面的那些.c文件的头文件,由于不可以手动修改,因此放在了GenData中;剩下的那些.c和.h文件就是Bsw中除去Mcal的其他配置文件了。