標籤:end 要求 軟體 frame 中斷處理 操作 改進 any rds
在互連網/物聯網時代,嵌入式產品接入網路已經不是什麼新鮮概念或高端技術了。 通過網路對產品進行遠端管理是一種流行而又高效的方法,常見的方法有Telnet(TCP)、SNMP(UDP)和HTTP,這些要求產品擁有網卡(硬體)和支援TCP/IP協議(軟體)。
基於嵌入式Linux的產品先天就擁有了TCP/IP的協議棧支援,而一些傳統的不帶OS或基於小型RTX作業系統(uCos-ii)也藉助於LWIP,uIP等開源TCP/IP協議棧實現了網路應用。
Keil公司的MDK是最流行ARM開發工具,作為MDK的RL庫一部分的RL-TCPnet自然值得關注,雖然在MDK早期版本就已經布RL-TCPnet,但據江湖http://www.sansewa.com/tuofa_yuanyin/813.html傳言有協議支援不全和bug多等問題。但經過多次改進和升級,目前(MDK v4.7)已經相當穩定和好用了,MDK v5.0更是對其進行了大幅度升級(名字都變了)。在MDK下使用RL-RTX+RL-TCPNet構建應用有著得天獨厚的優勢。RL-TCPnet唯一的不好,可能就是不開源吧。
根據筆者經驗,移植TCP/IP做網路應用,痛點不在傳輸層/網路層或是應用程式層而是在物理層(網卡/PHY晶片提供)和MAC層(ARM晶片提供)。理由如下:
1.很多TCP/IP庫應用程式層都提供了大家熟悉的BSD Socket介面,可以像Linux上那樣方便開發網路應用。
2.傳輸層和網路層都是封裝在TCP/IP庫內部,如果不是要去研究tcp/ip協議過程不需要太關心其內部細節。
3.MAC層和物理層都是由硬體提供的,各個案例使用的晶片各不相同,需要針對不同的晶片實現其驅動以及供TCP/IP庫調用的介面。
以NXP的LPC1768和NS的DP83848C(PHY)為例,簡單說下RL-TCPnet的使用吧,其實標題說移植有些牽強,因為RL-TCPnet是不開源的,所以MDK針對不同的硬體運行平台提供了不同的RL-TCPnet的庫檔案。大概步驟如下:
一.加入RL-TCPnet庫到工程
針對Cortex-M3的RL-TCPnet庫“TCP_CM3.lib”可以在MDK安裝目錄“Keil\ARM\RV31\LIB\”下找到。添加到你的工程就可以了,沒有特殊情況盡http://www.chinamaofa.com/量給TCP/IP庫使用內部RAM以提高效率。
二.實現LPC1768的MAC驅動和PHY晶片DP83848C的驅動
需要提供如下功能:
1.實現LPC1768的MAC初始化,以及MII/RMII介面的配置
2.通過MDIO對PHY進行初始化配置,完成物理串連link以及介面模式速率的管理(一般配置成自適應模式Auto Nigotiation)。
針對1和2,RL-TCPnet庫要求以函數“void init_ethernet (void)"來提供。
3.實現為TCP/IP庫提供服務的介面函數(OSI網路分層定義下層實體為上層提供服務)
有兩種方式:查詢和中斷。
3.1查詢模式(指MAC主動去查詢是否收到PHY發來的以太幀)
實現收幀和發幀兩個介面函數:
void poll_ethernet (void)
void send_frame (OS_FRAME *frame)
3.2 中斷模式 (MAC中斷,不是PHY的中斷)
需要實現發幀、開啟/關閉MAC使能以及收幀(在中斷處理中進行)函數
void send_frame (OS_FRAME *frame)
void int_enable_eth ()
void int_disable_eth ()
- interrupt function void ENET_IRQHandler (void)
以上實現代碼可以參考MDK提供的”EMAC_LPC17xx.c“(位於MDK安裝目錄\Keil\ARM\Boards\Keil\MCB1700\RL\TCPnet\Library下)。
三.使用RL-TCPnet開發應用
RL-TCPnet既可以在RTOS上應用也可以”單獨“運行,因為RL-TCPnet本身就被設計成一個單獨的TCP/IP OS。使用RL-TCPnet可以開發DNS、FTP、HTTP、SNMP、Telnet等各類網路應用。
RL-TCPNet的移植與使用簡介