




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、自己做的ARM的UDP通信實驗【摘要】利用基于嵌入式實時操作系統(tǒng)C/OS-II的ZLG/IP軟件包,利用實驗板光盤提供的UDPtest軟件可以實現(xiàn)實驗板跟PC機的數(shù)據(jù)收發(fā)。目 錄第1章 硬件實現(xiàn)11.1RTL8019AS網(wǎng)絡(luò)控制器介紹1第2章 µC/OS-II操作系統(tǒng)32.1µC/OS-II系統(tǒng)簡介32.2µC/OS-II的特點32.3任務(wù)模式32.4支持的指令集42.5移植µC/OS-II4第3章 ZLG/IP軟件包結(jié)構(gòu)和配置63.1ZLG/IP軟件包結(jié)構(gòu)6第4章 設(shè)計過程84.1設(shè)計步驟84.2實驗程序10宏定義10RTL8019AS監(jiān)聽任務(wù)11UD
2、P通信程序12創(chuàng)建系統(tǒng)任務(wù)并初始化14主程序15定時器中斷控制16第5章 實驗結(jié)果19第6章 課程設(shè)計體會21第1章 硬件實現(xiàn)1.1 RTL8019AS網(wǎng)絡(luò)控制器介紹RTL8019AS是一種全雙工即插即用的以太網(wǎng)控制器,它在一塊芯片上集成了RTL8019內(nèi)核和一個16KB的SDRAM存儲器。它兼容RTL8019控制軟件和NE2000 8bit或16bit的傳輸,支持UTP,AUI,BNC和PNP自動檢測模式,支持外接閃爍存儲器讀寫操作,支持I/O口地址的完全解碼,具有LED指示功能。其接口符合Ethernet2和IEEE802.3(10Base5,10Base2,10BaseT)標(biāo)準(zhǔn)。RTL8
3、019AS采用100腳PQFP封裝,其主要引角功能如下:引角14,97100:中斷控制INT0-7;引角33:復(fù)位控制;引腳34:使能控制角AEN,低電平有效;引腳6,7,70,89:數(shù)字電源,5V;引腳14,28,83,86:數(shù)字地GND;引腳47,57:模擬電源:5V;引腳44,52:模擬地;引腳713,15,16,1827:ISA地址總線;引腳3643,87,88,9095:ISA數(shù)據(jù)總線;引腳31:Boot ROM讀操作控制;引腳32:Boot ROM寫操作控制;引腳62:RX接收數(shù)據(jù)顯示LED1腳;引腳63:TX發(fā)送數(shù)據(jù)顯示LED2腳;引腳58,59:接收數(shù)據(jù)TP IN+/-;引腳4
4、5,46:發(fā)送數(shù)據(jù)TP OUT+/-;引腳50,51:外接晶體。圖 1 RTL8019AS接線圖第2章 µC/OS-II操作系統(tǒng)2.1 µC/OS-II系統(tǒng)簡介µC/OS-II讀做“microCOS2”,意為“微控制器操作系統(tǒng)版本2”。µC/OS-II是著名的、源碼公開的實時內(nèi)核,可用于各類8位、16位和32位單片機、arm或 DSP等等。µC/OS-II是一個完整的、可移植、可固化、可剪裁的占先式實時多任務(wù)內(nèi)核。應(yīng)用程序處于整個系統(tǒng)的頂層.每個任務(wù)都可以認(rèn)為自己獨占了CPU,因而可以設(shè)計成為一個無限循環(huán)。2.2 µC/OS-II的特
5、點l 可移植性(portable)l 可固化(ROMmable) l 可剪裁(scalable) l 可剝奪(preemptive) l 多任務(wù)l 可確定性l 任務(wù)棧l 系統(tǒng)服務(wù)l 中斷管理l 穩(wěn)定性與可靠性多任務(wù)是指:µC/OS-II可以管理 64個任務(wù),然而,µC/OS-II的作者建議用戶保留 8 個給µC/OS-II。這樣,留給用戶的應(yīng)用程序最多可有 56 個任務(wù)。系統(tǒng)服務(wù)指:µC/OS-II提供很多系統(tǒng)服務(wù),例如信號量、互斥信號量、時間標(biāo)志、消息郵箱、消息隊列、塊大小固定的內(nèi)存的申請與釋放及時間管理函數(shù)等。中斷管理指:中斷可以使正在執(zhí)行的任務(wù)暫時
6、掛起,如果優(yōu)先級更高的任務(wù)被中斷喚醒,則高優(yōu)先級的任務(wù)在中斷嵌套全部退出后立即執(zhí)行,中斷嵌套層數(shù)可達 255 層。2.3 任務(wù)模式ARM7 處理器核具有用戶、系統(tǒng)、管理、中止、未定義、中斷和快中斷七種模式 。用戶模式(USER MODE)是ARM 通常執(zhí)行狀態(tài),用于執(zhí)行大多數(shù)應(yīng)用程序;快速中斷模式(FIQ MODE)支持?jǐn)?shù)據(jù)傳輸或通道處理;中斷模式(IRQ MODE)用于通用中斷處理;超級用戶模式(SVC MODE)是一種操作系統(tǒng)受保護的模式:數(shù)據(jù)中止模式(ABT MODE)指令預(yù)取指中止、數(shù)據(jù)中止時進入該模式;未定義模式(UND MODE)當(dāng)執(zhí)行未定義的指令時進入該模式;系統(tǒng)模式(SYS M
7、ODE)是操作系統(tǒng)一種特許的用戶模式。除了用戶模式之外,其他模式都?xì)w為特權(quán)模式,特權(quán)模式用于中斷服務(wù)、異?;蛘咴L問受保護的資源特權(quán)模式中除系統(tǒng)模式之外另5種模式又稱為異常模式,在移植過程中必須設(shè)置中斷向量表來處理異常。uCOS II的移植主要處理標(biāo)準(zhǔn)中斷(IRQ)、快速中斷(FIQ)和軟件中斷(SWI)。2.4 支持的指令集帶T變量的ARM7處理器核具有兩個指令集:標(biāo)準(zhǔn)32位ARM指令集和16位 Thumb指令集,兩種指令集有不同的應(yīng)用范圍,µC/OS-II包含了這些指令集的切換(TaskIsARM()和 TaskIsTHUMB()用于改變指令集)。2.5 移植µC/OS-
8、IIµC/OS-II 要求所有.C 文件的都要包含都文件includes.h,這樣使得用戶項目中的每個.C文件不用分別去考慮它實際上需要哪些頭文件。使用includes.h的缺點是它可能會包含一些實際不相關(guān)的頭文件,這意味著每個文件的編譯時間可能會增加,但卻增強了代碼的可移植性。在本移植中另外增加了一個頭文件config.h,我們要求所有用戶程序必須包含config.h,在config.h中包含 includes.h 和特定的頭文件和配置項。而µC/OS-II 的系統(tǒng)文件依然只是包含 includes.h,即µC/OS-II 的系統(tǒng)文件完全不必改動。所有的配置改變
9、包括頭文件的增減均在config.h中進行,而includes.h定下來后不必改動(µC/OS-II 的系統(tǒng)文件需要包含的東西是固定的)。這樣,µC/OS-II 的系統(tǒng)文件需要編譯的次數(shù)大大減少,編譯時間隨之減少。µCOS-II 不使用C語言中的 short、int、long等數(shù)據(jù)類型的定義,因為它們與處理器類型有關(guān),隱含著不可移植性。代之以移植性強的整數(shù)數(shù)據(jù)類型,這樣,既直觀又可移植。在使用周立功提供的µC/OS-II模板的任何功能之前,必須調(diào)用函數(shù)OSInit(),它完成µC/OS-II的初始化并建立空閑任務(wù)。在開始多任務(wù)之前,必須建立至少
10、一個用戶任務(wù)(不包括µC/OS-II的空閑任務(wù)),這是通過調(diào)用函數(shù)OSTaskCreate()或函數(shù)OSTaskCreateExt()實現(xiàn)。最后函數(shù)main()調(diào)用函數(shù) OSStart()將控制權(quán)交給µC/OS-II內(nèi)核main()函數(shù)也就結(jié)束了。µC/OS-II應(yīng)用程序主函數(shù)如下:程序清單 1int main (void) OSInit(); /初始化 uC/OS-II OSTaskCreate(TaskStart,(void *)0, &TaskStartStk127, 3);/創(chuàng)建起動任務(wù) OSStart(); /開始多任務(wù)第3章 ZLG/IP軟件包
11、結(jié)構(gòu)和配置3.1 ZLG/IP軟件包結(jié)構(gòu)為了使軟件可移植性強、易維護,該軟件包采用分層的方法編寫。包括網(wǎng)絡(luò)傳輸用到的協(xié)議、硬件驅(qū)動及C/OS-II的結(jié)構(gòu)進行分層。ZLG/IP包相關(guān)文件說明如表格 1 表格 1 軟件包相關(guān)文件說明文件名簡要說明ARP.C地址解析協(xié)議CRC.C循環(huán)冗余碼校驗Ethernet.C以太網(wǎng)標(biāo)準(zhǔn)HARDWARE.C硬件驅(qū)動IP.C網(wǎng)絡(luò)互聯(lián)協(xié)議ICMP.C因特網(wǎng)控制消息協(xié)議Socket.C本地端口協(xié)議TCP.C傳輸控制協(xié)議UDP.C用戶數(shù)據(jù)包協(xié)議傳輸層有兩個協(xié)議傳輸數(shù)據(jù):傳輸控制協(xié)議TCP和用戶數(shù)據(jù)報協(xié)議UDP。TCP協(xié)議是面向連接的一個協(xié)議,可靠性高,費用也高;UDP協(xié)議
12、是提供最少服務(wù)和費用的傳輸層協(xié)議。UDP是最簡單的傳輸層協(xié)議,它具有以下特點:l 無連接:UDP不基于連接來傳輸數(shù)據(jù)。l 不可靠:UDP的數(shù)據(jù)報發(fā)送時沒有定序,所以UDP傳送的數(shù)據(jù)是不可靠的,只有靠應(yīng)用層協(xié)議中增加超時重發(fā)等功能才能提供可靠的服務(wù)。l 提供應(yīng)用層協(xié)議標(biāo)識:UDP報頭有定義應(yīng)用層協(xié)議標(biāo)識和目標(biāo)應(yīng)用層標(biāo)識。l 提供UDP報的校驗和:UDP報頭包含有整個UDP報(包括報頭和有效負(fù)載)及偽報頭的校驗和,計算方法與計算IP數(shù)據(jù)報校驗和的計算方法相同。l 緩沖:UDP協(xié)議不提供任何數(shù)據(jù)接收或發(fā)送的緩沖區(qū)。緩沖區(qū)應(yīng)該由應(yīng)用層協(xié)議提供。l 分段:UDP協(xié)議不提供分段傳輸方式,所以應(yīng)用層協(xié)議要盡
13、量發(fā)送小的包。SOCKET接口函數(shù)是TCP/IP的API。使用SOCKET API函數(shù)編寫UDP通信的任務(wù)時,分為服務(wù)器方式兩種。服務(wù)器方式是先接收到數(shù)據(jù)再進行處理,而客戶機則是先發(fā)生數(shù)據(jù)后等待回應(yīng)處理,它們用到的SOCKET API函數(shù)都是相同的。如圖 2所示就是UDP通信時服務(wù)器端和客戶機通信函數(shù)應(yīng)用過程圖。圖 2 UDP通信是SOCKET API函數(shù)的應(yīng)用第4章 設(shè)計過程4.1 設(shè)計步驟由于使用DM9000的網(wǎng)絡(luò)控制芯片的Magic2200的實驗箱有點問題,后來我們改用使用RTL8019AS網(wǎng)絡(luò)控制芯片的EasyARM2200教學(xué)實驗平臺。1) 啟動ADS1.2,使用ARM Execut
14、able Image for µCOS-II(lpc22xx)工程模板建立一個工程shiyan。2) 把µCOS-II內(nèi)核源碼和移植文件,ZLG/IP軟件包目錄拷貝到已建工程目錄下,如圖 3所示,arm目錄為移植文件目錄,Source目錄為µCOS-II內(nèi)核源碼,tcpip目錄為ZLG/IP軟件包目錄。圖 3 項目目錄結(jié)構(gòu)3) 修改tcpipincludecfg_net.h文件,修改MAC地址為:0x00,0x14,0x97,0x0F,0x1F,0x9D。如程序清單 2程序清單 2 MAC和IP設(shè)置/* first Net Port Config */#defin
15、e My_Mac_1ID 0x00,0x14,0x97,0x0F,0x1F,0x9D /將RTL8019的物理地址存儲在程序空間?#define IP_MARK_1ID 255,255,0,0 /255.255.255.0,子網(wǎng)掩碼#define MY_IP_1ID 172,30,172,77#define MY_GATEWAY_1ID 172,30,172,125/*End Net Port Config */4) 修改shiyansrcos_cfg.h文件,OS_MAX_EVENTS改為42,OS_LOWEST_PRIO改為62,OS_MAX_QS改為10。5) 在ADS的項目窗口中添加T
16、CPIP的文件組;然后把tcpip目錄下的ARPArp.c、ETHERNETEthernet.c、HARDWAREHardware.c、IPIp.c、PINGIcmp.c、SOCKETzlg_socket.c和TCPTcp.c、UDPUdp.c等文件添加到該文件組,最后把程序編好添加到ADS項目窗口的user文件組中,如圖 4 shiyan工程窗口6) 在Startup.s文件的ResetInit子程序中,修改存儲器接口Bank3總線配置,如程序清單程序清單 3 存儲器接口Bank3總線配置LDR R0, =BCFG3 ;設(shè)置BCFG3寄存器LDR R1, =0x10001460STR R1,
17、 R0 4.2 實驗程序4.2.1 宏定義首先對程序進行初始化宏定義,如程序清單 4程序清單 4 初始化宏定義#include "config.h"#include "./include/cfg_net.h"void Timer1_Init(void);#define TASK_START_ID 0 #define TASK_1_ID 1#define TASK_2_ID 2#define TASK_3_ID 3#define TASK_4_ID 4#define TASK_5_ID 5#define TASK_6_ID 6#define TASK_ST
18、ART_PRIO 10 #define TASK_1_PRIO 11#define TASK_2_PRIO 12#define TASK_3_PRIO 13#define TASK_4_PRIO 14#define TASK_5_PRIO 15#define TASK_6_PRIO 16#define MSG_QUEUE_SIZE 20 OS_EVENT *RecPackedFlag; OS_EVENT *RecBufOverFlowFlag;OS_EVENT *RecTcpPackedFlag;OS_EVENT *RecPingPackedFlag;OS_STK task0_stack300
19、0;OS_STK task1_stack1000;OS_STK task2_stack2000;OS_STK task3_stack1000;OS_STK task4_stack2000;4.2.2 RTL8019AS監(jiān)聽任務(wù)網(wǎng)絡(luò)控制器監(jiān)聽程序,如程序清單 5程序清單 5 網(wǎng)卡監(jiān)聽任務(wù)void TaskB(void *pdata) /重要的監(jiān)聽RTL8019AS任務(wù)void * UdpTemp;uint8 eer; while (1) UdpTemp=OSQPend(RecUdpQFlag,0,&eer); if(eer=OS_NO_ERR)Udp_Process(Rec_Ptr *)
20、UdpTemp);eer=eer; 4.2.3 UDP通信程序UDP通信程序見程序清單 6程序清單 6 UDP服務(wù)器void TaskD(void *pdata) uint8 add36="ZLGMCUyhbabcdefghijklmnopqrstuvwxyz"/當(dāng)接收到“A”時發(fā)送的數(shù)據(jù)uint8 add110="123456789"/當(dāng)出錯是發(fā)送的數(shù)據(jù)uint8 rec_buffer100; /發(fā)送緩存區(qū)SOCKETs; uint8 couter_byte=5; /重復(fù)發(fā)送的次數(shù)int rec_coute,send_coute;uint16 iii;
21、struct sockaddr servaddr,clientaddr;OSTimeDly(60);servaddr.sin_family=0; /設(shè)置客戶機IPservaddr.sin_addr0=172;servaddr.sin_addr1=30;servaddr.sin_addr2=172;servaddr.sin_addr3=125;servaddr.sin_port=1026; /設(shè)置服務(wù)器端口號 OSTimeDly(60); s=*socket( 0, SOCK_DGRAM, UDP_PROTOCOL);/建立SOCKET clientaddr.sin_family=0; /設(shè)置本
22、地IPclientaddr.sin_addr0=172;clientaddr.sin_addr1=30;clientaddr.sin_addr2=172;clientaddr.sin_addr3=77;clientaddr.sin_port=1025; /設(shè)置本地監(jiān)聽端口號iii=bind( (SOCKET * )&s, (struct sockaddr*)&clientaddr,sizeof(clientaddr); /綁定服務(wù)器地址 while (1) rec_coute=recvfrom( s, rec_buffer, 100, 0, (struct sockaddr*)
23、&servaddr, &iii ); /接收數(shù)據(jù)if(rec_coute>0)if(rec_buffer0='A') /如果第一個數(shù)據(jù)是“A”couter_byte=5;elsesend_coute=sendto(s, rec_buffer, rec_coute, 0, (struct sockaddr*)&servaddr, sizeof(servaddr) ); /把接收的數(shù)據(jù)返回while(couter_byte!=0) /循環(huán)發(fā)送數(shù)據(jù)send_coute=sendto(s, add, 34, 0, (struct sockaddr*)&am
24、p;servaddr, sizeof(servaddr) ); if(send_coute=34)OSTimeDly(40);elsesend_coute=sendto(s, add1, 9, 0, (struct sockaddr*)&servaddr, sizeof(servaddr) ); /出錯后發(fā)送的數(shù)據(jù)OSTimeDly(40);couter_byte-; 4.2.4 創(chuàng)建系統(tǒng)任務(wù)并初始化創(chuàng)建系統(tǒng)任務(wù)并初始化如程序清單 7程序清單 7 系統(tǒng)任務(wù)void task0(void *pdata) /*在第1個任務(wù)中設(shè)置定時器0及中斷*/ UBYTE iii; #if OS_CRI
25、TICAL_METHOD = 3 OS_CPU_SR cpu_sr;#endifTargetInit(); OSTaskCreateExt(TaskB, /重要的監(jiān)聽RTL8019AS任務(wù) (void *)0, &task1_stack999, TASK_1_PRIO, TASK_1_ID, &task1_stack0, 1000, (void *)0, 0); OSTaskCreateExt(TaskD, /接受數(shù)據(jù)和發(fā)送數(shù)據(jù) (void *)0, &task3_stack999, TASK_3_PRIO, TASK_3_ID, &task3_stack0,
26、1000, (void *)0, 0); SetNetPort();InitNic(0);/RTL8019芯片初始化,在global.c中定義Initial_arp();Tcp_Initial(); Udp_Initial(); while(1) OSTimeDly(4);do iii=Rec_Packet();while(iii!=0); void Uart_SendChar(INT8U data) while(U0LSR & 0x00000020) = 0); U0THR = data;4.2.5 主程序程序清單 8 主程序int main (void)UBYTE iii;Time
27、r1_Init(); OSInit(); OSTaskCreateExt(task0, (void *)0, &task0_stack2999, TASK_START_PRIO, TASK_START_ID, &task0_stack0, 3000, (void *)0, 0); RecPackedFlag=OSSemCreate(0);RecBufOverFlowFlag=OSSemCreate(0);RecTcpPackedFlag=OSSemCreate(0);RecPingPackedFlag=OSSemCreate(0);SendFlag=OSSemCreate(1)
28、;RecIcmpQFlag=OSQCreate(&RecIcmpQ0,Q_Max_Size);RecTcpQFlag=OSQCreate(&RecTcpQ0,Q_Max_Size);RecUdpQFlag=OSQCreate(&RecUdpQ0,Q_Max_Size); OSStart(); 4.2.6 定時器中斷控制程序清單 9 中斷控制void Timer1_Init(void)OS_ENTER_CRITICAL(); T1IR = 0xffffffff; T1TC = 0; T1TCR = 0x01; T1MCR = 0x03; T1MR0 = 0xffffff;OS_EXIT_CRITICAL(); void Timer1(void)static uint8 m_10sec=0;stat
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 云計算HCIP??荚囶}與參考答案
- 個人借款申請書范文
- 業(yè)務(wù)員年度工作計劃
- 企業(yè)弱電維護合同范本
- 三八婦女節(jié)護士愛崗敬業(yè)的演講稿
- 南通批發(fā)市場用電合同范本
- 醫(yī)院房子出售合同范本
- 臺球俱樂部采購合同范本
- 南京租房陰陽合同范例
- 區(qū)域 加盟 合同范本
- 戶外廣告制作安裝合同模板
- 2025年國家自然科學(xué)基金委員會招聘流動編制人員59人歷年高頻重點模擬試卷提升(共500題附帶答案詳解)
- 2024年義務(wù)教育2022年版《道德與法治課程標(biāo)準(zhǔn)》真題庫附答案
- 志愿服務(wù)證明(多模板)
- 大學(xué)生創(chuàng)新創(chuàng)業(yè)教程PPT全套完整教學(xué)課件
- 山東建筑電氣與智能化疑難問題分析與解答
- 2022年鄭州衛(wèi)生健康職業(yè)學(xué)院單招英語模擬試題(附答案解析)
- Q∕GDW 10354-2020 智能電能表功能規(guī)范
- 土壤學(xué)習(xí)題與答案
- 觀摩臺標(biāo)準(zhǔn)化建設(shè)方案
- 數(shù)字化影像與PACS教學(xué)大綱
評論
0/150
提交評論