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