2007年8月3日 星期五

Bitwise運算的限制

今天為了寫幾個API,並為了作資料動態長度的判別,因而使用到Bitwise的運算,以便檢測資料的長度,然而確一而在地發生錯誤,經反複測試及確認,原來Bitwise的運算不可以運用於"long long"型別的變數,僅可以適用於"char"/"short"/"int"/"long"幾種型別;因此,為了解決動態資料長度的判斷,改以Bit Shift的方式來解決。
(Data >> 32) > 0 ===> 8 bytes
(Data >> 16) > 0 ===> 4 bytes
(Data >> 8) > 0 ===> 2 bytes
(Data >> 0) > 0 ===> 1 bytes

2007年6月7日 星期四

如何在Multi-thread的架構下,以pthread實作Event

如何在Multi-thread的架構下,以pthread實作Event的作法:
我們常在其它的Embedded OS中使用Event的機制來達到Process之間的通訊,但在Linux中卻沒有Event的機制可供使用,此時您可以以這個方法來達成!

.我們可以宣告一個指定數目的Array做為Event的宣告。
.而Array中的每一個Element就當作是一個Event Bit。
.然後,我們可以為每一個欲等待的Event建立一個monitor thread,然後使用thread的condition Variable來等待該Event被設立。
.當Event被設立(Condition Variable的狀態為TRUE時),monitor thread就會被喚醒,它就可以通知等待此Event的thread。

詳細Sample Code待日後找個時間再Post出來!

2007年6月1日 星期五

如何解決在Java中出現亂碼的問題?

這個問題發生的原因是在Java的字型目錄中少了中文字型,可以將系統的字型連結過去,即可解決!
$cd /usr/java/jre1.6.0_01/lib/fonts/
$ln -s /usr/share/fonts/truetype/arphic/bkai00mp.ttf bkai00mp.ttf
$ln -s /usr/share/fonts/truetype/arphic/uming.ttf uming.ttf

重新啟用Java程式即可使用中文!

如何解決在linux上無法使用Freemind的問題?

最近為了在Linux上使用Freemind,從網路下載了最新版的Freemind下來使用,不料,新版的Freemind需要新版的JAVA才能使用(新版的Freemind使用了新的JAVA功能),此時竟發現新版的JAVA並未被放入Debian套件庫中(似乎是一些License的顧慮,Sun好像沒有完全開放),這下子Freemind卡在Java套件而無法使用。
為解決這個問題,我到了http://www.java.com/zh_TW/網站下載Java Runtime Environment Version 6 Update 1,我下載了jre-6u1-linux-i586.bin來使用,依下列步驟執行安裝:
$su
$cd /usr
$mkdir java
$cd java
$cp ~/jre-6u1-linux-i586.bin .
$chmod a+x jre-6u1-linux-i586.bin
$./jre-6u1-linux-i586.bin

將/usr/bin目錄下的java連結連結到所安裝的目錄
$cd /usr/bin
$mv java java-old
$ln -s /usr/java/jre1.6.0_01/bin/java java

這時侯再去執行Freemind就可以正確執行了!

2007年5月31日 星期四

如何知道PIPE或Socket的另一端已經斷線或關閉fd?

當您使用write()API來進行資料的傳送時,若此時PIPE或Socket發生斷線,或是對方關閉fd時,除了write()API會回傳error外,另外會收到errno=EPIPE的錯誤碼及SIGPIPE訊號會被觸發,這裡要小心,SIGPIPE訊號的預設對應動作是關閉程式,如果您沒有打算關閉程式,應該要把SIGPIPE的Handler改為SIG_IGN。

2007年5月15日 星期二

輕輕鬆鬆撰寫Host端的USB Device Driver---向系統註冊Device Driver篇

最近為了發展ICE的Device Driver,花了一些時間研究這個Topic,先前找了一些文件,的確對我助益良多,但畢竟是早期的文件,一些相關的API與資料結構都已經不一樣,無法完全套用,因此記錄一下這陣子嘗試撰寫Driver的心得!
1.以Module的型式撰寫Driver,以方便測試:
請參考前面提到如何撰寫Module程式的步驟來進行!別忘了init_module()/cleanup_module()兩個API
2.為自己的裝置定義Vendor ID及Product ID(注意!必須與裝置內的FW一致)
static struct usb_device_id danny_ids[] = {
{USB_DEVICE (Danny_ID, 0x12345)},
{ }
};
3.宣告ID Table
MODULE_DEVICE_TABLE (usb, danny_ids);
4.為自己的裝置宣告一個device driver (先定義兩個USB裝置插拔時會呼叫到的API,裡面暫時是空的)
static struct usb_driver DannyDriver = {
.name = "Danny Device",
.probe = danny_probe,
.disconnect = danny_disconnect,
.id_table = danny_ids,
};
5.在init_module()中向系統註冊Device Driver
usb_register(&DannyDriver);
6.別忘了!也要在cleanup_module()中加入從系統移除Device Driver的動作
usb_deregister(&DannyDriver);

程式撰寫到這裡,將driver掛載入系統後,插拔USB裝置,應該已有所反應,當裝置插入時,danny_probe()會被呼叫到;當移除裝置時,danny_disconnect()會被呼叫 ------- 待緒.....

2007年5月2日 星期三

不用USB View也能看到USB Device的資訊!

在Linux 2.6版的檔案系統中,您可以檢視
/proc/bus/usb/目錄下的devices檔案,裡面會儲存所有USB Devices的資訊。
Command:
less /proc/bus/usb/devices