嵌入式软件开发|VxWorks工程Makefile分析

开发VxWorks应用,相信很多人一开始接触时,公司就已经提供了现成的BSP包以及如何建立项目工程等等,不需要花费很多的力气就可以创建一个helloWorld程序,甚至加入到公司的产品开发中。然而很多工程师参加工作多年以后,仍然不知道真正的VxWorks项目工程是如何编译和建立起来的,然而作为一名合格的嵌入式软件工程师,掌握一些底层的工作原理和机制是很有必要的,也为系统分析和定位疑难问题垫点了良好的基础。本文将以一个生成目标为 default_romCompress作为例子详细(如下图)的介绍Tornado的IDE环境下Makefile的工作机理。
嵌入式软件开发|VxWorks工程Makefile分析
文章图片






在阅读本文之前,最好参考我转载的一篇博文:VxWorks引导启动过程。很感谢该文的作者写出的这么高质量的文章,该文章从面上讲述了VxWorks映像的类型以及各种映像的启动过程,然而如果要更深一步理解VxWorks引导启动过程这篇文章的内容,不亲自阅读Makefile文件是不能够真正理解其启动过程的,只能说你记住了其启动过程。




一、建立项目工程
通过Tornado建立项目工程时,IDE环境会在项目工程文件夹中自动生成一个Makefile以及几个.c文件,如下图所示:
嵌入式软件开发|VxWorks工程Makefile分析
文章图片


其中上述的Makefile文件就是整个项目工程的起点Makefile文件,其他Makefile文件都是通过此Makefile文件包含进来的,最终确定终极目标。此Makefile文件是取自我具体的项目工程,故可能大小跟读者建立的大小会有不一致。


二、工程Makefile分析
首先,大体上介绍一下工程项目下的第一个Makefile文件的组成,也就是上述建立项目工程时在项目工程目录下的Makefile文件,其内容可以归纳为以下6个部分的内容。
(1)首先,此Makefile文件定义了几个重要的变量,其中BOOT_EXTRA是我们通过Tornado集成开发环境定义的一个宏定义,用户可以通过此宏定义添加第3方l库文件。
嵌入式软件开发|VxWorks工程Makefile分析
文章图片


(2)由于咱们项目工程选择了default_romCompress, 故可以在Makefile中找到如下段。其中定义了CPU和工具链,而且出现了咱们所希望看到的终极目标文件:vxworks_romCompress.bin,随着Makefile的深入,我们会挖掘到此终极目标文件是如何形成的。
嵌入式软件开发|VxWorks工程Makefile分析
文章图片



(3)定义COMPONENTS变量,COMPONENTS变量就是我们在Tornado工程中所include的VxWorks的组件库。这些组件库也会随着后期被编译到VxWorks_romCompress.bin文件中。


(4)包含其他Makefile文件:include $(TGT_DIR)/h/make/defs.project


(5)再次定义一些变量系统变量,其中有些变量是跟硬件密切相关的,如RAM空间和FLASH空间,如图中红色框所示,从中就知道我们的系统平台采用的是2MB的FLASH芯片,后期将会进一步介绍这些变量在整个编译和启动过程中的作用。
嵌入式软件开发|VxWorks工程Makefile分析
文章图片



(6)包含其他Makefile文件:include $(TGT_DIR)/h/make/rules.project, 其中rule.project这个Makefile文件就出现了终极目标的定义,即确立vxWorks_romCompress.bin为终极目标且规则了其编译规则。


故工程项目的Makefile文件主要是包含了上述的6个方面,其他都是.o文件的依赖文件和规则的定义,不影响理解整个Makefile文件的流程。


三、整个工程Makefile包含以及流程
章节二中介绍了我们遇到的第一个Makefile文件的分析,也是整个项目工程的入口Makefile文件。下面将着重介绍由此Makefile文件所引申出来的整个流程,通过下面的分析,读者应该能够掌握vxworks_romCompress.bin的诞生。如下图所示,黑色箭头是Makefile文件的包含过程(切记:不是执行过程)。
图中分析如下几点:
(1)终极目标的确定是在../h/make/rule.project里面定义,同时该Makefile文件中还规定了产生bin文件的模式规则,从而引申出vxWork_romCompress的编译。
(2)图中可知道,在产生vxWorks和vxWorks_romCompress的时候,其链接器所指向的入口是不一样的,当链接生成vxWorks的时候,其指定的链接入口函数
为SYS_ENTRY,即sysInit()函数(存在于sysALib.s文件中); 而当链接生成vxWorks_romCompress的时候,链接器指定的入口函数为romInit()函数(存在于romInit.s文件中)。此时就应该能够理解为什么文章VxWorks引导启动过程中第四部分中提到的"VxWorks映像函数级启动过程"的启动类型:单板上电启动和VxWorks映像入口启动的原因了。




(3)有了上述的入口启动函数之后,读者阅读程序就可以得到如下的两种不同的启动方式:


【嵌入式软件开发|VxWorks工程Makefile分析】嵌入式软件开发|VxWorks工程Makefile分析
文章图片


    推荐阅读