2010年12月24日 星期五
[C]避免使用函式巨集
函式區集有一個非常嚴重的問題:
在定義巨集時,若參數出現不只一次,
就可能不只一次被計算到。
舉例來說:
#define isupper(c) ((c) >= 'A' && (c) <= 'Z')
2010年12月23日 星期四
[C]顯示系統時間以及記憶體資訊
有時會發生頻繁使用 script 而造成系統發生問題 (ex. kernel panic, memory dump)
此時在 debug 的時候如果想要印出一些資訊來觀察,
但又要避免使用 script,
就只好使用 c 來實作,
例如原本以 shell script
date 查詢目前系統時間,
cat /proc/meminfo 查詢目前 LowFree 使用量以及所有記憶體資訊,
就可以用上面的C程式範例來達到與 script 同樣的效果。
2010年12月21日 星期二
linux swap file
2970+0 records in
2970+0 records out
在 sd card 建立一個 2.9MB 的 swap
/ $ mkswap /mnt/sd/swapfile
Setting up swapspace version 1, size = 3035136 bytes
/ $ swapon /mnt/sd/swapfile
/ $ free
total used free shared buffers
Mem: 62724 44752 17972 0 20
Swap: 2960 0 2960
查看是否 swap 有配置成功
2010年12月19日 星期日
[路跑]2010 富邦台北馬拉松賽 (9 km)
這是我第一次報名馬拉松比賽,
前一天晚上借住小晏家,
大概1點多睡著,
4點半就起床了,
5點半搭上芝山站的捷運,
看到車廂內的人右腳都綁著晶片,
感覺真特別,
很像是另類的大型集會,
一來大家全都不認識,
但其實大家的目的地都一樣(台北市政府市民廣場);
尤其是到了市政府站的時候,
捷運的車廂都空了 XDD
開始有人拿起相機拍這擁擠的人潮,
感覺好像跨年才有的氣氛!
2010年12月13日 星期一
[Chrome瀏覽器] Auto-Translate and AutoCopy
以前在使用 Firefox 的時候,可以安裝 google toolbar,
然後在看某些英文文章時,
滑鼠移到某些單字上面就會出現翻譯,
但現在使用 Chrome,
在英文頁面時,只會問我要不要全文翻譯,
但是也沒辦法安裝 google toolbar (目前只支援 IE, Firefox),
所以我只好上網找看看有沒有其它 plugin 可用。
很幸運,有的!
Auto-Translate: 透過google translate幫你翻譯你所圈選的文字
AutoCopy: 自動複製選擇的文字
2010年12月11日 星期六
2010年12月10日 星期五
我的 i9000 8G Android 2.1 (ZWJG5) 更新至 Android 2.2 (ZWJP6 Froyo)
下面是我操作的步驟:
2010年11月30日 星期二
2010年11月26日 星期五
2010年11月21日 星期日
2010年11月2日 星期二
(Vim)modeline設定
Tab 將會用四個 space 取代;
但是在寫 Makefile 時,
通常必須要使用 Tab 做為開頭,
此時,
為了使用真正的 Tab, 而不想用 space 取代,
我們可以在 Makefile 開頭使用 modeline 設定,
其實,不同格式的檔案,都可以在它們的開頭加上 modeline 設定,
Vim 會去讀取這些控制參數。
ex. 以 Makefile 為例
最上方加上 # vim: set ts=4 sw=4 noet:
記得 # 與 vim 之間要有一個空格。
這樣子在 Makefile 裡面按 Tab 就不會被 space 取代了。
enjoy!
參考網址:http://edt1023.sayya.org/vim/node10.html
2010年11月1日 星期一
(設定開機順序)以wubi安裝Ubuntu
使用 wubi 安裝 Ubuntu 10.10
每次重新開機時
會先看到一個 Windows 多重開機選單
第一個選項(預設)為 Windows 系統
第二個才是 Ubuntu
想要設定預設從 Ubuntu 開機要話要怎麼做呢?
1. 登入 windows
2. 至「我的電腦」按右鍵->「內容」->「進階」
3. 然後至「啟動及修復」的項目內,應該可以看到一個下拉選單可以設定預設作業系統
4. 選擇第二個 Ubuntu 為預設,另外還可以選擇等待時間
然後就可以跟 windows 說掰掰了...XD
2010年10月31日 星期日
(聊天通訊)Ubuntu安裝Emesene與Skype
直接
sudo apt-get update
sudo apt-get install emesene 即可。
至於 Skype,我是參考 Tsung's blog 進行安裝。
http://plog.longwin.com.tw/news-unix/2007/01/11/ubuntu_skype_setup_2007
sudo vim /etc/apt/sources.list
加入此行 deb http://download.skype.com/linux/repos/debian/ stable non-free
sudo apt-get update
sudo apt-get install skype
2010年10月24日 星期日
(網頁瀏覽)安裝Google Chrome
下載google-chrome-beta_current_i386.deb (依個人喜好)
2. sudo dpkg -i google-chrome-beta_current_i386.deb
3. 安裝「Xmarks」 http://www.xmarks.com/
它可幫助我們在不同電腦、不同瀏覽器之間同步書籤。
可在 Xmarks 的「選項」功能設定自動同步,
這樣以後書籤的修改,隨時隨地就可以更新了。
2010年10月18日 星期一
[Terminal] LilyTerm
參考此網址:
http://lilyterm.luna.com.tw/en/download.html
然後修改 /etc/apt/sources.list 加入來源,
接下來,
apt-get update
apt-get install lilyterm 就可以安裝 testing version 的版本了。
2010年10月8日 星期五
2010年10月5日 星期二
王牌天神2-電影中蠻令人感動的對話
裡面寫了王牌天神2的一些感動人心的對話,
跟大家分享。
上帝與 Evan 老婆的對話:
如果有個人希望
自己可以更有耐心
你認為上帝會
直接賜予他耐心呢
還是給他一個
培養耐心的機會
2010年9月29日 星期三
OOM problem
之前在某些專案遇到 Out of memory 的問題,
可以試著察看 Committed_AS 這個欄位,
系統有可能在 OOM 的情況下,
砍掉任一支吃最多ram的程式,
進而導致系統不穩定。
2010年9月21日 星期二
2010年9月18日 星期六
2010年9月16日 星期四
XML資料儲存(關於&符號)
某個 Tag 儲存的內容含 & 符號,
會造成 xml 檔案的 Tag 錯亂。
錯亂的結果為 & 位置出現的前後內容都被斷開分別儲存,
但是 Tag 是完全不對稱的,
所以讀取這個錯亂的 xml 檔案就會出問題。
google 後發現某些符號對 XML 來說是有特殊意義的,
所以必須特別處理。
例如「&」符號如果要儲存,要先取代成「&」再儲存。
其它查到的符號如下:
< 應該取代成「<」
> 應該取代成「>」
& 應該取代成「&」
' 應該取代成「'」
" 應該取代成「"」
斷行符號 應該取代成「
」
2010年9月10日 星期五
2010年9月8日 星期三
單向鍊結串列
工作時雖然學到了一些 domain knowledge,
但是沒有了以前的資料結構、演算法做為工具,
寫程式總覺得很空虛,
所以有時間就稍微複習一下以前的資料結構,
範例可能寫得不好,
歡迎大家討論指教。
Linked list 算是最常用到的一個資料結果,就先拿它來做練習吧!
list.h
list.cpp
main.cpp
Makefile
執行結果:
$ list
->Constructor
Total: 9
Cassia Gary Louis Kanru Nami Cyt Jane Hank
Delete the node that name is "Cassia"
Total: 8
Gary Louis Kanru Nami Cyt Jane Hank
Delete the node that name is "Kanru"
Delete the node that name is "Gary"
Total: 6
Louis Nami Cyt Jane Hank
->Destructor
2010年9月5日 星期日
2010年9月2日 星期四
在Vim中將 source code 轉換成 html
在指令模式下輸入 :TOhtml,
然後存檔即可。
e.g.
程式檔名為 test.cpp
透過 :TOhtml 指令產生並存檔,html檔名為 test.cpp.html
而且原本在 Vim 裡面的 color scheme 以及 color 都會保存在 html 檔案內,
大家可以試看看。
2010年8月22日 星期日
2010年8月15日 星期日
2010年8月14日 星期六
(電影)神偷奶爸
今天心血來潮就找小晏一起到天母美麗華看電影,
因為時間很突然,
就剛好看了神偷奶爸(Despicable Me)這部卡通片,
果然一整個廳裡面幾乎都是爸媽帶著小朋友一起來看這部片的,
整部片其實都還蠻好笑的,
尤其是小小兵實在是很可愛,
目前也看了幾部電影的預告片,
其實都還蠻不錯,
之後9/10上映的惡靈古堡4應該也會去看,
畢竟是陪伴大學以及研究所時間的電影系列啊。
隨便一扯就離題了...
結論是神偷奶爸這部片子適合父母與小朋友們一起欣賞,
話說坐我後面的那位爸爸,
為什麼很多笑點你反而都笑得比你兒子還誇張呢? XDD
2010年8月12日 星期四
SVN basic command
記錄一下用過的指令與心得。
windows: TortoiseSVN
ubuntu: svn-workbench
Basic funcion:
Example.
1. check out
svn co http://192.168.0.4/svn/
2. commit
svn ci
3. update
svn up
4. add
svn add filename/directory
5. mv (修改檔名,但之前記錄還要留下)
svn mv filename new_filename
6. revert (還原這次的修改,回到前一版的檔案狀態)[未commit前可用]
svn revert file/directory
7. log
svn log
svn log -l 10 (顯示10筆最新log)
svn log -c 100 (顯示 revision 100 的 log)
svn log -v 100 (顯示 revision 100 的詳細 log)
8. rm
svn rm http://192.168.0.4/svn/src/driver
---------------------------------------
svn 檔案資訊
? 此檔案不存在 svn 裡
A 此次新增的檔案
C 此檔案已經有人改過,合併不成功,需人工介入
D 此次移除的檔案
M 此檔案有修改過
U 此檔案有被更新過
Reference:
1.
Tsung's Blog: SVN 基本指令教學
http://plog.longwin.com.tw/my_note-programming/2007/07/10/svn_tutorial_2007
Android, iOS 手機比較
因為之後會購買智慧型手機,把最近看上的幾支手機做個比較: | |||
手機 | Samsung i9000 | HTC Legend | Apple iphone3gs |
---|---|---|---|
平台 | Android 2.1 | Android 2.1 with HTC Sense | iOS 4 |
CPU | 1GHz | 600MHz | 600MHz |
RAM | 512M | 384M | 256M |
螢幕 | Super AMOLED 4" | AMOLED 3.2" | 3.5" |
相機 | 500萬畫素(無閃光燈,但有 VGA 視訊電話鏡頭) | 500萬畫素(具備自動對焦及閃光燈) | 300萬畫素 |
藍芽 | 支援藍牙 v 3.0 / USB v2.0 傳輸介面 | Bluetooth® 2.1,含 EDR (Enhanced Data Rate) | Bluetooth 2.1 + EDR 無線技術 |
數據機 (Tethering) | 可透過 DLNA 技術連接內部裝置,進行跨平台傳輸 | 網際網路共用,透過 USB | 應該可以,不確定 |
2010年7月31日 星期六
gVim 7.3b lang en error
目前解決的方式是修改 _vimrc
將 lang mes en 移到檔案的最開頭
且後面不再設定 lang en
目前修改後看起來是正常的
2010年7月13日 星期二
First Makefile example
CFLAGS= -Wall -O2 -march=armv4 -mtune=arm9tdmi
USER_SRC=/usr/src/arm-linux-2.6
INC+=-I$(USER_SRC)
%.o: %.c (表示利用 pattern rule 來做一些自訂的內隱規則)
$(CC) $(CFLAGS) -c -o $@ $< $(INC)
% : 表示所有相對於後面先決條件的檔名的意思,
不是*,
因為它有一對一的關係,
例如 hello.o 就要找 hello.c;
表示所有遇到 .o 的 target,去找相對應的 .c,
如果找不到就不做下去了
$@ : 目前的目標項目名稱
$< : 代表目前的相依性項目
$*: 代表目前的相依性項目,不過不含副檔名
2010年7月7日 星期三
(輸入法)Ubuntu 安裝無蝦米
sudo apt-get install gcin
sudo im-switch -s gcin
wget http://edt1023.sayya.org/gcin/noseeing-12.tar.gz
tar zxvf noseeing-12.tar.gz
mkdir ~/.gcin
mv noseeing.gtab ~/.gcin
2010.10.31 新增
1. 要注意,上述的動作請用一般user帳號進行操作,不要切換至root
2. 如果切換至root, 有可能發生按右鍵「設定gcin」,會無法設定,工作列上的 gcin icon 會消失
2010年6月16日 星期三
First Qt program - Hello
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]
網址: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
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
平常在實作中,常使用無窮迴圈做 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日 星期日
2010年5月17日 星期一
2010年5月3日 星期一
FIFOs
引用
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
cscope -bqkR
然後可以至 vim 去載入 cscope.out,
R 表示會搜尋子目錄
如果專案很大,或是涉及到 linux kernel 時,
我不曉得 cscope 處理的時間會不會很久;
同事是建議可以用 eclipse,
而且 IDE 的操作據說也很方便,
我不曉得 eclipse 遇到相同的情況是怎麼去建立索引的,
不過 trace code 時必須快速在 function 間跳來跳去,
所以一個好的工具的確是很重要。
青菜蘿蔔每個人各有喜好,
目前我的專案都還不是很大,
所以 vim + cscope + taglist 已足夠應付我大部份需求了。
8051 Timer
主要的控制流程為:
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模擬波形、...等
2010年4月12日 星期一
GPIO Setting
在產品上很常看到 GPIO 的一些應用,
以及與 Main chip 的 i2c 溝通。
在設定 GPIO 的 Pin define 時,
我們必須指定這支 pin 的用途(bi-directional, push-pull, input only, open-drain);
雖然是念資工的,
但是電路圖其實我也只看得懂大概,
示波器也只會量測波形的 high / low 而已,
以前學校的老師應該會覺得很難過吧 ^^"
目前我也只用到 input only, bi-directional 的設定;
但是一直不了解 push-pull, open-drain 的差別,
google 找到的說明感覺比較偏硬體的解釋,
寫軟體的人好像很難懂(我是說我自己...XD),
所以如果有哪位網友有簡潔的方式可以教會我的,
還煩請分享一下。
Ubuntu 與 Debian 環境下的 eclipse 有些按鍵無法動作
但是因為最近同事在推廣 eclipse 的好用之處,
所以我就裝起來試試看,
結果在創建專案時,
遇到 Next / Cancel / Finish 的按鍵沒有作用的現象;
上網 google 後,
參考 http://softsmith.blogspot.com/2010/02/eclipse-button-ubuntu.html (軟體工匠) 的教學,
在 Ubuntu 上面已經 ok 了,
(後來發現把Debian重開後,就正常了!)
所以在公司還是繼續用 Vim ^_^
筆記一下(解法):
#!/bin/sh
export GDK_NATIVE_WINDOWS=true
./eclipse
2010年3月27日 星期六
8051 review
Memory Structure
● ROM
內建 4K, 外接最大 64K(含內建4K)
有一個角位要指定是否要使用外部記憶體(接高準位或接地)
CPU Reset後,程式將從程式記憶體0000H位置開始執行,如沒遇到跳躍指令,則沿著程式記憶體順序執行
● RAM
資料記憶體與程式記憶體是分開的獨立區塊,因此,兩者的位址並不衝突
內建128bytes, 外接最大 64K
0000H~007FH的128bytes:可直接定址或間接定址
● 暫存器庫
0000H~001FH的32個位址為暫存器庫(Register Bank)
0000H~0007H為 RB0
0008H~000FH為 RB1
0010H~0017H為 RB2
0018H~001FH為 RB3
----------------------------------------------------------------------------------------------------------
每個暫存器庫都包含 R0,R1, ..., R7等8個暫存器,而同一時間只能使用其中一組暫存器庫
----------------------------------------------------------------------------------------------------------
暫存器庫的切換,可以PSW(Program Status Word)的RS1, RS0來決定
----------------------------------------------------------------------------------------------------------
CPU Reset, 系統的堆疊指標SP指向07H位址,所以資料存入堆疊時,將從08H開始。
為了避免衝突或不必要的錯誤,通常會把堆疊指標移到30H以後的位址
----------------------------------------------------------------------------------------------------------
● 可位元定址
0020H~002FH的16個位元組為可位元定址區, 通常存取時是byte為單位
----------------------------------------------------------------------------------------------------------
可位元定址則是指定存取一個位元(bit)
----------------------------------------------------------------------------------------------------------
● 一般資料與堆疊區
0030H~007FH的80個位元組位址為一般資料存取及堆疊區
----------------------------------------------------------------------------------------------------------
由於 CPU Reset 後,堆疊指標指向07H,為了確保資料安全性與程式執行正確,
最好能將堆疊指標移至本區
----------------------------------------------------------------------------------------------------------
● 0080H~00FFH的128bytes為SFR(Special Fucntion Register),可直接定址
這些位置的宣告放在 Keil C 提供的 reg51.h header file (不用特別去記)
----------------------------------------------------------------------------------------------------------
SP(Stack Pointer register), First In Last Out
PCON(Power Control register): 設定CPU電源模式
TCON(Timer/Counter Control register)
TMOD(Timer/Counter Mode Control register)
TL0,TH0為第一組計時/計數器(Timer 0)的計量暫存器
SCON(Serial Port Control register)
IE(Interrupt Enable register)
IP(Interrupt Priority register)
Timing analysis and reset
Clock 是整個系統運作的依據
ex. 8051 定義 clock 為 0 ~ 24 MHz, 表示只要不超過 24 MHz 都是 ok
至於要不要使用最高的頻率,需視程式複雜性而定
機械週期:含幾個 clock pluse (ex. 1 machine cycle contains 12 clock pluse)
12MHz -> 一個clock pluse 週期為 1/12 微秒, 因此1個 machine cycle 含12個 clock pluse = 12 x 1/12 = 1微秒
在8051的所有指令中,只有乘法與除法需要4個machine cycle, 其餘指令都能在1~2個machine cycle 完成
8051 reset: 將高準位加到 reset 接腳超過2微秒
Develop process and tools
「硬體設計」與「軟體設計」並行
硬體設計 target board
軟體設計,然後應用實體模擬器(In-Circuit Emulator, ICE),載入可執行碼,然後在target board進行實體模擬
如果軟、硬體設計無誤,可以實際燒錄
tools: Keil C 的整合開發環境
introduce Keil C
常數:在指定記憶體位置,放置固定不變的資料
變數:在指定記憶體位置裡的資料是可變的
Data Type
char, 8 bit, -128~+127
unsigned char, 8 bit, 0~255
enum, 8/16 bit, -128~127/-32768~32767
short, 16, -32768~32767
unsigned short, 16, 0 ~ 65535
int, 16, -32768~32767
unsigned int, 16, 0~65535
long, 32,
unsigned long, 32,
double, 32
void, 0
8051 Data type
bit, sbit, sfr, sfr16, idata(間接定址)
bit, 1 bit, 0/1 --> 0x20~0x2f之間的位址
sbit, 1 bit, 0/1 --> 0x20~0x2f之間的可位視定址記憶體,或 0x80~0xff的SFR
ex.
char bdata scan;
sbit input_0 = scan^0; (表示第0位元)
ex.
sfr P0=0x80;
sbit P0_0 = P0^0;
sfr, 8 bit, 0~255
sfr16, 16 bit, 0~65535
記憶體形式
code -> 程式記憶體 -> 0x0000~0xffff(64k)
data -> 直接定址的內部資料記憶體 -> 0x00~0x7f (128)
idata -> 間接定址的內部資料記憶體 -> 0x80~0xff (128)
bdata -> 位元定址的內部資料記憶體 -> 0x20~0x2f(16)
void 中斷副程式名稱(void) interrupt 中斷編號 using 暫存器庫
8051 只有使用 0 ~ 4 的中斷編號
0: INT0
1: Timer 0
認識中斷
好端端的幹嘛中斷?其實是為了提升效率!
8051提供5個中斷:外部中斷INT0, INT1, Timer0, Timer1,以及串列埠中斷UART(RI/TI)
外部中斷:TCON, IT0/IT1, IE, IP
計時計數器中斷:若是計時器中斷,CPU將計數內部的時鐘脈波,而提出內部中斷
若是計數器,CPU將計數外部的脈波,而提出內部中斷