為提高環境監控系統的穩定性,節約系統資源,提出了一種由下位機、傳輸網絡和上位機組成的環境監控系統的設計方案,詳細介紹了該系統中下位機的硬件及軟件設計。該下位機硬件以ARM9處理器S3C2410為核心,軟件采用多線程應用程序同時處理多個任務,并采用信號量和互斥量實現線程間的同步。實際應用表明,該系統運行穩定,提高了系統效率。
0引言
隨著國民經濟及工業技術的發展,環境保護越來越受到重視。現在市場上已經出現了多種環境監控系統,但性能不穩定。現場監控終端大多采用工控機或單片機,前者抗干擾性能好,但成本較高;后者處理能力低,人機界面不友好,不利于現場人員的監控管理。針對上述問題,筆者設計了一種基于多線程的環境監控系統。該系統采用多線程技術有效地實現了監控過程中數據的采集與存儲、實時數據顯示、下位機(監控終端)與上位機(監控中心)的通信、實時報警等功能。本文重點介紹該系統下位機的設計。
1系統總體結構
基于多線程的環境監控系統由現場監控終端(下位機)、傳輸網絡、監控中心(上位機)3個部分組成,其結構如圖1所示。
圖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口(數字量輸出),下位機通過這些接口與被監控設備通信。
圖2下位機硬件組成
3下位機的需求與結構設計
下位機定時采集、處理現場數據,并存儲在數據庫中,把實時數據發送給上位機,并響應上位機發送的控制命令。因此,下位機需要同時處理多個任務,這些任務并發執行。若使用單線程來完成這些任務,則需要使用多個定時器來觸發,而過多的定時器會導致系統不穩定。Window s是搶先式多任務的操作系統,啟動了一個應用程序就等于啟動了一個進程。一個進程通常擁有一個線程,在系統資源管理中,每一個線程被分配一定的時間片。采用多線程的設計方法可以使程序擁有多個線程,這樣程序就能同時處理更多的任務。因此,若使用多個進程來協作完成,能避免上述缺點且系統比較穩定,但系統對進程的頻繁調度會占用過多資源,程序的可讀性也不好。
筆者采用一種并行的、多線程方案能夠很好地處理多個任務,并充分節約系統資源。該方案中,下位機有5個線程:GU I線程、復位線程、數據采集與存儲線程、網絡通信線程、決策線程。其中GU I線程為主線程,負責界面處理、系統數據的初始化以及創建子線程等任務;復位線程、數據采集與存儲線程、網絡通信線程是后臺的工作線程,通過優先級調度、線程同步等機制保證能可靠執行現場數據采集、存儲、發送、顯示等任務。復位線程在啟動后循環地對看門狗操作,不作為任務處理線程。任務線程之間的關系如圖3所示。
圖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程序
……
}
-
監控系統
+關注
關注
21文章
3943瀏覽量
177220 -
上位機
+關注
關注
27文章
945瀏覽量
55034 -
下位機
+關注
關注
0文章
94瀏覽量
18831
發布評論請先 登錄
相關推薦
評論