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