uClinux下中斷驅(qū)動的I/O方式
發(fā)布時間:2007/8/30 0:00:00 訪問次數(shù):688
作者:華中科技大學(xué) 邱華 花駿 謝自美
摘要 在開發(fā)數(shù)據(jù)流設(shè)備的驅(qū)動程序時,采用中斷驅(qū)動的I/O方式結(jié)合緩沖區(qū)的使用,可以將數(shù)據(jù)的接收和系統(tǒng)調(diào)用read隔離開來,提高設(shè)備在系統(tǒng)中的運行效率。本文在討論uClinux下中斷處理程序和底半部分的開發(fā)的基礎(chǔ)上,以一種電信E1線路和以太網(wǎng)互聯(lián)設(shè)備上數(shù)據(jù)流設(shè)備為例,講述中斷驅(qū)動的I/O方式的驅(qū)動程序開發(fā)。主要過程是在中斷期間填充數(shù)據(jù)到緩沖塊,并用鏈表將緩沖塊串接起來;在系統(tǒng)調(diào)用read期間從緩沖塊取走數(shù)據(jù),再將緩沖塊放到自由鏈表中備用。涉及驅(qū)動程序中常用的阻塞式I/O和自旋鎖等技術(shù)應(yīng)用。通過使用上述多種技術(shù)開發(fā)的數(shù)據(jù)流設(shè)備驅(qū)動程序,確保系統(tǒng)穩(wěn)定高效的動作。
關(guān)鍵詞 uClinux 中斷驅(qū)動 I/O方式
引 言
在32位微處理器逐漸成為嵌入式系統(tǒng)主流的同時,嵌入式應(yīng)用也變得越來越復(fù)雜。許多嵌入式系統(tǒng)都不得不借助于專用的操作系統(tǒng)來支撐自己的應(yīng)用。uClinux作為類Unix操作系統(tǒng),繼承了Linux的各種優(yōu)秀的品質(zhì),成為首選的嵌入式系統(tǒng)的操作系統(tǒng)。
為自己的設(shè)備在操作系統(tǒng)下添加驅(qū)動程序,是嵌入式設(shè)計必不可少的部分。針對不同的設(shè)備類型,選擇合適的驅(qū)動程序的模式,同樣也是十分重要的。通常的設(shè)備驅(qū)動采用直接I/O的方式,如存儲器、看門狗等;而對于象網(wǎng)絡(luò)這樣的數(shù)據(jù)流設(shè)備的驅(qū)動,則應(yīng)該用到中斷機(jī)制。
本文以uClinux為背景,以一種數(shù)據(jù)流設(shè)備為目標(biāo),介紹中斷驅(qū)動的I/O設(shè)備驅(qū)動的開發(fā)。
1 應(yīng)用背景
1.1 硬件描述
本文介紹的驅(qū)動程序是應(yīng)用在一種電信E1線路和以太網(wǎng)互聯(lián)設(shè)備上的。它是旁路接收E1數(shù)據(jù)并將其發(fā)送到以太網(wǎng)的某一臺服務(wù)器上,在服務(wù)器上對E1的話路和信令時隙分析。
該設(shè)備中的處理器是采用三星公司出品的網(wǎng)絡(luò)型ARM處理器S3C4510B。E1線路接口采用Dallas半導(dǎo)體公司的專用El接口單元(LIU)芯片DS2148,它完成波形整理、時鐘恢復(fù)和HDB3解碼。DS2148將整理后的E1數(shù)據(jù)流送給一片Altera公司的Cyclone系列的FPGA(EPlC3T144C8),它將串行的E1數(shù)據(jù)流存入到FIFO,再通過ARM的32位外部總線將數(shù)據(jù)傳送給ARM。ARM將數(shù)據(jù)打包通過以太網(wǎng)發(fā)送到服務(wù)器上。圖l所示是本系統(tǒng)的硬件框圖。本文主要介紹接在ARM的外部總線上的FPGA,在uClinux下的驅(qū)動程序中斷機(jī)制的設(shè)計。
1.2硬件連接
S3C4510B處理器和FPGA的連接電路如圖2所示。
1.3 FPGA內(nèi)FIFO的結(jié)構(gòu)
在FPGA內(nèi)部設(shè)置了兩個FIFO。為了防止ARM和FPGA操作的沖突,ARM和FPGA對兩個FIFO操作采用乒乓方式,這樣ARM和FPGA就可以同時操作不同的FIFO,而不需要等待。FIFO的大小是4096位,能容納一個E1復(fù)幀的數(shù)據(jù)量。當(dāng)FPGA將一個FIFO填滿后,會用中斷的方式通知ARM來讀FIFO,同時FPGA會置內(nèi)部的F1FO狀態(tài)寄存器。FIFO)狀態(tài)寄存器命名為fpga_imf,是一個32位的寄存器,用其中某幾位置“l(fā)”,表示對應(yīng)的FIFO需要讀取。
2 軟件設(shè)計
中斷驅(qū)動的I/O是指,輸人數(shù)據(jù)在中斷期間被填充到緩沖區(qū)內(nèi),并由讀取該設(shè)備的進(jìn)程取走緩沖區(qū)內(nèi)的數(shù)據(jù);輸出緩沖區(qū)由寫設(shè)備的進(jìn)程填充,并在中斷期間取走數(shù)據(jù)。數(shù)據(jù)緩沖可以將數(shù)據(jù)的發(fā)送和接收與write及read系統(tǒng)調(diào)用分離開來,提高系統(tǒng)的整體性能。下面是uCllnux下的中斷程序的設(shè)計。
2.1 uClinux下的中斷程序
在uClinux系統(tǒng)中,通過調(diào)用下面這個函數(shù)向系統(tǒng)申請一個中斷通道(或中斷請求IRQ),并在處理完以后釋放掉它。
mt reqLIest_irq(unsigned int irq,void(*handler)(int,vold*,
struct pt_regs*),unsigned 10ng flags,const chat*device,
vold*dev_id);
void free_irq(unstgned int lrq,VOid*dev_id);
其中,irq是中斷號。在本系統(tǒng)中它對應(yīng)于S3C4510B的21個中斷源。這里用的是中斷源O。handler指向要安裝的中斷處理函數(shù)的指針。flags是一個與中斷管理有關(guān)的各種選項的字節(jié)掩碼。device傳遞給request_irq的字符串,在/proc/interrupts中用于顯示中斷的擁有者。dev_id指針用于共享的中斷信號線。函數(shù)的返回值為O時表示成功,或者返回一個負(fù)的錯誤碼。函數(shù)返回一EBUJSY通知另一個設(shè)備驅(qū)動程序已經(jīng)使用了要申請的中斷信號線。下面是FPGA的設(shè)備中斷申請函數(shù)。這個函數(shù)是在驅(qū)動中的fpga_open函數(shù)中被調(diào)用的。
int fpga_open(struct inode*inocle,stuct_file*file){
int result;
result=request_irq(FPGA_IRQ,δfpga_isr,SA_INTER-RUPT,″fpga″,NULL);
if(resuIt!=O){
printk(KERN_INFO”Can not register FPGA ISR!\n”);}else{
printk(KERN_INFO″FPGA ISR Register succ
作者:華中科技大學(xué) 邱華 花駿 謝自美
摘要 在開發(fā)數(shù)據(jù)流設(shè)備的驅(qū)動程序時,采用中斷驅(qū)動的I/O方式結(jié)合緩沖區(qū)的使用,可以將數(shù)據(jù)的接收和系統(tǒng)調(diào)用read隔離開來,提高設(shè)備在系統(tǒng)中的運行效率。本文在討論uClinux下中斷處理程序和底半部分的開發(fā)的基礎(chǔ)上,以一種電信E1線路和以太網(wǎng)互聯(lián)設(shè)備上數(shù)據(jù)流設(shè)備為例,講述中斷驅(qū)動的I/O方式的驅(qū)動程序開發(fā)。主要過程是在中斷期間填充數(shù)據(jù)到緩沖塊,并用鏈表將緩沖塊串接起來;在系統(tǒng)調(diào)用read期間從緩沖塊取走數(shù)據(jù),再將緩沖塊放到自由鏈表中備用。涉及驅(qū)動程序中常用的阻塞式I/O和自旋鎖等技術(shù)應(yīng)用。通過使用上述多種技術(shù)開發(fā)的數(shù)據(jù)流設(shè)備驅(qū)動程序,確保系統(tǒng)穩(wěn)定高效的動作。
關(guān)鍵詞 uClinux 中斷驅(qū)動 I/O方式
引 言
在32位微處理器逐漸成為嵌入式系統(tǒng)主流的同時,嵌入式應(yīng)用也變得越來越復(fù)雜。許多嵌入式系統(tǒng)都不得不借助于專用的操作系統(tǒng)來支撐自己的應(yīng)用。uClinux作為類Unix操作系統(tǒng),繼承了Linux的各種優(yōu)秀的品質(zhì),成為首選的嵌入式系統(tǒng)的操作系統(tǒng)。
為自己的設(shè)備在操作系統(tǒng)下添加驅(qū)動程序,是嵌入式設(shè)計必不可少的部分。針對不同的設(shè)備類型,選擇合適的驅(qū)動程序的模式,同樣也是十分重要的。通常的設(shè)備驅(qū)動采用直接I/O的方式,如存儲器、看門狗等;而對于象網(wǎng)絡(luò)這樣的數(shù)據(jù)流設(shè)備的驅(qū)動,則應(yīng)該用到中斷機(jī)制。
本文以uClinux為背景,以一種數(shù)據(jù)流設(shè)備為目標(biāo),介紹中斷驅(qū)動的I/O設(shè)備驅(qū)動的開發(fā)。
1 應(yīng)用背景
1.1 硬件描述
本文介紹的驅(qū)動程序是應(yīng)用在一種電信E1線路和以太網(wǎng)互聯(lián)設(shè)備上的。它是旁路接收E1數(shù)據(jù)并將其發(fā)送到以太網(wǎng)的某一臺服務(wù)器上,在服務(wù)器上對E1的話路和信令時隙分析。
該設(shè)備中的處理器是采用三星公司出品的網(wǎng)絡(luò)型ARM處理器S3C4510B。E1線路接口采用Dallas半導(dǎo)體公司的專用El接口單元(LIU)芯片DS2148,它完成波形整理、時鐘恢復(fù)和HDB3解碼。DS2148將整理后的E1數(shù)據(jù)流送給一片Altera公司的Cyclone系列的FPGA(EPlC3T144C8),它將串行的E1數(shù)據(jù)流存入到FIFO,再通過ARM的32位外部總線將數(shù)據(jù)傳送給ARM。ARM將數(shù)據(jù)打包通過以太網(wǎng)發(fā)送到服務(wù)器上。圖l所示是本系統(tǒng)的硬件框圖。本文主要介紹接在ARM的外部總線上的FPGA,在uClinux下的驅(qū)動程序中斷機(jī)制的設(shè)計。
1.2硬件連接
S3C4510B處理器和FPGA的連接電路如圖2所示。
1.3 FPGA內(nèi)FIFO的結(jié)構(gòu)
在FPGA內(nèi)部設(shè)置了兩個FIFO。為了防止ARM和FPGA操作的沖突,ARM和FPGA對兩個FIFO操作采用乒乓方式,這樣ARM和FPGA就可以同時操作不同的FIFO,而不需要等待。FIFO的大小是4096位,能容納一個E1復(fù)幀的數(shù)據(jù)量。當(dāng)FPGA將一個FIFO填滿后,會用中斷的方式通知ARM來讀FIFO,同時FPGA會置內(nèi)部的F1FO狀態(tài)寄存器。FIFO)狀態(tài)寄存器命名為fpga_imf,是一個32位的寄存器,用其中某幾位置“l(fā)”,表示對應(yīng)的FIFO需要讀取。
2 軟件設(shè)計
中斷驅(qū)動的I/O是指,輸人數(shù)據(jù)在中斷期間被填充到緩沖區(qū)內(nèi),并由讀取該設(shè)備的進(jìn)程取走緩沖區(qū)內(nèi)的數(shù)據(jù);輸出緩沖區(qū)由寫設(shè)備的進(jìn)程填充,并在中斷期間取走數(shù)據(jù)。數(shù)據(jù)緩沖可以將數(shù)據(jù)的發(fā)送和接收與write及read系統(tǒng)調(diào)用分離開來,提高系統(tǒng)的整體性能。下面是uCllnux下的中斷程序的設(shè)計。
2.1 uClinux下的中斷程序
在uClinux系統(tǒng)中,通過調(diào)用下面這個函數(shù)向系統(tǒng)申請一個中斷通道(或中斷請求IRQ),并在處理完以后釋放掉它。
mt reqLIest_irq(unsigned int irq,void(*handler)(int,vold*,
struct pt_regs*),unsigned 10ng flags,const chat*device,
vold*dev_id);
void free_irq(unstgned int lrq,VOid*dev_id);
其中,irq是中斷號。在本系統(tǒng)中它對應(yīng)于S3C4510B的21個中斷源。這里用的是中斷源O。handler指向要安裝的中斷處理函數(shù)的指針。flags是一個與中斷管理有關(guān)的各種選項的字節(jié)掩碼。device傳遞給request_irq的字符串,在/proc/interrupts中用于顯示中斷的擁有者。dev_id指針用于共享的中斷信號線。函數(shù)的返回值為O時表示成功,或者返回一個負(fù)的錯誤碼。函數(shù)返回一EBUJSY通知另一個設(shè)備驅(qū)動程序已經(jīng)使用了要申請的中斷信號線。下面是FPGA的設(shè)備中斷申請函數(shù)。這個函數(shù)是在驅(qū)動中的fpga_open函數(shù)中被調(diào)用的。
int fpga_open(struct inode*inocle,stuct_file*file){
int result;
result=request_irq(FPGA_IRQ,δfpga_isr,SA_INTER-RUPT,″fpga″,NULL);
if(resuIt!=O){
printk(KERN_INFO”Can not register FPGA ISR!\n”);}else{
printk(KERN_INFO″FPGA ISR Register succ
熱門點擊
- 嵌入式控制器的輸入端口設(shè)計分析
- 嵌入式系統(tǒng)中精確的衛(wèi)星定位授時與同步
- 基于裸機(jī)編程的實時系統(tǒng)
- PPCBoot在MPC8250上的移植方法
- 嵌入式指紋鎖的設(shè)計與實現(xiàn)
- 嵌入式微控制器MC68HC912B32背景調(diào)
- μC/OSII中的時鐘中斷技術(shù)研究
- 利用TriMedia注冊表和成員管理器實現(xiàn)B
- 嵌入式頻率計的設(shè)計
- uClinux下中斷驅(qū)動的I/O方式
推薦技術(shù)資料
- AMOLED顯示驅(qū)動芯片關(guān)鍵技
- CMOS圖像傳感器技術(shù)參數(shù)設(shè)計
- GB300 超級芯片應(yīng)用需求分
- 4NP 工藝NVIDIA Bl
- GB300 芯片、NVL72
- 首個最新高端芯片人工智能服務(wù)器
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究