基于射頻識別技術的車輛路口通行系統設計
3. 軟件設計
為了實現TCP/IP通信,同時使系統盡可能地輕量和簡潔,本系統通過在uC/OS-II操作系統上移植LwIP協議棧加以實現。lwIP是瑞士計算機科學院的一個開源的TCP/IP協議棧實現,它是一套專門為嵌入式系統設計的源碼開放的輕型協議棧。LwIP在保持TCP/IP協議基本要求的前提下,通過層與層之間共享內存,避免了許多繁瑣的復制處理,這樣做大幅度地節省了代碼和數據存儲空間,因此非常適合嵌入式應用。與其他輕型協議棧不同的是,LwIP不僅支持一般的網絡協議,比如UDP協議、DHCP協議、PPP協議等,而且還支持多網絡接口、IPv6和標準API。
3.1 LwIP在uC/OS-II上的移植
針對uC/OS-II[6]和ARM的ADS編譯器,LwIP的移植只需要編寫arch文件夾下的3個文件——cc.h、sys_arch.h和sys_arch.c。其中cc.h中有與CPU和編譯器有關的定義,包括數據結構和大小端存儲方式等。為了增強移植性,LwIP專門把和操作系統有關的數據結構和函數放在一起組成操作系統封裝層,為諸如定時、進程同步和消息傳遞等操作系統服務提供統一的接口,移植時需針對不同的操作系統來實現特定的操作系統封裝層,這些是由sys_arch.h和sys_arch.c實現的。其中sys_arch.h主要定義與操作系統相關的數據結構——信號量、郵箱和進程號,這些在uC/OS-II中都有對應的實體,LwIP中的郵箱對應于uC/OS-II中的消息隊列。sys_arch.c中要實現和操作系統有關函數的定義,包括系統的初始化以及信號和郵箱的操作——創建、刪除、投遞和等待,這些功能需要用uC/OS-II中相應的函數進行重新封裝。另外,TCP/IP協議棧中需要許多定時器的功能,在LwIP中是用sys_timeout結構體隊列和相應的函數實現的。每個sys_timeout結構體包括本線程的timeout時間長度,以及超時后的回調處理函數sys_arch.c中sys_arch_timeouts()函數的功能就是返回當前進程所對應的sys_timeout結構體隊列的頭指針。本系統用的方法是在系統初始化的時候根據最大的LwIP進程數創建一個sys_timeout結構體指針的數組,以后每創建一個LwIP進程其優先級都從一個連續的已知區間進行分配,sys_arch_timeouts()函數通過調用OSTaskQuery()函數獲得進程的優先級進而獲得對應的sys_timeout結構體隊列的頭指針。
3.2 RTL8019驅動程序的編寫
RTL8019驅動程序做的工作主要是8019的初始化、發送和接收以太網數據包。初始化函數rtl8019_init()是在添加以太網絡接口時由netif_add()函數調用,調用過程中首先初始化此接口對應的全局網絡接口結構體,然后設置8019的各功能寄存器。初始化完8019之后調用arp_init()函數啟動ARP功能,然后用sys_timeout()函數啟動ARP緩沖列表生命周期的定時器。數據包的發送首先從ARP緩沖隊列中查找目的MAC地址,然后構造以太網數據幀的頭部,最后調用底層的發送函數low_level_output()將數據幀發送出去。如果找不到對應的IP/MAC項,發送ARP請求數據幀。數據包的接收由中斷[7]處理函數rtl8019_ISR()調用,它的執行過程是先調用最底層的接收函數low_level_input()從8019中接收數據幀,如果接收的是IP數據包,則更新ARP緩沖隊列并把數據包傳給網絡接口結構指定的函數進行處理。如果接收的是ARP數據包,則調用etharp_arp_input()函數處理。最底層的接收發送函數采用的都是8019的遠程DMA工作方式以提高性能[8]。
3.3 軟件框圖
圖4 讀卡器系統軟件框圖
信號機的響應級由監控中心的上位機設定,信號機可以在事先獲得授權的情況下自主改變燈色,如果事先未獲授權,或是同時收到多個不同標簽的請求,則信息必須送到監控中心處理,由監控中心的上位機判定優先級后發指令控制信號機的動作。監控中心還可以隨時獲得特定車輛的位置以及所在區域的路況等信息,通過合理改變區域內信號機的綠信比,達到區域協調控制的目的。
評論