天天看點

eCos Synthetic實踐(一)——Hello World!

1. 簡介

eCos提供了Linux Synthetic Target,通過Synthetic Target可以将eCos應用作為一個普通程序在Linux系統内運作, 這既提供了體驗eCos的機會又不需要繁瑣的硬體準備工作,關于Linux Synthetic Target的更多資訊請閱讀參考資料。

本文介紹如何在32位Xubuntu系統下開始eCos Synthetic旅程,這是《eCos Synthetic實踐》系列的第一篇, 主要内容包括:配置主控端使其支援eCos Synthetic的配置、編譯,使用Eclipse建立最簡單的Hello World工程, 并對Hello World進行配置、編譯、調試。

本文假設主控端系統為32位Xubuntu 12.04,如果使用其它32位版的Linux發行版, 那麼軟體安裝指令需要根據所使用的系統作相應地調整,Synthetic不支援Cygwin環境, 如果使用的是64位系統,那麼需要一些額外的工作,請參考《x86_64主控端》一節。

2. 建立開發環境

2.1. 安裝必要的主控端軟體

安裝版本控制軟體、C++編譯器、Eclipse內建開發環境。

sudo apt-get install mercurial g++ eclipse-cdt      

mercurial是eCos項目目前采用的版本控制軟體,安裝mercurial可以讓我們擷取最新的eCos代碼, mercurial的字面意思是“水銀”,是以mercurial的指令為hg,hg是“水銀”的化學符号。

g++為GNU C++編譯器,C++是eCos的主要實作語言之一,是以需要安裝C++編譯器,Xubuntu預設已安裝C編譯器, 但是沒有安裝C++編譯器。

eclipse-cdt為Eclipse C/C++ Develepment Tools,是強大的Eclipse适用于C/C++的版本, Eclipse可以編輯、編譯、調試C/C++工程,Eclipse支援C/C++預處理指令解析并将預處理後無效的代碼進行灰色處理, 這對閱讀有大量預處理指令的eCos代碼是非常有幫助的,在Eclipse的幫助下可以很容易分辨出eCos哪部分代碼在目前配置下是被編譯進目标檔案的, 哪些是被忽略的。此外,Eclipse還是非常棒的GDB前端,在沒有Eclipse之前,Insight是個不錯的選擇,但自從有了Eclipse後, 世界改變了,具有商業支援的eCosPro就提供了基于Eclipse的內建開發環境。

2.2. 擷取eCos代碼

通過hg擷取eCos的最新代碼,代碼存儲在~/ecos-hg。

hg clone http://hg-pub.ecoscentric.com/ecos ~/ecos-hg      

2.3. 擷取eCos配置工具

擷取最新版适用于Linux系統的eCos配置工具,并解壓到~/ecos-tools。

mkdir ~/ecos-tools
cd ~/ecos-tools
wget ftp://sourceware.org/pub/ecos/anoncvs/ecos-tools-bin-110209.i386linux.tar.bz2
tar -xf ecos-tools-bin-110209.i386linux.tar.bz2      

3. 配置編譯eCos Synthetic庫

打開eCos Configuration Tool。

~/ecos-tools/configtool      

第一次打開eCos Configuration Tool将會打開Choose folder for eCos repository對話框, 在輸入框内填入/home/user/ecos-hg/,點選OK關閉對話框。

圖 1. Choose folder for eCos repository對話框

eCos Synthetic實踐(一)——Hello World!

通過菜單Build > Templates打開Templates對話框, 在Hardware的下拉清單中選擇Linux synthetic target,點選OK關閉對話框将自動加載模闆配置。

圖 2. Templates對話框

eCos Synthetic實踐(一)——Hello World!

加載模闆後可能會有部分選項沖突,将彈出Resolve conflicts對話框,點選Continue按鈕自動解決沖突。

圖 3. Resolve conflicts對話框

eCos Synthetic實踐(一)——Hello World!

通過菜單File > Save儲存配置檔案,假設儲存為~/ecos-conf/synth_default.ecc, 後續Eclipse引用頭檔案的路徑跟配置檔案的存儲路徑有關。

通過菜單Build > Library開始編譯eCos庫,第一次編譯将彈出Build Tools Path對話框, 這裡編譯Synthetic目标使用的是Linux原生編譯器,是以在輸入框内填入/usr/bin,點選OK按鈕開始編譯eCos庫,這需要一些時間。

圖 4. Build Tools Path對話框

eCos Synthetic實踐(一)——Hello World!

4. 編譯運作eCos單元測試(可選)

eCos幾乎每個元件都提供了或多或少的單元測試檔案, 通過eCos Configuration Tool可以自動編譯運作與目前配置有關的所有單元測試,并且自動判斷測試結果,這又是eCos的一大亮點。 單元測試是可選的,可以忽略該步驟而不影響後面的步驟。

在編譯Tests之前,首先解決一個bug。

mv ~/ecos-hg/packages/infra/current/tests/cxxsupp.cxx ~/ecos-hg/packages/infra/current/tests/cxxsupp.cxx.orig
sed "s/#ifndef CYGPKG_HAL_H8300/#if 0/" ~/ecos-hg/packages/infra/current/tests/cxxsupp.cxx.orig \
> ~/ecos-hg/packages/infra/current/tests/cxxsupp.cxx      

将cxxsupp單元測試屏蔽,cxxsupp使用了C++預設的new和delete操作符,new和delete操作符是由libsupc++.a提供的, libsupc++.a由編譯器提供,這裡使用的是Linux原生編譯器,包括Ubuntu在内的部分Linux發行版目前使用的GCC編譯器預設打開堆棧檢查, 是以libsupc++.a引用了與堆棧檢查有關的函數__sprintf_chk,__sprintf_chk的作用是先進行堆棧檢查然後再執行真正的sprintf操作, __sprintf_chk是由glibc提供的,而eCos使用的是eCos自己的C庫,不會連結到glibc,而且eCos的C庫也沒有提供__sprintf_chk函數, 是以編譯cxxsupp單元測試将導緻連結失敗(undefined reference to `__sprintf_chk’), 這裡通過屏蔽cxxsupp單元測試的辦法解決這個問題。

通過菜單Build > Tests編譯單元測試,這需要一些時間。

編譯完成後通過菜單Tools > Platforms打開Platforms對話框, 選擇linux項點選Modify…按鈕打開Modify Platform對話框,将Command prefix清空,這裡使用原生編譯器不需要字首, 将Inferior内的gdb指令的字首删除。

圖 5. Platforms對話框

eCos Synthetic實踐(一)——Hello World!

圖 6. Modify Platform對話框

eCos Synthetic實踐(一)——Hello World!

通過菜單Tools > Run Tests打開Run Tests對話框,點選Output标簽頁,點選Run按鈕開始執行單元測試, 在Output視圖可以看到測試過程的輸出,測試完成後點選Summary标簽頁察看測試結果, Pass表示測試通過,Inapplicable表示目前配置下該測試不可用,Fail表示測試失敗。

圖 7. Run Tests對話框,正在執行測試

eCos Synthetic實踐(一)——Hello World!

圖 8. Run Tests對話框,測試結果摘要

eCos Synthetic實踐(一)——Hello World!

5. 建立Hello World工程

5.1. 建立工程

打開Eclipse,通過菜單File > New > Project,選擇C/C++分類下的C Project, 打開C Project項目建立向導,Project name 輸入 synth-hello,Project type選擇Hello World ANSI C Project, 點選Finish完成項目建立。

圖 9. C Project對話框

eCos Synthetic實踐(一)——Hello World!

5.2. 配置工程

通過菜單Project > Properties打開Properties for synth-hello對話框, 選擇C/C++ general分類下的Paths and Symbols頁,選擇Includes标簽頁,點選Add…按鈕添加eCos庫頭檔案路徑, 這裡假設使用者名為user,eCos配置檔案存儲為~/ecos-conf/synth_default.ecc, 那麼對應的eCos庫頭檔案路徑為/home/user/ecos-conf/synth_default_install/include, 将Add to all configurations選項勾上将該路徑添加到所有工程配置, 将Add to all languages選項勾上将該路徑添加到所有語言的搜尋路徑中。

圖 10. Properties對話框

eCos Synthetic實踐(一)——Hello World!

圖 11. 添加頭檔案路徑對話框

eCos Synthetic實踐(一)——Hello World!

選擇Library Paths标簽頁,點選Add…按鈕添加庫檔案搜尋路徑, 這裡假設使用者名為user,eCos配置檔案存儲為~/ecos-conf/synth_default.ecc, 那麼對應的eCos庫檔案路徑為/home/user/ecos-conf/synth_default_install/lib, 将Add to all configurations選項勾上将該路徑添加到所有工程配置, 将Add to all languages選項勾上将該路徑添加到所有語言的搜尋路徑中。

圖 12. 添加庫檔案路徑對話框

eCos Synthetic實踐(一)——Hello World!

選擇C/C++ Build分類下的Settings頁,選擇Tool Settings标簽頁,選擇GCC C Linker > General, 将-nostartfiles、-nodefaultlibs、-nostdlib、-static這四個選項勾上,eCos使用自帶的C庫,不會連結到任何Linux庫。 選擇GCC C Linker > Miscellaneous,在Linker flags輸入框填入-Ttarget.ld,eCos使用自己生成的連結控制檔案。

圖 13. 設定連結選項(一)

eCos Synthetic實踐(一)——Hello World!

圖 14. 設定連結選項(二)

eCos Synthetic實踐(一)——Hello World!

5.3. 編譯工程

通過菜單Project > Build Project編譯工程,在Console視圖可以看到編譯輸出及結果。

5.4. 調試工程

通過菜單Run > Debug Configurations打開調試配置對話框,在C/C++ Application上右鍵,選擇New, 建立一個 C/C++ Application類型的調試配置,點選右下角Debug按鈕開始調試。

圖 15. 調試配置對話框

eCos Synthetic實踐(一)——Hello World!

開始調試後提示進入調試模式,點選Yes進入調試模式,預設配置下将在main函數處設定端點,是以進入main函數後, 程式停止執行,等待下一步指令,通過Debug視圖的調試按鈕可以開始單步調試。

圖 16. 初始調試視圖

eCos Synthetic實踐(一)——Hello World!

點選Debug視圖的Step Into按鈕進入函數内部,從Eclipse打開的源代碼檔案可以看出puts函數是由eCos自己提供的, Debug視圖可以察看函數調用棧。Synthetic不支援多線程調試,是以Debug隻能察看目前線程的調用棧。

圖 17. 單步調試

eCos Synthetic實踐(一)——Hello World!

puts函數執行後,可以在Console視圖看到輸出的“!!!Hello World!!!”字元串, 看到Hello World說明eCos Synthetic已經能夠在Linux系統上正确運作,歡迎進入eCos Synthetic的世界。

圖 18. 調試輸出

eCos Synthetic實踐(一)——Hello World!

6. x86_64主控端

eCos配置工具及Synthetic相關的代碼是32位的,在64位系統下運作32位軟體需要安裝額外的庫檔案。 下面列出的解決辦法理論上無論是Intel的64位還是AMD的64位都是通用的,但是僅在Intel i3處理器上驗證過。

sudo apt-get install ia32-libs      

安裝32位庫檔案,隻有在安裝了32位庫檔案後eCos Configuration Tool才能正常運作, 否則将報錯:bash: ./configtool: No such file or directory

sudo apt-get install g++-multilib      

安裝multilib以支援32位軟體開發,根據依賴關系将自動安裝lib32gcc1、gcc-multilib等,否則在編譯eCos單元測試或者eCos應用時報錯: /usr/bin/ld: cannot find libgcc.a /usr/bin/ld: cannot find libsupc++.a /usr/bin/ld: cannot find libgcc_eh.a

為編譯器、連結器、彙編器添加-m32選項,64位系統下預設使用64位方式編譯程式,但是eCos庫僅支援32位模式, 是以應用程式也隻能使用32位模式,否則連結失敗: /usr/bin/ld: skipping incompatible /home/user/ecos-conf/synth_default_install/lib/vectors.o when searching for vectors.o ; /usr/bin/ld: cannot find vectors.o

圖 19. 編譯器添加-m32選項

eCos Synthetic實踐(一)——Hello World!

圖 20. 連結器添加-m32選項

eCos Synthetic實踐(一)——Hello World!

圖 21. 彙編器添加-m32選項

eCos Synthetic實踐(一)——Hello World!

7. 參考資料

  1. ​​《XXXVIII. eCos Synthetic Target》​​:官方參考手冊。
  2. ​​《eCos的Linux Synthetic Target簡介》​​:官方參考手冊的部分翻譯。
  3. ​​《eCos需要Synthetic虛拟目标闆的理由》​​:誰需要Synthetic,什麼情況下需要Synthetic?
  4. ​​《虛拟實驗室eCos開發環境的配置 (Linux)》​​:使用基于QEMU的模拟器運作eCos。
  5. ​​VirtualBox​​:虛拟機軟體。
  6. ​​Xubuntu​​:易于使用又節省資源的Linux發行版。