本文部分來自 Raspberry Pi台灣樹莓派 官方網站
由於 Raspberry Pi 上的處理器是 ARM 架構的,因此要將同樣的 hello.c 在 Raspberry Pi 執行,必須將程式編譯成 ARM 架構的可執行檔。
我們有兩個選擇,第一是直接在 Raspberry Pi 上編譯。第二是先在我們的個人電腦用 Raspberry Pi 的 toolchain 編譯完成後,再上傳到 Pi。
這裡簡介如何在個人電腦安裝 Raspberry Pi 的 toolchain,以在 ubuntu 上安裝 gcc-linaro-arm-linux-gnueabihf-raspbian 為例。
1. 在個人電腦安裝必要的套件。
sosorry@ubuntu:~$ sudo apt-get install make git-core ncurses-dev
2. 下載最新版的 toolchain。
sosorry@ubuntu:~$ mkdir rpi sosorry$ubuntu:~$ cd rpi sosorry@ubuntu:~/rpi$ git clone https://github.com/raspberrypi/tools.git remote: Reusing existing pack: 17273, done. remote: Total 17273 (delta 0), reused 0 (delta 0) Receiving objects: 100% (17273/17273), 311.52 MiB | 343 KiB/s, done. Resolving deltas: 100% (11698/11698), done. Checking out files: 100% (15860/15860), done.
3. 安裝 toolchain。安裝方法是將 gcc-linaro-arm-linux-gnueabihf-raspbian 加到環境變數裡。
sosorry@ubuntu:~/rpi$ vi ~/.bashrc export PATH=$PATH:/home/sosorry/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin # add this line at the end of file
4. 測試。先開啟一個新的終端機,輸入 arm 後連續按兩次 tab 鍵,如果跑出來一堆像下面的提示表示安裝成功。
arm-linux-gnueabihf-addr2line arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gfortran arm-linux-gnueabihf-objdump arm-linux-gnueabihf-ar arm-linux-gnueabihf-gcc-4.7.2 arm-linux-gnueabihf-gprof arm-linux-gnueabihf-pkg-config arm-linux-gnueabihf-as arm-linux-gnueabihf-gcc-ar arm-linux-gnueabihf-ld arm-linux-gnueabihf-pkg-config-real arm-linux-gnueabihf-c++ arm-linux-gnueabihf-gcc-nm arm-linux-gnueabihf-ld.bfd arm-linux-gnueabihf-ranlib arm-linux-gnueabihf-c++filt arm-linux-gnueabihf-gcc-ranlib arm-linux-gnueabihf-ldd arm-linux-gnueabihf-readelf arm-linux-gnueabihf-cpp arm-linux-gnueabihf-gcov arm-linux-gnueabihf-ld.gold arm-linux-gnueabihf-size arm-linux-gnueabihf-elfedit arm-linux-gnueabihf-gdb arm-linux-gnueabihf-nm arm-linux-gnueabihf-strings arm-linux-gnueabihf-g++ arm-linux-gnueabihf-gdbtui arm-linux-gnueabihf-objcopy arm-linux-gnueabihf-strip
讓我們實際寫一個 hello.c 並編譯它吧。
sosorry@ubuntu:~/rpi$ vi hello.c #includeint main() { printf("hello, world\n"); return 0; }
用 Raspberry Pi 的 toolchain 編譯 hello.c。這一步驟稱為交叉編譯(cross-compiling)。
sosorry@ubuntu:~/rpi$ arm-linux-gnueabihf-gcc hello.c -o hello-arm
讓我們看看檔案的資訊,可以看到該檔案是 ARM 的格式。
sosorry@ubuntu:~/rpi$ file hello-arm hello-arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, not stripped
如果我們在 x86 環境下試著執行會發現無法成功。
sosorry@ubuntu:~/rpi$ ./hello-arm bash: ./hello-arm: cannot execute binary file
我們把 hello-arm 上傳到我們的 Pi,假設 IP 為 192.168.1.2。
sosorry@ubuntu:~/rpi$ scp hello-arm pi@192.168.1.2:/home/pi pi@192.168.1.2's password: hello-arm 100% 5447 5.3KB/s 00:00
在我們的 Pi 上執行,看看結果吧。
pi@raspberrypi:~$ ./hello-arm hello, world
常見問與答:
1. 為什麼要在個人電腦上安裝 toolchain?
因為個人電腦的處理速度通常高於 Raspberry Pi ,因此如果要開發比較大的專案(例如編譯核心),建議在個人電腦上處理,才不會等等等等。實務上在嵌入式系統的開發過程中,目標機器通常不會有 toolchain,因此常常會需要先在開發環境上將專案交叉編譯後再燒到目標機器。
因為個人電腦的處理速度通常高於 Raspberry Pi ,因此如果要開發比較大的專案(例如編譯核心),建議在個人電腦上處理,才不會等等等等。實務上在嵌入式系統的開發過程中,目標機器通常不會有 toolchain,因此常常會需要先在開發環境上將專案交叉編譯後再燒到目標機器。
This repository contains the source code for the ARM side libraries used on Raspberry Pi. These typically are installed in /opt/vc/lib and includes source for the ARM side code to interface to: EGL, mmal, GLESv2, vcos, openmaxil, vchiq_arm, bcm_host, WFC, OpenVG.Use buildme to build. It requires cmake to be installed and an arm cross compiler. It is set up to use this one: https://github.com/raspberrypi/tools/tree/master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian
3. 如果個人電腦(主機端)是 64 位元的要裝那個版本的 toolchain?
要使用
要使用
tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
目錄下的執行檔,也就是將該路徑加入環境變數即可。
遇到 permission denied,最有可能發生的問題是
1. 檔案沒有執行權限,您可以用 chmod 755 將檔案擁有者的權限改為可執行。
2. 使用者沒有執行檔案的權限,您可以用 chown pi:pi hello-arm 將檔案的擁有者和使用群組都改為 pi。
1. 檔案沒有執行權限,您可以用 chmod 755 將檔案擁有者的權限改為可執行。
2. 使用者沒有執行檔案的權限,您可以用 chown pi:pi hello-arm 將檔案的擁有者和使用群組都改為 pi。
遇到 ssh 連線的 key 有問題,通常是多台主機使用同一個 IP,只要將 ~/.ssh/known_hosts 裡面儲存 host 的 public key 給刪除就可以了。
沒有留言:
張貼留言