在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > DS80C400的Keil C語言編程

            DS80C400的Keil C語言編程

            作者: 時間:2012-02-01 來源:網(wǎng)絡 收藏
            注意在每次啟動應用時都須調(diào)用finit函數(shù),以確保文件系統(tǒng)已正確安裝并能正常工作。如果文件系統(tǒng)已正確初始化(返回0),并且我們所要的文件已全部到位,則函數(shù)直接退出,不去嘗試下載文件。否則,它會嘗試從TFTP服務器下載文件,并將它們寫入文件系統(tǒng),正如函數(shù)get_tftp_file中所顯示的。

            SolarWinds為Windows (平臺提供了一個免費的TFTP服務器,它被應用于該演示程序的開發(fā)中。在SolarWinds網(wǎng)站(www.solarwinds.net),跟隨Downloads - Free Software菜單可找到TFTP服務器下載。安裝以后,使用File菜單下的Configure選項來配置現(xiàn)有文件。確保程序使用你的TFTP服務器IP地址(TFTP_IP_MSP, TFTP_IP_2,TFTP_IP_3和TFTP_IP_LSB)。

            簡單的HTTP服務器
            該應用中的HTTP服務器是RFC 2068所描述的HTTP服務器的一個簡化版實現(xiàn)。在該版本下,只支持'GET'方法。輸入頭被忽略,只給出很少的輸出頭。

            服務器套接字通過調(diào)用Berkley型套接字函數(shù)來創(chuàng)建,這樣使得服務器套接字容易建立。以下代碼說明了這個簡單的HTTP服務器是如何創(chuàng)建、邦定并接受新連接的。

                  struct sockaddr local;unsigned int socket_handle, new_socket_handle, temp;socket_handle = socket(0, SOCKET_TYPE_STREAM, 0);local.sin_port = 80;bind(socket_handle, local, sizeof(local));listen(socket_handle, 5);printf("Ready to accept HTTP connections...r");// here is the main loop of the HTTP serverwhile (1){new_socket_handle = accept(socket_handle, address, sizeof(address));handleRequest(new_socket_handle);closesocket(new_socket_handle);}
            請注意,接受了新的套接字后,這個簡單的應用并不啟動新的線程或進程來處理請求。而是在同一進程中處理該請求。任何非演示版的HTTP服務器都會在新的線程中處理收到的請求,這樣就允許多個連接出現(xiàn)并被同時處理。請求處理完后,關(guān)閉套接字,等待另一個收到的連接。

            handleRequest方法從收到的請求中解析出一個文件名,并確定該方法是'GET'。其它方法(甚至是'POST','HEAD'或'OPTIONS')均不被接受。兩個文件名被作為特例處理。當請求文件為time.html時,服務器動態(tài)產(chǎn)生一個響應,其中包含來自timeserver的最新結(jié)果,以及自上一次查詢時間服務器以來的秒數(shù)。當請求文件為stats.html時,將顯示服務器的正常運行時間和請求次數(shù)統(tǒng)計結(jié)果。

            如果找不到文件或發(fā)出的是無效的請求方法,HTTP服務器報告錯誤碼。

            SNTP客戶端
            第二個主要部分是Simple Network Time Protocol客戶端,參見RFC 1361的描述。它是Network Time Protocol (RFC 1305)的一個版本。SNTP要求UDP從一個偵聽端口123的服務器請求時戳。我們的timeserver使用以下代碼周期性地與服務器time.nist.gov同步。請注意,在寫這篇文章時,DNS檢索還不被支持,因此服務器的IP地址須手動設置。DNS現(xiàn)已被添加到了C庫網(wǎng)站,以下代碼更新后可通過檢索獲得IP地址。

                  socket_handle = socket(0, SOCKET_TYPE_DATAGRAM, 0);// set a timeout of about 2 secondsbuffer[0] = 0x0;buffer[1] = 0x0;buffer[2] = 0x8;buffer[3] = 0x0;setsockopt(socket_handle, 0, SO_TIMEOUT, buffer, 200);buffer[2] = 0;                            // reset since we used this in call to setsockoptbuffer[0] = 0x23;                         // No warning/NTP Ver 4/Clientaddress.sin_addr[12] = TIME_NIST_GOV_IP_MSB;address.sin_addr[13] = TIME_NIST_GOV_IP_2;address.sin_addr[14] = TIME_NIST_GOV_IP_3;address.sin_addr[15] = TIME_NIST_GOV_IP_LSB;address.sin_port = NTP_PORT;sendto(socket_handle, buffer, 48, 0, address, sizeof(struct sockaddr));recvfrom(socket_handle, buffer, 256, 0, address, sizeof(struct sockaddr));timeStamp = *(unsigned long*)(buffer[40]);timeStamp = timeStamp - NTP_UNIX_TIME_OFFSET;// now we have time since Jan 1 1970formatTimeString(timeStamp, "London", last_time_reading_1);last_reading_seconds = getTimeSeconds();closesocket(socket_handle);
            首先生成一個數(shù)據(jù)報套接字,并給定一個約2秒的超時(0x800==2048ms)。這樣可以確保在與我們選擇的服務器通信失敗時,不必無限期地等待下去。

            下一行設定請求選項。關(guān)于這些位的描述參見RFC 1361第三節(jié)。值0x23要求閏秒時無需告警,要求采用NTP版本4,并聲明模式為'Client'。當我們使用公共數(shù)據(jù)報函數(shù)sendto和recvfrom發(fā)出請求并收到回答后,時戳的秒部被賦給變量timeStamp,然后調(diào)整到參考時間1970年1月1日。formatTimeString函數(shù)將時戳轉(zhuǎn)換為易讀的字符串,如“In London it is 15:37:37 on March 31, 2003”。

            getTimeSeconds函數(shù)以內(nèi)部時鐘為基礎確定上一次更新。由于該程序大約每60秒才更新一次,HTML頁time.html使用這個數(shù)值來報告自上次更新以來的時間間隔。最后,關(guān)閉套接字,SNTP客戶端在下面的60秒內(nèi)進入休眠。

            有關(guān)同步的說明
            在LARGE存儲模式下,編譯器將通過在進程交換中非安全的存儲器傳遞有限數(shù)量的參數(shù)。這就意味著有些函數(shù)不能由多個程序同時調(diào)用。盡管已專為 400開發(fā)了C庫,其中的所有變量都通過在進程交換中安全的直接存儲器傳遞,有些函數(shù)仍然是危險的。例如,Berkeley式的套接字header要求一些較長的方法簽名,它會涉及到一些通過非安全存儲器傳遞的數(shù)據(jù)。因此,針對套接字有兩個庫:

            一個庫(rom_sock.lib)遵循Berkeley式的header。但是,兩個進程同時用這個庫調(diào)用某個函數(shù)是不安全的。不過,如果一個進程正在使用UDP函數(shù)而另一個正在使用TCP函數(shù)就不會有問題。為了對并發(fā)訪問非安全存儲器提供真正的保護,開發(fā)了另外一個套接字庫(rom_sock.lib)。該庫中的函數(shù)類似于Berkeley型函數(shù),但具有更少或重新安排的變量,以使編譯器通過安全存儲區(qū)傳遞參數(shù)。無論何種情況,請參考相關(guān)文檔,以確認函數(shù)是否為多進程安全的。

            c語言相關(guān)文章:c語言教程




            關(guān)鍵詞: DS80C400 Keil C語言編程

            評論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉