藍牙局域網接入點的嵌入式實現
籃牙協議棧的設計主要包括:結構設計,重要數據結構的設計,任務的管理,內存的管理等等。
1) 結構設計:系統采用單進程的結構,由主程序循環的調用幾個任務。當一個任務執行完之后,才會進入對下一個任務的執行。任務的執行不影響中斷的產生和中斷服務程序的調用,可以保證系統對外部事件的響應,構成典型地前后臺系統。
2) 重要數據結構的確定:根據對藍牙協議的分析可知,協議的中心任務是建立和管理幾個藍牙設備之間的連接,建立通訊鏈路,并借此傳輸數據。因此對這種連接的建立,維護和參數管理是軟件最基本的功能。根據藍牙規范中連接的屬性和各種協議數據包的定義,可以確定對應的數據結構。例如可以用結構l2cap_con來描述邏輯鏈路控制和適配協議層的對等層間的連接通道。
struct l2cap_con {
BD_ADDR remote_bd; /* 6 bytes */
unsigned short local_cid;
unsigned short remote_cid;
int current_state;
unsigned short psm;
unsigned short remote_mtu;
unsigned short flush_timeout;
…
};
其中BD_ADDR是一個6字節的結構,記錄連接中另一方的藍牙地址,local_cid是邏輯信道本地端設備信道標示符,remote_con是遠端信道標示符,current_state表示目前的連接狀態,psm是協議/服務復用段,remote_mtu是遠端最大傳輸單位等等。還有其他一些變量用來說明這個連接的一些屬性和狀態。通過這個數據結構,可以描述在L2CAP 對等層間的數據通道。除了結構l2cap_con之外,還有許多用來描述各層協議數據包屬性的結構也都是系統的核心結構,這里不再詳細列出。
3) 任務管理:針對協議任務和事件數量多,并且之間相關性大的特點,使用有限狀態機的方法來處理,并采用過程驅動方案來實現有限狀態機,為每個輸入狀態啟動一個過程。當某一個事件發生時,系統利用當前狀態來選取一個適當的動作,該動作處理輸入事件并更新當前狀態變量值。如圖四所示是L2CAP的面向連接信道的狀態機,顯示了由哪一個事件導致狀態轉換,以及在狀態轉換時采取哪一個動作。信道的操作共有七個狀態:關閉、高層連接請求、L2CAP層連接請求、配置、打開、高層斷開連接請求、L2CAP層斷開連接請求。
4) 內存管理:內存管理通常是操作系統的核心任務之一,由于本系統沒有使用操作系統,所以這部分任務是系統必需而重要的任務。輸入的數據包必須被保存在內存中,并將其傳遞給適當的任務作進一步的處理。同時,應用程序產生的輸出數據也必須以數據包的形式存儲在內存中,并將其傳遞給硬件設備傳送出去。設計要做到快速分配存儲空間,并且避免數據包在各層協議之間移動時的數據復制。針對本系統處理的實際情況:藍牙協議數據報只有一些固定的大小的包類型,因此采用系統分配大小固定的緩沖區的方案。這樣作可以杜絕內存碎片。需要緩沖區的時候,系統調用allot_bt_buffer函數。只要緩沖區分配完成,需要保存的僅僅是指向緩沖區的指針,所以歸還緩沖區到空閑緩沖區列表的時候,系統調用unallot_bt_buffer,將被釋放的緩沖區的指針交還給它。采用這種方法,協議軟件只需傳遞指向該緩沖區的指針,處理過程統一,并且避免了處理過程中數據的移動。
從一般軟件設計分類的角度來看,設備管理和系統資源管理是操作系統的任務。在綜合考慮系統簡單性和成本等因素之后,本系統中沒有使用獨立的實時操作系統,而是由嵌入式軟件完成部分應該由操作系統完成的功能。
五. 結束語
本嵌入式局域網訪問點已可以應用于對機器人的遠程訪問上。如果將現有接入點進行適當改動和擴展,就能實現其他功能,例如給它擴展上一個語音解碼芯片后很容易擴展到語言信號的傳輸。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論