終於碩班人生告一段落,這三年工作與學業兩頭燒,其實累積了不少開發日誌。今天想以交叉編譯器(Cross compiler)開場,盼日後可以持續的回饋廣大的社群。我的目標是用最簡單易懂的方式,給大家一個引子,就跟我在學習與使用一樣,這篇文章可能無法直接交會你,但應該可以提供給你一些方向跟參考。
除了x86之外最廣泛被使用的就是ARM平台。課本中出現的MIPS或Power PC等這一類較早期的機器已經不再出現新世代的設計之中。大家也可以注意一下RISC-V,這也被小弟我列為未來必要了解的平台之一。
我假設你是有一定基礎的資工系學生或者剛出社會又或者是工作一段時間的軟體工程師。每天你面對著程式碼,編譯,部署,測試。其實很多細節都由原廠幫我們處理乾淨了,喔!假設你不是IC設計領域的RD。但無論如何,你一定會很常接觸各式各樣的編譯器,其中又以GCC最為大宗。我猜想如果看到這篇通常我的假設應該是相對接近的。
前面提到了平台(Platform)與編譯器(Compiler),想必講到這應該就能猜想到,何謂交叉編譯器[Fig.1]。通常我們會有所謂的Host,也就是我們的開發平台,在開發嵌入式系統過程中,我們較難在ARM平台上編譯,除了效能外,時間成本也不是那麼好的條件之下,尤其是你可以簡單地在x86先驗證程式碼(當然這邊是先編譯x86版本),接著再編譯出ARM(aarch64)的檔案部署到機器上整合測試。另外關於測試環境有各種方法,這邊就不贅述,可以稍微提一下關鍵字:QEMU
Fig.1 Cross compiler
小結一下:你可以比較簡單的都將開發環境整合至既有的HOST,而不用因為眾多不同平台而需要轉換不同開發環境,ARM Family可不是只有aarch64而已。此外眾多的Vendor也可能會為開發者提供VM(虛擬環境)或是Docker(容器)更將開發環境直接打包給開發者,這個時代開發Embedded System已經非常幸福又新潮了!
簡單來說,我們會在Host上面安裝所謂的Toolchain。通常,某一塊板子,比方說Raspberry Pi,這塊大家耳熟能詳,幾乎出現在日常以及學校實驗室各個角落的ARM平台。你想要編譯程式可以跑在RPi上面,你就是需要使用Toolchain內提供的交叉編譯器以及資料庫(Library)。我們可以先從編譯器角度去理解這件事情。
https://hackmd.io/@ofAlpaca/ryNNXAuoQ/https%3A%2F%2Fhackmd.io%2Fs%2FB1aGFRW6Q?type=book
其實所謂的Toolchain就是提供編譯階段時期的各種交叉編譯的工具。
https://www.daimajiaoliu.com/daima/56a0884c3d5b805
看到了嗎,對照到編譯器階段,Toolchain提供了個階段的交叉編譯工具。無論你使用gcc或是Make或是CMaker,只要設定好路徑跟環境,整個交叉編譯的程序就可以直接在Host啟動,順利節省開發時間與環境建置的時間。
再來我會分享兩個開源專案的實例,當然主要也是我有移植的需求。分別針對Makefile及CMake進行操作。
我選用ColinlanKing/stress-ng專案進行移植。stress-ng主要用來對平台進行壓力測試的工具。
我的Host為ubuntu 18.04。
安裝Toolchain
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
Clone project & cd strss-ng
git clone <https://github.com/ColinIanKing/stress-ng.git
>