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