一種嵌入式電網(wǎng)監(jiān)測儀的實現(xiàn)方案
2.2 改寫操作系統(tǒng)相關的函數(shù)
sys_arch.c中具有與操作系統(tǒng)相關的一些結構和函數(shù),主要可以分為三個部分。
?。?)進程間通信的函數(shù)
函數(shù)sys_sem_new( )、sys_sem_free( )、sys_sem_signal( )、sys_arch_sem_wait( )、sys_mbox_new( )、sys_mbox_free( )、sys_mbox_post( )、sys_arch_mbox_fetch( )的功能在μC/OS-II中基本都有,但要注意這里的mbox要用μC/OS-II中的消息隊列實現(xiàn)。但是,μC/OS-II沒有對消息隊列中的消息進行管理,因此不能直接使用,必須在μC/OS-II的基礎上重新實現(xiàn)。而有一些mbox只可能有一個消息,可以用郵箱實現(xiàn)。另外函數(shù)sys_sem_free( )和sys_mbox_free( )不易實現(xiàn),可以采用從空閑隊列中動態(tài)分配和回收的方法。
(2)sys_arch_timeout( )
LwIP中每個與外界網(wǎng)絡連接的線程都有自己的timeout屬性,即等待超時時間。這個屬性表現(xiàn)為:每個線程都對應一個sys_timeout結構體隊列,包括這個線程的timeout時間長度以及超時后應調(diào)用的timeout函數(shù),該函數(shù)可以做一些釋放連接和回收資源的工作。如果一個線程對應的sys_timeout為空(NULL),說明該線程會對連接做永久的等待。
(3)sys_thread_new( )
LwIP可以是單線程運行,即只有一個tcpip線程(tcpip_thread),負責處理所有的tcp/ucp連接,各種網(wǎng)絡程序都通過tcpip線程與網(wǎng)絡交互。但LwIP也可以多線程運行,以提高效率,降低編程復雜度。
創(chuàng)建新線程的函數(shù)為:
void sys_thread_new(void(*thread)(void*arg),void*arg)
在μC/OS-II中,沒有線程(thread)的概念,只有任務(task)。它已經(jīng)提供了創(chuàng)建新任務的系統(tǒng)API調(diào)用OSTask-Create。因此,只要把OSTaskCreate封裝一下,就可以實現(xiàn)sys_thread_new。需要注意的是:LwIP中的thread并沒有μC/OS-II中優(yōu)先級的概念,實現(xiàn)時要由用戶事先為LwIP中創(chuàng)建的線程分配好優(yōu)先級。
2.3 lib_arch中庫函數(shù)的實現(xiàn)
在ARM SDT 2.開發(fā)環(huán)境下,gcc編譯器的lib庫里已經(jīng)有了LwIP協(xié)議棧中系統(tǒng)CPU或編輯器有關的外部函數(shù):strlen( )、strcmp( )、bcopy( )、bzero( ),只需要編寫htons( )、ntohs( )、htonl( )、ntohl( )即可。
3 網(wǎng)絡設備驅動程序
基于RTL8019AS網(wǎng)絡芯片驅動的編寫,主要是進行相關寄存器的設置。LwIP協(xié)議棧中,網(wǎng)絡接口層負責接收上層的IP數(shù)據(jù)報,裝配成不完整的物理幀后復制到控制器片內(nèi)RAM中,并通過控制器發(fā)送到傳輸介質上,發(fā)送時由控制器裝配成完整的物理幀;或者將控制器中緩存的接收到的物理幀先復制到系統(tǒng)內(nèi)存,然后抽出IP數(shù)據(jù)報,交給IP層進行處理。修改ethernetif.c文件,實現(xiàn)底層的輸入輸出。
RTL8019AS是一種全雙工即插即用的以太網(wǎng)控制器,它在一塊芯片上集成了RTL8019內(nèi)核和一個16KB的SDRAM存儲器。它兼容RTL8019控制軟件和NE2000 8bit或16bit的傳輸,支持UTP,AUI,BNC和PNP自動檢測模式,支持外接閃爍存儲器讀寫操作,支持I/O口地址的完全解碼,具有LED指示功能。
3.1 網(wǎng)卡初始化函數(shù)
void ethernetif_init(struct netif*netif)用于初始化網(wǎng)卡,在程序啟動之初被調(diào)用。這里主要完成網(wǎng)卡的復位操作以及通過對各個寄存器賦值,確定網(wǎng)卡的工作方式等。
3.2 網(wǎng)卡發(fā)送函數(shù)
函數(shù)err_t ethernetif_output(struct netif*netif,struct pbuf*p,struct ip_addr*ipaddr)為IP層傳來的IP報文加上以太網(wǎng)包頭并通過網(wǎng)絡接口發(fā)送。RTL8019AS使用遠端DMA將封裝好的以太網(wǎng)包寫到RTL8019AS內(nèi)部的雙口RAM的發(fā)送緩沖環(huán)中,然后啟動本地DMA,網(wǎng)卡自動發(fā)送緩沖環(huán)里的數(shù)據(jù)到以太網(wǎng)。
發(fā)送過程有三個步驟:數(shù)據(jù)包的封裝;通過遠程DMA將數(shù)據(jù)包送到數(shù)據(jù)發(fā)送緩沖區(qū);通過RTL8019的本地DMA將數(shù)據(jù)送入FIFO進行發(fā)送。
3.3 網(wǎng)卡接收函數(shù)
函數(shù)void ethernetif_input(struct netif*netif)從網(wǎng)絡接口接收以太網(wǎng)數(shù)據(jù)包并把其中的IP報文向IP層發(fā)送。網(wǎng)卡對于以太網(wǎng)上目的地為該網(wǎng)卡的包會自動啟動本地DMA接收數(shù)據(jù),并存放在RTL8019AS芯片內(nèi)部RAM的接收緩沖環(huán)中,然后以中斷的方式通知CPU。此時該函數(shù)使用遠端DMA接收數(shù)據(jù)到系統(tǒng)的RAM當中。
3.4 中斷處理函數(shù)
void ethernetif_isr(void)處理網(wǎng)卡相關的中斷,RTL8019AS接收到數(shù)據(jù)后,就通過中斷入口把接收數(shù)據(jù)的工作交給函數(shù)ethernetif_input()來處理。
在實時多任務環(huán)境中,一般采用中斷方式處理RTL8019AS的收發(fā)。圖1是一個典型中斷處理程序(ISR)的流程。當主程序響應RTL8019AS的中斷時,ISR的入口將根據(jù)讀取的中斷狀態(tài)寄存器(ISR)的值來確定程序的走向。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論