写在文章主题之前:仅以本文致敬我的老哥哥(陈哥,他喜欢我这样叫他,估计是为了显年轻,拉近我们之间的距离感)。陈哥70后(具体不能说哈),之所以记得这么清楚,是因为陈哥和我导师同年,所以记得深刻。陈哥和我导师还是北理同班同学,这社会,很大,有时,又那么小。
写本文的起因:陈哥,前几天"催更"。让我给讲讲PB(Post Build),起初,以为陈哥在开玩笑,因为我知道他工作内容偏向市场,对于我这样写技术细节的文章,应该不太合口味。然而,他认真的给我说,让我讲讲,因此,也就有了本文,也就拉扯了一些我和陈哥的往事。让我没想到的是:陈哥关注我2年多了,在我最开始写的时候就开始关注。我写的很多技术文章,他不一定看懂,但是,他仍在看着、思考着...见证着我的青涩与成长。
想来,和陈哥结识10个年头了。10年,倏忽而过,这期间,我们有交集,又脱离交集,感慨万千。
陈哥,为人平和,喜欢热闹,也做得一手西北菜。刚毕业的时候,我和陈哥合租,学得一些手艺,“虎皮尖椒”、"豆角焖面"等等。当然,也学会了“麻将”、"斗地主"、“台球”、“羽毛球”......
提起"Autosar"就更有渊源了,最初,我听到这个词,是陈哥聊起的。一次,陈哥捎带我导师的东西,我去代领,约在地铁里碰面,因为有一段顺路,聊到了Autosar,那时,我一脸茫然。现在想来,有种忍者神龟和师傅互换角色的感受。和陈哥关系,似有亦师亦友的感觉。10年已过,偶尔我会给陈哥打个电话,只是简单的问候,无关利益。此时。我们又处在下一个10年的历程中,陈哥,一切顺遂。---陈哥小兄弟记(2024/01/29)
图片
提示:图片来源网络
回到本文,该怎么去理解Autosar中的PostBuild、Precompile、Linktime呢?它们在约束谁呢?
1、编译原理
如果要理解Autosar的PostBuild、Precompile、Linktime,我们得从程序的编译原理聊起。搞软件开发的小伙伴知道:我们使用高级语言(eg:C、C++等)编写的代码,是给软件开发者看的,而真正干活的单片机"不懂"高级语言,单片机需要它能识别的言语,才知道如何干活。怎么办呢?答:编译器(Compiler)翻译高级语言,最终将高级语言经过一系列处理,打包成镜像文件,烧录到单片机中。而这个"一系列处理"包含:预编译处理、编译处理、汇编处理、链接处理等操作,如下所示:图片
那么,这些处理,与Autosar的PostBuild、Precompile、Linktime又有怎样的联系呢?2、Autosar与PostBuild、Precompile、Linktime
在Autosar中,谈论PostBuild、Precompile、Linktime时,很多时候是在讨论参数(Variant)的处理时机。既然是Variant的处理时机,那么就会对应到参数在编译过程中的处理时机,示意如下:图片
(一)Autosar配置参数看Autosar规范的小伙伴,如果关注过配置章节,应该会注意到PostBuild、Precompile、Linktime这几个高频关键词。配置章节,会针对配置参数约束其参与编译处理的时机,比如:COM模块,在配置章节,对配置参数处理的三个时机(或者说阶段)做了解释,需要了解更多细节的小伙伴可以参考Autosar COM规范,示意如下:图片
eg:CaniIf模块的配置参数CanIfPrivateDlcCheck,约束其在Pre-compile time可以操作,即:参数CanIfPrivateDlcCheck只有在预编译处理阶段处理,示意如下:图片
提示:X表示支持,—表示不支持Pre-compile Time:参数预处理,即:对使用#处理的信息进行替换,在对参数编译之前,提前替换。比如:#define定义的宏等。举例:对源文件中的MAX_LENGTH预编译处理编写的源文件代码如下所示:#define MAX_LENGTH 100...uint16 idx = 0x00;if(idx= 0x00; idx < MAX_LENGTH; idx++){}...经过预编译处理,将源码中的宏MAX_LENGTH均替换成100,如下所示:
...uint16 idx = 0x00;if(idx= 0x00; idx < 100; idx++){}...
如上是代码宏替换的场景,而Autosar中,多数是设置参数的使能与否。
工程使用场景:在代码开发阶段,可以通过配置上位机对某些功能使能或者禁用,比如:DLC(Date Length Code)检查功能使能与否。
Link Time:当源文件经过汇编处理以后,会输出中间对象文件(*.o文件),这些输出对象连同库文件(eg:*.a),经过链接器(Linker)的链接处理,才能分配到指定的内存位置。
在前文《Tasking基础:将变量放入指定内存的两种方式》提到过链接原理,即:Linker(链接器)如何将*.o、*.a等文件分配到预期内存位置,示意如下:图片
工程使用场景:该阶段,更多的是开发阶段体现。eg:修改了某个源文件(*.c),需要重新编译该源文件,重新链接。Post-Build Time:参数在这个阶段处理,其实就是修改二进制文件中特定参数的值。一般来说,这个阶段更多的是标定功能,比如:通过XCP修改某个常量,这个常量一般与算法相关,该常量可能是某个公式的因子参数,通过标定该参数,以便于达到预期环境(工况)下的性能。
工程使用场景:整车配置字(eg:Car Configuration),通过标定(XCP)或者诊断$2E(Write Data By Identifier service)、$3D(Write Memory By Address service)等服务,修改特定参数,配置车辆的高、中、低配置或者香氛系统使能与否。这样的配置场景,在车辆下线阶段有很多,本文不一一举例。 本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。