2013年4月26日 星期五

三不五時, 愛要即時

就這麼一個禮拜, 從此天人永隔
很後悔上個禮拜老爸要我打電話跟妳聊聊天的時候我沒有打
沒想到這一通電話沒打
從此就再也沒辦法跟妳講到話了.....


外婆我會永遠思念妳
祝妳在天國可以幸福快樂..... :' )

2013年2月15日 星期五

Bochs設定方式

這幾天在看《Orange's 一個作業系統的實現》這本書
書中介紹到Bochs這套IA-32的模擬器
但書中所附的設定檔跟我目前在Ubuntu中所使用的設定檔有點不同

2012年10月18日 星期四

C和組合語言對於組語符號引用的差異 (ARM & x86)

之前在trace U-Boot source codes的時候發現了C對於組語內符號的引用方式非常奇特
搜尋了一下相關的資料發現也有人有跟我一樣的疑問

U-Boot中的board_init_f():
(定義在:arch/arm/lib/board.c)


2012年10月15日 星期一

Linux Kernel: ARRAY_SIZE()

通常我們在C語言中取得陣列的元數個數可以透過下列的方式來計算:


2012年10月14日 星期日

Linux Kernel: BUILD_BUG_ON_ZERO() / BUILD_BUG_ON_NULL()

之前在trace Linux Kernel source codes時發現了兩個很特別的macro:BUILD_BUG_ON_ZERO() 和 BUILD_BUG_ON_NULL()
(定義在:include/linux/kernel.h)
它們的定義如下:


2012年5月8日 星期二

Linux Kernel: __lookup_processor_type

最近在trace Linux Kernel的bootup流程
過程中也發現了assembly與linker script之間的有趣"交流"
特別記錄一下.....
以下的code將以Linux 3.3.4的版本做說明

2010年8月14日 星期六

Never Ends...

最近為了畢業論文花了兩個禮拜左右的時間
研究關於Linux Performance Monitoring的相關技術
從原本完全不知道如何做Performance的Monitoring
到發現原來有不少Open Sourced的Performance Monitoring的Tools
像是:SystemTap、LTTng、Ftrace等工具...
以及其底層所實做的技術:Kprobes、Tracepoints、Ptrace...等

在試過幾個不同的技術後
最後決定Kernel Space Tracing
使用Performance Overhead較高 (因為需要插入Breakpoint instructions)
但可以在不更動所欲偵測程式的source code的情況下做Dynamic Analysis的Kprobes

而User Space Tracing則打算使用GNU GDB底層所使用的Ptrace
(原本打算使用Ptrace的增進版 - Utrace,不過由於尚未支援ARM平台所以只好作罷...)

另外為了能讓資料由Kernel Space pass到User Space的Overhead降到最低
所以還稍微研究了Relay (前身為Relayfs)

以及為了提供nanosecond等級的時間精準度
所打算使用的hrtimer (High Resolution Timer)

但人算不如天算...
原先想說大概基本所需要技術都研究的差不多了
剩下的就是跟老師討論實做在我們3D Chip平台上所需的細節後
就可以真正開始設計這套系統...

結果沒想到今天在報告關於Kprobes的進度後
老師又丟了一個新的議題要我解決:
算出Process Context Switch所花的時間
啊吼... 這下真的是在我頭上投下了一個超大顆的震撼彈!!
(難不成是要我去修改Linux Kernel的Scheduler?! 囧rz)
因為不管是Kprobes或是Ptrace...
其原理都是在fucntion的entry或是exit處甚至是function內部再加上int 3的assembly code
(x86、x86_64平台上的breakpoint instruction,也就是soft interrupt)
在對CPU發出soft interrupt後再將控制權轉交給其他的handlers
如此就可以透過此方法來計算function enter及return的timestamps
進而計算出function所花的執行時間,達到Performance Monitoring的功能
但由於Context Switch發生的時間點完全無法預測
因此也無法得知需要在哪個部位下breakpoints

原本是想找理由"婉拒"的
但沒想到老師搬出Linux的time程式
說可以測量出real、user、sys這三種時間

我之前就記得這個程式也只是單純計算程式在User Space及Kernel Space的執行時間
並沒有特別將Context Switch的時間給計算出來...
但因為討論的當下並沒有明確的證據可以證明
老師又很堅持他的論點,所以只好妥協... QQ

果然之後查了user就是程式在User Space所執行的時間
sys就是程式在Kernel Space所執行的時間
而且時間精準度只有second等級 (頂多到millisecond...)
底層實做方法則是透過wait3() system call來實做的
雖然沒有很仔細的好好trace過time的source code
但感覺起來用Kprobes、Ptrace所算出來的時間可能還更精準一點?!


不過有個好消息是我有可能不用作硬體整合
可以專心開發Performance Monitoring Tool了!! (喔耶~ \(●口●)/)
但看來Context Switch的問題勢必是會被要求得解決了?! QQ
目前查了一些資料 是的確有計算Context Switch的Benchmark
(像是:LMbench)
不過還不知道其底層所實做的方法為何就是...
(倒是覺得自己越來越像是在OS Lab了... XDDD)

目前還有另外一個隱憂就是目前測試都是在x86的平台上做的
天曉得移植到板子的ARM平台後又會發生啥鬼事情?!
還有root filesystem若有缺少所需使用的Library可能也得自行想辦法加入... QQ


果然就如同學長所說的
若是他能預測老師的想法他早就畢業了...

這次報告前完全沒想到會有Context Switch相關的問題要解決
沒想到老師還是給它揪了出來!!
老師的想法果真是很難預測..... QQ

就連才要在台灣待兩個月的德國佬今天也被我們老師assign工作要做了
原本以為兩個月的時間應該光瞭解一些基礎知識就差不多要回國哩
但老師還是assign他要用SystemC做一個Flash Memory版的cache
甚至還要求能轉換成RTL下到FPGA上
(不過我想這點時間能完成SystemC modules大概就很不錯了...)

實驗室真的是越來越"強大"了!! <囧>

2010年7月22日 星期四

Recently...

唸研究所滿一年了...
馬上也就要碩一升碩二了~
時間過得真快...
也體會了不少黑暗學術界的辛酸血淚... QQ

當初進研究所的時候是想要專心研究Embedded Linux的
雖然還是有做到Device Driver相關的Maintenance
不過最後還是被老闆抓去做硬體整合... Orz

能有機會學到以前輔大不太常碰到的硬體是個還蠻難得的機會
而且軟體寫久了也會想瞭解一下最底層的硬體是怎樣在運作的
不過整合最討厭的就是得先等到別人開發到一定的程度後才能開始工作
(就某方面來說這也很像Device Driver的開發
必須等到軟/硬體都有一定的程度侯才能驗證自己寫的是否正確無誤... QQ)
再加上設計者不是自己
因此只能單純就Bus上的行為來觀察IP是否正常運作
沒問題的話倒還好...
機車的就是當問題發生的時候常常不知道為啥會出錯!!!!!
有可能是我們自己整合的時候有修改到錯的地方
也有可能是他們本身設計上的錯誤...
雖然目前主要還是學長在處理這方面的問題
不過看了真的是覺得沒啥勁.....
而且之後還要把我們實驗室的CPU和ICE一起給整進去
最後還要能Tape out成一顆晶片回來!!
(聽說光排隊等Tape out就要一、兩個月?! QQ)
一想到就整個頭很大..................... <囧>

原本以為自己碩士畢業論文大概就是跟軟/硬體整合相關的了
沒想到上週老闆又提起了當初他所提的軟/硬體效能監測工具的東西出來
這次再被提就真的是逃不掉了...
硬著頭皮就是得給它做出來才行!!

一開始對軟體的效能監測一直都沒啥頭緒
只知道用最簡單的printf()或是printk()來印出所執行的時間
但這些function calls本身的overhead就非常重
而且若想要移植到新的應用程式就得重新寫過
對效能和可移植性來說都是非常不好的方法

再加上在有OS的情況下因為OS Scheduler的關係...
要針對各個應用程式來監測便變得更加的困難
因此勢必得從Kernel層本身來下手

在書上無意間看到了LTTng (Linux Trace Toolkit Next Generation) 這套工具
查了以後才發現這是套非常強大的Open-Sourced的軟體
不但可以針對Kernel Space及User Space來監測其效能
甚至還提供了LTTV (LTTng Viewer) 這套GUI介面的軟體來分析其所擷取的效能分析結果
而且最棒的是作者在他的官方網頁上都有放他所投出去的Papers和Presentations
連他自己的博士論文都完整的放在網頁上供人點閱
也就此瞭解到了不少Kernel Source本身
或是別人release的Kernel Patches來協助完成tracing / debugging的功能
像是:
GNU GDB和strace所使用的ptrace() system call
Kprobes
LTTng作者:Mathieu Desnoyers (神人!!) 所開發的Kernel Marker和Tracepoints
IBM工程師特別針對Device Driver tracing / debugging的Linux Driver Tracing Interface (DTI)
以及relay (前身為relayfs)

希望在研究後也可以設計出自己一套基本的軟/硬體效能監測的工具!! XDDD

另外Linux Symposium也是一個超棒的研討會
很多Mainline Linux Kernel所包含的技術都有在這研討會上發表過Papers
(還蠻希望未來能有一天可以參加這種研討會的... XDDD)

前兩天還去上了國家晶片研究中心(CIC)開的Bootloader的課程
對程式底層架構、Linker script和U-boot也終於是有了一點概念...
不過ARM的assembly code實在是很不熟!! QQ


雖然還沒開始正式接觸到硬體設計的部份
不過就目前來說還是對Linux Kernel比較有興趣點... >M<"
而且這也比較符合當初進研究所希望做的Linux Kernel相關研究
自己也能比較有自己的進度 不用每次都要等別人修改
(但Overloading也跟著變重很多就是... QQ)


還不曉得最近看的東西是否真的可以用在我們實驗室的平台上
x86或x64平台的支援還是比ARM要完整的多了...
而且我們實驗室用的板子是廠商自己開發的
相對於有Open-Sourced支援的Versatile平台限制可能也會多了不少?!
還是得花時間再研究一下其可行性才行.....


希望這真的是我最後的畢業題目了...
之前做的事情對老師來說真的只是在"練功"
而且就"練功"而言來說還真的是不太好練... <囧>

現在的Overloading已經接近滿載!!
而且還有要帶學弟...etc 的事情要弄
再被assigned其他的東西要做我就真的是要先自爆嚕!!!!! (●皿●)"
另外最重要的當然就是希望能兩年準時畢業啦!! XDDD

2010年5月6日 星期四

Embedded Linux mounting NFS in VMWare

今天一整個下午都在研究...
為啥我要mount我Host端架的NFS Server會一直mount不到

看CDK板的Spec. 說明看了老半天
IP一直換換換 結果每次要mount NFS的時候都會出現:
mount: RPC: Unable to receive; errno = No route to host

而且不管由Host端的OS ping板子
或是由板子ping回Host端的OS 都ping不到...

搞了一整個下午才發現原來因為我是用Windows + Linux @ VMWare
然後NFS Server也是架在VMWare裡面的Linux
但只設定了板子和Linux的IP
忘了設定Windows網卡的IP
所以不管是Linux @ VMWare → Windows → CDK板
或是CDK板 → Windows → Linux @ VMWare
都會因為Windows的網卡沒有設在同一個網段
所以中間的連線會被斷掉...

試了一整個下午才想到有可能是這個原因
浪費了自己一個下午的時間在那邊IP改過來改過去的...
多個VMWare在中間就真的要多注意一下中間橋接連線的設定... QQ


最後補上各個部份網路的設定:

Linux @ VMWare:
---------------------------------------------- 
IP address:10.168.1.166
Network Mask:255.255.255.0
GateWay IP:10.168.1.254

Windows:
---------------------------------------------- 
IP address:10.168.1.168
Network Mask:255.255.255.0
GateWay IP:10.168.1.254

CDK板:
----------------------------------------------
IP address:10.168.1.214
Network Mask:255.255.255.0
GateWay IP:10.168.1.254


其實只要確定IP address都是在同一個網段 + 使用同一個Gateway
就可以透過跳線來做連線了...
另外如果是用筆電的話記得也要把無線網路給關掉
不然VMWare可能會變成去抓無線網路的連線
導致連不到我們想要連線的網卡...

還有如果使用的NFS Server屬於比較舊版本的
就必須在mount的時候加上:-o nolock 的參數
nolock 參數是禁用文件鎖 (disable file locking) 的功能
不然在mout的時候就會出現:
portmap: server localhost not responding, timed out
RPC: failed to contact portmap (errno -5)
portmap: server localhost not responding, timed out
RPC: failed to contact portmap (errno -5)
lockd_up: makesock failed, error=-5
portmap: server localhost not responding, timed out
RPC: failed to contact portmap (errno -5)
mount: mounting 10.168.1.166:/home/sys3d/Desktop/3DG on 3DG failed

的錯誤訊息...

加上 -o nolock 參數後就可以正常mount NFS的資料夾了:
mount -t nfs -o nolock 10.168.1.166:/home/sys3d/Desktop/3DG 3DG
(正確不會有錯誤訊息)

不過令我有點納悶的是我是用Ubuntu 10.04 LTS當我Host端的OS
NFS也是用apt套件直接安裝最新版的...
結果還是要加上 -o nolock 參數
那不知道到底怎樣才不算舊版的NFS Server哩...?! Orz

P.S. HyperTerminal我覺得PuTTY比minicom好用多了... XDDD

2010年4月16日 星期五

Linux device driver access physical address

一般我們在寫嵌入式系統 Stand alone (Non-OS) 的程式時
如果想存取一段Physcial address
通常我們會以下面的方式來定義指標:
#define CLCDC_BASE    (volatile unsigned long *) 0x10120000;
如果想要取得其值則會定義為:
#define CLCDC_R0        *((volatile unsigned long *) 0x10120000);
如此在存取CLCDC_R0值時,就是在對該Physical address做存取:
CLCDC_R0 = 123;

但如果現在在有OS的情況下
由於OS會有記憶體保護的機制
因此user space的應用程式都無法如同Stand alone的程式直接對某段Physical address做存取
至於device driver也必須使用ioremap()函式來將一段Physical address映射到一段Virtual address才能夠存取:
void * ioremap(unsigned long phys_addr, unsigned long size);


今天剛好有機會測試到這兩種方法在Linux內所會造成結果的差別...
因為VersatilePB板上的Color LCD Controller (CLCDC)
(其在VersatilePB板上的Base address為:0x1012000,Size為:64KB)
會在啟動時將記憶體某一個區段map為frame buffer來使用
而其使用的記憶體位置會存在CLCDC中的某一個register內
因為要將資料輸出到frame buffer中
因此必須先取得該register所存放frame buffer的physical address...

一開始是先使用一般嵌入式系統Stand alone (Non-OS) 程式的方式來取得該值:
static unsigned long clcdc_base = *((volatile unsigned long *) 0x10120000);
再將我要輸出的資料指定給frame_buffer變數
結果可以正常Compile
但放到QEMU所模擬的VersatilePB環境,insmod時...
就會噴出:
Unable to handle kernel paging request at virtual address 10120000 
的錯誤訊息...


在搜尋一些網頁後才發現一般這樣使用在Kernel中會被視為Virtual address
但因為Kernel並沒有map這段Virtual address到某段Physical address
所以沒辦法做轉換,因此噴出錯誤訊息...

正確的使用方法應該先將此Physical address透過ioremap()函式映射到一段Virtual address
之後再對該Virtual address做存取:
static unsigned long clcdc_base = ioremap(0x10120000, 64 * 1024);

如此便可正確存取到CLCDC的registers了...


事後想想其實自己原本就有利用ioremap()來存取我們3D晶片上的registers
結果想再新增一個功能頭腦反而就轉不過來了... <囧>

不過這也算是一個還不錯的經驗...
發現原來就算是在kernel space中也是必須透過ioremap()才能存取Physcial address的...

P.S.
根據定義... ioremap()所回傳的Virtual address
是不可被直接存取,而是必須間接透過Kernel所提供的存取函式的
ex:ioread8()、ioread16()、ioread32()、iowrite8()、iowrite16()、iowrite32()、memset_io()、memcpy_fromio()、memcpy_toio() ...etc

但這次改之前OS Lab所留下來的device driver
卻發現全都是直接存取ioremap()所回傳的Virtual address
或許這不是正確的寫法?!
(不過仍然可以跑就是.....)
哪天有機會再把它改掉看看是不是也能正常使用?! XDDD


最近device driver寫得差不多了
(改人家寫的都馬寫得很快... Orz)

原本畢業論文要做效能分析的程式被中途喊卡
老闆改叫我去接學長做軟/硬體整合的工作
原先進來這個實驗室的時候就是只想focus在OS部份,不想看wave form的!!
看來這下真的是沒得選了... QQ


接下來就要開始嗑 AMBA AHB / AXI 的bus protocal spec. 哩...
或許能有這個機會接觸到平常碰不太到的硬體也是個不錯的經驗?!
希望最後不會做不出來就好... QQ

不過最好佳在的是現在老闆"有機會"放寬他的條件,大家都有機會兩年畢業了.......................... 吧?!

誠心希望這張支票最後不會跳票... (●皿●)"

2010年3月16日 星期二

Google Sites...

今天被專題生問到我畢業專題Drupal的東西
因為他們軟工也想架一個簡單賣東西的網站

好奇問了一他怎會知道我做這個
結果才發現原來他是看到我Google Sites的文章
那時候做的Portfolio被學弟無聊逛到...
真是懷念~
果然放在網路上的東西很有可能會在某一天被某人給挖出來... XDDD

倒是Portfolio都沒在更新了...
等研究所唸完可以再把東西好好給它更新一下
希望這不會是兩、三年以後的事..... QQ

想到這就想到我們大四電子商務的osCommerce!!
一門很喇賽又很歡樂的課...
當初修得還蠻快樂的說~
還讓我想到當時有個女的不知道是喝酒還是嗑藥?!
在台上一直瘋言瘋語的... 真是有趣~ XDDD

雖然osCommerce的模組化真的是很鳥...
(還要修改程式碼才能把新的模組給加上去 =M=a)
跟Drupal來說完全沒得比~
但osCommerce的確比較符合他們的需求
至少不用再去找特別的模組就可以達到他們的基本要求了...
所以最後還是推薦他們使用osCommerce





喚起我大學的回憶..... >///<

2009年8月17日 星期一

Verilog筆記...

記錄...
一些關於Verilog撰寫方面的筆記...

1. TestBench的module宣告不用宣告input port和output ports
ex:
電路設計檔的module宣告:
test.v
----------
module test (in1, in2, out); <= 有宣告所需的input和output ports
其TestBench檔的module宣告:
test_tb.v
----------
module test_tb; <= 不需要宣告test.v中所需的input和output ports

2. TestBench通常input ports會改宣告成reg型態 / output ports會改宣告成wire型態
ex:
電路設計檔的input / output ports宣告:
test.v
----------
module test (i0, i1, i2, out);
input i0, i1, i2;
output out;
reg out;

其TestBench檔的input / output ports宣告:
test_tb.v
----------
module test_tb;
reg i0, i1, i2; <= input ports改宣告成reg型態
wire out; <= output ports改宣告成wire型態

3. 這是發生在撰寫4 Bits Up-Down Counter時發生的邏輯錯誤:

4 Bits Up-Down Counter電路設計檔:
Four_Bits_Up_Down_Counter.v
----------
// 4 Bits Up-Down Counter with reset and control signal
module Four_Bits_Up_Down_Counter (control, reset, clk, out);
input control, reset, clk;
output [3:0] out;
reg [3:0] out;

always @(posedge clk)
begin
if (~reset) // When reset = 0: zero the value of out
begin
out <= 4'b0;
end
else if (control) // If control = 1: Up-count the number
begin
// Only Up-count while the number not reach 4'b1111
if (out != 4'b1111)
begin
out <= out + 1;
end
end
else // Else if control = 0: Down-count the number
begin
// Only Down-count while the number not reach 4'b0000
if (out != 4'b0000)
begin
out <= out - 1;
end
end
end
endmodule

其TestBench檔:
Four_Bits_Up_Down_Counter_tb.v
----------
// 4 Bits Up-Down Counter with reset and control signal Test Bench
module Four_Bits_Up_Down_Counter_tb;
reg control, reset, clk;
wire [3:0] out;

Four_Bits_Up_Down_Counter tb (.control(control), .reset(reset), .clk(clk), .out(out));

initial
begin
control = 1'b1;
reset = 1'b0;
clk = 1'b0;
#10 reset = 1'b1;
#500 $finish;
end

always
begin
#10 clk = !clk;
end
endmodule

其模擬出來的out都會是Unknown的訊號:


其原因在於...
當clk由負緣拉為正緣時:
always @(posedge clk)

程式才會進入下面的if / else判斷式

但由於在clk由負緣拉為正緣前:
always
begin
#10 clk = !clk;
end

reset就已經由0改設成為1了:
#5 reset = 1'b1;

也因此導致out沒有初始值 = Unknow
如此之後不論判斷式再怎麼加 / 減
其值均會為Unknown,導致錯誤的結果


解決方法:
將進入判斷式的條件多加:always @(posedge clk or negedge reset)
將reset也加入進入判斷式的條件中...
如此當reset由正緣拉為負緣時
就會一併將out初始為0000了


原本一直以為是自己Verilog有寫錯...
在問過學長後才發現原來有這麼一個隱藏的問題!!
果然有經驗的一看到就可以很快的發現問題出在哪...

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^"

2009年6月14日 星期日

慘痛的學費...

痛
原本要在筆電上面灌雙OS的
但因為筆電一直沒來
之前一直在VMWare上一直灌失敗 (Linux→Windows)
所以自己心血來潮想說用實機來灌看看OS

該備份的資料都備份好了
該準備的安裝光碟也都燒出來了
結果竟然因為自己一時的不小心...
讓自己多年來的辛苦付諸一旦!!

就是這個畫面把我多年來辛苦存的資料給全毀了...
(圖片為Fedora 9的安裝畫面,來源為:http://0rz.tw/ZBrGB)

因為用VMWare在跑的時候硬碟一開始一定都是unreadable的
所以多次用下來導致我每次都很順手的就直接點了YES下去
偏偏很衰小的是Fedora 11安裝的時候竟然抓到的是我第二顆的硬碟(sdb)
在沒有察覺的情況下...
我親手點了YES,把自己多年來的辛苦給全部洗掉!!
之後察覺不對靜,所以點了下一步後就馬上離開安裝程序了
但....


一切為時已晚!!


所有多年來的音樂、MV、作業、程式碼、報告、系統軟體、系學會的資料.......
太多太多的東西全部都被洗掉了!!
(因為這顆就是我的備份碟...... QQ)

不過讓我最不解的是為什麼它會抓到的是我第二顆的硬碟,而不是第一顆... =M=a
而且我還有第三顆硬碟(sdc) (不過裡面只有存日劇、電影...etc)
為什麼就偏偏抓到我最重要的那一顆!!

之後不管是用TestDisk、spfdisk、FinalData...
完全救不回我原本的資料...
(磁區都是未規劃,FinalData沒辦法讀取,要讀取就先必須格式化!!)

而且昨天的時間幾乎都花在重灌...
因為先灌Linux,再灌Windows
比先灌Windows,再灌Linux稍微複雜一點

由於Windows讀不到Linux的檔案格式
必須先從Linux分割好後,再用mkntfs把那個磁區格式化成NTFS格式
而且Vista還必須再多一點設定

但在我灌好Linux後...
不管我用Linux內的fdisk+mkntfs、spfdisk或是Vista安裝程式的diskpart來新增一個新的磁區
Vista就是讀不到我切的那塊!!
在安裝的時候一直出現Exception:請確定您的安裝來源...

在多次的Trail & Error後
最後只好放棄先用Vista分割好兩塊磁區
灌好後再灌Linux上去
一整天的時間幾乎都花在這上面... QQ

事後跟小胖討論後發覺可能是因為自己在灌Linux的時候分割了太多的磁區
(/,/boot,swap,/home,/var)
把Primary分割區的4個Quota都給用完了
所以再切割新的磁區都只能選擇Logical分割區
但Windows一定得灌在Primary分割區
所以才導致一直抓不到分割區的狀況發生?!
或許下次可以等筆電來後再試試看?! XDDD

不管怎樣...
逝去的資料不會復返
一切都得重新來過......
雖然這些資料說重要也不是到非常重要的程度
大部份的人大概也都沒在好好保留這些東西的...

但說無所謂又非真的無所謂!!
好歹也是自己多年來的珍藏
竟然因為自己一時的不小心把資料給全毀了!!
(還不是因為硬碟壞掉這種無法避免的原因... QQ)
多少還是會感到有點心痛... >M<"


只能說這次的經驗就當作自己在學習過程中的學費+慘痛的體悟...
因為這個緣故也讓我多看了一些相關的資料...
但下次自己在弄的時候真的是得小心點才是~ Orz

2009年5月30日 星期六

wire v.s. reg...

記錄...
轉載自網路:

簡單來說硬體描述語言有兩種用途:1. 仿真,2. 綜合
對於wire和reg,也要從這兩個角度來考慮:
--------------------------------------------------------------------------------------------

從仿真的角度來說,HDL語言面對的是編譯器 (如Modelsim等),相當於軟體思路
這時:
wire對應於連續賦值,如assign
reg對應於過程賦值,如always、initial
--------------------------------------------------------------------------------------------

從綜合的角度來說,HDL語言面對的是綜合器 (如DC等),要從電路的角度來考慮。
這時:
1. wire變數綜合出來一般是一根導線;
2. reg變數在always區塊中有兩種情況:
(1). always後是 (a or b or c) 型式的,也就是不帶Clock Edge的
綜合出來還是組合邏輯電路 (Combinational Logic)
(2). always後是 (posedge clk) 型式的,也就是帶Clock Edge的
綜合出來一般是循序邏輯電路 (Sequential Logic),會包含觸發器 (Flip-Flop)

在設計中:
1. 輸入信號一般來說你是不知道上一級是暫存器輸出還是組合邏輯輸出
=> 那麼對於本級來說就是一根導線,也就是wire型
2. 而輸出信號則由你自己來決定是組合邏輯輸出還是暫存器輸出
=> wire型、reg型都可以
3. 但一般的,整個設計的外部輸出 (即最頂層module的輸出),要求是暫存器輸出
=> 也就是reg型,較穩定、扇出能力也較好

以上轉載自此
--------------------------------------------------------------------------------------------

大體上來說wire和reg都類似於C/C++的變數

但若此變數要放在:
begin...end內
,該變數須使用reg
begin...end外,則該變數須使用wire

另外使用wire時,須搭配assign;reg則不必

input、ouput、inout預設值都是wire

若wire和reg用錯地方,compiler都會提醒,所以不必太擔心

一個很重要的觀念:
在Verilog中使用reg,並不表示合成後就是暫存器(register)
1. 若在組合邏輯電路 (Combinational Logic)中使用reg,合成後仍只是net
2. 在循序邏輯電路 (Sequential Logic)中使用reg,合成後才會以flip-flop型式表示成暫存器(register)

以上轉載自此

2009年5月29日 星期五

osCommerce 05/29更新...

osCommerce
新增了:2gether_discount_full 的module...
合購某些商品可享有95折(5% OFF)的優惠!!

各位如果想測試的話可以在一登入的首頁點選特價商品左上角的:
技嘉 GV-N250OC-1GI 高效能顯示卡

我有設定它和金士頓 DDRII 800 2GB 桌上型記憶體
合購可以享有95折(5% OFF)的優惠...

最後就請各位再多多測試看看有沒有需要修改的地方吧...


osCommerce前台網頁
osCommerce後台網頁

2009年5月28日 星期四

osCommerce商品已上架...

osCommerce
我今天已經把Eric傳給我的商品全部上架到我們osCommerce的網站上了...
價格的部份我是自己隨便訂的
還挑了幾個商品做了特價的優惠...

另外由於我覺得如果特價商品的訊息只有在右側的區塊出現有點太不明顯
所以我還修改了首頁的Codes:加入了特價商品的中間區塊
(原本只有新進商品...)
所以現在只要一登入首頁就可以看到特價商品和新進商品的資訊了...


最後要請各位組員們幫幾個忙:

1. 麻煩每個人都去註冊一個帳號
隨便買個幾樣東西
衝一下我們我網站的訂單數
可以的話也順便對幾個商品做個評論...

2. 麻煩哨子在這個週末假期將我們網站的Logo設計好傳給我,以便我上載...

3. 麻煩各位測試看看有沒有需要修改的部份
ex:出貨方式、付款方式...etc
這些其實都是可能影響到我們企劃書的內容的
所以之前我才跟小安和宣筑要了我們的企劃書來看看我網站是否有需要修改的地方

各位用一用如果覺得哪邊有需要修改的部份可以跟我說一下
或是可以自己登入後台頁面做修改...
後台管理的帳號、密碼忘了的話也可以來問我!!


原則上我網站的部份如果沒有特別需求
我就維持現在這樣不做任何更動了...
(除了各位買了東西後我會確認訂單外...etc)

投影片的部份就麻煩你們先做個大概後再傳給我
我再把我架站過程的部份加入...


謝謝各位 && 端午節快樂!! ^__^


osCommerce前台網頁
osCommerce後台網頁