基于arm的智能家居系統(tǒng)方案_第1頁
基于arm的智能家居系統(tǒng)方案_第2頁
基于arm的智能家居系統(tǒng)方案_第3頁
基于arm的智能家居系統(tǒng)方案_第4頁
基于arm的智能家居系統(tǒng)方案_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、基于ARM的智能家居系統(tǒng)設(shè)計方案系統(tǒng)綜述智能家居(Smart Home)是以住宅為平臺,利用綜合布線技術(shù)、網(wǎng)絡(luò)通信技術(shù)、 安全防范技術(shù)、自動控制技術(shù)、音視頻技術(shù)將家居生活有關(guān)的設(shè)施集成,構(gòu)建高效的住宅設(shè)施與家庭日程事務(wù)管理系統(tǒng),以提升家居安全性、便利性、舒適性、藝術(shù)性,并實(shí)現(xiàn)環(huán)保節(jié)能的居住環(huán)境。衡量一個智能家居系統(tǒng)的成功與否,并非僅僅取決于智能化系統(tǒng)的多少、系統(tǒng)的先進(jìn)性或集成度,而是取決于系統(tǒng)的設(shè)計和配置是否經(jīng)濟(jì)合理并且系統(tǒng)能否成功運(yùn)行,系統(tǒng)的使用、管理和維護(hù)是否方便,系統(tǒng)或產(chǎn)品的技術(shù)是否成熟適用,換句話說,就是如何以最少的投入、最簡便的實(shí)現(xiàn)途徑來換取最大的功效,實(shí)現(xiàn)便捷高質(zhì)量的生活。智能家居

2、通常包括以下子系統(tǒng):訪問/控制系統(tǒng)通過電腦、手持終端等設(shè)備了解家中狀況,對設(shè)備進(jìn)行控制。門禁系統(tǒng)門禁系統(tǒng)主要包括以下功能,室外監(jiān)控功能:當(dāng)門口有異響自動提示,能在家中或遠(yuǎn)程看到外面情況;拍照存檔功能:當(dāng)家中沒人且有人按動門鈴,便自動拍照存儲,方面房屋主人查詢;可視對講功能:有客來訪,可自由通話,并能看到外面情況,并能控制門鎖的打開關(guān)閉;遠(yuǎn)程開鎖功能:可以通過Internet 網(wǎng),在任何地方開啟家里的門鎖。視頻監(jiān)控系統(tǒng)視頻監(jiān)控的基本功能主要有:遠(yuǎn)程監(jiān)控:可以進(jìn)行實(shí)時本地和遠(yuǎn)程網(wǎng)絡(luò)監(jiān)控;遠(yuǎn)程控制:可以實(shí)現(xiàn)遠(yuǎn)程對設(shè)備的各種控制,可以對圖像質(zhì)量,分辨率,圖像縮放進(jìn)行操作,可以對云臺的移動方向進(jìn)行控制;

3、視頻存儲:能夠?qū)⒁曨l數(shù)據(jù)本地存儲,能夠在任何時候?qū)@些數(shù)據(jù)進(jìn)行回放;移動偵測:布防后能夠發(fā)現(xiàn)移動的物體并報警。門窗控制系統(tǒng)可以在室內(nèi)任何位置以及遠(yuǎn)程對門窗以及窗簾進(jìn)行打開關(guān)閉操作。具備自動防風(fēng)防雨功能,當(dāng)檢測到下雨刮風(fēng)時,自動關(guān)閉窗戶。同時能與環(huán)境檢測系統(tǒng)聯(lián)動,當(dāng)發(fā)現(xiàn)室內(nèi)空氣環(huán)境不好或者發(fā)現(xiàn)可燃?xì)怏w時能自動開窗通風(fēng)。入侵檢測功能能夠及時發(fā)現(xiàn)暴力入侵情況,并向安防系統(tǒng)發(fā)送報警信號。家電控制系統(tǒng)通過ZigBee/紅外轉(zhuǎn)發(fā)器,以紅外遙控和電源控制相結(jié)合的方式對傳統(tǒng)家電(如:電視機(jī)、空調(diào)、冰箱、電飯煲、淋浴器、微波爐等)進(jìn)行控制以及狀態(tài)查詢。同時對家中總電源以及各個電源接口進(jìn)行打開關(guān)閉的操作,實(shí)現(xiàn)對部

4、分家電的控制,同時可杜絕家電待機(jī)耗電情況。環(huán)境檢測系統(tǒng)環(huán)境監(jiān)測系統(tǒng)主要對家庭內(nèi)部環(huán)境數(shù)據(jù)進(jìn)行監(jiān)測。包括:溫度監(jiān)測、可燃?xì)怏w監(jiān)測、火災(zāi)監(jiān)測、空氣質(zhì)量檢測等等。并能與安防系統(tǒng)聯(lián)動,出現(xiàn)異常情況時能夠及時報警。 智能家居系統(tǒng)示意圖平臺選擇控制系統(tǒng)平臺選擇智能家居的控制系統(tǒng)是智能家居的核心組成部分,相當(dāng)于整個智能家居系統(tǒng)的神經(jīng)中樞,因此系統(tǒng)平臺的選擇對于項(xiàng)目成功與否至關(guān)重要。嵌入式處理器有眾多的架構(gòu)和種類,不同的處理器從性能到成本以及總線接口、外圍電路各有不同。目前,采用ARM體系的微處理器已經(jīng)遍布在消費(fèi)電子、工業(yè)控制、通信、網(wǎng)絡(luò)等領(lǐng)域。據(jù)統(tǒng)計,基于ARM體系結(jié)構(gòu)的嵌入式微處理器占據(jù)了RISC類型處理

5、器75%以上的市場份額。在全球范圍內(nèi),使用ARM授權(quán)生產(chǎn)微處理器芯片的廠商多達(dá)數(shù)十家,就連眾所周知的芯片巨頭英特爾公司在通信領(lǐng)域也開發(fā)了基于ARM體系結(jié)構(gòu)的微處理器?;诒卷?xiàng)目高性能,低功耗,低成本的要求,本項(xiàng)目采用基于ARM的嵌入式系統(tǒng)。由于本系統(tǒng)主要目的是用于實(shí)驗(yàn)驗(yàn)證,因此采用時下流行的樹莓派(Raspberry Pi)作為控制系統(tǒng)開發(fā)平臺。樹莓派是專為學(xué)生計算機(jī)編程教育而設(shè)計,只有信用卡大小的卡片式電腦,自問世以來,受眾多計算機(jī)發(fā)燒友和創(chuàng)客的追捧,曾經(jīng)一“派”難求。樹莓派外表雖然“嬌小”,內(nèi)“心”卻很強(qiáng)大,視頻、音頻等功能通通皆有,可謂是“麻雀雖小,五臟俱全”。 樹莓派功能示意圖客戶端平

6、臺選擇智能家居客戶端主要指用戶操作界面及其軟件系統(tǒng),包括完整的智能家居控制界面,具備無線編碼學(xué)習(xí)功能和個性化情景模式,用戶可以通過配置,來實(shí)現(xiàn)自定義的智能家居體驗(yàn)。據(jù)調(diào)研機(jī)構(gòu)Strategy Analytics最新的報告顯示,Android以83.6%的市場占有率穩(wěn)居移動操作系統(tǒng)市場之首。為了最大限度的運(yùn)用市場上現(xiàn)有的資源,本系統(tǒng)首先開發(fā)基于Android的智能家居遠(yuǎn)程客戶端。硬件設(shè)計方案控制系統(tǒng)硬件設(shè)計方案由于該系統(tǒng)主要用于實(shí)驗(yàn)驗(yàn)證,硬件設(shè)計上以簡單為主,主要包括一下幾個模塊:主控系統(tǒng):樹莓派開發(fā)板( HYPERLINK /link?url=jzYmIIuunbzUffXChYmEjYZRK

7、_4TOC-RYoDaB9sTQ6a3V1VygBNGv4LuHRRajpMFWxrYcqoAXPflD8IiJPQHjK t _blank Raspberry Pi Model B+)監(jiān)視系統(tǒng):USB攝像頭(羅技Pro5000)家電模擬系統(tǒng):控制器(單片機(jī)AT89C51)、模擬家電(LED燈)、模擬傳感器(按鍵)通信系統(tǒng):Wi-Fi模塊(聯(lián)想2代B型迷你無線網(wǎng)卡) 控制系統(tǒng)硬件示意圖客戶端硬件設(shè)計方案客戶端需支持市面上主流Android手機(jī)。軟件設(shè)計方案控制系統(tǒng)軟件設(shè)計方案控制系統(tǒng)軟件設(shè)計包括兩個方面:一是嵌入式操作系統(tǒng),另一個是嵌入式服務(wù)器軟件。在選擇嵌入式操作系統(tǒng)的時候,首先要考慮到對硬

8、件系統(tǒng)的支持,由于ARM處理器的應(yīng)用非常廣泛,目前的主流嵌入式操作系統(tǒng)對ARM體系結(jié)構(gòu)的處理器都提供良好的支持。其次要考慮嵌入式操作系統(tǒng)的可移植性,可移植性良好的操作系統(tǒng),可以在不同平臺、不同硬件系統(tǒng)上運(yùn)行,從而可以減少或避免以后代碼的移植工作,降低開發(fā)工作的難度。最后考慮到需要快速、低成本、高質(zhì)量的完成用戶的需求,對嵌入式操作系統(tǒng)的可利用資源和成本的考慮也十分重要。對于嵌入式服務(wù)器軟件的選擇,首先考慮本系統(tǒng)主要面向家庭,因此訪問量很小,不需要復(fù)雜的功能,但當(dāng)出現(xiàn)緊急情況時要求盡快相應(yīng),對實(shí)時性有一定要求。因此需要選擇一款功能簡單、體積小、占用資源少、速度快的服務(wù)器;其次由于服務(wù)器需要長時間穩(wěn)

9、定運(yùn)行,因此對可靠性有較高的要求;最后由于控制系統(tǒng)運(yùn)行著系統(tǒng)中各個模塊的控制程序,這些程序需要瀏覽器通過CGI接口進(jìn)行調(diào)用返回,因此服務(wù)器必須支持CGI調(diào)用?;谝陨显?,本例選擇嵌入式Linux系統(tǒng)+Boa嵌入式服務(wù)器作為控制系統(tǒng)軟件設(shè)計方案。Linux系統(tǒng)是1991年由芬蘭人Linus Torvalds發(fā)明的,從誕生到現(xiàn)在的短短十幾年的時間,Linux 獲得了飛速的發(fā)展尤其是在嵌入式操作系統(tǒng)領(lǐng)域。嵌入式Linux是指對標(biāo)準(zhǔn)Linux 進(jìn)行小型化裁剪處理,可固化在存儲器或單片機(jī)中,適合于特定嵌入式應(yīng)用場合的專用Linux 操作系統(tǒng)。Boa是一個小型Web Server,系統(tǒng)兼容性好,可在多數(shù)

10、Unix 系統(tǒng)中運(yùn)行,特別適合在嵌入式的場合中使用。它是一個單任務(wù)的HTTP 服務(wù)器,如果有兩個用戶同時訪問它,那么其中的一個用戶必須等待片刻,它產(chǎn)生獨(dú)立的進(jìn)程來處理CGI 程序,因此占用較少的系統(tǒng)資源。Boa的優(yōu)點(diǎn)在于其快速性和可靠性而且完全免費(fèi)。 控制系統(tǒng)軟件架構(gòu)示意圖客戶端軟件設(shè)計方案本文采用的客戶端軟件基于時下流行的Android移動操作系統(tǒng),即基于Android 的智能家居遠(yuǎn)程客戶端?;贏ndroid 的智能家居遠(yuǎn)程客戶端是通過Android 智能家居軟件控制的以通信網(wǎng)絡(luò)為紐帶的智能家居遠(yuǎn)程控制系統(tǒng),用來實(shí)現(xiàn)對用戶家庭智能家居系統(tǒng)及其設(shè)備的遠(yuǎn)程控制,其基本思想是實(shí)現(xiàn)智能控制、分類操

11、作、分級管理、配置靈活。Android 智能家居遠(yuǎn)程客戶端按功能可劃分為五部分:登陸控制單元、信息存儲單元、智能控制單元、智能情景模式及人機(jī)界面。 客戶端軟件架構(gòu)示意圖實(shí)施步驟嵌入式開發(fā)環(huán)境搭建(簡要介紹)嵌入式開發(fā)環(huán)境搭建主要包括:宿主機(jī)(PC)系統(tǒng)的安裝配置(Ubuntu 14.04)NFS 服務(wù)配置(使目標(biāo)機(jī)和宿主機(jī)共享文件)交叉編譯器安裝(在宿主機(jī)上進(jìn)行程序的開發(fā)和編譯工作,在目標(biāo)機(jī)中執(zhí)行)控制端軟件設(shè)計 嵌入式Linux內(nèi)核配置與編譯Linux 內(nèi)核配置的內(nèi)容有數(shù)百項(xiàng)之多,想要完全了解非常困難也沒有必要。本文只介紹一下內(nèi)核配置編譯的一般步驟。內(nèi)核下載首先需要下載Linux 源代碼壓縮

12、包。一般從Linux 官方網(wǎng)站 下載,然后將壓縮包解壓到指定目錄下;編譯配置修改修改源碼樹根目錄下的Makefile文件中 ARCH:=arm CROSSCOMPILE:=arm-linux- 兩個變量,以適用于嵌入式系統(tǒng)。使用make menuconfig 對內(nèi)核進(jìn)行裁剪,配置內(nèi)核產(chǎn)生.config文件。根據(jù)系統(tǒng)功能需求選擇相關(guān)的功能模塊,保存即可。這里需要說明的是內(nèi)核配置選項(xiàng)多達(dá)數(shù)百項(xiàng),需要根據(jù)不同的硬件平臺進(jìn)行修改配置,其余的采用默認(rèn)設(shè)置即可。編譯內(nèi)核生成鏡像完成了對內(nèi)核的配置以后,內(nèi)核仍然是源碼的形式,還不能下載到硬件平臺上運(yùn)行。內(nèi)核編譯的目的就是生成最終可以在硬件平臺上運(yùn)行的可執(zhí)行代

13、碼。內(nèi)核的編譯過程是由Makefile文件控制的,Makefile定義了一系列的規(guī)則來指定哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯。內(nèi)核編譯步驟非常固定,需要用到以下幾個命令:make clean用來把以前編譯內(nèi)核時產(chǎn)生的文件刪除掉,避免上次編譯的文件對本次編譯產(chǎn)生影響。 根文件系統(tǒng)制作嵌入式Linux支持多種文件系統(tǒng)。雖然在嵌入式系統(tǒng)中,由于資源受限的原因,它的文件系統(tǒng)和非嵌入式Linux 的文件系統(tǒng)有較大的區(qū)別,但是他們的總體架構(gòu)是一樣的,都是采用目錄樹的結(jié)構(gòu)。本文中采用的是cramfs文件系統(tǒng)。這種系統(tǒng)是一種簡單的只讀文件系統(tǒng),因此非常適合嵌入式系統(tǒng)。本文適用busy

14、box進(jìn)行根文件系統(tǒng)的制作,步驟如下:Busybox配置編譯下載busybox源碼,執(zhí)行make menuconfig進(jìn)行相關(guān)配置(如:General Configuration中,一定要選擇“Support for devfs”選項(xiàng))。生成.config文件后執(zhí)行make TARGET_ARCH=arm,編譯busybox,編譯結(jié)束后,執(zhí)行make install,生成一個_install文件夾,內(nèi)有一個linuxrc文件和bin、sbin、usr三個文件夾,刪除linuxrc,將三個文件夾打包。Rootfs制作創(chuàng)建一個文件夾,比如rootfs,轉(zhuǎn)到rootfs,執(zhí)行命令mkdir bin

15、dev etc home lib mnt proc sbin sys tmp var usr,建立相應(yīng)的文件夾,再建立etc下的init.d文件夾。然后準(zhǔn)備啟動所需的文件:linuxrc、rcS、inittab、fstab四個文件。將剛才在busybox的_install下的三個文件夾的打包文件復(fù)制到rootfs目錄,解壓后刪除打包文件。調(diào)試開發(fā)將自己開發(fā)的相關(guān)程序拷貝到rootfs相應(yīng)目錄下,適用命令mkcramfs rootfs rootfs.cramfs。運(yùn)行成功后,將產(chǎn)生的rootfs.cramfs文件燒寫到目標(biāo)板上就可以了。 Boa 嵌入式服務(wù)器移植下載并編譯Boa源碼從下載Boa源

16、碼,將其解壓并進(jìn)入源碼目錄的src子目錄,在源碼目錄下執(zhí)行./configure生成Makefile 文件;然后執(zhí)行Make命令對源碼進(jìn)行編譯。配置移植將boa.conf 拷貝到etc/boa目錄下,修改boa.conf 文件中的以下部分,其他配置保持不變;DocumentRoot /var/www /后面的目錄為自己存放網(wǎng)頁的目錄。ScriptAlias /var/www/cgi-bin/ /后面的目錄為cgi 程序的存放目錄。運(yùn)行測試在解壓的之前解壓的boa-0.94.13/src 目錄下有個boa 的可執(zhí)行程序。執(zhí)行后boa就開始運(yùn)行了,正常執(zhí)行后可以通過ps A 看到boa 進(jìn)程。將一

17、個靜態(tài)網(wǎng)頁拷貝到/www 下,通過IE 就可以訪問了。將解壓后boa 目錄下的examplescgi-test.cgi 拷貝到/www/cgi-bia 下,可進(jìn)行cgi 測試。在Boa 服務(wù)器的移植過程中,有以下兩點(diǎn)需要注意:1、修改一個叫define.h 的文件,里面可以配置boa.conf 文件的保存位置,一般保持默認(rèn)在etc/boa 文件夾下。2、保持User nobody 不變。以前就是因?yàn)閷obody 改成了root 造成不能配置不成功,而且沒有任何錯誤提示??蛻舳塑浖O(shè)計客戶端軟件為典型的Android App。其主要包括以下幾個功能:系統(tǒng)登錄模塊:輸入主機(jī)地址和密碼,點(diǎn)擊連接服

18、務(wù)器即可登錄到智能家居控制系統(tǒng)的客戶端。登陸系統(tǒng)后會有系統(tǒng)設(shè)置、家電控制、情景模式等幾個模塊。家電控制模塊:家電控制模塊按室內(nèi)格局以及相關(guān)功能分為幾個子項(xiàng),每個子項(xiàng)中包括各種可控家用電器,如頂燈、窗簾、空調(diào)等常用家電。視屏監(jiān)控模塊:視屏監(jiān)控模塊用于顯示智能家居系統(tǒng)中攝像頭的輸出,包括攝像頭切換,視角切換,快照等功能。 心得體會經(jīng)過多年的發(fā)展,智能家居系統(tǒng)的研究取得了巨大的成績,先進(jìn)的智能家居系統(tǒng)和優(yōu)秀的設(shè)計方案層出不窮。智能家居系統(tǒng)的應(yīng)用和推廣,使人們的生活環(huán)境得到了改善,生活質(zhì)量得到了提高,也為智能化居住環(huán)境的建設(shè)起到了積極的推動作用。當(dāng)前智能家居系統(tǒng)正在迅速發(fā)展,越來越多的先進(jìn)技術(shù)也引入到

19、智能家居系統(tǒng)的研究領(lǐng)域中來,為智能家居的研究提供了堅實(shí)的理論基礎(chǔ)。通過此次智能家居系統(tǒng)的設(shè)計,使我對嵌入式系統(tǒng)的理解更為深入。其中主要包括以下幾個方面的知識:1、嵌入式系統(tǒng)的基本架構(gòu);2、ubuntu操作系統(tǒng)的使用;3、NFS文件系統(tǒng)的配置;4、交叉編譯器的配置;5、linux文件系統(tǒng)的生成;6、Bao服務(wù)器的移植與配置;7、Android App的開發(fā)與發(fā)布。附錄資料:不需要的可以自行刪除C語言中如何獲取時間?精度如何?1 使用time_t time( time_t * timer ) 精確到秒2 使用clock_t clock() 得到的是CPU時間精確到1/CLOCKS_PER_SEC秒

20、3 計算時間差使用double difftime( time_t timer1, time_t timer0 )4 使用DWORD GetTickCount() 精確到毫秒5 如果使用MFC的CTime類,可以用CTime:GetCurrentTime() 精確到秒6 要獲取高精度時間,可以使用BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)獲取系統(tǒng)的計數(shù)器的頻率BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)獲取計數(shù)器的值然后用兩次計數(shù)器的差除以F

21、requency就得到時間。7 Multimedia Timer FunctionsThe following functions are used with multimedia timers.timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime/*/用標(biāo)準(zhǔn)C實(shí)現(xiàn)獲取當(dāng)前系統(tǒng)時間的函數(shù)一.time()函數(shù)time(&rawtime)函數(shù)獲取當(dāng)前時間距1970年1月1日的秒數(shù),以秒計數(shù)單位,存于rawtime 中。#include time.hvoid main ()time_t rawtime;struct tm * t

22、imeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );printf ( 007The current date/time is: %s, asctime (timeinfo) );exit(0);=#include - 必須的時間函數(shù)頭文件time_t - 時間類型(time.h 定義是typedef long time_t; 追根溯源,time_t是long)struct tm - 時間結(jié)構(gòu),time.h 定義如下:int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon

23、;int tm_year;int tm_wday;int tm_yday;int tm_isdst;time ( &rawtime ); - 獲取時間,以秒計,從1970年1月一日起算,存于rawtimelocaltime ( &rawtime ); - 轉(zhuǎn)為當(dāng)?shù)貢r間,tm 時間結(jié)構(gòu)asctime ()- 轉(zhuǎn)為標(biāo)準(zhǔn)ASCII時間格式:星期 月 日 時:分:秒 年-二.clock()函數(shù),用clock()函數(shù),得到系統(tǒng)啟動以后的毫秒級時間,然后除以CLOCKS_PER_SEC,就可以換成“秒”,標(biāo)準(zhǔn)c函數(shù)。clock_t clock ( void );#includeclock_t t = cl

24、ock();long sec = t / CLOCKS_PER_SEC;他是記錄時鐘周期的,實(shí)現(xiàn)看來不會很精確,需要試驗(yàn)驗(yàn)證;-三.gettime(&t); 據(jù)說tc2.0的time結(jié)構(gòu)含有毫秒信息#include#includeint main(void)struct time t;gettime(&t);printf(The current time is: -:d:d.dn,t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);return 0;time 是一個結(jié)構(gòu)體, 其中成員函數(shù) ti_hund 是毫秒。-四.GetTickCount(),這個是wind

25、ows里面常用來計算程序運(yùn)行時間的函數(shù);DWORD dwStart = GetTickCount();/這里運(yùn)行你的程序代碼DWORD dwEnd = GetTickCount();則(dwEnd-dwStart)就是你的程序運(yùn)行時間, 以毫秒為單位這個函數(shù)只精確到55ms,1個tick就是55ms。-五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高DWORD dwStart = timeGetTime();/這里運(yùn)行你的程序代碼DWORD dwEnd = timeGetTime();則(dwEnd-dwStart)就是你的程序運(yùn)行時

26、間, 以毫秒為單位雖然返回的值單位應(yīng)該是ms,但傳說精度只有10ms。=/*Unix#unix時間相關(guān),也是標(biāo)準(zhǔn)庫的/*1.timegm函數(shù)只是將struct tm結(jié)構(gòu)轉(zhuǎn)成time_t結(jié)構(gòu),不使用時區(qū)信息;time_t timegm(struct tm *tm);2.mktime使用時區(qū)信息time_t mktime(struct tm *tm);timelocal 函數(shù)是GNU擴(kuò)展的與posix函數(shù)mktime相當(dāng)time_t timelocal (struct tm *tm);3.gmtime函數(shù)只是將time_t結(jié)構(gòu)轉(zhuǎn)成struct tm結(jié)構(gòu),不使用時區(qū)信息;struct tm * gm

27、time(const time_t *clock);4.localtime使用時區(qū)信息struct tm * localtime(const time_t *clock);1.time獲取時間,stime設(shè)置時間time_t t;t = time(&t);2.stime其參數(shù)應(yīng)該是GMT時間,根據(jù)本地時區(qū)設(shè)置為本地時間;int stime(time_t *tp)3.UTC=true 表示采用夏時制;4.文件的修改時間等信息全部采用GMT時間存放,不同的系統(tǒng)在得到修改時間后通過localtime轉(zhuǎn)換成本地時間;5.設(shè)置時區(qū)推薦使用setup來設(shè)置;6.設(shè)置時區(qū)也可以先更變/etc/sysconf

28、ig/clock中的設(shè)置再將ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效time_t只能表示68年的范圍,即mktime只能返回1970-2038這一段范圍的time_t看看你的系統(tǒng)是否有time_t64,它能表示更大的時間范圍/*windows#Window里面的一些不一樣的/*一.CTime () 類VC編程一般使用CTime類 獲得當(dāng)前日期和時間CTime t = GetCurrentTime();SYSTEMTIME 結(jié)構(gòu)包含毫秒信息typedef struct _SYSTEMTIME WORD wYear;WORD w

29、Month;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds; SYSTEMTIME, *PSYSTEMTIME;SYSTEMTIME t1;GetSystemTime(&t1)CTime curTime(t1);WORD ms = t1.wMilliseconds;SYSTEMTIME sysTm;:GetLocalTime(&sysTm);在time.h中的_strtime() /只能在windows中用char t11;_strtime(t);puts(t);/*獲得當(dāng)前日期

30、和時間CTime tm=CTime:GetCurrentTime();CString str=tm.Format(%Y-%m-%d);在VC中,我們可以借助CTime時間類,獲取系統(tǒng)當(dāng)前日期,具體使用方法如下:CTime t = CTime:GetCurrentTime(); /獲取系統(tǒng)日期,存儲在t里面int d=t.GetDay(); /獲得當(dāng)前日期int y=t.GetYear(); /獲取當(dāng)前年份int m=t.GetMonth(); /獲取當(dāng)前月份int h=t.GetHour(); /獲取當(dāng)前為幾時int mm=t.GetMinute(); /獲取當(dāng)前分鐘int s=t.GetSe

31、cond(); /獲取當(dāng)前秒int w=t.GetDayOfWeek(); /獲取星期幾,注意1為星期天,7為星期六二.CTimeSpan類如果想計算兩段時間的差值,可以使用CTimeSpan類,具體使用方法如下:CTime t1( 1999, 3, 19, 22, 15, 0 );CTime t = CTime:GetCurrentTime();CTimeSpan span=t-t1; /計算當(dāng)前系統(tǒng)時間與時間t1的間隔int iDay=span.GetDays(); /獲取這段時間間隔共有多少天int iHour=span.GetTotalHours(); /獲取總共有多少小時int iM

32、in=span.GetTotalMinutes();/獲取總共有多少分鐘int iSec=span.GetTotalSeconds();/獲取總共有多少秒-三._timeb()函數(shù)_timeb定義在SYSTIMEB.H,有四個fieldsdstflagmillitmtimetimezonevoid _ftime( struct _timeb *timeptr );struct _timeb timebuffer;_ftime( &timebuffer );取當(dāng)前時間:文檔講可以到ms,有人測試,好象只能到16ms!四.設(shè)置計時器定義TIMER ID#define TIMERID_JISUANF

33、ANGSHI 2在適當(dāng)?shù)牡胤皆O(shè)置時鐘,需要開始其作用的地方;SetTimer(TIMERID_JISUANFANGSHI,200,NULL);在不需要定時器的時候的時候銷毀掉時鐘KillTimer(TIMERID_JISUANFANGSHI);對應(yīng)VC程序的消息映射void CJisuan:OnTimer(UINT nIDEvent)switch(nIDEvent)-#如何設(shè)定當(dāng)前系統(tǒng)時間-windowsSYSTEMTIME m_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLocalTime.w

34、Day=1;m_myLocalTime.wHour=0;m_myLocalTime.wMinute=0;m_myLocalTime.wSec;m_myLocalTime.wMillisec;lpSystemTime=&m_myLocalTime;if( SetLocalTime(lpSystemTime) ) /此處換成 SetSystemTime( )也不行MessageBox(OK !);elseMessageBox(Error !);SYSTEMTIME m_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.

35、wM;m_myLocalTime.wDay=1;lpSystemTime=&m_myLocalTime;if( SetDate(lpSystemTime) ) /此處換成 SetSystemTime( )也不行MessageBox(OK !);elseMessageBox(Error !);本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:HYPERLINK /khuang2008/archive/2008/12/09/3483274.aspx/khuang2008/archive/2008/12/09/3483274.aspx一種制作微秒級精度定時器的方法當(dāng)使用定時器時,在很多情況下只用到毫秒級的時間間

36、隔,所以只需用到下面的兩種常用方式就滿足要求了。一是用SetTimer函數(shù)建立一個定時器后,在程序中通過處理由定時器發(fā)送到線程消息隊列中的WM_TIMER消息,而得到定時的效果(退出程序時別忘了調(diào)用和SetTimer配對使用的KillTimer函數(shù))。二是利用GetTickCount函數(shù)可以返回自計算機(jī)啟動后的時間,通過兩次調(diào)用GetTickCount函數(shù),然后控制它們的差值來取得定時效果,此方式跟第一種方式一樣,精度也是毫秒級的。用這兩種方式取得的定時效果雖然在許多場合已經(jīng)滿足實(shí)際的要求,但由于它們的精度只有毫秒級的,而且在要求定時時間間隔小時,實(shí)際定時誤差大。下面介紹一種能取得高精度定時的

37、方法。在一些計算機(jī)硬件系統(tǒng)中,包含有高精度運(yùn)行計數(shù)器(high-resolution performance counter),利用它可以獲得高精度定時間隔,其精度與CPU的時鐘頻率有關(guān)。采用這種方法的步驟如下:1、首先調(diào)用QueryPerformanceFrequency函數(shù)取得高精度運(yùn)行計數(shù)器的頻率f。單位是每秒多少次(n/s),此數(shù)一般很大。2、在需要定時的代碼的兩端分別調(diào)用QueryPerformanceCounter以取得高精度運(yùn)行計數(shù)器的數(shù)值n1,n2。兩次數(shù)值的差值通過f換算成時間間隔,t=(n2-n1)/f。下面舉一個例子來演示這種方法的使用及它的精確度。在VC 6.0 下用M

38、FC建立一個對話框工程,取名為HightTimer.在對話框面板中控件的布局如下圖:其中包含兩個靜態(tài)文本框,兩個編輯框和兩個按紐。上面和下面位置的編輯框的ID分別為IDC_E_TEST和IDC_E_ACTUAL,通過MFC ClassWizard添加的成員變量也分別對應(yīng)為DWORD m_dwTest和DWORD m_dwAct. “退出”按紐的ID為IDOK,“開始測試”按紐ID為IDC_B_TEST,用MFC ClassWizard添加此按紐的單擊消息處理函數(shù)如下:void CHightTimerDlg:OnBTest()/ TODO: Add your control notificati

39、on handler code hereUpdateData(TRUE); /取輸入的測試時間值到與編輯框相關(guān)聯(lián)的成員變量m_dwTest中LARGE_INTEGER frequence;if(!QueryPerformanceFrequency( &frequence) /取高精度運(yùn)行計數(shù)器的頻率,若硬件不支持則返回FALSEMessageBox(Your computer hardware doesnt support the high-resolution performance counter,Not Support, MB_ICONEXCLAMATION | MB_OK);LARGE

40、_INTEGER test, ret;test.QuadPart = frequence.QuadPart * m_dwTest / 1000000; /通過頻率換算微秒數(shù)到對應(yīng)的數(shù)量(與CPU時鐘有關(guān)),1秒=1000000微秒ret = MySleep( test ); /調(diào)用此函數(shù)開始延時,返回實(shí)際花銷的數(shù)量m_dwAct = (DWORD)(1000000 * ret.QuadPart / frequence.QuadPart ); /換算到微秒數(shù)UpdateData(FALSE); /顯示到對話框面板其中上面調(diào)用的MySleep函數(shù)如下:LARGE_INTEGER CHightTim

41、erDlg:MySleep(LARGE_INTEGER Interval)/ 功能:執(zhí)行實(shí)際的延時功能 / 參數(shù):Interval 參數(shù)為需要執(zhí)行的延時與時間有關(guān)的數(shù)量 / 返回值:返回此函數(shù)執(zhí)行后實(shí)際所用的時間有關(guān)的數(shù)量 / LARGE_INTEGER privious, current, Elapse;QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privious.QuadPart Interval.QuadPart )QueryPerformanceCounter( t

42、);Elapse.QuadPart = current.QuadPart - privious.QuadPart;return Elapse;注:別忘了在頭文件中為此函數(shù)添加函數(shù)聲明。至此,可以編譯和執(zhí)行此工程了,結(jié)果如上圖所示。在本人所用的機(jī)上(奔騰366, 64M內(nèi)存)測試,當(dāng)測試時間超過3微秒時,準(zhǔn)確度已經(jīng)非常高了,此時機(jī)器執(zhí)行本身延時函數(shù)代碼的時間對需要延時的時間影響很小了。上面的函數(shù)由于演示測試的需要,沒有在函數(shù)級封裝,下面給出的函數(shù)基本上可以以全局函數(shù)的形式照搬到別的程序中。BOOL MySleep(DWORD dwInterval)/ 功能:執(zhí)行微秒級的延時功能 / 參數(shù):Int

43、erval 參數(shù)為需要的延時數(shù)(單位:微秒) / 返回值:若計算機(jī)硬件不支持此功能,返回FALSE,若函數(shù)執(zhí)行成功,返回TRUE / BOOL bNormal = TRUE;LARGE_INTEGER frequence, privious, current, interval;if(!QueryPerformanceFrequency( &frequence):MessageBox(NULL, Your computer hardware doesnt support the high-resolution performance counter,Not Support, MB_ICONEX

44、CLAMATION | MB_OK); /或其它的提示信息return FALSE;interval.QuadPart = frequence.QuadPart * dwInterval / 1000000;bNormal = bNormal & QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privious.QuadPart interval.QuadPart )bNormal = bNormal & QueryPerformanceCounter( t );return b

45、Normal;需要指出的是,由于在此函數(shù)中的代碼很多,機(jī)器在執(zhí)行這些代碼所花費(fèi)的時間也很長,所以在需要幾個微秒的延時時,會影響精度。實(shí)際上,讀者在熟悉這種方法后,只要使用QueryPerformanceFrequency和QueryPerformanceCounter這兩個函數(shù)就能按實(shí)際需要寫出自己的延時代碼了。使用CPU時間戳進(jìn)行高精度計時對關(guān)注性能的程序開發(fā)人員而言,一個好的計時部件既是益友,也是良師。計時器既可以作為程序組件幫助程序員精確的控制程序進(jìn)程,又是一件有力的調(diào)試武器,在有經(jīng)驗(yàn)的程序員手里可以盡快的確定程序的性能瓶頸,或者對不同的算法作出有說服力的性能比較。在Windows平臺下

46、,常用的計時器有兩種,一種是timeGetTime多媒體計時器,它可以提供毫秒級的計時。但這個精度對很多應(yīng)用場合而言還是太粗糙了。另一種是QueryPerformanceCount計數(shù)器,隨系統(tǒng)的不同可以提供微秒級的計數(shù)。對于實(shí)時圖形處理、多媒體數(shù)據(jù)流處理、或者實(shí)時系統(tǒng)構(gòu)造的程序員,善用QueryPerformanceCount/QueryPerformanceFrequency是一項(xiàng)基本功。本文要介紹的,是另一種直接利用Pentium CPU內(nèi)部時間戳進(jìn)行計時的高精度計時手段。以下討論主要得益于Windows圖形編程一書,第15頁17頁,有興趣的讀者可以直接參考該書。關(guān)于RDTSC指令的詳細(xì)

47、討論,可以參考Intel產(chǎn)品手冊。本文僅僅作拋磚之用。在Intel Pentium以上級別的CPU中,有一個稱為“時間戳(Time Stamp)”的部件,它以64位無符號整型數(shù)的格式,記錄了自CPU上電以來所經(jīng)過的時鐘周期數(shù)。由于目前的CPU主頻都非常高,因此這個部件可以達(dá)到納秒級的計時精度。這個精確性是上述兩種方法所無法比擬的。在Pentium以上的CPU中,提供了一條機(jī)器指令RDTSC(Read Time Stamp Counter)來讀取這個時間戳的數(shù)字,并將其保存在EDX:EAX寄存器對中。由于EDX:EAX寄存器對恰好是Win32平臺下C+語言保存函數(shù)返回值的寄存器,所以我們可以把這

48、條指令看成是一個普通的函數(shù)調(diào)用。像這樣:inline unsigned _int64 GetCycleCount() _asm RDTSC 但是不行,因?yàn)镽DTSC不被C+的內(nèi)嵌匯編器直接支持,所以我們要用_emit偽指令直接嵌入該指令的機(jī)器碼形式0X0F、0X31,如下:inline unsigned _int64 GetCycleCount() _asm _emit 0 x0F _asm _emit 0 x31 以后在需要計數(shù)器的場合,可以像使用普通的Win32 API一樣,調(diào)用兩次GetCycleCount函數(shù),比較兩個返回值的差,像這樣: unsigned long t; t = (u

49、nsigned long)GetCycleCount(); /Do Something time-intensive . t -= (unsigned long)GetCycleCount(); Windows圖形編程第15頁編寫了一個類,把這個計數(shù)器封裝起來。有興趣的讀者可以去參考那個類的代碼。作者為了更精確的定時,做了一點(diǎn)小小的改進(jìn),把執(zhí)行RDTSC指令的時間,通過連續(xù)兩次調(diào)用GetCycleCount函數(shù)計算出來并保存了起來,以后每次計時結(jié)束后,都從實(shí)際得到的計數(shù)中減掉這一小段時間,以得到更準(zhǔn)確的計時數(shù)字。但我個人覺得這一點(diǎn)點(diǎn)改進(jìn)意義不大。在我的機(jī)器上實(shí)測,這條指令大概花掉了幾十到100

50、多個周期,在Celeron 800MHz的機(jī)器上,這不過是十分之一微秒的時間。對大多數(shù)應(yīng)用來說,這點(diǎn)時間完全可以忽略不計;而對那些確實(shí)要精確到納秒數(shù)量級的應(yīng)用來說,這個補(bǔ)償也過于粗糙了。 這個方法的優(yōu)點(diǎn)是: 1.高精度??梢灾苯舆_(dá)到納秒級的計時精度(在1GHz的CPU上每個時鐘周期就是一納秒),這是其他計時方法所難以企及的。 2.成本低。timeGetTime 函數(shù)需要鏈接多媒體庫winmm.lib,QueryPerformance* 函數(shù)根據(jù)MSDN的說明,需要硬件的支持(雖然我還沒有見過不支持的機(jī)器)和KERNEL庫的支持,所以二者都只能在Windows平臺下使用(關(guān)于DOS平臺下的高精度

51、計時問題,可以參考圖形程序開發(fā)人員指南,里面有關(guān)于控制定時器8253的詳細(xì)說明)。但RDTSC指令是一條CPU指令,凡是i386平臺下Pentium以上的機(jī)器均支持,甚至沒有平臺的限制(我相信i386版本UNIX和Linux下這個方法同樣適用,但沒有條件試驗(yàn)),而且函數(shù)調(diào)用的開銷是最小的。 3.具有和CPU主頻直接對應(yīng)的速率關(guān)系。一個計數(shù)相當(dāng)于1/(CPU主頻Hz數(shù))秒,這樣只要知道了CPU的主頻,可以直接計算出時間。這和QueryPerformanceCount不同,后者需要通過QueryPerformanceFrequency獲取當(dāng)前計數(shù)器每秒的計數(shù)次數(shù)才能換算成時間。 這個方法的缺點(diǎn)是: 1.現(xiàn)有的C/C+編譯器多數(shù)不直接支持使用

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論