輕型PPP協(xié)議在μC/OS-II操作系統(tǒng)中的實現(xiàn)
OS_CPU_C.C中斷服務(wù)子程序的算法如下:
void XxxISR(void)
{OS_ENTER_CRITICAL()或直接給變量OSIntSum賦1;
清除中斷源(與具體的外設(shè)有關(guān));
通知中斷控制器中斷結(jié)束:VICVectAddr=0;
開中斷:OS_EXIT_CRITICAL();
用戶處理程序;}
OS_CPU_C.C中任務(wù)堆棧的初始化函數(shù)OSTaskStkInit()
OS_STK *OSTaskStkInit()
{模擬帶參數(shù)(pdata)的函數(shù)調(diào)用;
模擬ISR向量;
按照預(yù)先所設(shè)定的寄存器值初始化堆棧結(jié)構(gòu);
返回棧頂指針給調(diào)用該函數(shù)的函數(shù);}
3 輕型PPP協(xié)議的設(shè)計與實現(xiàn)
PPP協(xié)議軟件模塊主要通過各層協(xié)商機制完成數(shù)據(jù)鏈路的建立、配置、測試、以及在鏈路連接建立后,將收到的PPP數(shù)據(jù)幀解析,根據(jù)協(xié)議字段將數(shù)據(jù)信息交由不同的上層模塊進行處理;同時可根據(jù)系統(tǒng)的需要,將上層模塊傳來的信息打包成不同的PPP數(shù)據(jù)幀發(fā)送出去。
Main主模塊:該模塊控制著整個PPP守護進程的程序流程。當(dāng)PPP連接成功后,它使PPP守護進程進入休眠狀態(tài),一直到管理員斷開或者外部事件引起斷開時它負責(zé)斷開PPP連接。在PPP成功建立連接后,建立一個信號量,由PPP模塊處理任務(wù)不斷檢測這個信號量;若檢測到有調(diào)制解調(diào)器中斷復(fù)服務(wù)程序發(fā)來的信號量,則進行PPP數(shù)據(jù)幀的發(fā)送或接收。
LCP模塊:該階段是通過交換配置數(shù)據(jù)包來建立和配置數(shù)據(jù)鏈路,發(fā)送LCP REQ數(shù)據(jù)包,將會收到客戶端的發(fā)送過來的LCP ACK數(shù)據(jù)包,客戶端還要回REQ數(shù)據(jù)包,服務(wù)器端接受到LCP REQ后,則向客戶端同樣發(fā)送一個LCP ACK數(shù)據(jù)包,至此鏈路協(xié)商正式結(jié)束。
認證協(xié)商模塊(PAP):認證階段是可選的,如果在鏈路建立協(xié)商階段,服務(wù)器發(fā)送的第一個LCP REQ數(shù)據(jù)包中含有了認證的數(shù)據(jù)選項,而且其數(shù)據(jù)選項一直沒有被對方拒絕并且得到確認,則進入認證協(xié)商階段;否則,進入網(wǎng)絡(luò)層協(xié)商階段。
網(wǎng)絡(luò)層協(xié)商模塊(NCP):NCP協(xié)商的主要目的是服務(wù)器首先讓客戶端確認自身的IP地址,然后給客戶端動態(tài)分配一個合法的IP地址。網(wǎng)絡(luò)層協(xié)商 NCP每次請求數(shù)據(jù)包必須含有服務(wù)器端的IP選項,并且此選項最終被確認。在客戶端回送了對服務(wù)器端的確認數(shù)據(jù)包后,開始進入客戶端向服務(wù)器端申請動態(tài)分配IP地址的階段,所以客戶端繼續(xù)向服務(wù)器端發(fā)送含有客戶端IP地址且值為0的NCP REQ數(shù)據(jù)包,服務(wù)器端接受到這個數(shù)據(jù)包后,從IP地址池中取出一個合法的IP地址,發(fā)送了一個NCP NAK數(shù)據(jù)包。在該數(shù)據(jù)包中,客戶端IP地址的數(shù)據(jù)選項中填入了從IP地址池中取出的IP地址的值,即給客戶端動態(tài)的分配IP地址的值。隨后,客戶端將接收到的NCP NAK中的IP地址值作為下一次回送的NCP REQ中的客戶端的IP地址值的選項。當(dāng)服務(wù)器端再接收到此NCP REQ數(shù)據(jù)包后,便發(fā)送NCP ACK數(shù)據(jù)包,至此整個PPP協(xié)商過程結(jié)束,鏈路建立成功。
PPP模塊:在協(xié)商好網(wǎng)絡(luò)協(xié)議,可以進行數(shù)據(jù)的傳輸。為了更實時的進行數(shù)據(jù)傳輸,在這里為PPP協(xié)議模塊建立一個信號量,當(dāng)發(fā)生modem接受事件時,當(dāng)Modem接收到數(shù)據(jù)時引發(fā)處理器的外部中斷。在外部中斷0處理函數(shù)中,將接收到的數(shù)據(jù)存入串口緩沖區(qū)中,如果緩沖區(qū)的數(shù)據(jù)已組成了一個完整的 PPP數(shù)據(jù)幀,則由中斷服務(wù)子程序通過μC/OS-II所提供的OSSemPost()向任務(wù)PPP模塊任務(wù)發(fā)送一個信號量。
對PPP模塊任務(wù)來說,通過OSSemPend()函數(shù)等待由Modem中斷服務(wù)程序發(fā)出的信號量,當(dāng)接收到這個信號量后,說明有事件發(fā)生;再次判斷這個事件是什么事件,若是接送事件,則調(diào)用Receive()接收PPP數(shù)據(jù)幀,放到SRAM接收緩沖區(qū),若接收后,判斷接收緩沖區(qū)是否正確地接收到數(shù)據(jù),若正確地接收到PPP數(shù)據(jù)幀時,則調(diào)用PPPInput()進行對PPP數(shù)據(jù)幀的解析。若幀類型是IP則調(diào)用IP數(shù)據(jù)包的處理例程;若幀類型是LCP則調(diào)用LCP數(shù)據(jù)幀的處理例程;若幀類型是PAP、NCP則分別調(diào)用這兩種類型數(shù)據(jù)包的處理例程。若是發(fā)送事件,則調(diào)用 Send()發(fā)送PPP數(shù)據(jù)幀。
評論