VxWorks工程Makefile分析

開發VxWorks應用,相信很多人一開始接觸時,公司就已經提供了現成的BSP包以及如何建立項目工程等等,不需要花費很多的力氣就可以創建一個helloWorld程序,甚至加入到公司的產品開發中。然而很多工程師參加工作多年以後,仍然不知道真正的VxWorks項目工程是如何編譯和建立起來的,然而作爲一名合格的嵌入式軟件工程師,掌握一些底層的工作原理和機制是很有必要的,也爲系統分析和定位疑難問題墊點了良好的基礎。本文將以一個生成目標爲 default_romCompress作爲例子詳細(如下圖)的介紹Tornado的IDE環境下Makefile的工作機理。




在閱讀本文之前,最好參考我轉載的一篇博文:VxWorks引導啓動過程。很感謝該文的作者寫出的這麼高質量的文章,該文章從面上講述了VxWorks映像的類型以及各種映像的啓動過程,然而如果要更深一步理解VxWorks引導啓動過程這篇文章的內容,不親自閱讀Makefile文件是不能夠真正理解其啓動過程的,只能說你記住了其啓動過程。



 一、建立項目工程

        通過Tornado建立項目工程時,IDE環境會在項目工程文件夾中自動生成一個Makefile以及幾個.c文件,如下圖所示:

        

 

       其中上述的Makefile文件就是整個項目工程的起點Makefile文件,其他Makefile文件都是通過此Makefile文件包含進來的,最終確定終極目標。此Makefile文件是取自我具體的項目工程,故可能大小跟讀者建立的大小會有不一致。


二、工程Makefile分析

           首先,大體上介紹一下工程項目下的第一個Makefile文件的組成,也就是上述建立項目工程時在項目工程目錄下的Makefile文件,其內容可以歸納爲以下6個部分的內容。

         (1)首先,此Makefile文件定義了幾個重要的變量,其中BOOT_EXTRA是我們通過Tornado集成開發環境定義的一個宏定義,用戶可以通過此宏定義添加第3方l庫文件。

                    

        

        (2)由於咱們項目工程選擇了default_romCompress, 故可以在Makefile中找到如下段。其中定義了CPU和工具鏈,而且出現了咱們所希望看到的終極目標文件:vxworks_romCompress.bin,隨着Makefile的深入,我們會挖掘到此終極目標文件是如何形成的。

                  


        (3)定義COMPONENTS變量,COMPONENTS變量就是我們在Tornado工程中所include的VxWorks的組件庫。這些組件庫也會隨着後期被編譯到VxWorks_romCompress.bin文件中。


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


         (5)再次定義一些變量系統變量,其中有些變量是跟硬件密切相關的,如RAM空間和FLASH空間,如圖中紅色框所示,從中就知道我們的系統平臺採用的是2MB的FLASH芯片,後期將會進一步介紹這些變量在整個編譯和啓動過程中的作用。

                  


        (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)有了上述的入口啓動函數之後,讀者閱讀程序就可以得到如下的兩種不同的啓動方式:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章