趙婉芳,趙 剛
(1.北京電子科技職業(yè)學(xué)院 北京 100016;2.中國(guó)電話號(hào)簿公司 北京 100032)
隨著通信業(yè)務(wù)的迅猛發(fā)展,通信設(shè)備使用單處理器處理所有任務(wù)的工作方式已經(jīng)很難滿足業(yè)務(wù)需求。為了提高系統(tǒng)業(yè)務(wù)處理能力,大部分的通信設(shè)備引入了雙處理器工作方式,即使用兩個(gè)相同類型或者不同類型的處理器協(xié)作完成系統(tǒng)中的不同任務(wù),這種方式不僅提高了設(shè)備性能,還大大增強(qiáng)了系統(tǒng)的實(shí)時(shí)性、可靠性和適用性。該類設(shè)備的兩個(gè)處理器由于需要協(xié)作共同完成任務(wù),因此處理器間必須進(jìn)行數(shù)據(jù)的交換,處理器間的通信變得非常重要,它不僅會(huì)影響數(shù)據(jù)交換的可靠性,還會(huì)影響整個(gè)系統(tǒng)的協(xié)作處理能力和設(shè)備的整體性能。
目前,處理器間通信主要有主從方式和對(duì)等方式。在主從方式下,一個(gè)處理器作為主端(Master),連接一個(gè)或多個(gè)處理器作為從端(Slave),所有通信都由主端發(fā)起,從端不能主動(dòng)發(fā)送數(shù)據(jù),如并行總線、SPI等;而在對(duì)等方式中,多個(gè)處理器通過(guò)網(wǎng)絡(luò)連接在一起,每個(gè)處理器都能主動(dòng)向外發(fā)送數(shù)據(jù),當(dāng)發(fā)生沖突時(shí)能主動(dòng)回避并重發(fā),如以太網(wǎng)等。一般來(lái)說(shuō),對(duì)等方式的效率較高,設(shè)計(jì)較靈活,但是處理器間的網(wǎng)絡(luò)連接復(fù)雜度較高,需要一個(gè)外置數(shù)據(jù)交換芯片來(lái)進(jìn)行數(shù)據(jù)的交換處理。如何找到一種可靠、低成本、容易實(shí)現(xiàn)的雙處理器間通信方式,降低嵌入式系統(tǒng)的復(fù)雜度和開發(fā)成本,對(duì)雙處理器嵌入式系統(tǒng)的開發(fā)和應(yīng)用具有很好的現(xiàn)實(shí)意義。
本文針對(duì)通信設(shè)備中雙處理器間通信的需求和特點(diǎn),綜合考慮開發(fā)成本、周期、穩(wěn)定性等因素,提出了一種基于串口的對(duì)等通信方式。該通信方式將TCP/IP與串口結(jié)合起來(lái),通過(guò)串口傳輸以太網(wǎng)數(shù)據(jù),利用TCP/IP來(lái)保證數(shù)據(jù)傳輸?shù)恼_性,實(shí)現(xiàn)了兩個(gè)處理器間的全雙工通信。
處理器間通信一般可以通過(guò)數(shù)據(jù)交換、并行總線或者串行總線等方式實(shí)現(xiàn)。由于現(xiàn)代處理器都有豐富的串口可以利用,因此串口通信方式相對(duì)于數(shù)據(jù)交換方式和并行總線方式而言不用增加額外的器件,實(shí)現(xiàn)成本低,硬件連接簡(jiǎn)單,而且傳輸速率能達(dá)到10 KB/s甚至更高,可以滿足大部分產(chǎn)品設(shè)計(jì)的需求,是應(yīng)用比較廣泛的一種通信方式。
在目前采用雙處理器結(jié)構(gòu)的通信設(shè)備中,兩個(gè)處理器有明確的分工:數(shù)據(jù)處理器專門進(jìn)行數(shù)據(jù)處理;控制處理器主要完成控制工作。位于兩個(gè)處理器之間的通信通道則主要用于傳遞控制信息。由于控制信息的特點(diǎn)是數(shù)據(jù)量小,對(duì)數(shù)據(jù)傳輸?shù)募皶r(shí)性和準(zhǔn)確性要求高,因此數(shù)據(jù)傳輸?shù)姆€(wěn)定、可靠是處理器間通信最重要的條件。另外還需考慮到實(shí)現(xiàn)方式的通用性(可以適用于多種操作系統(tǒng)和處理器)和易實(shí)現(xiàn)。綜上所述,通信通道需要滿足以下條件:
·數(shù)據(jù)傳輸穩(wěn)定、可靠;
·數(shù)據(jù)傳輸速率在10 KB/s以上;
·移植性好,可用于多種處理器互聯(lián);
·易于編寫應(yīng)用軟件。
如果在系統(tǒng)中采用串口通信方式來(lái)實(shí)現(xiàn)處理器間信息的交換,則能夠保證實(shí)現(xiàn)的低成本和易實(shí)現(xiàn),但是數(shù)據(jù)傳輸?shù)恼_性無(wú)法保證。因?yàn)榇趥鬏敂?shù)據(jù)只是利用奇偶位校驗(yàn)數(shù)據(jù),這種校驗(yàn)方式只能檢測(cè)出信息傳輸過(guò)程中的部分誤碼,即只能檢出1位誤碼,不能檢出2位及2位以上誤碼。另外,奇偶校驗(yàn)方式不能糾錯(cuò),在發(fā)現(xiàn)錯(cuò)誤后,只能要求重發(fā),誤碼率較高,嚴(yán)重影響數(shù)據(jù)傳輸?shù)恼_性。因此,如何保證數(shù)據(jù)傳輸穩(wěn)定、可靠,提高處理器協(xié)作處理能力,是實(shí)現(xiàn)處理器間通信需要解決的首要問(wèn)題。
本文在串口通信方式基礎(chǔ)上引入了TCP/IP協(xié)議棧,用于在串口上傳輸以太網(wǎng)數(shù)據(jù),實(shí)現(xiàn)雙處理器間的通信,并利用TCP/IP來(lái)保證數(shù)據(jù)傳輸?shù)恼_性。由于TCP/IP是一種面向連接的協(xié)議,TCP在傳輸前必須先通過(guò) “三重握手”在主機(jī)間建立TCP連接,它所傳輸?shù)臄?shù)據(jù)流采用了順序號(hào)和應(yīng)答措施,可以發(fā)現(xiàn)數(shù)據(jù)的丟失、段的失序和對(duì)傳輸錯(cuò)誤的排除,因此完全能實(shí)現(xiàn)數(shù)據(jù)流的可靠傳輸。其次,TCP/IP符合開放系統(tǒng)互連(OSI)模型,采用分層結(jié)構(gòu)(傳輸層、網(wǎng)絡(luò)層、鏈路層、應(yīng)用層),易于移植到串口上使用,保證了實(shí)現(xiàn)方式的易移植性。此外,TCP/IP是一種十分成熟的網(wǎng)絡(luò)協(xié)議,可以被移植到各種操作系統(tǒng)中,在主流嵌入式操作系統(tǒng)中都有TCP/IP協(xié)議棧,在產(chǎn)品開發(fā)中易于實(shí)現(xiàn)。可見(jiàn),該方式在解決了數(shù)據(jù)傳輸?shù)母呖煽啃缘耐瑫r(shí),保證了易實(shí)現(xiàn)、低成本和易移植。
具體的實(shí)現(xiàn)原理為:等待發(fā)送的數(shù)據(jù)先通過(guò)網(wǎng)絡(luò)協(xié)議棧處理,即給數(shù)據(jù)加上TCP/IP頭部和以太網(wǎng)頭部,再放到串口上傳輸;對(duì)方接收到后,將數(shù)據(jù)包傳給網(wǎng)絡(luò)協(xié)議棧處理,去掉TCP/IP頭部和以太網(wǎng)頭部,最終得到所需的數(shù)據(jù)。該方式的實(shí)現(xiàn)需要軟硬件配合,硬件上需要將串口連接起來(lái),保證處理器之間的物理聯(lián)通,而實(shí)現(xiàn)的重點(diǎn)和難點(diǎn)在于軟件驅(qū)動(dòng)的設(shè)計(jì)和實(shí)現(xiàn)。
在兩個(gè)處理器中驅(qū)動(dòng)程序的結(jié)構(gòu)是相同的,在系統(tǒng)中的位置如圖1所示。
在圖1中可以看到,串口驅(qū)動(dòng)在TCP/IP和以太網(wǎng)協(xié)議下方,與網(wǎng)卡驅(qū)動(dòng)在同一層。該串口驅(qū)動(dòng)的作用就是將串口設(shè)備模擬成網(wǎng)卡設(shè)備。對(duì)于上層協(xié)議棧,串口成為一個(gè)虛擬網(wǎng)卡設(shè)備。上層協(xié)議棧通過(guò)該驅(qū)動(dòng)在串口上收發(fā)數(shù)據(jù)包。這種結(jié)構(gòu)的好處是不破壞系統(tǒng)原有的結(jié)構(gòu),盡量使用系統(tǒng)已有的軟件模塊,在編寫應(yīng)用程序時(shí)使用標(biāo)準(zhǔn)的socket接口編程,軟件移植性好,可在多種操作系統(tǒng)環(huán)境中運(yùn)行。由于Linux系統(tǒng)支持x86、ARM、PowerPC等體系結(jié)構(gòu)的處理器,內(nèi)核高效、穩(wěn)定,可根據(jù)系統(tǒng)需要進(jìn)行剪裁,并且支持TCP/IP,在嵌入式系統(tǒng)中應(yīng)用十分廣泛,因此本文的處理器采用Linux作為操作系統(tǒng)。
驅(qū)動(dòng)程序是實(shí)現(xiàn)處理器間通信的關(guān)鍵,驅(qū)動(dòng)程序部分的主要任務(wù)是將數(shù)據(jù)包通過(guò)串口發(fā)送出去,同時(shí)將串口接收到的數(shù)據(jù)包傳遞給上層協(xié)議棧處理,主要解決如何在上層協(xié)議棧和串口驅(qū)動(dòng)之間進(jìn)行數(shù)據(jù)交換以及在物理串口上傳輸以太網(wǎng)數(shù)據(jù)問(wèn)題,因此驅(qū)動(dòng)程序的設(shè)計(jì)分為上層協(xié)議棧接口和串口驅(qū)動(dòng)兩部分。上層協(xié)議棧接口部分負(fù)責(zé)將協(xié)議棧與串口驅(qū)動(dòng)連接起來(lái)。串口驅(qū)動(dòng)部分則實(shí)現(xiàn)串口硬件模塊的控制,如發(fā)送數(shù)據(jù)、接收數(shù)據(jù)和中斷處理等功能。
從圖1可以看到,該驅(qū)動(dòng)程序處于協(xié)議棧的底部,因此需要提供與上層協(xié)議棧的接口。由于在Linux 2.6內(nèi)核源碼樹include/linux/netdevice.h頭文件中有net_device結(jié)構(gòu)體的定義,net_device是網(wǎng)卡驅(qū)動(dòng)向上層協(xié)議棧注冊(cè)時(shí)使用的一個(gè)專用結(jié)構(gòu)體,該結(jié)構(gòu)體中定義了很多網(wǎng)絡(luò)參數(shù)和供網(wǎng)絡(luò)協(xié)議接口層調(diào)用的設(shè)備方法。本文所述驅(qū)動(dòng)屬于虛擬網(wǎng)卡驅(qū)動(dòng)范疇,因此向上層協(xié)議棧注冊(cè)時(shí)也需要通過(guò)net_device結(jié)構(gòu)體進(jìn)行。在net_device結(jié)構(gòu)體中需要定義的網(wǎng)絡(luò)參數(shù)主要有網(wǎng)絡(luò)設(shè)備名稱、I/O基地址、最大傳輸單元等,需要定義的接口函數(shù)有設(shè)備初始化函數(shù)、統(tǒng)計(jì)信息查詢函數(shù)等。當(dāng)net_device結(jié)構(gòu)被注冊(cè)到Linux內(nèi)核中,就完成了上層協(xié)議棧與串口驅(qū)動(dòng)的連接,上層協(xié)議棧就能通過(guò)net_device結(jié)構(gòu)體來(lái)使用串口驅(qū)動(dòng)。具體的內(nèi)容將在下文實(shí)現(xiàn)部分中描述。
串口驅(qū)動(dòng)的主要任務(wù)是控制串口硬件模塊發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。其中串口中斷處理函數(shù)是串口驅(qū)動(dòng)實(shí)現(xiàn)的核心,串口數(shù)據(jù)發(fā)送和接收過(guò)程主要由該函數(shù)來(lái)實(shí)現(xiàn),中斷函數(shù)的具體流程如圖2所示。
在串口驅(qū)動(dòng)中基于中斷函數(shù)的數(shù)據(jù)發(fā)送和接收過(guò)程如下。
發(fā)送數(shù)據(jù)過(guò)程:上層協(xié)議棧在組包過(guò)程中調(diào)用uart_header()來(lái)構(gòu)造以太網(wǎng)包的頭部,然后將構(gòu)造好的以太網(wǎng)包發(fā)送給uart_xmit()。在函數(shù) uart_xmit()中,調(diào)用netif_stop_queue()暫停上層協(xié)議棧繼續(xù)向串口驅(qū)動(dòng)發(fā)送數(shù)據(jù),防止過(guò)多數(shù)據(jù)使串口驅(qū)動(dòng)無(wú)法處理,然后調(diào)用uart_encode()給發(fā)送數(shù)據(jù)添加串口幀格式。處理后的數(shù)據(jù)放在發(fā)送緩存中等待發(fā)送。將前15 byte數(shù)據(jù)寫入串口TX_FIFO(發(fā)送FIFO),并使能發(fā)送中斷。接下來(lái)的發(fā)送工作由串口中斷處理程序完成。當(dāng)TX_FIFO中的數(shù)據(jù)發(fā)送完時(shí),串口產(chǎn)生中斷信號(hào),中斷處理程序?qū)⑽窗l(fā)送的數(shù)據(jù)填入FIFO中,如此循環(huán),直到數(shù)據(jù)發(fā)送完成。完成后,調(diào)用netif_start_queue()打開數(shù)據(jù)發(fā)送隊(duì)列。
接收數(shù)據(jù)過(guò)程:串口的接收中斷在初始化時(shí)被使能,并設(shè)置RX_FIFO(接收FIFO)中斷門限為8個(gè)字符,即RX_FIFO中的數(shù)據(jù)超過(guò)8個(gè)時(shí)將觸發(fā)串口中斷。中斷處理程序從RX_FIFO中讀取數(shù)據(jù),邊讀邊解碼,數(shù)據(jù)解碼后得到以太網(wǎng)包。在多個(gè)中斷后,當(dāng)收到一個(gè)完整的以太網(wǎng)包后,調(diào)用netif_rx(),將整個(gè)數(shù)據(jù)包傳遞給上層協(xié)議棧處理。
在驅(qū)動(dòng)設(shè)計(jì)中串口分幀也是一個(gè)關(guān)鍵點(diǎn)。由于串口設(shè)備是流設(shè)備,數(shù)據(jù)以 byte為單位傳輸,傳輸?shù)臄?shù)據(jù)沒(méi)有幀結(jié)構(gòu),而網(wǎng)絡(luò)數(shù)據(jù)是分幀傳輸?shù)?,因此無(wú)法使用串口設(shè)備來(lái)傳輸網(wǎng)絡(luò)數(shù)據(jù)。此外,在串口硬件模塊中也沒(méi)有分幀機(jī)制。為了實(shí)現(xiàn)使用串口傳輸網(wǎng)絡(luò)數(shù)據(jù),可以通過(guò)在驅(qū)動(dòng)中添加分幀機(jī)制的方法來(lái)實(shí)現(xiàn)數(shù)據(jù)分幀??紤]到處理器的開銷問(wèn)題,采用了一種簡(jiǎn)單的機(jī)制來(lái)實(shí)現(xiàn)分幀,即通過(guò)在發(fā)送方給數(shù)據(jù)包添加頭部和尾部標(biāo)識(shí)的方法來(lái)實(shí)現(xiàn),具體定義如下:在發(fā)送數(shù)據(jù)包的頭部添加多個(gè)“0x7e”,尾部添加一個(gè)“0x7e”,中間是數(shù)據(jù)包,如圖3所示。
由于使用“0x7e”作為標(biāo)識(shí),因此數(shù)據(jù)包中的“0x7e”必須用其他方式表示。將數(shù)據(jù)包中的 “0x7e”替換為“0x7d 0x5e”、“0x7d”替換為“0x7d 0x5d”。接收到數(shù)據(jù)后,先識(shí)別幀的邊界,然后還原數(shù)據(jù)包。數(shù)據(jù)包中的數(shù)據(jù)需進(jìn)行如下處理:
0x7d 0x5e→0x7e
0x7d 0x5d→0x7d
利用以上串口分幀機(jī)制就能實(shí)現(xiàn)在串口上傳輸以太網(wǎng)數(shù)據(jù)。
該驅(qū)動(dòng)在Linux系統(tǒng)中以模塊的形式實(shí)現(xiàn),可以動(dòng)態(tài)地加載和卸載。驅(qū)動(dòng)程序主要實(shí)現(xiàn)兩類函數(shù):一類是以太網(wǎng)協(xié)議棧的接口函數(shù);另一類是串口驅(qū)動(dòng)模塊函數(shù)。在使用串口之前,必須對(duì)串口設(shè)備進(jìn)行初始化。在初始化過(guò)程中,首先清空FIFO和中斷寄存器;然后設(shè)置串口的參數(shù),如波特率、FIFO中斷觸發(fā)點(diǎn);最后注冊(cè)中斷處理函數(shù),使能中斷并啟動(dòng)發(fā)送隊(duì)列。
經(jīng)過(guò)初始化,串口進(jìn)入工作狀態(tài),開始收發(fā)數(shù)據(jù),因此首先要申明Linux驅(qū)動(dòng)模塊的初始化函數(shù)和卸載函數(shù)。初始化函數(shù)module_init(uart_init_module)的功能是告知Linux系統(tǒng)當(dāng)初始化串口驅(qū)動(dòng)模塊時(shí)調(diào)用模塊初始化函數(shù)uart_init_module()。而卸載函數(shù)module_exit(uart_cleanup_module)的功能則是告知系統(tǒng)當(dāng)卸載該驅(qū)動(dòng)模塊時(shí)調(diào)用函數(shù)uart_cleanup_module()來(lái)完成驅(qū)動(dòng)模塊卸載操作,解注冊(cè)網(wǎng)絡(luò)設(shè)備并釋放該驅(qū)動(dòng)占用的資源。
驅(qū)動(dòng)模塊初始化函數(shù)uart_init_module()的主要實(shí)現(xiàn)代碼如下:
#define UART_NAME “etu”
static int__init uart_init_module(void)
{
struct net_device*net_dev=NULL;
/*分配內(nèi)存空間,并初始化結(jié)構(gòu)net_dev*/
net_dev=alloc_netdev(sizeof(struct uart_priv),UART_NAME,uart_init);
/*給網(wǎng)絡(luò)設(shè)備注冊(cè)一個(gè)名字 */
dev_alloc_name(net_dev,UART_NAME);
/*在系統(tǒng)中注冊(cè)新的網(wǎng)絡(luò)設(shè)備 */
register_netdev(net_dev);
return 0;
}
uart_init_module()函數(shù)首先給一個(gè) net_device結(jié)構(gòu)分配空間,然后定義網(wǎng)絡(luò)設(shè)備名為“etu”,最后向系統(tǒng)注冊(cè)一個(gè)新的網(wǎng)絡(luò)設(shè)備。
結(jié)構(gòu)體net_device描述了該虛擬網(wǎng)絡(luò)設(shè)備的所有信息,包括各種操作函數(shù)和參數(shù),其定義在頭文件netdevice.h中,主要定義的網(wǎng)絡(luò)參數(shù)和接口函數(shù)如下。
(1)網(wǎng)絡(luò)參數(shù)
name:網(wǎng)絡(luò)設(shè)備名稱,使用ifconfig命令可以查看。
base_addr,irq:網(wǎng)絡(luò)設(shè)備的I/O基地址、中斷號(hào)。
hard_header_len:硬件頭的長(zhǎng)度,以太網(wǎng)的值為14。
mtu:最大傳輸單元,以太網(wǎng)中值為1 500 byte。
dev_addr[MAX_ADDR_LEN]:硬件 (MAC)地址長(zhǎng)度及設(shè)備硬件地址,以太網(wǎng)地址長(zhǎng)度是48 bit。
flags:網(wǎng)絡(luò)接口狀態(tài)標(biāo)志,它的值可以是IFF_UP、IFF_BROADCAST等。
(2)接口函數(shù)
int(*init)(struct net_device*dev):設(shè)備初始化函數(shù),僅驅(qū)動(dòng)初始化時(shí)調(diào)用一次。
int(*open)(struct net_device*dev):設(shè)備打開接口函數(shù),當(dāng)設(shè)備被激活時(shí)調(diào)用,在該函數(shù)中注冊(cè)設(shè)備所需的系統(tǒng)資源,如地址空間、IRQ、DMA等,同時(shí)激活硬件。
int(*stop)(struct net_device*dev):設(shè)備關(guān)閉接口函數(shù),這個(gè)函數(shù)關(guān)閉硬件,釋放系統(tǒng)資源。
int(*hard_start_xmit)(struct sk_buff*skb,struct net_device*dev):初始化數(shù)據(jù)包傳輸?shù)暮瘮?shù)。
struct net_device_stats* (*get_stats)(struct net_device*dev):統(tǒng)計(jì)信息查詢接口函數(shù),調(diào)用該函數(shù),可查詢?cè)O(shè)備的各種統(tǒng)計(jì)信息,如接收字節(jié)數(shù)、發(fā)送字節(jié)數(shù)等。
int(*do_ioctl)(struct net_device*dev,struct ifreq*ifr,int cmd):該接口函數(shù)提供設(shè)置網(wǎng)絡(luò)設(shè)備參數(shù)的接口,如修改硬件地址(MAC)。
定義好的net_device結(jié)構(gòu)體在函數(shù)uart_init()中被初始化。該初始化函數(shù)將驅(qū)動(dòng)中定義的操作函數(shù)賦值給結(jié)構(gòu)體net_device中的函數(shù)指針,并初始化結(jié)構(gòu)體net_device中的各個(gè)成員參數(shù)。經(jīng)過(guò)初始化后,net_device結(jié)構(gòu)被注冊(cè)到Linux內(nèi)核中,這樣就完成了上層協(xié)議棧與串口驅(qū)動(dòng)的連接。上層協(xié)議棧就能通過(guò)net_device結(jié)構(gòu)體來(lái)使用串口驅(qū)動(dòng)。
在串口驅(qū)動(dòng)模塊中則主要實(shí)現(xiàn)以下函數(shù)。
static int uart_open(struct net_device*dev):設(shè)備使能函數(shù),該函數(shù)的工作是配置串口模塊參數(shù),注冊(cè)串口中斷處理函數(shù),使能串口中斷,啟動(dòng)發(fā)送隊(duì)列。
static int eos_release(struct net_device*dev):設(shè)備關(guān)閉函數(shù),該函數(shù)的工作是停止發(fā)送隊(duì)列,關(guān)閉串口模塊,禁止串口中斷,清除串口的FIFO。
static int uart_xmit(struct sk_buff*skb,struct net_device*dev):發(fā)送函數(shù),該函數(shù)完成數(shù)據(jù)的發(fā)送工作,對(duì)數(shù)據(jù)進(jìn)行編碼,然后放入串口的FIFO中,使能串口的發(fā)送中斷。
static int uart_header(struct sk_buff*skb,struct net_device*dev,unsigned short type,void*daddr,void*saddr,unsigned len):填寫以太網(wǎng)數(shù)據(jù)包的頭部函數(shù),該函數(shù)填寫發(fā)送數(shù)據(jù)包的頭部,如源MAC、目的MAC等。
在實(shí)際使用中要注意串口的波特率可設(shè)置為115 200,如果要提高串口的傳輸速率,除了提高串口波特率外,后面幾個(gè)因素都會(huì)影響串口的傳輸速率,如串口FIFO深度、FIFO中斷觸發(fā)位置、中斷延遲、CPU性能等。另外,在調(diào)試過(guò)程中要進(jìn)行串口中斷處理程序優(yōu)化,并盡量減少執(zhí)行時(shí)間。
處理器間的通信一直是多處理器嵌入式系統(tǒng)的研究重點(diǎn),本文通過(guò)在串口上引入TCP/IP協(xié)議棧的方式實(shí)現(xiàn)了雙處理器間的通信,在保證了實(shí)現(xiàn)方式的低成本、易移植和易實(shí)現(xiàn)的前提下,大大提高了通信的可靠性和穩(wěn)定性。本文的實(shí)現(xiàn)方式具有很好的移植性,不僅適用于通信設(shè)備,還適用于任何雙處理器的嵌入式系統(tǒng),對(duì)嵌入式系統(tǒng)的開發(fā)和應(yīng)用具有很好的現(xiàn)實(shí)意義。
1 Rubin A著.Lisoleg譯.Linux設(shè)備驅(qū)動(dòng)程序.北京:中國(guó)電力出版社,2000
2 Rubin A.Linux device drivers.Sebastopol:O’Reilly Press,2001
3 DanielP,CesatiB M.Understanding the Linux Kernel.Sebastopol:O’Reilly Press,2000
4 趙炯.Linux內(nèi)核完全注釋.北京:機(jī)械工業(yè)出版社,2004