當前位置:首頁 > 電源 > 數(shù)字電源
[導讀]1 引言 PXA270 是Intel 公司的一款基于XScale 架構的高集成度高性能嵌入式處理器,采用ARMv5TE內核,包含了Intel的SpeedStep 技術,優(yōu)化了處理器的功耗,可以動態(tài)調節(jié) CPU 的電壓和頻率來節(jié)省電源的功耗。支持

1  引言
    PXA270 是Intel 公司的一款基于XScale 架構的高集成度高性能嵌入式處理器,采用ARMv5TE內核,包含了Intel的SpeedStep 技術,優(yōu)化了處理器的功耗,可以動態(tài)調節(jié) CPU 的電壓和頻率來節(jié)省電源的功耗。支持多種嵌入式操作系統(tǒng),如Linux、WinCE、Nucleus、Palm OS、VxWorks等。
    Socket接口是TCP/IP網絡層的API,定義了許多函數(shù)和例程,可以用它們來開發(fā)TCP/IP網絡層的應用程序。網絡的Socket數(shù)據(jù)傳輸是一種特殊的I/O,具有一個類似于打開文件的函數(shù)調用Socket(),該函數(shù)返回一個整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實現(xiàn)的。
2 系統(tǒng)設計
    系統(tǒng)的設計分為服務器端和客戶端設計兩部分,服務器端為運行Linux操作系統(tǒng)的PC機,客戶端為PXA270系統(tǒng),在該系統(tǒng)中移植和構建Linux嵌入式操作系統(tǒng),兩者通過Switch交換機進行網絡通信。
2.1 系統(tǒng)工作原理
    在Linux 操作系統(tǒng)中,Socket 屬于文件系統(tǒng)的一部分,網絡通信可以被看作是對文件的讀取。Linux 擁有POSIX 標準庫函數(shù),Socket()、Bind()、Sendto()、Recvfrom()等庫函數(shù)可以方便地實現(xiàn)客戶/ 服務器模型中數(shù)據(jù)的傳送與接收。系統(tǒng)設計主要的目的是完成服務器和客戶端網絡通信的實現(xiàn)。首先啟動宿主機和客戶機的操作系統(tǒng)Linux,然后每個模塊加載網絡設備驅動程序,最后通過TCP/IP協(xié)議建立雙方的通信鏈路,完成Socket通信,詳細情況如圖1所示。
2.2  嵌入式TCP/IP協(xié)議架構
    嵌入式系統(tǒng)作為TCP服務器,在三次握手建立連接的過程中,嵌入式系統(tǒng)作為監(jiān)聽狀態(tài)的服務器,處于LISTEN狀態(tài),等待對方發(fā)起連接。當它接收到SYN數(shù)據(jù)片,立即發(fā)出SYN+ACK的數(shù)據(jù)片確認收到對方的SYN,此時變?yōu)镾YN_ RECEIVED狀態(tài)。再接收到對方返回的一個包含ACK的空數(shù)據(jù)片則三次握手完成,進入ESTABLISHED狀態(tài),最后進行TCP數(shù)據(jù)通訊。

圖1  系統(tǒng)的原理示意圖
    嵌入式系統(tǒng)建立連接時初始化序列號,然后根據(jù)對方發(fā)包中的值來確定序列號,不記憶序列號,不能識別重復報文。嵌入式服務器僅僅在服務器端響應客戶端的請求,接收一個發(fā)送一個確認回答,不考慮失序問題。同時接收到TCP請求后,將存儲于發(fā)送緩沖區(qū)中的數(shù)據(jù)立即發(fā)送即可,只需一個數(shù)據(jù)包就能完成,也不需考慮失序問題。
    因為嵌入式系統(tǒng)采用滑動窗口為1的傳輸方式,即發(fā)送一次數(shù)據(jù)包就等待返回應答,因此當接收不到確認包,就認為自己發(fā)送的包丟失,直接發(fā)送上次發(fā)送的數(shù)據(jù)。TCP的連接中,當客戶機異常導致連接崩潰時,嵌入式系統(tǒng)發(fā)數(shù)據(jù)時會被回復復位信號,回到初始狀態(tài)。嵌入式TCP/IP協(xié)議如圖2所示。
3  客戶端/服務器端功能設計
    在TCP/IP網絡中,通信的兩個進程間相互作用的主要模式是客戶/服務器模式,即客戶端向服務器端發(fā)出服務請求,服務器接收到請求后,提供相應的服務。客戶/服務器模式在操作過程中采取的是主動請求方式。

圖2  嵌入式TCP/IP圖解[!--empirenews.page--]
3.1  客戶端程序設計
    客戶端可以向服務器端發(fā)送連接請求,并且客戶端也可以接收到來自服務器端發(fā)送回來的數(shù)據(jù)。客戶端可以判斷當前自己的工作狀態(tài),如連接的建立,啟動的成功和數(shù)據(jù)包通信的個數(shù)等。客戶端程序設計主要按以下的步驟完成函數(shù)的調用:
    ①建立自己的Socket(并驗證建立成功);
    ②啟動連接(并驗證建立成功);
    ③返回連接信息;
    ④接收收到的數(shù)據(jù);
    ⑤判斷數(shù)據(jù)的屬性。
    客戶端程序設計的程序基本流程如圖3所示。

圖3  客戶端程序簡單示意圖
    客戶端打開通信通道,并連接到服務器所在主機的特定端口,向服務器發(fā)送請求報文,等待并接收應答,請求結束后關閉通信通道并終止通信。客戶端主要程序如下:
    Int main(int argc,char *argv[])
    if(argc!=3)
    printf("error!!!please enter the remote IP and PORT please!!! the form like 192.168.0.* 4000\n");                           
    mysocket=socket(AF_INET,SOCK_STREAM,0);    //建立一個套接字
    if(mysocket==-1)
    printf("error!!! failed to created the new socket,program end here\n");
    printf("OK-- you have successful created a socket named mysocket\n");
    return(0);         //socket 建立不成功,回初始位置
    connectcheck=connect(mysocket,(struct sockaddr*)&addr_remote,sizeof(struct sockaddr));
    //調用connect函數(shù)連接服務器端
    if(connectcheck==-1)
    printf("error!!!sorry you have failed to connect the remote server!!try again !program end here\n");
   // connect不成功回初始位置
    printf("OK-- Now you have successful connect the server,this server IP =%s,and it's PORT =%s,now you can communicat with this server!!!!!!!\n ",argv[1],argv[2])
    //打印服務器IP地址和端口號
    while(1)
    bzero(gotbuffer,long);
    number=recv(mysocket,gotbuffer,long,0);       
    //調用阻塞函數(shù)
    if(number==-1)
    printf("error!!! some thing wrong !let you can not got the data form server,program end here\n");
    return(0);
    gotbuffer[number]='\0';  
    close(mysocket);          
3.2  服務器端程序設計
    服務器端可以快速的做出客戶端的連接請求反映,服務器端反映來自客戶端的連接參數(shù),如連接的IP、連接時間、連接的當前狀態(tài)等。服務器啟動后根據(jù)請求提供以下服務:
    ①打開通信通道并告知本地主機,在某一公認地址上接收客戶請求;
    ②等待客戶請求到達該端口;
    ③接收到重復服務請求,處理該請求并發(fā)送應答信號;
    ④返回第二步,等待另一客戶請求;
    ⑤關閉服務器。
    服務器端程序設計的流程如圖4所示。[!--empirenews.page--]
    客戶端與服務器端進程的作用是非對稱的,因此編碼不同。同時,服務器進程一般是先于客戶請求請求而啟動的,只要系統(tǒng)運行,該服務進程一直存在,直到正常或強迫終止。服務器端主要程序如下:
    mysocket=socket(AF_INET,SOCK_STREAM,0);
    //建立新的套接字
    if(mysocket==-1)
    printf("error!!! failed to created mysocket\n");
    return(0);        //socket建立不成功,回初始位置
    mybindcheck=bind(mysocket,(struct sockaddr*)&addr_local,sizeof(struct sockaddr));
    if(mybindcheck==-1)
    printf("error!!!failed to bind the IP and port with mysocket\n");
    return(0);

圖4  服務器端程序簡單示意圖
    { printf("OK--you have successed bind your IP with port %d\n",port);
    listencheck=listen(mysocket,howmany);
    if(listencheck==-1)
    printf("error!!! you have failed listen this port,program end here\n");
    return(0);                        //調用監(jiān)聽函數(shù)
    sin_size=sizeof(struct sockaddr_in);
    newsocket=accept(mysocket,(struct sockaddr*)&addr_remote,&sin_size);     
    //調用接收函數(shù)
    if(newsocket==-1)
    printf("error!!!failed to got remote connect this server,program end here\n");
    return(0);         //建立新的socket失敗返回
    printf("OK--  now have created the newsocket to use this own connection,use this communicate with clint%s\n",inet_ntoa(addr_remote.sin_addr),port);
    printf("OK-- server have successed got connect from clint IP = %s,port = %d,now connecting is running;\n",inet_ntoa(addr_remote.sin_addr),port)
pid_t pid;
    pid=fork();           //調用fork()建立子進程
    if(pid>0)
    printf("OK-- i am a father procces,child proccess will continue for you,it's ID= %d,now end newsock and use old socket to listen again................. \n",pid);
    close(newsocket);
    printf("OK-- i am a child procces,i am responsible for this new communicate,blow i will do for connect\n");
    printf("OK-- please enter your data which you want to send n");                             
    while(1)
    bzero(sendbuffer,long);
    scanf("%s",sendbuffer);
    sendcheck=send(newsocket,sendbuffer,strlen(sendbuffer),0); //發(fā)送數(shù)據(jù)
    if(sendcheck==-1)
    printf("error!!!failed to send to remote\n");
    close(newsocket);
    else
    printf("OK--now you have send %d byte data to remote!!!pleases send again!!!!\n",sendcheck);[!--empirenews.page--]
4  應用與測試

圖5  數(shù)據(jù)發(fā)送驗證客戶端    
    系統(tǒng)測試前,服務器端通過以太網和客戶端實現(xiàn)連接??蛻舳藰嫿薼inux嵌入式操作系統(tǒng),客戶端的程序通過嵌入式交叉編譯環(huán)境進行調試。測試前應保證網絡的順暢和串口的操作正常。
    啟動服務器端,運行Linux操作系統(tǒng),并建立新的用戶終端,然后運行服務器端socket通信程序。
    啟動客戶端,運行Linux嵌入式操作系統(tǒng),配置IP地址為192.168.15.15,運行客戶端socket通信程序。
    服務器端和客戶端連接,在服務器端會有詳細的連接請求顯示出來,如IP地址、服務器當前狀態(tài),通信模式等。服務器開始發(fā)送數(shù)據(jù),客戶端開始接收來自服務器的數(shù)據(jù),驗證是否正確。圖5為數(shù)據(jù)發(fā)送驗證客戶端。
5  結論
    通過在PXA270中增加嵌入式操作系統(tǒng)Linux的基礎上實現(xiàn)一個較為簡單的網絡通信模塊,驗證了嵌入式系統(tǒng)socket通行的可行性,實現(xiàn)嵌入式系統(tǒng)基于TCP/IP協(xié)議的網絡接入,針對各種智能設備如家用電器、工業(yè)控制裝置或儀器、安全監(jiān)控系統(tǒng)、汽車電子接入互聯(lián)網變得簡單容易。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉