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