王巧玲,高 杰,陳婭荔
?
基于linux操作系統(tǒng)的多串口驅(qū)動研究
*王巧玲1,高 杰2,陳婭荔1
(1.井岡山大學(xué)電子與信息工程學(xué)院,江西,吉安 343009 2.南昌大學(xué)共青學(xué)院信息工程系,江西,共青城 332020)
在介紹基于linux操作系統(tǒng)的多串口驅(qū)動設(shè)計理論基礎(chǔ)上, 重點研究對多串口編程的技術(shù),實現(xiàn)基于tty的核心設(shè)計,可作為實現(xiàn)串口終端設(shè)備集中管理、實時數(shù)據(jù)采集的服務(wù)器主板應(yīng)用。其特點是可以采用ARM平臺,但完全兼容X86平臺,用戶原來在X86 平臺下編寫linux操作系統(tǒng)的多串口驅(qū)動的程序只需做一次重新編譯即可實現(xiàn)移植,達(dá)到基于Linux操作系統(tǒng)的多串口驅(qū)動實時通訊的目的。
linux操作系統(tǒng);多串口驅(qū)動;tty核心
在Linux操作系統(tǒng)中串口的編程技術(shù)和DOS、Windows系統(tǒng)下的方法有所不同。本文較為詳細(xì)的敘述了在Linux操作系統(tǒng)中串口的驅(qū)動編程技術(shù)。重點研究多串口驅(qū)動通訊,本驅(qū)動創(chuàng)新點可以通過自動探測的方法測出當(dāng)前是什么類型的主板,可以讓bios往中斷狀態(tài)寄存器或其他保留的寄存器位中寫一個標(biāo)記即可,用于唯一標(biāo)記每一類主板。串口驅(qū)動主要技術(shù)是在tty核心[1]的基礎(chǔ)上實現(xiàn)的,需要同時驅(qū)動最多32個串口,板上的串口共用中斷號,板上串口基地址連續(xù)。因此,通過合理的結(jié)構(gòu)體設(shè)計可以方便的實現(xiàn)。
串口驅(qū)動本質(zhì)上也是字符設(shè)備驅(qū)動[2-3],只是內(nèi)核根據(jù)其特殊的數(shù)據(jù)傳輸過程進(jìn)行封裝,將其文件操作(file_operation)封裝到tty核心(tty_io.c)中,由tty核心提供接口給應(yīng)用程序調(diào)用,tty核心還提供接口給線路規(guī)程和驅(qū)動程序使用;因此,在寫串口驅(qū)動時只需要調(diào)用tty核心提供的接口,并傳入驅(qū)動的處理函數(shù)(tty_operations)。
向tty核心注冊驅(qū)動時,tty核心便會為該驅(qū)動分配設(shè)備號,并注冊文件操作函數(shù)(file_operations)。而在tty核心中各文件操作函數(shù)會調(diào)用驅(qū)動傳入的處理函數(shù),可見真正實現(xiàn)應(yīng)用程序需求的函數(shù)還是驅(qū)動程序,tty核心只是實現(xiàn)一個中轉(zhuǎn)的過程,但tty核心中封裝了很多串口驅(qū)動實現(xiàn)的通用函數(shù),大大簡化了串口驅(qū)動的編寫。
編寫串口驅(qū)動主要分以下幾個步驟:
int tty_register_driver(struct tty_driver *driver);在注冊前要對tty_driver進(jìn)行賦值,在tty_driver中指定設(shè)備號、串口個數(shù)、操作函數(shù)等信息。
int tty_unregister_driver(struct tty_driver *driver);釋放設(shè)備驅(qū)動。
設(shè)置驅(qū)動提供的串口操作函數(shù),注冊時提供給tty核心使用,串口操作函數(shù)是在tty_driver中設(shè)置的。
中斷處理函數(shù)是串口通訊的核心,驅(qū)動對串口進(jìn)行讀、寫都是通過中斷來實現(xiàn)的;串口內(nèi)部有2個64B的FIFO(TX和RX),分別用于發(fā)送和接收數(shù)據(jù)。
圖1 串口數(shù)據(jù)發(fā)送
串口發(fā)送數(shù)據(jù)過程如圖1所示,一般串口通訊都是基于異步協(xié)議的,因此數(shù)據(jù)是以字節(jié)為單位傳輸?shù)模?dāng)驅(qū)動將一個字節(jié)數(shù)據(jù)寫到串口時,會先通過THR寄存器存入RX FIFO,然后通過TSR將數(shù)據(jù)發(fā)送出去,每一個數(shù)據(jù)的發(fā)送時間是16個時鐘周期。當(dāng)RX FIFO里的數(shù)據(jù)低于某一TRIGGER值或為空時,就會觸發(fā)中斷,并將LSR寄存器的bit[0]和ISR的bit[1]置1,中斷處理程序根據(jù)這些值發(fā)送數(shù)據(jù)到串口。RX FIFO的TRIGGER值由FCR寄存器的bit[6,7]設(shè)置。
串口接收數(shù)據(jù)過程如圖2所示,和發(fā)送數(shù)據(jù)一樣,串口接收數(shù)據(jù)也是以字節(jié)為單位的,串口通過RSR寄存器接收數(shù)據(jù),然后會將數(shù)據(jù)存入TX FIFO,驅(qū)動程序同樣以字節(jié)為單位從TX FIFO中取數(shù)據(jù)。當(dāng)TX FIFO中數(shù)據(jù)高于某個TRIGGER值就會觸發(fā)中斷,并將LSR的bit[5]和ISR的bit[2]置1,中斷處理程序根據(jù)這些值從串口TX FIFO讀取數(shù)據(jù)。TX FIFO的TRIGGER值由FCR寄存器的bit[4,5]設(shè)置。
當(dāng)啟用了自動RTS硬件流控制時(EFR bit[6]=1 MCR bit[1]=1),當(dāng)TX FIFO的數(shù)據(jù)大于56時,串口會自動通知發(fā)送端停止發(fā)送數(shù)據(jù);當(dāng)TX FIFO數(shù)據(jù)小于8時,串口會自動通知發(fā)送端繼續(xù)發(fā)送數(shù)據(jù)。使用RTS/CTS(請求發(fā)送/清除發(fā)送)流控制時,應(yīng)將通訊兩端的RTS、CTS線對應(yīng)相連。
圖2 串口數(shù)據(jù)接收
多串口驅(qū)動基于tty核心進(jìn)行的,主要設(shè)計以下幾個方面:
這里的與內(nèi)核通訊實際上是通過tty核心來實現(xiàn)的,通過向tty核心注冊驅(qū)動告訴內(nèi)核應(yīng)該處理哪個驅(qū)動和應(yīng)該使用哪些處理函數(shù),注冊函數(shù)如下:
int tty_register_driver(struct tty_driver *driver);
字符設(shè)備驅(qū)動與應(yīng)用程序通訊是通過文件操作file_operations來實現(xiàn)的,而文件操作是在tty核心中實現(xiàn)的。
可見,應(yīng)用程序雖然是調(diào)用tty核心的文件操作函數(shù),但本質(zhì)上還是驅(qū)動來實現(xiàn)的。因此,驅(qū)動中可以根據(jù)需要實現(xiàn)與應(yīng)用程序通訊的函數(shù),本人在多串口驅(qū)動中實現(xiàn)了open、release、write、ioctl等函數(shù)。
驅(qū)動與硬件通訊就是操作寄存器,在串口芯片的datasheet中有詳細(xì)的說明,多的串口芯片是ST16C654,這里介紹幾個驅(qū)動中常用的寄存器。
RHR:接收數(shù)據(jù)寄存器;
THR:發(fā)送數(shù)據(jù)寄存器;
IER:中斷使能寄存器,其中bit[0-3]分別對應(yīng)4中中斷;
ISR:中斷狀態(tài)寄存器,其中bit[1,2]分別代表讀、寫中斷;
FCR:FIFO控制寄存器,使能FIFO和TRIGGER等級都在這里設(shè)置;
LCR:線路控制寄存器,設(shè)置線路規(guī)程,包括:數(shù)據(jù)位,校驗位,停止位等;
MCR:MODEM控制寄存器,其中bit[0,1]用于使能硬件流控制輸出;
LSR:線路狀態(tài)寄存器,其中bit[0]標(biāo)記RHR是否有數(shù)據(jù),
bit[5]標(biāo)記THR是否為空;
DLL、DLM:波特率除數(shù)寄存器,用于設(shè)置波特率。
這里的數(shù)據(jù)結(jié)構(gòu)不是指上一節(jié)的數(shù)據(jù)結(jié)構(gòu),這里是指串口驅(qū)動內(nèi)部的數(shù)據(jù)組織方式,這些數(shù)據(jù)結(jié)構(gòu)貫穿整個串口驅(qū)動程序,合理的設(shè)計數(shù)據(jù)結(jié)構(gòu)和組織方式可以有效地提高驅(qū)動的效率,下面分別介紹內(nèi)核和多串口驅(qū)動的數(shù)據(jù)結(jié)構(gòu)設(shè)計和組織方式,并進(jìn)行比較和分析。
數(shù)據(jù)結(jié)構(gòu)和組織方式的設(shè)計要注意以下幾個方面:
(a)數(shù)據(jù)結(jié)構(gòu)要能表示串口的所有信息以及運(yùn)行過程中串口的屬性;
(b)open時要能根據(jù)數(shù)據(jù)結(jié)構(gòu)來判斷是哪一個串口,因為有可能一塊板上有很多串口;
(c)中斷處理函數(shù)中也需要能通過數(shù)據(jù)結(jié)構(gòu)來判斷是哪個串口產(chǎn)生的中斷。
內(nèi)核串口驅(qū)動主要是通過以下2個數(shù)組來實現(xiàn)的。
struct serial_state rs_table[64];
這是一個串口基本信息結(jié)構(gòu)體,結(jié)構(gòu)體中包括波特率、基地址、中斷號等信息,在定義時就已經(jīng)對其進(jìn)行了初始化,初始化是通過宏SERIAL_PORT_DFNS來實現(xiàn)的,這個宏初始化了每個串口的基地址、中斷號,這個數(shù)組中的初始值就是默認(rèn)情況下的ttySn的值,所以可以根據(jù)主板的串口信息修改該宏的值,實現(xiàn)驅(qū)動主板上各串口。
struct async_struct *IRQ_ports[225];
這是一個數(shù)組指針,數(shù)組大小為225,對應(yīng)于每個中斷號,數(shù)組每個元素指向所有共享該中斷號的串口信息結(jié)構(gòu)體鏈表;async_struct是一個包含一個已打開串口所有信息的結(jié)構(gòu)體,當(dāng)打開一個串口時,會動態(tài)創(chuàng)建一個串口信息結(jié)構(gòu)體async_struct,然后根據(jù)打開設(shè)備的基本信息serial_state對這個結(jié)構(gòu)體進(jìn)行初始化,最后將其鏈入相應(yīng)IRQ鏈表的頭。
低版本內(nèi)核串口驅(qū)動的數(shù)據(jù)結(jié)構(gòu)模型如圖3所示,在打開設(shè)備時,通過打開設(shè)備的次設(shè)備號和驅(qū)動的起始次設(shè)備號計算出是第幾個串口,從而得到串口基本信息serial_state;在中斷處理程序中,可以直接根據(jù)中斷號獲取所有使用該中斷號的串口信息,然后對所有串口進(jìn)行處理。
圖3 低版本內(nèi)核數(shù)據(jù)結(jié)構(gòu)模型
高版本內(nèi)核串口驅(qū)動的設(shè)計思想和低版本內(nèi)核類似,只是在其基礎(chǔ)上進(jìn)行了一些改進(jìn),以8250串口驅(qū)動為例說明,主要有以下幾個數(shù)據(jù)結(jié)構(gòu):
struct old_serial_port old_serial_port[64];
串口基本信息結(jié)構(gòu)體,類似于2.4內(nèi)核的serial_state結(jié)構(gòu)體,由宏SERIAL_PORT_DFNS初始化。
struct uart_8250_port serial8250_ports[64];
已打開串口信息結(jié)構(gòu)體,類似于低版本內(nèi)核的async_struct結(jié)構(gòu)體,與低版本內(nèi)核的不同之處在于這里的結(jié)構(gòu)體是靜態(tài)分配的。
struct irq_info irq_lists[225];
這是一個數(shù)組,類似于低版本內(nèi)核的IRQ_ports,數(shù)組的內(nèi)容為包含一個list_head類型變量的結(jié)構(gòu)體,用于指向相同中斷號的所有串口的鏈表頭。
內(nèi)核串口驅(qū)動的數(shù)據(jù)結(jié)構(gòu)設(shè)計是一種通用的設(shè)計,目的在于能應(yīng)用于各種不同的主板,而多串口驅(qū)動的數(shù)據(jù)結(jié)構(gòu)完全是針對104串口系列主板設(shè)計的,是根據(jù)多的特性設(shè)計結(jié)構(gòu)體。
由于每塊多主板的所有串口是有一些共用屬性的,所以設(shè)計一個主板信息結(jié)構(gòu)體,這個結(jié)構(gòu)體每塊主板一個,主板各個串口信息都可以通過此結(jié)構(gòu)體來設(shè)置,結(jié)構(gòu)體定義如下:
struct evocdrv_brdconf {/*每塊板的信息*/
int board_type;/*主板類型1-1048COM 2-COMMON*/
int flags;/*UART_CLEAR_FIFO | UART_USE_ FIFO |UART_HAS_EFR*
int ports;/*串口個數(shù)*/
int irq;/*中斷號,一般為共享中斷*/
int irq_type;/*0:串口0-7共享中斷(M1=on);1--0-3共享,4-7共享(M1=off)*/
int vector;/*中斷狀態(tài)寄存器基地址,4塊板16個端口,板上所有串口共用*/
int vector_mask;/*中斷狀態(tài)*/
int uart_type;/*芯片類型*/
char uart_name[20];/*芯片名字*/
int ioaddr;/*每個串口的端口基地址,由sw1設(shè)置(p14)*/
int baud_base;/*串口的波特率基數(shù)quot=baud_ base/baud*/
int max_baud;/*最大波特率*/};
除了主板信息結(jié)構(gòu)體之外,還定義了一個大小為32的串口信息結(jié)構(gòu)體數(shù)組,用于保存每個串口的信息,串口信息數(shù)組在初始化時根據(jù)其主板的信息設(shè)置;由于多主板的特殊性,如:主板上的所有串口是共用中斷號的,串口的基地址是連續(xù)的等等,所以可以把這些共用的屬性設(shè)置在主板信息結(jié)構(gòu)體中。串口信息數(shù)組是這樣設(shè)計的,默認(rèn)每塊主板8個串口,若主板串口個數(shù)小于8則數(shù)組的相應(yīng)位為空值。
打開串口時,根據(jù)設(shè)備的次設(shè)備號和驅(qū)動的次設(shè)備號起始值,計算出打開的是第幾個串口,根據(jù)這個就可以直接從串口信息數(shù)組中獲取串口信息;在中斷處理程序中,這里并沒有像內(nèi)核串口驅(qū)動中的中斷指針數(shù)組,但由于每塊板上的串口中斷號是相同的,所以只需要在發(fā)生中斷時判斷是哪塊板上的串口產(chǎn)生的,然后對該板上的串口進(jìn)行一一判斷并處理;在請求中斷號時,將板上第一個串口信息結(jié)構(gòu)體作為參數(shù)傳入,然后在中斷處理函數(shù)中根據(jù)串口信息數(shù)組的第0,8,16,24個元素來判斷屬于哪塊主板。
串口驅(qū)動中要實現(xiàn)的函數(shù)有很多,包括與tty核心的通訊函數(shù),與應(yīng)用程序的通訊函數(shù)以及中斷處理函數(shù),主要函數(shù)如下:
struct tty_operations evocdrv_ops = {
.open = evocdrv_open,/*打開串口*/
.close = evocdrv_close,/*關(guān)閉串口*/
.write = evocdrv_write,/*寫串口*/
.put_char = evocdrv_put_char,/*寫一個字符到串口*/
.flush_chars = evocdrv_flush_chars,/*發(fā)送寫緩沖區(qū)中數(shù)據(jù)*/
.write_room = evocdrv_write_room,/*獲取寫緩沖區(qū)的可用空間*/
.chars_in_buffer = evocdrv_chars_in_buffer,/*獲取寫緩沖區(qū)數(shù)據(jù)大小*/
.flush_buffer = evocdrv_flush_buffer,/*清空寫緩沖區(qū)*/
.ioctl = evocdrv_ioctl,/*ioctl*/
.throttle = evocdrv_throttle,/*通知串口不要發(fā)送數(shù)據(jù)*/
.unthrottle = evocdrv_unthrottle,/*通知串口恢復(fù)發(fā)送數(shù)據(jù)*/
.set_termios = evocdrv_set_termios,/*設(shè)置線路規(guī)程*/
.stop = evocdrv_stop,/*停止向串口發(fā)送數(shù)據(jù)*/
.start = evocdrv_start,/*恢復(fù)向串口發(fā)送數(shù)據(jù)*/
.hangup = evocdrv_hangup,/*設(shè)備掛起,等待再次被open*/
.tiocmget = evocdrv_tiocmget,/*獲取MODEM狀態(tài)位*/
.tiocmset = evocdrv_tiocmset,/*設(shè)置MODEM狀態(tài)位*/
};
這里挑一些與應(yīng)用程序聯(lián)系比較密切的函數(shù)進(jìn)行介紹。
(1) open
當(dāng)應(yīng)用程序調(diào)用open函數(shù)打開設(shè)備文件時就會進(jìn)入此函數(shù),此函數(shù)主要實現(xiàn)打開設(shè)備以及對設(shè)備進(jìn)行初始化等功能,主要工作如下:
● 找到打開串口的信息結(jié)構(gòu)體并進(jìn)行必要的初始化;
● 初始化串口寄存器,包括啟用FIFO、中斷等各種初始化工作;
● 設(shè)置波特率、停止位、流控制等線路狀態(tài)信息;
(2) close
當(dāng)應(yīng)用程序調(diào)用close函數(shù)關(guān)閉設(shè)備時會進(jìn)入此函數(shù),此函數(shù)實現(xiàn)的功能與open相反,主要是善后工作,包括對所有改變過的寄存器復(fù)位,還有對open后請求的一些資源進(jìn)行釋放。
(3) write
當(dāng)應(yīng)用程序調(diào)用write函數(shù)進(jìn)行寫操作時會進(jìn)入此函數(shù),此函數(shù)主要實現(xiàn)把應(yīng)用程序?qū)懭氲臄?shù)據(jù)保存到寫緩沖區(qū)xmit_buf中,這是一個4KB大小的緩沖區(qū),是在open時動態(tài)分配的,在close是釋放。當(dāng)xmit_buf中有數(shù)據(jù)時,開啟發(fā)送數(shù)據(jù)中斷IER_THRI,然后就會進(jìn)入中斷處理程序?qū)mit_buf的數(shù)據(jù)發(fā)送給串口。
(4) ioctl
當(dāng)應(yīng)用程序調(diào)用ioctl函數(shù)時會進(jìn)入此函數(shù),此函數(shù)主要提供應(yīng)用程序一些設(shè)置的方法和獲取驅(qū)動信息的方法,這里有一個很重要的方法TIOCSSERIAL,當(dāng)調(diào)用setserial命令設(shè)置設(shè)備節(jié)點信息時會調(diào)用ioctl并傳入TIOCSSERIAL參數(shù),在處理程序中,根據(jù)用戶傳入的基礎(chǔ)波特率、中斷號、基地址等串口信息修改串口信息結(jié)構(gòu)體,如果中斷號或基地址改變了,則重新設(shè)置串口各寄存器,否則只要重新設(shè)置串口的線路信息就可以了。
(5) set_termios
當(dāng)應(yīng)用程序調(diào)用tcsetattr函數(shù)時進(jìn)入此函數(shù),主要功能是設(shè)置線路規(guī)程信息,函數(shù)tcsetattr調(diào)用后tty核心會更新tty_struct->termios,并將原來的線路規(guī)程保存在old_termios中作為參數(shù)傳入set_termios中,程序根據(jù)tty_struct中的線路規(guī)程值對串口進(jìn)行重新設(shè)置。
(6) tiocmset
設(shè)置MODEM狀態(tài),主要是設(shè)置DTR/RTS線的狀態(tài),主要應(yīng)用于硬件流控制中。
(7) 中斷處理函數(shù)
串口驅(qū)動程序的數(shù)據(jù)傳輸和接收都是通過中斷來實現(xiàn)的,觸發(fā)中斷的情況有很多,這里列出幾個常用的中斷觸發(fā)。當(dāng)出現(xiàn)以下幾種情況時會觸發(fā)中斷:
①若設(shè)置了IER寄存器的RDI位,當(dāng)FIFO值到達(dá)TRIGGER值時觸發(fā)讀中斷,并將ISR寄存器的bit[1]和LSR寄存器的bit[0]置1;
②若設(shè)置了IER寄存器的THRI位,當(dāng)FIFO值低于TRIGGER值或FIFO為空時觸發(fā)寫中斷,并將ISR寄存器的bit[0]和LSR寄存器的bit[5]置1;
③若設(shè)置了IER寄存器的TLSI位,當(dāng)出現(xiàn)RX break、RX framing error、RX parity error、overrun error的任意一個時將觸發(fā)一個中斷;
④若設(shè)置了IER寄存器的MSI位,當(dāng)CTS線、DSR線、RI響鈴控制器、CD數(shù)據(jù)載波檢測線中任意一個狀態(tài)改變時將觸發(fā)一個中斷;
由于有很多中情況會觸發(fā)中斷,所以在中斷處理函數(shù)中要對各種可能產(chǎn)生中斷的情況進(jìn)行判斷并處理,這里最重要的當(dāng)然是對讀、寫中斷的處理了,可以通過讀取寄存器的值來判斷進(jìn)行哪種操作。
當(dāng)ISR寄存器的bit[1]或LSR寄存器的bit[0]為1時,執(zhí)行讀操作,即從串口讀取數(shù)據(jù),由于串口內(nèi)部有個64B的RX FIFO,而且串口數(shù)據(jù)傳輸是以字節(jié)為單位的,所以在讀取數(shù)據(jù)操作函數(shù)(receive_chars)中,每次以字節(jié)為單位從串口RHR寄存器讀取64B的數(shù)據(jù);先將讀取的數(shù)據(jù)保存到tty_buffer中(tty_insert_flip_char),然后在將tty_ buffer中的數(shù)據(jù)發(fā)送到read_buf中(tty_flip_buffer _push),應(yīng)用程序就是從read_buf中讀取數(shù)據(jù)的。
當(dāng)ISR寄存器的bit[0]或LSR寄存器的bit[5]為1時,執(zhí)行寫操作,即向串口寫數(shù)據(jù)(transmit_ chars),寫操作與讀操作類似,也是每次以字節(jié)為單位向串口寫入64B的數(shù)據(jù),寫入數(shù)據(jù)的寄存器為THR;這里寫入的數(shù)據(jù)并不是用戶空間傳入的數(shù)據(jù),應(yīng)用程序先將數(shù)據(jù)寫入寫緩沖區(qū)xmit_buf,函數(shù)transmit_chars從寫緩沖區(qū)發(fā)送數(shù)據(jù)到串口,寫緩沖區(qū)大小為4KB。
可以看出內(nèi)核中數(shù)據(jù)結(jié)構(gòu)的設(shè)計是一種通用的設(shè)計,不論是哪種類型的主板、哪種類型的芯片都可使用內(nèi)核驅(qū)動;但正是由于這種通用性,使得內(nèi)核對串口信息的默認(rèn)值很難做一個合適的設(shè)置,因為不同的主板串口信息往往是不同的,只能通過serserial命令來手動修改。多串口驅(qū)動的設(shè)計是將內(nèi)核中2個串口信息結(jié)構(gòu)體合為一個,并實現(xiàn)一個主板信息結(jié)構(gòu)體,此結(jié)構(gòu)體包含了一塊板上所有串口共用的信息,對于中斷處理的設(shè)計是通過傳入每塊板第一個串口的信息結(jié)構(gòu)體實現(xiàn)的,這里沒有內(nèi)核方便,有待改進(jìn)。
[1] 李萌.linux操作系統(tǒng)多串口編程技術(shù)[J].火控雷達(dá)技術(shù); 2008,29(3).
[2] 劉海燕,荊濤.linux系統(tǒng)應(yīng)用與開發(fā)教程[M].北京:機(jī)械工業(yè)出版社,2006:44-47.
[3] 高艷輝,龔華軍.嵌入式實時Linux在PC104平臺上的實現(xiàn)[J].儀器儀表用戶,2008,15(2).
[4] 高艷輝.基于嵌入式實時Linux的無人機(jī)半物理仿真平臺研究[D].南京:南京航空航天大學(xué),2008.
[5] 曾煒,沈為群.基于RTAI-Linux的飛行仿真實時管理系統(tǒng)[J].計算機(jī)工程,2008,34(19).
[6] 劉海燕,邵立嵩.linux系統(tǒng)應(yīng)用與開發(fā)教程[M].北京:機(jī)械工業(yè)出版社,2006:65-69.
[7] 黃志洪,鐘耿揚(yáng).linux操作系統(tǒng)[M].北京:冶金工業(yè)出版社,2010:155-169.
The research of multi-serial drive based on the Linux operating system
*WANG Qiao-ling1,GAO Jie2, CHENG Ya-li1
(1.School of Electronic Information Engineering, Jinggangshan University, Ji’an, Jiangxi 343009, China;2.Information Engineering Department of Nanchang University, Gongqing College, Gongqing City, Jiangxi 332020,China)
We introduce the Linux operating system based on the design theory of multi-serial port drive and realize the core design based on tty with the multi-serial port programming technology, which can be used as a serial port terminal equipment to realize the centralized management, the real-time data acquisition server application motherboard. Its characteristic is can be used with ARM platform, but is fully compatible with X86 platform. Furthermore, the original X86 operating system Linux multi-serial port drive program in the workbench need only recompile to realize the transplant, which is based on Linux operating system to the serial driver real-time communication.
Linux operating system; multi- serial driver; tty core
1674-8085(2012)03-0069-06
TP316
A
10.3969/j.issn.1674-8085.2012.03.015
2012-02-16;
2012-03-27
*王巧玲(1979-),女,江西吉水人,講師,碩士,主要從事計算機(jī)軟件理論研究(Email:xinyuwql@163.com);
高 杰(1983-),男,江西吉安人,助教,主要從事嵌入式方向研究(Email:275750383@qq.com);
陳婭荔(1982-),女,江西南昌人,助教,碩士,主要從事人工智能和圖像處理研究(Email:30006959@qq.com).