《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 業界動態 > 基于多線程的環境監控系統下位機的設計

基于多線程的環境監控系統下位機的設計

2017-05-11
關鍵詞: GUI 環境監控 多線程

  為提高環境監控系統的穩定性,節約系統資源,提出了一種由下位機、傳輸網絡和上位機組成的環境監控系統的設計方案,詳細介紹了該系統中下位機的硬件及軟件設計。該下位機硬件以ARM9處理器S3C2410為核心,軟件采用多線程應用程序同時處理多個任務,并采用信號量和互斥量實現線程間的同步。實際應用表明,該系統運行穩定,提高了系統效率。

  0引言

  隨著國民經濟及工業技術的發展,環境保護越來越受到重視。現在市場上已經出現了多種環境監控系統,但性能不穩定。現場監控終端大多采用工控機或單片機,前者抗干擾性能好,但成本較高;后者處理能力低,人機界面不友好,不利于現場人員的監控管理。針對上述問題,筆者設計了一種基于多線程的環境監控系統。該系統采用多線程技術有效地實現了監控過程中數據的采集與存儲、實時數據顯示、下位機(監控終端)與上位機(監控中心)的通信、實時報警等功能。本文重點介紹該系統下位機的設計。

  1系統總體結構

  基于多線程的環境監控系統由現場監控終端(下位機)、傳輸網絡、監控中心(上位機)3個部分組成,其結構如圖1所示。

53a3fc0c6c0c3-thumb.jpg

  圖1基于多線程的環境監控系統結構

  下位機是一個基于A RM9的嵌入式系統,用于定時采集、處理、存儲被監測的特征數據。經過下位機處理后的數據,按照相關協議,經GPRS模塊發送給上位機。上位機由一臺PC機擔任,負責接收多個下位機發送的數據,并對這些數據進行分析、處理和顯示。環保部門可通過上位機監控其轄區內的污染排放狀況。上位機基于VB. NET開發。

  2下位機硬件設計

  下位機的硬件核心部分由S3C2410、NandFLASH和SDRAM組成,如圖2所示。S3C2410是三星公司生產的一款基于ARM920T內核的32位RISC嵌入式微處理器,帶有獨立的16 KB指令Cache和16 KB數據Cache、LCD控制器、RAM控制器、N and FLASH控制器、并行I/ O口、8路10位ADC,其運行頻率可達203 MHz.8位64 MB的Nand FLASH選用的芯片為K9F1208, 64 MB的SDRAM由2片HY57V561620組成。下位機通過以太網控制器CS8900A擴展了一個網口,數據既可以通過無線傳輸,也可以通過有線傳輸;通過I/ O接口擴展了8個DI口(數字量輸入)、4個AI口(模擬量輸入)、4個DO口(數字量輸出),下位機通過這些接口與被監控設備通信。

53a3fbb3c622f-thumb.jpg

  圖2下位機硬件組成

  3下位機的需求與結構設計

  下位機定時采集、處理現場數據,并存儲在數據庫中,把實時數據發送給上位機,并響應上位機發送的控制命令。因此,下位機需要同時處理多個任務,這些任務并發執行。若使用單線程來完成這些任務,則需要使用多個定時器來觸發,而過多的定時器會導致系統不穩定。Window s是搶先式多任務的操作系統,啟動了一個應用程序就等于啟動了一個進程。一個進程通常擁有一個線程,在系統資源管理中,每一個線程被分配一定的時間片。采用多線程的設計方法可以使程序擁有多個線程,這樣程序就能同時處理更多的任務。因此,若使用多個進程來協作完成,能避免上述缺點且系統比較穩定,但系統對進程的頻繁調度會占用過多資源,程序的可讀性也不好。

  筆者采用一種并行的、多線程方案能夠很好地處理多個任務,并充分節約系統資源。該方案中,下位機有5個線程:GU I線程、復位線程、數據采集與存儲線程、網絡通信線程、決策線程。其中GU I線程為主線程,負責界面處理、系統數據的初始化以及創建子線程等任務;復位線程、數據采集與存儲線程、網絡通信線程是后臺的工作線程,通過優先級調度、線程同步等機制保證能可靠執行現場數據采集、存儲、發送、顯示等任務。復位線程在啟動后循環地對看門狗操作,不作為任務處理線程。任務線程之間的關系如圖3所示。

53a3fc0c0686d-thumb.jpg

  圖3任務線程之間的關系

  4多線程技術在系統中的應用

  4. 1線程的創建

  Linux環境下,使用pthread_cr eate()函數創建一個新線程,默認情況下主線程會等待被創建的子線程執行結束,得到子線程的返回結果然后再繼續往后執行。實時監控程序的子線程都是循環執行的,不需要運行結束后歸并到主線程中,需設置其屬性為PT HREAD _ CREATE _DETACHED.根據子線程的重要性進行優先級設置,確保重要線程優先執行。子線程的優先級從高到低依次為復位線程、數據采集與存儲線程、決策線程、網絡通信線程。

  線程的創建、設置偽代碼如下:

  void * thr ead_wat chdog(void * arg); / /復位線程函數

  void * thr ead_collect ion(void * arg); / /數據采集與存儲線程函數

  void * thr ead_communi cat ion(void * arg); / /網絡通信線程函數

  void * thr ead_decis e(void * arg); / /決策線程函數

  int dat a[ 12] ; / /數據緩沖區,用于存放線程間共享的數據函數

  main()

  {

  / /初始化工作

  ……

  pthread_t wat chd og; / /線程號

  pthread_t collect ion;

  pthread_t commun ication;

  pthread_t deci se;

  pthread_at t r_init(); / /初始化線程屬性

  pthread_at t r_setdetach st at e(); / /不對線程進行重新歸并

  pthread_at t r_set s ched param(); / /設置線程的優先級

  sem_init(); / /對相關信號量進行初始化

  pth read_creat e(); / /創建新線程

  / /啟動GUI程序

  ……

  }

  4. 2線程的同步機制

  同步機制是否合理是多線程應用程序運行是否穩定的關鍵。在程序設計時,需考慮到可能引起數據毀壞的多線程數據訪問沖突以及如何使用同步技術避免這種沖突。Linux操作系統實現同步機制的方法有信號量(semaphore)和互斥量(mutex),這兩種方法相似,但各有側重。信號量側重于一個線程被另一個線程激活,常有先后執行的關系。而互斥量則保護某一共享內存任一時刻只有一個線程訪問。網絡通信線程和數據采集與存儲線程之間的同步通過信號量來實現。

  為了防止系統資源泄漏,保持各個線程的同步,主線程需要初始化數據采集驅動代碼,為數據采集做好準備;申請相應的內存空間,用于存放采集到的實時數據;定義好各個信號量和互斥量。

  4. 3線程的實現方法

  數據采集與存儲線程是獲取數據的起始線程,由GU I線程創建,網絡通信線程和決策線程是由數據采集與存儲線程激活。下位機開始運行后,數據采集與存儲線程啟動,每隔5 s運行1次,讀DI、AI接口的狀態,并把這些狀態和此刻的時間存入SQ Lite數據庫中。數據采集與存儲線程每運行一次,對信號量sem_decise和sem_ com進行一次post操作,分別激活決策線程和網絡通信線程。數據采集與存儲線程的同步流程如圖4所示。

53a3fc66801ad-thumb.jpg

  圖4數據采集與存儲線程的同步流程

  數據采集與存儲線程作為系統的數據源頭,它激活了其它2個子線程,與之相對應,被激活的子線程隨著它的結束而結束。線程在未接受到信號量激活時處于阻塞狀態,不占用系統資源。前臺處理用戶界面的GUI線程與后臺的工作線程之間是獨立的。GU I線程提供友好的人機界面,它把被監控對象的信息實時顯示在圖形界面上,供現場工作人員查詢和設置。

  監控程序的每個線程都需要對存放被監控對象實時狀態的數據緩沖區進行訪問。由于Linux操作系統允許多個線程同時對某一數據緩沖區進行讀操作,但在同一時刻對該數據緩沖區只能有一個寫操作。GUI線程需要定時刷屏,更新被監控對象的實時狀態,因而需要定時對緩沖區進行讀操作,而數據采集與存儲線程定時地對該緩沖區進行寫操作,它們之間沒有觸發關系,是相互獨立運行的。因此,需要對緩沖區設置一個互斥量,確保任一時刻這兩個線程只有一個能對其進行訪問。

  數據采集與存儲線程對緩沖區進行寫操作之前,先對互斥量進行加鎖操作,把實時狀態寫入數據緩沖區后,再進行解鎖。這樣避免了因與GU I線程爭奪資源而造成系統不穩定的現象。上鎖與解鎖操作代碼如下:

  void * thr ead_collect ion(void * arg)

  {

  ……

  pthread_mu tex_lock(dat a_mu tex); / /上鎖操作

  read(fd, dat a, s izeof(dat a)); / /寫實時狀態到data緩沖區

  pthread_mu tex_unl ock(dat a_m ut ex); / /解鎖操作

  / /激活網絡通信線程、決策線程,并寫數據到數據庫

  ……

  }

  同樣,GUI線程中也需要對緩沖區進行相應的上鎖、解鎖操作。

  網絡通信線程和決策線程由GUI線程創建,由數據采集與存儲線程激活,都是每5 s運行1次。

  由于GPRS模塊通過串口與下位機相連,并采用透明傳輸模式,即有數據即傳輸,因此,網絡通信線程只需要定時對串口寫操作就可以完成數據傳輸任務。網絡通信線程先打開串口,設置串口的波特率、數據位、校驗位等屬性,然后等待數據采集與存儲線程的信號量將其激活,第一次被激活后,進入了一個w hile循環,執行一次串口寫操作,再等待下一次被激活。網絡通信線程被激活的條件是數據采集與存儲線程對信號進行了一次加1操作,即sem_ post(sem_2)。網絡通信線程的關鍵代碼如下:

  fd= open(“/ dev/ t t ySC4”, O_RDWR);

  set_sp eed(fd, 9 600); / /設置波特率

  set_parit y(fd, 8, 1, %n); / /設置數據位、奇偶校驗位

  sem_w ait(s em_2); / /等待信號量激活

  w h ile(1){

  w rit e(fd, buf , sizeof(buf)); / /對串口寫操作,發送數據

  sem_w ait(sem_2); / /等待下一次信號量激活

  }

  pth read_exit(“thread exit \ n”); / /線程退出

  決策線程的任務是對當前被監控對象的狀態進行判斷,如果有異常發生,則產生一個報警信號,并執行相關動作來應對這些異常。其代碼結構與網絡通信線程相似。

  5結語

  基于多線程的環境監控系統采用多線程技術完成下位機的多個任務,相對于單任務應用程序,多線程應用程序能夠減少定時器的使用,節約系統資源,從而提高系統效率。而且,多線程應用程序更能體現模塊化設計思想,程序易于維護和修改。該系統已經成功應用于多個項目之中,性能穩定可靠。


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:[email protected]
主站蜘蛛池模板: 欧美日韩精品一区二区三区视频播放 | 精品99在线观看 | 久久99国产乱子伦精品免 | www.亚洲免费 | 欧美巨乳在线观看 | 欧美xo影院| 99久久成人国产精品免费 | 国产99视频精品免费观看7 | 久久久这里只有精品加勒比 | 欧美成人看片黄a免费看 | 国产专区第一页 | 美女张开腿给男人捅 | 亚洲国产欧美目韩成人综合 | 久久国产精品久久精 | 久久精品99精品免费观看 | 日韩国产欧美在线观看一区二区 | 欧美午夜性春猛交 | 国内黄色一级精品 | 男人女人做刺激视频免费 | 免费观看日本特色做爰视频在线 | 久久精品国产精品亚洲人人 | 国产精品成人观看视频国产 | 午夜精品久久久久久99热7777 | 日本三级成人中文字幕乱码 | 亚洲3p| 国产精品视频久久 | 久久精品国产免费高清 | 99热碰| 日本欧美在线视频 | 国产视频在线免费观看 | 欧美91精品久久久久网免费 | 亚洲高清免费视频 | 久久久久久久久网站 | 日韩国产欧美视频 | 99re热视频这里只精品 | 在线精品日韩一区二区三区 | 中文字幕在线欧美 | 手机看片国产日韩 | 午夜限制r级噜噜片一区二区 | 中国美女黄色一级片 | 国产成人精品久久二区二区 |