久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 一種嵌入式電網監測儀的實現方案

一種嵌入式電網監測儀的實現方案

作者: 時間:2011-07-24 來源:網絡 收藏

  2.2 改寫操作系統相關的函數

  sys_arch.c中具有與操作系統相關的一些結構和函數,主要可以分為三個部分。

  (1)進程間通信的函數

  函數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中的消息隊列。但是,μC/OS-II沒有對消息隊列中的消息進行管理,因此不能直接使用,必須在μC/OS-II的基礎上重新。而有一些mbox只可能有一個消息,可以用郵箱。另外函數sys_sem_free( )和sys_mbox_free( )不易實現,可以采用從空閑隊列中動態分配和回收的方法。

  (2)sys_arch_timeout( )

  LwIP中每個與外界網絡連接的線程都有自己的timeout屬性,即等待超時時間。這個屬性表現為:每個線程都對應一個sys_timeout結構體隊列,包括這個線程的timeout時間長度以及超時后應調用的timeout函數,該函數可以做一些釋放連接和回收資源的工作。如果一個線程對應的sys_timeout為空(NULL),說明該線程會對連接做永久的等待。

  (3)sys_thread_new( )

  LwIP可以是單線程運行,即只有一個tcpip線程(tcpip_thread),負責處理所有的tcp/ucp連接,各種網絡程序都通過tcpip線程與網絡交互。但LwIP也可以多線程運行,以提高效率,降低編程復雜度。

  創建新線程的函數為:

  void sys_thread_new(void(*thread)(void*arg),void*arg)

  在μC/OS-II中,沒有線程(thread)的概念,只有任務(task)。它已經提供了創建新任務的系統API調用OSTask-Create。因此,只要把OSTaskCreate封裝一下,就可以實現sys_thread_new。需要注意的是:LwIP中的thread并沒有μC/OS-II中優先級的概念,實現時要由用戶事先為LwIP中創建的線程分配好優先級。

  2.3 lib_arch中庫函數的實現

  在ARM SDT 2.開發環境下,gcc編譯器的lib庫里已經有了LwIP協議棧中系統CPU或編輯器有關的外部函數:strlen( )、strcmp( )、bcopy( )、bzero( ),只需要編寫htons( )、ntohs( )、htonl( )、ntohl( )即可。

  3 網絡設備驅動程序

  基于RTL8019AS網絡芯片驅動的編寫,主要是進行相關寄存器的設置。LwIP協議棧中,網絡接口層負責接收上層的IP數據報,裝配成不完整的物理幀后復制到控制器片內RAM中,并通過控制器發送到傳輸介質上,發送時由控制器裝配成完整的物理幀;或者將控制器中緩存的接收到的物理幀先復制到系統內存,然后抽出IP數據報,交給IP層進行處理。修改ethernetif.c文件,實現底層的輸入輸出。

  RTL8019AS是一種全雙工即插即用的以太網控制器,它在一塊芯片上集成了RTL8019內核和一個16KB的SDRAM存儲器。它兼容RTL8019控制軟件和NE2000 8bit或16bit的傳輸,支持UTP,AUI,BNC和PNP自動檢測模式,支持外接閃爍存儲器讀寫操作,支持I/O口地址的完全解碼,具有LED指示功能。

  3.1 網卡初始化函數

  void ethernetif_init(struct netif*netif)用于初始化網卡,在程序啟動之初被調用。這里主要完成網卡的復位操作以及通過對各個寄存器賦值,確定網卡的工作方式等。

  3.2 網卡發送函數

  函數err_t ethernetif_output(struct netif*netif,struct pbuf*p,struct ip_addr*ipaddr)為IP層傳來的IP報文加上以太網包頭并通過網絡接口發送。RTL8019AS使用遠端DMA將封裝好的以太網包寫到RTL8019AS內部的雙口RAM的發送緩沖環中,然后啟動本地DMA,網卡自動發送緩沖環里的數據到以太網。

  發送過程有三個步驟:數據包的封裝;通過遠程DMA將數據包送到數據發送緩沖區;通過RTL8019的本地DMA將數據送入FIFO進行發送。

  3.3 網卡接收函數

  函數void ethernetif_input(struct netif*netif)從網絡接口接收以太網數據包并把其中的IP報文向IP層發送。網卡對于以太網上目的地為該網卡的包會自動啟動本地DMA接收數據,并存放在RTL8019AS芯片內部RAM的接收緩沖環中,然后以中斷的方式通知CPU。此時該函數使用遠端DMA接收數據到系統的RAM當中。

  3.4 中斷處理函數

  void ethernetif_isr(void)處理網卡相關的中斷,RTL8019AS接收到數據后,就通過中斷入口把接收數據的工作交給函數ethernetif_input()來處理。

  在實時多任務環境中,一般采用中斷方式處理RTL8019AS的收發。圖1是一個典型中斷處理程序(ISR)的流程。當主程序響應RTL8019AS的中斷時,ISR的入口將根據讀取的中斷狀態寄存器(ISR)的值來確定程序的走向。

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


評論


相關推薦

技術專區

關閉