2010年6月16日 星期三

First Qt program - Hello

0 意見
程式碼如下:(參考良葛格Qt4範例)


qmake -project: 產生 .pro 專案檔
qmake: 產生 Makefile
make

然後切換至 debug 目錄
執行 hello

執行結果:


Learning Materials:
Tutorials
http://doc.qt.nokia.com/4.6/tutorials.html

How to Learn Qt
http://doc.trolltech.com/4.6/how-to-learn-qt.html

All Overviews and HOWTOs
http://doc.trolltech.com/4.6/overviews.html

API References
http://doc.trolltech.com/4.6/index.html

Qt 環境配置 [Windows]

0 意見
1. 下載 MinGW - Minimalist GNU for Windows
網址:http://sourceforge.net/projects/mingw/files/

安裝下列三者:
a. MinGW base tools
b. g++ compiler
c. MinGW Make

設定環境變數:
C:\MinGW\bin

MinGW base tools 包含下列項目:


2. 下載 QT Framework
網址:http://qt.nokia.com/downloads/


設定環境變數:
C:\Qt\4.6.3\bin

執行開始功能表中 Qt 資料夾
(預設名稱為 "Qt by Nokia v4.6.3 (OpenSource)")裡的
"Qt 4.6.3 (Build Debug Libraries)",
以建立 Debug Library。
(這個過程可能需要2個小時以上)


build成功後,如下圖:



相關連結:
http://program-lover.blogspot.com/2008/09/installing-qt-on-windows.html

2010年6月8日 星期二

message queue

0 意見
1. msgQ很像fifo, 但是更有效率。
2. 讓兩個不相關的程序可以傳送資料。
3. 可免除同步化和擱置的問題。

sys/msg.h
sys/types.h
sys/ipc.h

int msgctl(int id, int command, struct msgid_ds *buf):
控制函數 (IPC_STAT, IPC_SET, IPC_RMID)

int msgget(key_t, int msgflg):
產生和存取 msgQ (IPC_CREAT)

int msgrcv(int id, void *msg_ptr, size_t sz, long int msgtype, int msgflg):
從 msgQ 取出訊息

int msgsnd(int id, const void*msg_ptr, size_t sz, int msgflg):
增加一個 msg 至 queue
struct msg {
long int type;
/*the data you wish to transfer*/
char data[MAX_SIZE];
}
第三個參數 sz, 是 msg_ptr 的大小, 但是不包含第一個 long int
第四個參數 msgflg 如果含 IPC_NOWAIT, 則會立即回覆

舉例來說,
如果伺服器與客戶端要溝通,雙方可以各有一個 msgQ,
而如果有很多客戶端,如果使用大量的 msgQ,可能會較浪費;
此時可以試著將第一個 type 欄位拿來記錄客戶端的 ID,
用來區別要送到哪個客戶端;
而每個客戶端也可以抓取屬於他們自己的訊息,
而不會動到其它客戶端的訊息。

socket programming - select

0 意見
socket介面其實很像pipe,使用方式很雷同,但是還可以跨越網路通訊。

平常在實作中,常使用無窮迴圈做 busy wait,然後掃描是否有需要處理的事件;
但是這樣的方式較耗費CPU時間。

sys/types.h
sys/time.h
現在,可以試著使用 select() 系統呼叫,
可以同時處理很多檔案描述子(就像是很多客戶端),
但是沒有任何輸入/輸出時,
是處於擱置狀態。

select() 在 fd_set 的結構上運作,
我使用過的例子是設定 socket 為 Non-Block 模式,
然後 select 設定 Timeout 時間,
如果 time out 時間過了仍然沒有任何事件發生需要處理,
select() 也會回覆。

select() 回傳 -1 代表失敗,並會設定errno說明錯誤。
藉由 timeout 的管理,如果發生 time out,select() 會回傳0。

不多說,來看個例子吧!

2010年5月30日 星期日

天空

0 意見

星期五早上一如往常的走路上班,
但是那天剛好身上帶著相機,
在走路的同時,看著藍天白雲,
心情頓時變得很好,
如果能躺在一望無際的草原或沙灘上,
然後盡情的欣賞無邊無際的天空,
該有多好呀!
當天拍了一張照片跟大家分享!

2010年5月17日 星期一

三芝一日遊

0 意見
寶貝與學妹~

我家寶貝~長髮時有人說像蕭亞軒,短髮有人說像賴雅妍...XD

我與小晏


三芝~淺水灣~

雙連-三五水餃

0 意見


捷運雙連站2號出口,出來後往左手邊走,大約2分鐘就到了,就在麵包店旁邊。
每次去都是吃10個水餃(50元),有時再搭一碗酸辣湯(20元),就很滿足囉。

2010年5月3日 星期一

FIFOs

0 意見
利用FIFO讓兩個不相關的程式也可以交換資料。

引用
sys/types.h
sys/stat.h

所謂FIFO其實就是檔案,用open, close分別開啟與關閉一個FIFO。
open 必須傳入FIFO的路徑名稱。

FIFO 有 Block, NonBlock 模式可供選擇,依個人需求。

☆ 在 linux 下,process被擱置時是不會消耗 CPU 資源,所以使用 FIFO 時,這樣的同步方式是非常有效率的。

可以試著寫一個 daemon 與 client 利用 FIFO 溝通,
分為 write 與 read (request),
但是 read 的時候,
每個 client 最好能有自己的 FIFO,
以免資料被另一個 client 讀取造成錯誤(NonBlock模式下),
當然如果是 Block 模式就沒有此問題了。

由於 i2c bus 是單工的,
同一時間處理一個 command,
如果有很多 device 要做 i2c read/write,
也可以考慮統一把 i2c 讀寫的動作丟給一個專門負責的 daemon,
一來可以統一介面好維護,
再來是 i2c 的讀寫可以保證同一時間只處理一個,
不用擔心 i2c 仲裁的問題。

2010年4月14日 星期三

cscope

0 意見
find . -name "*.h" -o -name "*.c" -o -name "*.cpp" > cscope.files
cscope -bqkR

然後可以至 vim 去載入 cscope.out,
R 表示會搜尋子目錄

如果專案很大,或是涉及到 linux kernel 時,
我不曉得 cscope 處理的時間會不會很久;
同事是建議可以用 eclipse,
而且 IDE 的操作據說也很方便,
我不曉得 eclipse 遇到相同的情況是怎麼去建立索引的,
不過 trace code 時必須快速在 function 間跳來跳去,
所以一個好的工具的確是很重要。

青菜蘿蔔每個人各有喜好,
目前我的專案都還不是很大,
所以 vim + cscope + taglist 已足夠應付我大部份需求了。

8051 Timer

0 意見
8051的計時計數器應用我只使用過計量暫存器,
主要的控制流程為:
1. 初始化 Timer 的相關設定,設定 counter 初始值;
我使用的是 Mode 2 的工作模式,所以 counter 的最大值為256,
當我把 TH0, TL0 都設為 255 時,
表示每個 CPU Cycle 都會產生 Interrupt;
當知道每個 CPU Cycle 的時間後,
其實就可以推算到底 TH0, TL0 要設為多少(取決於你要多久後發生中斷)

2. 在 timer0 中斷副程式中,
還可以維護另一個 counter 變數(軟體控制),
上述1.是硬體的timer,
兩層 counter 的機制,
可以用來使一些應用,
ex. 馬達控制、GPIO模擬波形、...等