2009年7月22日 星期三

µClinux核心編譯...

記錄...
因為讀書會的工作分配...
新生每個人要負責嵌入式系統設計-以ARM處理器基礎之SOC平台這本書的某些章節
在讀書會的時候要提出來報告並討論
而我選擇了:
第6章 µClinux核心(Kernel) 及 第7章 µClinux設備驅動程式
這兩個章節...

因此今天就上網搜尋了一下如何編譯µClinux的核心:
(OS:Fedora 11)

µClinux定義:
µClinux就是一般所謂的作業系統
它是由Linux演變而來的

µClinux這個名稱是micro Controller Linux的簡稱

名稱代表著它是專供微控制器(micro controller)使用的Linux

(以上節錄自:
嵌入式系統設計-以ARM處理器基礎之SOC平台一書)

首先要先下載µClinux的核心:http://www.uclinux.org/pub/uClinux/dist/
目前最新版是Full Source Distribution (20090618) 這個版本
不過因為本人眼殘...
把2008看成2009~
所以下載了uClinux-dist-20080808.tar.bz2這個版本...
當初還想說為啥比較舊版的字還最大?!
(而且明明2009.08.08根本就還沒到... 囧rz)
不過用哪個版本的應該都沒關係就是了~
下載好後將核心解壓縮到所要存放路徑
ex:/usr/src/uClinux-dist

另外為了編譯核心
需要使用到arm-linux-tools
(下載:arm-linux-tools-20070808.tar.gz 這個壓縮檔)
arm-elf-tools
(下載:arm-elf-tools-20030314.sh 這個檔案)
這兩個toolchains...

將下載好的arm-linux-tools-20070808.tar.gz 這個壓所檔中:usr/local/下所有的資料夾
(arm-linux、bin、lib、libexec)
解壓縮到所要存放路徑
ex:/usr/local/arm/這個資料夾下:
cd /usr/local/

sudo mkdir arm
cd arm-linux-tools-20070808.tar.gz所在目錄
sudo tar -xvf arm-linux-tools-20070808.tar.gz /usr/local/arm

之後由於編譯µCLinu核心時需要使用到arm-linux-gcc這個指令
所以需要將/usr/local/arm/bin/這個路徑加入到$PATH環境變數中
sudo vim /etc/profile
在檔案最下面加入:
# For arm-linux-tools
PATH=/usr/local/arm/bin:$PATH
export PATH


存檔後直接使用.或是source /etc/profile便可在當下的環境中取用新設定好$PATH(若是需要永久取用,則需重新登入!!)


另外由於
arm-elf-tools-20030314.sh在Fedora下執行會出現以下錯誤:

問題一:tail: cannot open '+43' for reading: No such file or directory

解決方法:
用vim,將第39行的代碼:
tail +${SKIP} ${SCRIPT} | gunzip | tar xvf -
改成如下:
tail -n +${SKIP} ${SCRIPT} | gunzip | tar xvf -
(多加 -n 參數)

問題二:gunzip: stdin: unexpected end of file
解決方法:
在arm-elf-tools-20030314.sh 最後一行加入一空行
參考網頁:點我觀看
存檔後再執行arm-elf-tools-20030314.sh:
sudo ./arm-elf-tools-20030314.sh


Toolchains都設定好後:
cd /usr/src/uClinux-dist (µCLinux Source Code所在路徑)
make menuconfig (進入文字選單設定介面)
(或是可用:make config - 純文字條列式設定介面、make xconfig - 圖形化設定介面)
在選單中選擇Vendor/Product Selection ---> 來選擇所需要的硬體平台
--- Select the Vendor you wish to target
在此選擇GDB
--- Select the Product you wish to target
在此選擇ARMulator

在選單中選擇 Kenel/Library/Defaults Selection ---> 來設定其他編譯Kernel的相關設定
(Kernel Version 在此使用:linux-2.6.x、Libc Version使用:uClibc)

都設定完成後按x離開選單設定介面
並在離開的時候選擇將所設定的選項存檔

完成後便可開始編譯核心,輸入:
make dep
make

若在編譯過程中出現缺少genromfs相關檔案的錯誤訊息
可以至此網頁下載:genromfs - ROM FileSystem Generation Utility
至於安裝方式就依照網頁說明安裝即可重新執行make指令編譯核心


核心編譯成功後
在images資料夾下會有以下
三個檔案:boot.rom (重要)linux* (重要)romfs-inst.log
接下來我們就要在GDB/ARMulator下執行µCLinux:

首先進入到µCLinux所在路徑:
cd /usr/src/uClinux-dist/

建立images資料夾中,boot.rom檔案的連結:
ln -s images/boot.rom boot.rom

執行arm-elf-gdb:
arm-elf-gdb -n linux-2.6.x/linux (在此可根據所安裝的核心更換路徑)

若在此出現:
arm-elf-gdb: error while loading shared libraries: libncurses.so.4: cannot open shared object file: No such file or directory ... 的錯誤訊息時
則需在/usr/lib中建立連結到/lib/libncurses.so.5
libncurses.so.4連結檔:
cd /usr/lib
ln -s ../../lib/libncurses.so.5 libncurses.so.4

另外若要執行GDB,還需要有libgtk這個Library
安裝gtk+套件:
sudo yum install gtk+

完成後再次執行:
arm-elf-gdb -n linux-2.6.x/linux (在此可根據所安裝的核心更換路徑)

成功執行後依照以下指令依序執行即可:

GNU gdb 5.0
Copyright 2000 Free Software Foundation, Inc.
.........
..................
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-elf"...
(gdb) target sim
Loaded ROM boot.rom
Loaded ROM boot.rom
Loaded ROM boot.rom
Loaded ROM boot.rom
Connected to the simulator.
(gdb) loadLoading section .text, size 0x77b84 vma 0x2000000
Loading section .rodata, size 0x8ddb vma 0x2077b84
Loading section .data, size 0x8fc8 vma 0x2080a60
Start address 0x2000000
Transfer rate: 4507960 bits in <1>
(gdb) run

........
........
........

到此µClinux核心編譯便告一段落...


經過一番折騰總算是把µClinux給編譯完了
(每次剛解決了一個Error可能下一秒又會再跑出另一個Error... Orz)

不過目前還不知道要怎麼在上面寫程式
也沒有評估板可以把寫好的程式porting到上面
甚至未來還有沒有機會繼續朝這領域發展都還是個未知數~

雖然聽同學和一個博班的學長說老師今年有可能會將OS這塊納入研究領域
(這也是我會選擇這間Lab的原因啊!!! >M<")
不過在老師還沒返國前一切都還是個謎...

希望以後還能有機會繼續朝這方向發展嚕~~~ XDDD



參考網頁:
uClinux™ -- Embedded Linux Microcontroller Project -- Home Page
Getting started with uClinux
歡迎來到 Jollen 的網站 :: uClinux distribution 使用教學
uClinux - Setting up the Development Environment
linux下安裝arm-linux-gcc - Linux教程
fedora 下安裝arm-elf-tools-20030314.sh 的問題-Linux

2009年7月16日 星期四

multiple target patterns

記錄...
因為我們嵌入式要用到SystemC...
所以這幾天把Linux和Windows上的eclipse環境給架了一下

Linux上的很簡單
Fedora安裝的時候就可以選擇JDK和Fedora eclipse套件
(Ubuntu都還要再自己去下載,預設並沒有包在裡面可以選...?!)
而且CDT預設都已經包在裡面了...
所以連下載都不用再下載
只要把SystemC的Library給下載好
在eclipse中把Library給include進去就OK了!!
只是不知道是甚麼原因...
Fedora eclipse的"編輯介面"有點怪怪的...
像是我隨便點一下就會變成檔案更動的狀態:hello.cpp*
再點一次又變回來:hello.cpp
另外就是如果我用滑鼠選取了一段文字(反白)
再點其他地方這段文字就會自動被刪掉... =M="
這樣要是我要複製某段code到另一個地方
很容易就會因為所複製的這段文字被刪掉而出錯!!
造成編輯上的麻煩...

再加上怕未來實驗室會用到的軟體只有Windows版
所以在Windows上我也把eclipse的環境給架了起來
但Windows就比Linux麻煩多了
不但要重新下載CDT...
還要再多下載Cygwin或MinGW
(不過因為我找到的文件是用Cygwin,所以最後選擇了Cygwin...)

但沒想到CDT在Cygwin上有Bug!!
每次在Build Project的時候都會出現:multiple target patterns 的錯誤訊息
Google了一下發現是CDT自己的問題...
點我觀看1
點我觀看2

原來是CDT沒有將Windows格式的路徑 (ex:C:\hello)
轉成Cygwin格式的路徑 (ex:/cygdrive/c/hello)
在eclipse的Project Explorer中都可以看到SystemC include的路徑都是:
C:/systemc-2.2.0/include (純粹只有轉成Unix格式,但Cygwin並不適用...)
所以在Build後所產生的*.d檔中的路徑都會有問題~

最後Google找到了解決方法...
點我觀看

------- Comment #11 From Doyle Rhynard 2007-01-21 18:55:15 -0400 -------
> Yes, Using make 3.80 also solved the problem for me. It seams like CDT needs
> to use quoted strings in the generated .d files?

I recently stumbled upon this bug when I had to reinstall Eclipse/CDT and
Cygwin. After wasting a considerable amount of time trying to determine the
cause of "multiple target patterns" make error, I finally was able to come up
with a Google search that diagnosed the problem and provided a solution. That suggestion was to replace "C:\" with "\cygdrive\c\" for specifying include directories. I have found it easiest simply to edit the ".cdtbuild" file directly.


原來只要把SystemC所需要include Library的路徑由:
C:\systemc-2.2.0\include
改成:\cygdrive\c\systemc-2.2.0\include 即可
果然之後再Build Project就沒出現這個錯誤訊息了!!

沒想到這麼簡單~
但卻搞了我不少時間... QQ
不過好在問題最後是順利解決了!! ^M^"