LM3S9B96的μDMA高速網(wǎng)絡(luò )驅動(dòng)程序設計
引言
本文引用地址:http://dyxdggzs.com/article/201610/307655.htmLM3S9B96是德州儀器針對工業(yè)應用設計的Cortex—M3核的微控制器,應用領(lǐng)域包括遠程監控、電子販售機、測試和測量設備、網(wǎng)絡(luò )設備和交換機、工廠(chǎng)自動(dòng)化以及火警安防等。LM3S9B96的主頻最高為80 MHz,性能可達100 DMIPS,其以太網(wǎng)控制器集成了媒體訪(fǎng)問(wèn)控制器和物理層接口,以太網(wǎng)控制器遵循IEEE 802.3規范,完全支持10BASE—T和100BASE—TX標準。
德州儀器為微控制器LM3S9B96提供了輕量級TCP/IP協(xié)議lwIP下的網(wǎng)絡(luò )驅動(dòng)程序,該驅動(dòng)程序使用數據拷貝方式實(shí)現網(wǎng)絡(luò )層與發(fā)送FIFO(TX FIFO)和接收FIFO(RX FIFO)之間的數據交換,效率低,無(wú)法滿(mǎn)足高速網(wǎng)絡(luò )通信的要求。文中詳細描述了實(shí)時(shí)操作系統μC/OS—II環(huán)境下,基于微型直接存儲器訪(fǎng)問(wèn)(Micro Direct Memory Access,μDMA)傳輸的LM3S9B96網(wǎng)絡(luò )驅動(dòng)程序的設計,以提高網(wǎng)絡(luò )層與底層FIFO之間數據交換的效率,實(shí)現高速網(wǎng)絡(luò )通信。
1 LM3S9B96的以太網(wǎng)控制器
LM3S9B96的以太網(wǎng)控制器包含媒體訪(fǎng)問(wèn)控制器(Media Access Controller,MAC)層和網(wǎng)絡(luò )物理層(Network Physical,PHY)2個(gè)部分,如圖1所示,以太網(wǎng)控制器內部結構如圖2所示。
LM3S9B96的以太網(wǎng)控制器包含了網(wǎng)絡(luò )物理層的自動(dòng)交叉校驗MDIX、自動(dòng)協(xié)商、時(shí)鐘參考、MAC LED控制、媒體獨立接口(Media Indepen dent Interface,MII)寄存器組、發(fā)送編碼、脈沖整形、時(shí)鐘恢復、接收解碼、載波感應和沖突檢測等單元,用于實(shí)現10 BASE—T/100BA SETX的自動(dòng)協(xié)商、MDI與MDIX校驗、數據的編碼發(fā)送和解碼接收,以及網(wǎng)絡(luò )接口指示燈的控制;也包含了MAC層的TX FIFO、RX FIFO、接收控制、發(fā)送控制、數據訪(fǎng)問(wèn)、獨體媒體接口控制、定時(shí)器支持、MAC地址寄存器、中斷控制等單元,用于實(shí)現MAC地址的設置、物理層MII寄存器組的設置、中斷的產(chǎn)生和控制、網(wǎng)絡(luò )層與MAC層FIFO之間數據的傳輸。
網(wǎng)絡(luò )驅動(dòng)程序是網(wǎng)絡(luò )層與物理層硬件的直接接口,它屏蔽了物理層硬件的細節,利用物理層硬件,為網(wǎng)絡(luò )層提供了接收和發(fā)送數據的接口,如圖3所示。
網(wǎng)絡(luò )數據發(fā)送時(shí),網(wǎng)絡(luò )驅動(dòng)程序從網(wǎng)絡(luò )層接收數據包后,檢查數據發(fā)送緩沖隊列和TX FIFO是否為空,若均為空,程序會(huì )通過(guò)TX FIFO發(fā)送數據包;否則將數據包放入發(fā)送緩沖隊列,等待TX FIFO為空時(shí),網(wǎng)絡(luò )中斷觸發(fā)數據發(fā)送。網(wǎng)絡(luò )數據接收時(shí),RX FIFO從物理層接收數據包后,觸發(fā)網(wǎng)絡(luò )接收中斷,網(wǎng)絡(luò )驅動(dòng)程序從RX FIFO讀取數據包,并交由網(wǎng)絡(luò )層處理。
3 基于μDMA的網(wǎng)絡(luò )驅動(dòng)程序的設計
LM3S9896內置一個(gè)直接存儲器訪(fǎng)問(wèn)(Direct Memory Access,DMA)控制器,稱(chēng)之為微型DMA(μDMA)控制器。μDMA控制器所提供的工作方式能夠分載處理器參與的數據傳輸任務(wù),從而更加高效地使用內核以及總線(xiàn)帶寬。
LM3S9B96的以太網(wǎng)控制器支持μDMA功能,具有專(zhuān)用的μDMA通道,通過(guò)合理的編程配置,通過(guò)μDMA控制器,當需要時(shí)自動(dòng)在網(wǎng)絡(luò )控制器的TX FIFO、RXFIFO與存儲器之間傳輸數據,使得以太網(wǎng)MAC具有更高的性能,并大大減輕LM3S9B96內核的數據傳輸負擔。
LM3S9B96的μDMA網(wǎng)絡(luò )驅動(dòng)程序主要包含4個(gè)單元:初始化程序、數據包發(fā)送程序、數據包接收程序和中斷處理程序。
3.1 初始化程序
網(wǎng)絡(luò )驅動(dòng)初始化程序主要用于初始化網(wǎng)絡(luò )接口、設置μDMA參數和網(wǎng)絡(luò )中斷,具體工作如下:
①初始化網(wǎng)絡(luò )接口結構體的各個(gè)參數,如網(wǎng)絡(luò )接口名稱(chēng)、MAC地址、接口層發(fā)送函數地址等。
②設置MAC地址及其長(cháng)度、最大傳輸單元大小、網(wǎng)絡(luò )接口時(shí)鐘。
③配置以太網(wǎng)控制器操作參數,此處需要使能雙工傳輸、發(fā)送填充、自動(dòng)CRC校驗產(chǎn)生、多播數據接收等。
④使能μDMA單元并設置μDMA控制表基地址。
⑤禁止以太網(wǎng)發(fā)送通道μDMA,并設置該通道μDMA控制參數一一傳輸大小32位,源地址以32位大小自增,目標地址不增加,仲裁大小8位。
⑥禁止以太網(wǎng)接收通道μDMA,并設置該通道μDMA控制參數——傳輸大小32位,源地址不增加,目標地址以32位大小自增,仲裁大小8位。
⑦設置網(wǎng)絡(luò )中斷類(lèi)型,并使能網(wǎng)絡(luò )中斷等功能,為了簡(jiǎn)化中斷處理,此處僅使能網(wǎng)絡(luò )接收和發(fā)送中斷,禁止發(fā)送錯誤、接收錯誤、接收溢出等其他中斷類(lèi)型。
3.2 數據包發(fā)送程序
網(wǎng)絡(luò )數據的發(fā)送,是在中斷處理程序的協(xié)助下由網(wǎng)絡(luò )數據包發(fā)送程序實(shí)現。
數據包發(fā)送程序主要包含2個(gè)函數:網(wǎng)絡(luò )數據輸出函數stellarisif_output()和網(wǎng)絡(luò )數據傳輸函數stellarisif_transmit(),函數流程如圖4(a)、(b)所示。
stellarisif_output()函數并不進(jìn)行實(shí)際的數據發(fā)送,它只是將數據包放入緩沖隊列,或者是調用網(wǎng)絡(luò )數據傳輸函數進(jìn)行數據發(fā)送。如圖4(a)中標注,該函數需要注意:
①一個(gè)新的網(wǎng)絡(luò )數據包,必須檢查當前發(fā)送緩沖區是否為空。如果發(fā)送緩沖區不為空,即使TX FIFO為空,也要把待發(fā)送的網(wǎng)絡(luò )數據包放入發(fā)送緩沖區,這樣才能保證網(wǎng)絡(luò )數據先進(jìn)先出的發(fā)送次序。
②表明實(shí)際進(jìn)行網(wǎng)絡(luò )數據發(fā)送的是stellarisif_transmit()函數。
stellarisif_transmit()函數進(jìn)行實(shí)際的網(wǎng)絡(luò )數據發(fā)送,它以DMA方式復制網(wǎng)絡(luò )數據到TX FIFO,標識中斷處理程序設置網(wǎng)絡(luò )發(fā)送標志,啟動(dòng)網(wǎng)絡(luò )數據的物理層傳輸;或以?xún)群藞绦锌截惙绞綇椭凭W(wǎng)絡(luò )數據到TX FIFO,并置位網(wǎng)絡(luò )發(fā)送標志,啟動(dòng)網(wǎng)絡(luò )數據的物理層傳輸。如圖4(b)中標注,需要注意:
③由于以太網(wǎng)發(fā)送通道μDMA的傳輸大小被初始化32位(即傳輸數據寬度為4個(gè)字節),而μDMA傳輸要求源地址、目的地址必須按照傳輸數據寬度對齊。因此進(jìn)行μDMA傳輸前,應首先判斷數據的源地址(即被傳輸的凈荷數據地址)是否為4字節邊界對齊(以太網(wǎng)發(fā)送通道μDMA的目的地址為T(mén)X FIFO的地址,即0x40048010,已為4字節對齊,無(wú)需檢查)。若為4字節地址對齊,才能進(jìn)行μDMA數據傳輸,否則不能進(jìn)行μDMA傳輸,只能進(jìn)行由LM3S9B96內核執行的數據拷貝。需要說(shuō)明的是,通過(guò)合理分配LWIP協(xié)議棧的堆內存、緩沖及待發(fā)送數據的地址,是可以保證凈荷數據地址為4字節對齊的。
④設置μDMA通道為以太網(wǎng)發(fā)送通道,自動(dòng)傳輸模式,源地址為凈荷數據地址,目的地址為T(mén)X FIFO地址,傳輸長(cháng)度(以傳輸數據寬度為單位,即以32位或4字節為單位,實(shí)際傳輸的字節總長(cháng)度=傳輸長(cháng)度x傳輸數據寬度)。
3.3 數據包接收程序
網(wǎng)絡(luò )數據的接收,是在中斷處理程序的協(xié)助下,由網(wǎng)絡(luò )數據包接收程序(主要由網(wǎng)絡(luò )數據接收函數stellarisif_receive()構成)實(shí)現。
stellarisif_receive()函數負責以μDMA或內核執行拷貝方式,從RX FIFO讀取網(wǎng)絡(luò )數據幀到接收緩沖區pbuf。其流程如圖4(c)所示,該函數實(shí)現需要以下說(shuō)明:
⑤即使分配接收緩沖區pbuf失敗,也需要從RX FIFO中清空該數據幀,以免影響后續的數據幀接收。
⑥進(jìn)行以太網(wǎng)接收通道的μDMA傳輸前,也需要檢查接收緩沖區pbuf的地址是否為4字節邊界對齊。在LWIP協(xié)議棧的堆內存、緩沖分配合理時(shí),每次都以4字節整數倍的長(cháng)度申請分配接收緩沖區pbuf,是能保證pbuf地址為4字節邊界對齊的,從而實(shí)現每次網(wǎng)絡(luò )數據接收都通過(guò)μDMA實(shí)現RX FIFO至pbuf數據拷貝,無(wú)需LM3S9B96內核參與。
⑦設置μDMA通道為以太網(wǎng)接收通道,自動(dòng)傳輸模式,源地址為T(mén)X FIFO地址,目的地址為接收緩沖區pbuf地址,傳輸長(cháng)度(以傳輸數據寬度為單位,即以32位或4字節為單位,實(shí)際傳輸的字節總長(cháng)度=傳輸長(cháng)度×傳輸數據寬度)。
⑧需要等待中斷處理程序發(fā)送的網(wǎng)絡(luò )接收μDMA傳輸結束信號量,成功獲取該信號量,才能標志此次μDMA傳輸的結束。
3.4 中斷處理程序
中斷處理程序為lwIP協(xié)議棧處理以太網(wǎng)中斷,從底層接收網(wǎng)絡(luò )數據包,提交給上一層來(lái)處理,檢查網(wǎng)絡(luò )發(fā)送緩沖隊列、通過(guò)以太網(wǎng)MAC層進(jìn)行數據包發(fā)送。
中斷處理程序主要包括2個(gè)部分:以太網(wǎng)中斷服務(wù)程序lwIPEthernetIntHandler()和以太網(wǎng)中斷任務(wù)l(shuí)wIPInterruptTask(),流程如圖5所示。
LM3S9B96的以太網(wǎng)中斷產(chǎn)生時(shí),內核自動(dòng)跳轉至中斷向量表的57號處(LM3S9B96的以太網(wǎng)中斷向量號),該處定義了“DCD lwIPEthernet IntHandler”,進(jìn)而轉入中斷服務(wù)程序lwIPEthernetIntHandler()執行。如圖5(a)中標注,此程序根據3種不同類(lèi)型的中斷源進(jìn)行相應的處理:
①處理網(wǎng)絡(luò )接收和發(fā)送中斷。網(wǎng)絡(luò )接收、發(fā)送中斷產(chǎn)生后,程序釋放一個(gè)網(wǎng)絡(luò )中斷服務(wù)信號量,以太網(wǎng)中斷任務(wù)獲取該信號量后,調用stellarisif_receive()函數讀取數據幀,或調用stellarisif_transmit()函數發(fā)送數據幀。
②處理網(wǎng)絡(luò )接收通道的μDMA中斷。該中斷產(chǎn)生,表明從RX FIFO至接收緩沖區pbuf的μDMA傳輸結束,此時(shí)應釋放傳輸結束信號量,以解除stellarisif_receive()函數的傳輸結束等待。
③處理網(wǎng)絡(luò )發(fā)送通道的μDMA中斷。該中斷產(chǎn)生,表明從發(fā)送緩沖區pbuf至TX FIFO的μDMA傳輸結束,此時(shí)應置位網(wǎng)絡(luò )發(fā)送請求標志,啟動(dòng)網(wǎng)絡(luò )數據的物理層傳輸。
lwIPinterruptTask()函數負責從RX FIFO讀取網(wǎng)絡(luò )數據幀,并提交上層協(xié)議處理;或者從發(fā)送緩沖隊列讀取并調用stellarisif_trans mit()函數發(fā)送網(wǎng)絡(luò )數據幀,其流程如圖5(b)所示,該函數實(shí)現也需要注意:
④以太網(wǎng)中斷任務(wù)以阻塞模式等待網(wǎng)絡(luò )中斷服務(wù)信號量,直至網(wǎng)絡(luò )接收或發(fā)送中斷產(chǎn)生時(shí),lwIPEthernetIntHandler()釋放該信號量,任務(wù)才解除阻塞,開(kāi)始執行網(wǎng)絡(luò )數據幀的接收、發(fā)送操作。
⑤無(wú)論以太網(wǎng)中斷源為接收中斷,還是發(fā)送中斷,以太網(wǎng)中斷任務(wù)總是首先調用stellarisif_receive()函數讀取網(wǎng)絡(luò )數據幀(若成功讀取數據幀,則提交上層協(xié)議處理),然后檢查T(mén)XFIFO和網(wǎng)絡(luò )發(fā)送緩沖隊列,滿(mǎn)足發(fā)送條件時(shí),進(jìn)行數據幀發(fā)送操作。此種處理方式,貌似沒(méi)有對網(wǎng)絡(luò )發(fā)送與接收中斷進(jìn)行有效地區分處理,但事實(shí)上,在同時(shí)處理大量網(wǎng)絡(luò )數據的接收、發(fā)送時(shí),具有極高的執行效率。
結語(yǔ)
本文針對德州儀器的微控制器LM3S9B96,提出了一種面向高速網(wǎng)絡(luò )的、基于μDMA的網(wǎng)絡(luò )驅動(dòng)程序設計方案,該設計方案充分利用了LM3S 9B96的μDMA、網(wǎng)絡(luò )中斷等資源,大大提高了TCP/IP協(xié)議棧的網(wǎng)絡(luò )層與底層FIFO之間數據交換的效率。實(shí)驗測試表明,該網(wǎng)絡(luò )驅動(dòng)設計方案較之內核拷貝方式實(shí)現的網(wǎng)絡(luò )驅動(dòng)程序,通信效率提高了十余倍。
由于大多數德州儀器Cortex—M3核的微控制器的以太網(wǎng)控制器結構都非常相似,因此文中針對微控制器LM3S9B96提出的網(wǎng)絡(luò )驅動(dòng)程序設計方案,可適用于大多數德州儀器Cortex—M3核的微控制器的網(wǎng)絡(luò )驅動(dòng)程序設計。
評論