a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 基于 LWIP 的嵌入式網絡系統設計和實現

基于 LWIP 的嵌入式網絡系統設計和實現

作者: 時間:2011-12-20 來源:網絡 收藏

ARM(Advanced RISC Machines)是目前在領域里應用最廣泛的 RISC 微處理器 結構,以低成本、低功耗、高性能的特點占據了系統應用領域的領先地位,已遍及工業控制、消費類電子產品、通信系統、、無線系統等各類產品市場。S3C2410 芯 片是由韓國 SAMSUNG 公司推出的 ARM920T 核的通用處理器,是為應用于小型掌上設備系統應用而提供的微控制解決方案。SMDK2410 開發板是 SAMSUNG 公司推出 的此芯片的示例板,其網絡部分使用的是 CS8900A 芯片。

本文引用地址:http://www.j9360.com/article/149961.htm

鑒于 ARM 處理器多方面的優勢,現在已有多款操作系統了對其的支持,包括 Linux、 VxWork、WinCE、C/OS-II 等。其中 C/OS-II 以其源碼公開、代碼精簡(全部僅 6000 余 行),高效穩定,移植性好,可裁剪等特點,正在不斷擴大影響力。但是,?C/OS-II 只提供 了基本的操作系統功能,例如進程調度、同步、進程通信等,卻不提供一般操作系統都提供的如文件系統、網絡等功能,一定程度上限制了其使用。

是開放源代碼的獨立TCP/IP協議棧,由瑞士計算機科學院的 Adam unkels 等開 發,其目的是在支持比較完整的TCP/IP協議的基礎上減少代碼尺寸,同時減少對存儲器的使 用量,并且其移植接口簡潔清晰,便于添加入其它操作系統中。

本文以SMDK2410開發板為硬件平臺,構建了一個以C/OS-II和為基礎的軟件系 統,并給出了一個在該系統上的網絡服務應用程序,從而了一個完整的嵌入式。

1 整體介紹 本嵌入式系統體系結構如圖1所示,在最終運行于SMDK2410開發板上的軟件實際上包含五部分,分別是:硬件初始化程序、用戶應用程序、C/OS-II操作系統、網絡協議 棧、CS8900A網卡驅動程序:

由于各部分相對的獨立性,為了能使其協同工作,要各個模塊之間的接口,這需要做五部分的工作

編寫SMDK2410開發板初始化代碼,在系統啟動后初始化硬件,為軟件提供運行 環境。

移植C/OS-II到SMDK2410開發板,即為C/OS-II添加硬件相關代碼。

移植LWIP到C/OS-II,即為LWIP實現與操作系統相關的接口函數。

編寫CS8900A網卡驅動支持LWIP,即為LWIP實現底層硬件數據接收功能。

LWIP和C/OS-II提供的系統函數,編寫用戶網絡應用程序。

2 軟件系統各部分介紹

2.1 初始化硬件平臺 初始化代碼的目的是使系統硬件環境處于一個合適的狀態,從而為執行操作系統做好準備,它是整個軟件系統最開始運行的程序。主要包括以下工作,由匯編文件 init.S 實現:

中斷向量表的建立:ARM要求中斷向量表必須放置在從0X0地址開始,連續4byte 的空間內。每當一個中斷發生以后,ARM處理器便強制把PC指針置為向量表中對 應中斷類型的地址值。中斷向量表的建立是通過一系列的跳轉指令b來完成的,一 般如下:

b

ResetHandler

//加電和復位處理函數的地址

b

HandlerIRQ

//通用中斷服務函數的地址

b

HandlerFIQ

//快速中斷處理函數的地址

……

內部寄存器的設置:主要完成對 S3C2410 芯片中的時鐘管理、電源管理(包括掉電與重啟處理)、內存管理等。這部分工作在 ResetHandler 處理函數中完成,以 下兩部分工作也是在此函數中實現的。

堆棧的初始化:因為 ARM 有 7 種執行狀態,每一種狀態的堆棧指針寄存器(SP) 都是獨立的。因此,對程序中需要用到的每一種模式都要給 SP 定義一個堆棧地址。 方法是改變狀態寄存器內的狀態位,使處理器切換到不同的狀態,然后給 SP 賦值。 注意:不要切換到 User 模式進行 User 模式的堆棧設置,因為進入 User 模式后就 不能再操作 CPSR 回到別的模式了,可能會對接下去的程序執行造成影響。

代碼的搬移:全部可執行代碼最初被燒寫在了硬件電路板中的只讀 NorFlash 中, 雖然 CPU 可以直接從中執行,但是速度較慢,所以,要將可執行的代碼搬移到系統 RAM 中,以提高運行速度。

程序跳轉:在初始化代碼的最后,會通過跳轉指令啟動軟件系統的 main()函數。

2.2 C/OS-II 在 S3C2410 芯片上的移植

C/OS-II 實際上可以看作是一個多任務的調度器,并提供了和多任務調度相關的一些 系統服務,如信號量、郵箱等,大部分代碼由 C 語言編寫,硬件獨立。相對于移植工作而言,除一些類型定義等工作外,主要集中在多任務切換的實現上,這需要依據特定處理器結 構使用匯編語言實現處理器現場的保護和恢復。全部工作包括在對三個與體系結構相關文件[1]的修改上,具體如下:

OS_CPU.H 文件:這個文件中包括了用#define 語句定義的、與處理器相關的常 數、宏以及數據類型。我們要根據具體的處理器和編譯器重寫,主要包括數據類型 的重新定義、堆棧單位和增長方向的設定,以及開關中斷的宏定義和任務切換的宏 定義。

OS_CPU_C.C 文件 :當 C/OS-II 進行任務切換或中斷時要保護 CPU 的寄存器 到任務堆棧,在這個文件中定義了該堆棧的初始化函數,即設定了要保護的每一個 寄存器在堆棧中,使堆棧如同中斷剛發生過一樣。此外還有一些 HOOK 函數,必須 聲明。

OS_CPU_A.S 文件:C/OS-II 是多任務實時操作系統,在進行任務調度時需要切換任務上下文,這些和處理器相關的任務切換函數在這個文件中定義,此外還有時 鐘中斷處理函數和進退臨界區宏指令也需要在此文件中實現。

2.3 LWIP 在 C/OS-II 上的移植

LWIP是獨立的TCP/IP協議棧,代碼中沒有使用和操作系統及硬件相關的函數與數據結構,而是當需要這樣的函數時,通過操作系統模擬層加以使用。操作系統模擬層向諸如定時 器、處理同步、消息傳送機制等的操作系統服務提供一套統一的接口。原則上,移植LWIP 到其他操作系統時,僅僅需要實現適合該操作系統的操作系統模擬層,它包括以下這些函數[2]:

sys_init() //初始化接口函數

sys_arch_timeouts() //定時器接口函數

sys_sem_new() //創建信號量接口函數

sys_sem_signal() //發送信號量接口函數

sys_arch_sem_wait() //等待信號量接口函數

sys_sem_free() //釋放信號量接口函數

sys_mbox_t sys_mbox_new() //創建消息郵箱接口函數

sys_mbox_post() //發送消息接口函數

sys_arch_mbox_fetch() //取得消息接口函數

sys_mbox_free() //釋放消息郵箱接口函數

sys_thread_new() //創建線程接口函數

這些函數的實現,基本上是根據 ?C/OS-II 操作系統的相關數據結構,重定義這些函數 中的數據結構如 sys_sem_t、sys_mbox_t 等,再封裝 ?C/OS-II 操作系統相應的系統調用函 數來完成的。以接口函數 sys_sem_new()為例,其實現如下:

sys_sem_t sys_sem_new(u8_t count)

{

sys_sem_t pSem;

pSem = OSSemCreate((u16_t)count );

return pSem;

}

在 LWIP 中使用的這個信號量創建函數,可以看到是通過封裝 ?C/OS-II 操作系統的信號 量創建函數 OSSemCreate()來完成的,其中使用的數據結構 sys_sem_t 也被重定義如下:

typedef OS_EVENT* sys_sem_t;

其中數據結構 OS_EVENT 同樣為 C/OS-II 操作系統所有,其它函數的實現與此類似,不再重復。

此外,為支持操作系統模擬層,還需要建立 cc.h 、perf.h 文件,完成與 CPU 或編譯器 相關的定義,如數據長度、字的高低位順序等,這些應該與實現 C/OS-II 時相一致。

2.4 CS8900A 芯片驅動程序對 LWIP 的支持對于 LWIP 來說,它同樣為網絡驅動提供了一個移植接口,它使用 netif 數據結構代表 網絡驅動層,此數據結構部分如下:

struct netif {

struct netif *next;

err_t (* input)(struct pbuf *p, struct netif *inp);

err_t (* output)(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr);

err_t (* linkoutput)(struct netif *netif, struct pbuf *p);

……

};

LWIP 和網絡驅動程序會共用一個這樣的數據結構,從而實現了兩者的聯系。其中

output( )函數提供給 LWIP 的 IP 模塊,linkoutput( )函數提供給 LWIP 的 ARP 模塊。LWIP 的

驅動編寫 示例 [3] 指出, output( ) 函封裝 了 LWIP 中 ARP 模塊的數據 發送函 數 etharp_output( ),此函數最終會調用到 linkoutput( )函數,即 linkoutput( )函數是實際的數 據發送函數(這個函數由網絡驅動程序實現)。另一方面,當網絡驅動的中斷處理函數接收到一個數據包后,也會調用此結構中的 input( )函數(這個函數由 LWIP 實現),將數據轉交給 LWIP。接口結構[4]如圖 2 所示:

具體在為 LWIP 編寫網絡驅動程序時我們要實現以下函數:

初始化函數:init( )

在這個函數里,主要的任務就是初始化數據結構 netif,包擴硬件地址、最大傳輸 單元 mtu 和 state(指向設備驅動中網絡接口的特定狀態)以及 output( )函數、linkoutput( )函數和 input( )函數等。

數據發送函數:output( )

此函數只是簡單的封裝了 LWIP 中 ARP 模塊的數據發送函數 etharp_output( )。

數據發送函數:linkoutput( )

這是真正的網卡數據發送函數,output( )函數最終會調用到此函數。它將上層傳遞 來的數據轉移到 CS8900A 網卡芯片上,使網卡將數據發送到網絡上。

中斷函數:net_isr( )

CS8900A 芯片將其要求的所有中斷事件放在中斷狀態隊列寄存器 ISQ 中,所以當 其產生中斷要求 CPU 處理時,中斷處理函數要循環處理 CS8900A 芯片的 ISQ,判斷 中斷事件類型,然后做相應處理。例如,如果是數據接收事件,則將數據從網卡中轉移到內存,在必要處理后,調用 netif 中的 input( )函數將數據遞交給 LWIP 層。 整體驅動程序由 CS8900A.c 實現,簡要流程圖[5]如圖 3 所示:

3 應用

在完成上述工作后,一個嵌入式的軟件平臺基本完成。在這樣的一個軟件平臺 上,通過調用 LWIP 提供的函數,即可以開發網絡應用程序。本文編寫了一個 web 服務器應 用程序,將主機與 SMDK 開發板連入局域網環境下,從主機 IE 瀏覽器敲入 SMDK2410 開發板 IP 地址后,可瀏覽 SMDK2410 開發板提供的 http 網頁,如圖 4 所示。

4 結束語

目前,基于 S3C2410 芯片的 SMDK2410 開發板在國內嵌入式教育領域正得到越來越 廣泛的使用,本文給出了基于此硬件平臺的 ?C/OS-IILWIP 完整移植方案,構建了一個嵌 入式網絡實驗系統,并強調了硬件平臺初始化和網卡芯片驅動程序的移植和實現,使得最終的軟件系統可實際工作。同時,由于移植的相似性,可以較容易的修改代碼將其移植到其它 不同類型的開發板中運行,為基于 ?C/OS-II 和 LWIP 的網絡研究和應用提供了基礎。

linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


評論


相關推薦

技術專區

關閉