2012年12月24日 星期一

Raspberry Pi:Cross-compiler (update)

有鑒於 Raspberry Pi 的 CPU 和 RAM 的效能限制,在編譯大型檔案時需要耗費相當長的時間。(像我自己就傻傻地直接在 Raspberry Pi 上編譯 ZMQ...)因此通常在開發嵌入式系統的程式時,通常都會在其他電腦上透過 Cross-compiler 的方式編譯給板子執行的程式。

官方的 Wiki 的 Cross-compiler 說明中,已經有提供了官方預先 build 好的 cross-compiler 程式提供開發者使用,省去大量時間去下載、設定、編譯 crosstool-NG、Linaro GCC,之後才得到能用的 cross-compiler。

在此就簡單說明(真的超簡單)如何在 Linux 底下,建立 Cross-compiler 環境,幫我們可愛的 Raspberry Pi 編譯給它執行的程式!


※注意※
經測試後,Pre-build 的 cross-compiler 僅適用於 32-bit Linux,64-bit 需自行手動編譯。


1. 用 Linux 系統下指令抓取 tools
$ git clone git://github.com/raspberrypi/tools.git

2. 下載完後,依需求設定 PATH 環境路徑,方便往後呼叫程式。
$ export PATH=$PATH:/home/yourname/<cross-compiler path>/bin


使用範例


做完上面步驟後,進入 tools/arm-bcm2708/ 目錄會發現有三個子目路,分別為不同參數所產生出來的 cross-compiler,請依照需求,以及 RPi 所使用的 OS 做選擇。

首先我先寫一個簡單的 Hello World,儲存在 /tmp/hello.c,之後編譯程式
$ arm-linux-gnueabihf-gcc /tmp/hello.c -o hello

完成後和一般 gcc 一樣,會產生 hello 的可執行檔,不過這是要給 Raspberry Pi 執行的程式。Raspberry Pi 所使用的 CPU 是 ARMv6,除非你的 cross-compiler 環境和 Raspberry Pi 雷同,不然這隻程式是沒辦法執行的。

之後請複製到 Raspberry Pi 中,個人是以 scp 進行遠端複製,執行!


看到 Hello World,表示程式碼成功透過 cross-compiler 將程式編譯成給 Raspberry Pi 執行的程式。


手動建置 Cross-compiler


如果覺得這個方式真的太過於簡單、想嘗試練習自行建置 Cross-compiler,或是和我一樣,是以 64-bit Linux 做為開發環境的話,請參考以下網頁建置 cross-compiler 編譯環境。

1. 官方 Wiki (RPi Linaro GCC Compilation

2. How to build a cross compiler for your Raspberry Pi

2012年12月20日 星期四

Ubuntu:apt-file 套件搜尋小技巧

今天在編譯 Raspberry Pi 的過程中,缺少了不少編譯所需要的套件。對 Linux 不熟的我,通常看到這些缺少的元件,都不知道從何下手,而在搜尋過程中發現到一個利用 apt-file 來尋找特定元件包含在哪個套件中,實際應用節省了我不少的時間。

我在 Ubuntu 12.04 寫以下範例。

1. Ubuntu 預設是沒有安裝 apt-file,先把它安裝起來
$ apt-get install apt-file

2. 安裝完成後,更新套件訊息
$ apt-file update

3. 搜尋你想要的檔案,如:curses.h
$ apt-file search curses.h

4. apt-file 會列出套件名稱,以其底下符合條件的檔案名稱,從中找到所需要的。


5. 紅框框起來的部分就是我要的
$ apt-get install libncurses5-dev

問題解決!

2012年12月19日 星期三

Raspberry Pi:Setting up Static IP

如果有和我一樣的需求,要讓 Raspberry Pi 使用靜態 IP,而非透過 DHCP 方式取得 IP,可以仿照 Linux 的方式設定。

$ sudo vi /etc/network/interfaces

在文件中找到下列該行,並插入 # 註解掉。
#iface eth0 inet dhcp

在下方插入以下內容
iface eth0 inet static
address <你要給 RPi 使用的 IP>
netmask <子網路遮罩>
gateway <Gateway IP>
Reboot Raspberry Pi 後完成設定!


修改DNS server

$ sudo vi /etc/resolv.conf

2012年12月17日 星期一

Ganglia on Ubuntu server 12.04 LTS (update)

  Ganglia Monitoring System 是一套用來監視 grids 或 clusters 的可擴充性分散式系統監視工具軟體,結合了web-frontend網頁介面,使主機管理員可以在遠端,以閱覽網頁、觀察圖形的方式,監視每個 grids 或 clusters 的系統資訊,包括CPU、MEM、網路流量、process數......等等。
  這是一套 BSD-licensed 的 open source software,由 Berkeley 大學所開發的。許多 Linux 發行版的套件庫皆有提供 ganglia 的套件,Ubuntu 也不例外。

2012年12月6日 星期四

Raspberry Pi Model B

我絕對不會說這是早上離開宿舍時,腳被某個小箱子絆倒;
或是騎車到學校路上,被叼著箱子的狗跟著跑。(以上開箱文老梗)
因為這是...... 從覆盆子枝幹上摘下來的。(被打)

今天早上終於拿到了實驗室新玩具:Raspberry Pi Model B!
不過現在還沒有時間和周邊可以測試,處裡完一些工作後再來測試!
Raspberry Pi真的很小片,跟我的HTC Aria差不多大小而已!

先簡單放上兩張簡單的開箱圖,手機照相解析度差,傷眼抱歉。



2012年11月14日 星期三

查詢修改 Linux maximum pid 限制

一般寫小程式,我們很少去注意到一些系統上的限制,像是 open files、max user processes...等($ ulimit -a)。而近期為了測試研究需要使用的 Pub/Sub 架構上,Server 能承受多少 client 連接、CPU 使用率、MEM 使用量、每個訊息的 delay、是否會遺失封包...等,需要開啟大量 client 去做連接測試,這時可能為遇到以下狀況:

  1. open files 超過限制,系統不再讓 server 開啟 socket 服務 client。
    (socket 也是 file describe 的一種)
  2. maximum user process 超過數量,系統表示暫時無法取得系統資源。
基本上系統程式 ulimit 的限制,在使用 root 權限執行程式時可以忽略這些限制;或是利用 ulimit 修改特定(如open files)的限制數量。但是第二點,PID 一旦超過 kernel 的限制,這就不是 ulimit 或是 root 執行程式可以解決的問題。

在 Ubuntu 12.04 LTS kernel 的預設值,PID 上限可到 32768。因此整個系統在這個限制下,能開啟的 process 最多也就 32768個。要超過這個限制,我們需要修改 kernel 在 pid_max 的限制。

●查詢 kernel pid_max
$ sysctl kernel.pid_max

●修改 kernel pid_max
$ sysctl -w kernel.pid_max=<numbers>
Example:$ sysctl -w kernel.pid_max=65536

2012年11月8日 星期四

screenrc

最近時常需要開啟多個 terminal 來測試程式執行狀況,所以 pietty 越開越多,桌面也越來越亂、難管理。近期在詢問學姊作業的事情時,看到學姊的 Ubuntu console,在一個畫面中可以切換到不同的 console,按按鍵就可以互相切換,就一直很有興趣。

找了幾天,用過 screen、tmux,screen 在預設的設定上相當簡陋,當初還以為不是這款,直到在 Google 搜尋到相關的 screenrc 檔後,才知道「這就是我尋找很久的程式!」

參考網頁:

  1. screenrc of Vim-like - 凍仁的 Ubuntu 筆記
  2. [Linux] screen教學與bindkey設定用法 - 雅砌工坊

我修改上面兩個 Blog 中所寫的 screenrc,保留部份自己要的功能。

startup_message off

caption always "%{=u .r} %-w%<%{=ub .Y}%n %t%{=u .r}%+w "
hardstatus alwaysignore
hardstatus alwayslastline "%{= .K} [%l]%<%=%{= .Y}$USER%{= .R}@%H %=%{= .m} %Y/%m/%d%{= .M} %0c "

defutf8 on
altscreen on
shelltitle '$ |bash'
vbell off

# bind F9 to create a new screen
bindkey -k k9 screen
# bind F10 to kill current screen window
bindkey -k k; kill
# bind F11 to move to previous window
bindkey -k F1 prev
# bind F12 to move to next window
bindkey -k F2 next

2012年10月21日 星期日

Install VMware tools on Ubuntu server

Environment:Ubuntu server 12.04 LTS
Require:build-essential、linux-headers-server

Install VMware tools steps:

1. Attach media.
VM -> Install/Upgrade VMware tools

2. Create a mount point if doesn't exist.
$ mkdir /mnt/cdrom

3. Mount cdrom.
$ mount /dev/cdrom /mnt/cdrom

4. Change directory to mount point.
$ cd /mnt/cdrom

5. Copy VMware tools TAR file to /tmp
$ cp VM*.tar.gz /tmp

6.Change directory to /tmp
$ cd /tmp

7. Extract TAR
$ tar -xzvf VM*.tar.gz

8. Change directory to vmware-tools-distrib
$ cd ./vmware-tools-distrib

9. Run install script (with -d option to auto answer questions)
$ ./vmware-install.pl -d

10. Reboot
$ reboot

CSS Block + Google Code Prettify Prefix

參考網頁:
http://fly2sky999.blogspot.tw/2012/03/blogger-css-block-google-code-prettify.html

Code block:
<pre class="code">
要顯示的程式碼
</pre>

Code block with syntax highlighting:
<pre class="code prettyprint">
要顯示的程式碼
</pre>

若code中有特殊符號,用下面網頁轉碼:
HTML Encoder

Ubuntu Server: fd0 read error

  最近在幫忙老闆測試一些將來要安裝到lab server上的軟體,因此在自己電腦的VMware安裝了Ubuntu server 12.04 LTS 64-bit。起初在啟動時還沒有錯誤訊息,直到不久前才發覺boot過程中,短暫地跳出:
"error: fd0 read error."
   原因是因為Ubuntu server找不到floopy device,才會顯示出這段錯誤。雖然不影響運作,但是每次開機都會看到這段error message也很煩人。解決方法如下:
  1. 開啟VMware的floppy device。
  2. 從BIOS中Disable floppy device。
  3. 讓grup忽略fd0。(此方法較複雜)