<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 如何基于嵌入式Linux設(shè)計(jì)家居監(jiān)控系統(tǒng)?

          如何基于嵌入式Linux設(shè)計(jì)家居監(jiān)控系統(tǒng)?

          作者: 時(shí)間:2018-08-07 來(lái)源:網(wǎng)絡(luò) 收藏

          1 系統(tǒng)流程架構(gòu)

          本文引用地址:http://www.ex-cimer.com/article/201808/385610.htm

          本系統(tǒng)的操作系統(tǒng)平臺(tái)為L(zhǎng)inux, 內(nèi)核版本為2.6,目標(biāo)板上包括視頻采集、GPRS 模塊和控制器S3C2440.控制器主要是負(fù)責(zé)向客戶顯示及后端服務(wù)提供圖像數(shù)據(jù)。視頻服務(wù)器的啟動(dòng)方式是由后臺(tái)或觸發(fā)啟動(dòng)。當(dāng)用戶觸發(fā)事件時(shí)自動(dòng)啟動(dòng)采集程序或者由用戶遠(yuǎn)程啟動(dòng),再進(jìn)行圖像數(shù)據(jù)的抓取。

          2 系統(tǒng)設(shè)計(jì)

          2.1 Linux 下設(shè)備驅(qū)動(dòng)

          Linux 是免費(fèi)的操作系統(tǒng),其源代碼是公開(kāi)的,我們能夠根據(jù)實(shí)驗(yàn)的需求進(jìn)行必要的研究和修改。在Linux 操作系統(tǒng)中,設(shè)備都是以文件形式的存在,對(duì)設(shè)備的操作就是對(duì)文件的操作,使用戶可以調(diào)用通用的文件操作函數(shù)來(lái)進(jìn)行訪問(wèn)和操作設(shè)備。

          設(shè)備驅(qū)動(dòng)程序是Linux 內(nèi)核與外部設(shè)備關(guān)聯(lián)的接口,它們都根據(jù)用戶操作一系列的標(biāo)準(zhǔn)函數(shù)調(diào)用來(lái)執(zhí)行,通過(guò)調(diào)用獨(dú)立的驅(qū)動(dòng)程序來(lái)調(diào)用實(shí)際硬件的設(shè)備進(jìn)行特定操作。編程接口能夠使驅(qū)動(dòng)程序獨(dú)立運(yùn)行于內(nèi)核的其他部分,就如“嵌入”到內(nèi)核中一樣。這種模塊化設(shè)計(jì)特點(diǎn)使得Linux 驅(qū)動(dòng)程序的編寫(xiě)方法簡(jiǎn)單并且高效。操作簡(jiǎn)單的同時(shí)也有風(fēng)險(xiǎn),因?yàn)樵O(shè)備驅(qū)動(dòng)程序是運(yùn)行在內(nèi)核中,如果驅(qū)動(dòng)程序編寫(xiě)出現(xiàn)問(wèn)題,很有可能會(huì)使整個(gè)Linux 系統(tǒng)運(yùn)行出現(xiàn)問(wèn)題。

          驅(qū)動(dòng)程序運(yùn)行與一般應(yīng)用程序也有不同地方,驅(qū)動(dòng)程序運(yùn)行只能調(diào)用自己相應(yīng)函數(shù)和內(nèi)核中的標(biāo)準(zhǔn)函數(shù),而一般應(yīng)用程序只能調(diào)用外部數(shù)據(jù)庫(kù)等應(yīng)用函數(shù)。內(nèi)核模塊源文件中也不能包括一般的庫(kù)文件,只能使用內(nèi)核中規(guī)定的內(nèi)核函數(shù),否則就會(huì)出現(xiàn)問(wèn)題。這也是驅(qū)動(dòng)程序的寫(xiě)法與應(yīng)用程序的寫(xiě)法不同之處。當(dāng)然另一個(gè)不同之處是內(nèi)核與一般應(yīng)用程序處理錯(cuò)誤的方式不同:

          應(yīng)用程序中的錯(cuò)誤是不會(huì)對(duì)系統(tǒng)產(chǎn)生故障,并可使用調(diào)試器來(lái)進(jìn)行源代碼的跟蹤,從而發(fā)現(xiàn)問(wèn)題所在,但內(nèi)核錯(cuò)誤有可能會(huì)影響整個(gè)系統(tǒng),即使不影響系統(tǒng)也會(huì)出現(xiàn)殺死當(dāng)前進(jìn)程的問(wèn)題,而且也不能使用調(diào)試來(lái)發(fā)現(xiàn)問(wèn)題根源。

          2.2紅外中斷觸發(fā)設(shè)計(jì)

          本監(jiān)控系統(tǒng)實(shí)現(xiàn)了紅外熱釋電傳感器驅(qū)動(dòng),使用字符設(shè)備驅(qū)動(dòng)。由于S3C2440有117路的I/O線。其I/O線分成8組端口,分別是 GPA,GPB,GPC,GPD,GPE,GPF,GPG,GPH.當(dāng)有人進(jìn)入時(shí)或離開(kāi)被感應(yīng)區(qū)域時(shí),都會(huì)使熱釋電紅外傳感器的電平發(fā)生變化,從而引起中斷。熱釋電紅外傳感器感應(yīng)到有人進(jìn)入時(shí)就會(huì)自動(dòng)啟動(dòng)正在睡眠的視頻采集設(shè)備,對(duì)目標(biāo)進(jìn)行數(shù)據(jù)采集。同時(shí)熱釋電紅外傳感器的驅(qū)動(dòng)程序需要調(diào)用中斷方式來(lái)通知內(nèi)核,讓內(nèi)核通知視頻采集器已進(jìn)入工作狀態(tài),從而便于設(shè)備管理。

          S3C2440 通過(guò)GPIO 引腳的函數(shù)和宏來(lái)進(jìn)行配置和控制;函數(shù)S3C2440 _ GPIO _ CFGPIN 對(duì)復(fù)用GPIO 引腳配置;函數(shù)SET_ IRQ _ TYPE 對(duì)外部中斷觸發(fā)器進(jìn)行設(shè)置。本監(jiān)控系統(tǒng)使用了宏IRQT _ BOTHEDGE 對(duì)中斷進(jìn)行配置。在內(nèi)核頭文件中定義中斷號(hào),每個(gè)外部中斷都分配不同的中斷號(hào)來(lái)進(jìn)行控制。當(dāng)內(nèi)核接收到中斷響應(yīng),就會(huì)使用異步通知辦法。為了解決文件的異步通信,用戶程序必須做到兩點(diǎn):第一必須給進(jìn)程指定“屬主”;第二為了運(yùn)行異步通知,用戶程序必須在設(shè)備中設(shè)置FASYNC 標(biāo)志。根據(jù)內(nèi)核驅(qū)動(dòng)程序?qū)懛?,?qū)動(dòng)程序必須要定義自己的fasync 方法。當(dāng)程序執(zhí)行到F_SETFL 時(shí)就啟動(dòng)FASYNC,內(nèi)核就會(huì)調(diào)用驅(qū)動(dòng)程序fasync.內(nèi)核空間使用異步信號(hào)來(lái)向用戶發(fā)送信號(hào),相應(yīng)信號(hào)函數(shù)是:

          Void kill_fasync(struct fasync_struct **fa,intsig,init band)

          信號(hào)函數(shù)的功能是當(dāng)紅外傳感器輸出電平由高到低或由低到高的變化時(shí)觸發(fā)中斷響應(yīng),同時(shí)外部設(shè)備得到一個(gè)通過(guò)處理函數(shù)產(chǎn)生的電平變化,從而驅(qū)動(dòng)程序中定義read 方法。

          2.3 視頻采集驅(qū)動(dòng)

          在初始化的流程中初始化了攝像頭的一些默認(rèn)的值,根據(jù)紅外傳感器傳過(guò)來(lái)的拍照命令,啟動(dòng)拍照程序,開(kāi)始拍照,圖片數(shù)據(jù)保存為JPEG 格式存儲(chǔ),同時(shí)發(fā)送到手機(jī)終端While(1)

          {

          If(paizhao)

          {

          _pal=0 ;

          sendPaiZhao() ;

          readJPEG() ;

          keepData() ;

          sendData() ;

          }

          }

          2.4 圖像數(shù)據(jù)的JPEG 壓縮編碼

          通常情況下,沒(méi)有壓縮的JPEG圖像數(shù)據(jù)占用存儲(chǔ)空間比較大,非常耗費(fèi)存儲(chǔ)空間,也不利于網(wǎng)絡(luò)數(shù)據(jù)傳輸,因此對(duì)圖像數(shù)據(jù)進(jìn)行壓縮很有必要。對(duì)于圖像的壓縮方法,Linux系統(tǒng)下的Libjpeg庫(kù)中已經(jīng)有實(shí)現(xiàn)。Libjpeg是Linux下的一個(gè)標(biāo)準(zhǔn)的庫(kù),能夠直接調(diào)用它來(lái)實(shí)現(xiàn)圖片壓縮。這個(gè)庫(kù)的主要功能是將圖片以一定的壓縮比率壓縮成JPEG文件格式的圖片。由于Linux是開(kāi)源的,這個(gè)庫(kù)也是開(kāi)放的。不僅可以在一般的Linux操作系統(tǒng)下工作,也可以在Linux下進(jìn)行工作。這樣就減少了很多底層的工作,也有利于避免重復(fù)性的開(kāi)發(fā)工作。

          在使用這個(gè)庫(kù)之前,首先需要安裝和編譯這個(gè)庫(kù)。對(duì)于Linux,libjpeg庫(kù)已經(jīng)包括在Linux源代碼包中,在配置相關(guān)庫(kù)文件選項(xiàng)時(shí)把這個(gè)庫(kù)加入,再編譯一下內(nèi)核就可以使用libjpeg庫(kù)。

          圖像壓縮封裝調(diào)用image類的compress函數(shù),如下所示:

          Int image compress(image *newone,int quality)這個(gè)函數(shù)的功能是按照指定的quality 比率將圖片壓縮成JPEG 格式。函數(shù)中的兩個(gè)參數(shù)分別是指向新的image 類數(shù)據(jù)的指針( 即壓縮后的圖像數(shù)據(jù)),另一個(gè)參數(shù)是指定壓縮比率,一般范圍為0~100.當(dāng)數(shù)字越大,壓縮得到的圖片質(zhì)量就越高,也就越清晰,但同時(shí)壓縮后的數(shù)據(jù)文件容量越大。所以壓縮比不是越大越好,需要根據(jù)實(shí)驗(yàn)的現(xiàn)實(shí)需求來(lái)確定,以滿足實(shí)驗(yàn)功能要求且存儲(chǔ)成本和傳輸成本最低為標(biāo)準(zhǔn)。

          2.5 短消息的收發(fā)

          嵌入式監(jiān)控系統(tǒng)通過(guò)使用串口與GPRS連接,通過(guò)使用GPRS模塊來(lái)進(jìn)行短消息的收發(fā)。SMS短信的收發(fā)有兩種模式,即文本模式和PDU模式。文本模式只能發(fā)送變通的ASCII字符,短信內(nèi)容簡(jiǎn)單,其最大不足之處是不能收發(fā)其他字符。PDU模式將發(fā)送的信息按照一定的格式進(jìn)行新的編碼,一般是十六進(jìn)制數(shù)的PDU序列為主,把所有中文或者圖像進(jìn)行編碼后再予以發(fā)送(如圖2-1)。

          編程過(guò)程如下:

          1)打開(kāi)串口

          打開(kāi)串口設(shè)備文件需要使用標(biāo)準(zhǔn)的I/O操作函數(shù)。

          Fd=open(“/dev/ttyS0”,O_RDWR|O_NDELAY|O_NOCTTY) ;

          2) 設(shè)置串口屬性

          串口有一些規(guī)定的屬性必須進(jìn)行設(shè)置,否則就不能正常運(yùn)行,一般要設(shè)置波特率、控制模式標(biāo)志、本地模式標(biāo)志、輸入/ 輸出模式標(biāo)志、控制字符等相關(guān)串口屬性。


          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();