基于多線程的環(huán)境監(jiān)控系統(tǒng)下位機(jī)的設(shè)計(jì)[圖]

相關(guān)專題: 無線 芯片

摘要:為提高環(huán)境監(jiān)控系統(tǒng)的穩(wěn)定性,節(jié)約系統(tǒng)資源,提出了一種由下位機(jī)、傳輸網(wǎng)絡(luò)和上位機(jī)組成的環(huán)境監(jiān)控系統(tǒng)的設(shè)計(jì)方案,詳細(xì)介紹了該系統(tǒng)中下位機(jī)的硬件及軟件設(shè)計(jì)。該下位機(jī)硬件以ARM9 處理器S3C2410 為核心,軟件采用多線程應(yīng)用程序同時(shí)處理多個(gè)任務(wù),并采用信號(hào)量和互斥量實(shí)現(xiàn)線程間的同步。實(shí)際應(yīng)用表明,該系統(tǒng)運(yùn)行穩(wěn)定,提高了系統(tǒng)效率。

0 引言

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

1 系統(tǒng)總體結(jié)構(gòu)

基于多線程的環(huán)境監(jiān)控系統(tǒng)由現(xiàn)場監(jiān)控終端(下位機(jī))、傳輸網(wǎng)絡(luò)、監(jiān)控中心(上位機(jī))3 個(gè)部分組成,其結(jié)構(gòu)如圖1 所示。

圖1 基于多線程的環(huán)境監(jiān)控系統(tǒng)結(jié)構(gòu)

下位機(jī)是一個(gè)基于A RM9 的嵌入式系統(tǒng),用于定時(shí)采集、處理、存儲(chǔ)被監(jiān)測的特征數(shù)據(jù)。經(jīng)過下位機(jī)處理后的數(shù)據(jù),按照相關(guān)協(xié)議,經(jīng)GPRS 模塊發(fā)送給上位機(jī)。上位機(jī)由一臺(tái)PC 機(jī)擔(dān)任,負(fù)責(zé)接收多個(gè)下位機(jī)發(fā)送的數(shù)據(jù),并對這些數(shù)據(jù)進(jìn)行分析、處理和顯示。環(huán)保部門可通過上位機(jī)監(jiān)控其轄區(qū)內(nèi)的污染排放狀況。上位機(jī)基于VB. NET 開發(fā)。

2 下位機(jī)硬件設(shè)計(jì)

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

圖2 下位機(jī)硬件組成

3 下位機(jī)的需求與結(jié)構(gòu)設(shè)計(jì)

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

筆者采用一種并行的、多線程方案能夠很好地處理多個(gè)任務(wù),并充分節(jié)約系統(tǒng)資源。該方案中,下位機(jī)有5 個(gè)線程: GU I 線程、復(fù)位線程、數(shù)據(jù)采集與存儲(chǔ)線程、網(wǎng)絡(luò)通信線程、決策線程。其中GU I線程為主線程,負(fù)責(zé)界面處理、系統(tǒng)數(shù)據(jù)的初始化以及創(chuàng)建子線程等任務(wù); 復(fù)位線程、數(shù)據(jù)采集與存儲(chǔ)線程、網(wǎng)絡(luò)通信線程是后臺(tái)的工作線程,通過優(yōu)先級(jí)調(diào)度、線程同步等機(jī)制保證能可靠執(zhí)行現(xiàn)場數(shù)據(jù)采集、存儲(chǔ)、發(fā)送、顯示等任務(wù)。復(fù)位線程在啟動(dòng)后循環(huán)地對看門狗操作,不作為任務(wù)處理線程。任務(wù)線程之間的關(guān)系如圖3 所示。

圖3 任務(wù)線程之間的關(guān)系

4 多線程技術(shù)在系統(tǒng)中的應(yīng)用

4. 1 線程的創(chuàng)建

Linux 環(huán)境下,使用pthread_cr eate()函數(shù)創(chuàng)建一個(gè)新線程,默認(rèn)情況下主線程會(huì)等待被創(chuàng)建的子線程執(zhí)行結(jié)束,得到子線程的返回結(jié)果然后再繼續(xù)往后執(zhí)行。實(shí)時(shí)監(jiān)控程序的子線程都是循環(huán)執(zhí)行的,不需要運(yùn)行結(jié)束后歸并到主線程中,需設(shè)置其屬性為PT HREAD _ CREATE _DETACHED.根據(jù)子線程的重要性進(jìn)行優(yōu)先級(jí)設(shè)置,確保重要線程優(yōu)先執(zhí)行。子線程的優(yōu)先級(jí)從高到低依次為復(fù)位線程、數(shù)據(jù)采集與存儲(chǔ)線程、決策線程、網(wǎng)絡(luò)通信線程。

線程的創(chuàng)建、設(shè)置偽代碼如下:

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

void * thr ead_collect iON(void * arg); / / 數(shù)據(jù)采集與存儲(chǔ)線程函數(shù)

void * thr ead_communi cat ion(void * arg); / / 網(wǎng)絡(luò)通信線程函數(shù)

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

int dat a[ 12] ; / / 數(shù)據(jù)緩沖區(qū),用于存放線程間共享的數(shù)據(jù)函數(shù)

main()

{

/ / 初始化工作

……

pthread_t wat chd og; / / 線程號(hào)

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(); / / 不對線程進(jìn)行重新歸并

pthread_at t r_set s ched param(); / / 設(shè)置線程的優(yōu)先級(jí)

sem_init ; / / 對相關(guān)信號(hào)量進(jìn)行初始化

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

/ / 啟動(dòng)GUI 程序

……

}

4. 2 線程的同步機(jī)制

同步機(jī)制是否合理是多線程應(yīng)用程序運(yùn)行是否穩(wěn)定的關(guān)鍵。在程序設(shè)計(jì)時(shí),需考慮到可能引起數(shù)據(jù)毀壞的多線程數(shù)據(jù)訪問沖突以及如何使用同步技術(shù)避免這種沖突。Linux 操作系統(tǒng)實(shí)現(xiàn)同步機(jī)制的方法有信號(hào)量(semaphore )和互斥量(mutex ),這兩種方法相似,但各有側(cè)重。信號(hào)量側(cè)重于一個(gè)線程被另一個(gè)線程激活,常有先后執(zhí)行的關(guān)系。而互斥量則保護(hù)某一共享內(nèi)存任一時(shí)刻只有一個(gè)線程訪問。網(wǎng)絡(luò)通信線程和數(shù)據(jù)采集與存儲(chǔ)線程之間的同步通過信號(hào)量來實(shí)現(xiàn)。

為了防止系統(tǒng)資源泄漏,保持各個(gè)線程的同步,主線程需要初始化數(shù)據(jù)采集驅(qū)動(dòng)代碼,為數(shù)據(jù)采集做好準(zhǔn)備; 申請相應(yīng)的內(nèi)存空間,用于存放采集到的實(shí)時(shí)數(shù)據(jù); 定義好各個(gè)信號(hào)量和互斥量。

4. 3 線程的實(shí)現(xiàn)方法

數(shù)據(jù)采集與存儲(chǔ)線程是獲取數(shù)據(jù)的起始線程,由GU I 線程創(chuàng)建,網(wǎng)絡(luò)通信線程和決策線程是由數(shù)據(jù)采集與存儲(chǔ)線程激活。下位機(jī)開始運(yùn)行后,數(shù)據(jù)采集與存儲(chǔ)線程啟動(dòng),每隔5 s 運(yùn)行1 次,讀DI、AI接口的狀態(tài),并把這些狀態(tài)和此刻的時(shí)間存入SQ Lite 數(shù)據(jù)庫中。數(shù)據(jù)采集與存儲(chǔ)線程每運(yùn)行一次,對信號(hào)量sem_decise 和sem_ com 進(jìn)行一次post 操作,分別激活決策線程和網(wǎng)絡(luò)通信線程。數(shù)據(jù)采集與存儲(chǔ)線程的同步流程如圖4 所示。

圖4 數(shù)據(jù)采集與存儲(chǔ)線程的同步流程

數(shù)據(jù)采集與存儲(chǔ)線程作為系統(tǒng)的數(shù)據(jù)源頭,它激活了其它2 個(gè)子線程,與之相對應(yīng),被激活的子線程隨著它的結(jié)束而結(jié)束。線程在未接受到信號(hào)量激活時(shí)處于阻塞狀態(tài),不占用系統(tǒng)資源。前臺(tái)處理用戶界面的GUI 線程與后臺(tái)的工作線程之間是獨(dú)立的。GU I 線程提供友好的人機(jī)界面,它把被監(jiān)控對象的信息實(shí)時(shí)顯示在圖形界面上,供現(xiàn)場工作人員查詢和設(shè)置。

監(jiān)控程序的每個(gè)線程都需要對存放被監(jiān)控對象實(shí)時(shí)狀態(tài)的數(shù)據(jù)緩沖區(qū)進(jìn)行訪問。由于Linux 操作系統(tǒng)允許多個(gè)線程同時(shí)對某一數(shù)據(jù)緩沖區(qū)進(jìn)行讀操作,但在同一時(shí)刻對該數(shù)據(jù)緩沖區(qū)只能有一個(gè)寫操作。GUI 線程需要定時(shí)刷屏,更新被監(jiān)控對象的實(shí)時(shí)狀態(tài),因而需要定時(shí)對緩沖區(qū)進(jìn)行讀操作,而數(shù)據(jù)采集與存儲(chǔ)線程定時(shí)地對該緩沖區(qū)進(jìn)行寫操作,它們之間沒有觸發(fā)關(guān)系,是相互獨(dú)立運(yùn)行的。因此,需要對緩沖區(qū)設(shè)置一個(gè)互斥量,確保任一時(shí)刻這兩個(gè)線程只有一個(gè)能對其進(jìn)行訪問。

數(shù)據(jù)采集與存儲(chǔ)線程對緩沖區(qū)進(jìn)行寫操作之前,先對互斥量進(jìn)行加鎖操作,把實(shí)時(shí)狀態(tài)寫入數(shù)據(jù)緩沖區(qū)后,再進(jìn)行解鎖。這樣避免了因與GU I 線程爭奪資源而造成系統(tǒng)不穩(wěn)定的現(xiàn)象。上鎖與解鎖操作代碼如下:

void * thr ead_collect ion(void * arg)

{

……

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

read(fd, & dat a, s izeof (dat a)); / / 寫實(shí)時(shí)狀態(tài)到data 緩沖區(qū)

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

/ / 激活網(wǎng)絡(luò)通信線程、決策線程,并寫數(shù)據(jù)到數(shù)據(jù)庫

……

}

同樣,GUI 線程中也需要對緩沖區(qū)進(jìn)行相應(yīng)的上鎖、解鎖操作。

網(wǎng)絡(luò)通信線程和決策線程由GUI 線程創(chuàng)建,由數(shù)據(jù)采集與存儲(chǔ)線程激活,都是每5 s 運(yùn)行1 次。

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

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

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

set_parit y(fd, 8, 1, %n& ); / / 設(shè)置數(shù)據(jù)位、奇偶校驗(yàn)位

sem_w ait (& s em_2); / / 等待信號(hào)量激活

w h ile(1){

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

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

}

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

決策線程的任務(wù)是對當(dāng)前被監(jiān)控對象的狀態(tài)進(jìn)行判斷,如果有異常發(fā)生,則產(chǎn)生一個(gè)報(bào)警信號(hào),并執(zhí)行相關(guān)動(dòng)作來應(yīng)對這些異常。其代碼結(jié)構(gòu)與網(wǎng)絡(luò)通信線程相似。

5 結(jié)語

基于多線程的環(huán)境監(jiān)控系統(tǒng)采用多線程技術(shù)完成下位機(jī)的多個(gè)任務(wù),相對于單任務(wù)應(yīng)用程序,多線程應(yīng)用程序能夠減少定時(shí)器的使用,節(jié)約系統(tǒng)資源,從而提高系統(tǒng)效率。而且,多線程應(yīng)用程序更能體現(xiàn)模塊化設(shè)計(jì)思想,程序易于維護(hù)和修改。該系統(tǒng)已經(jīng)成功應(yīng)用于多個(gè)項(xiàng)目之中,性能穩(wěn)定可靠。

作者:陳立定 呂盛林 來源:《工礦自動(dòng)化》

我推薦大家讀

輕松參與

VS

表達(dá)立場

這是垃圾文章


微信掃描分享本文到朋友圈
掃碼關(guān)注5G通信官方公眾號(hào),免費(fèi)領(lǐng)取以下5G精品資料
  • 1、回復(fù)“YD5GAI”免費(fèi)領(lǐng)取《中國移動(dòng):5G網(wǎng)絡(luò)AI應(yīng)用典型場景技術(shù)解決方案白皮書
  • 2、回復(fù)“5G6G”免費(fèi)領(lǐng)取《5G_6G毫米波測試技術(shù)白皮書-2022_03-21
  • 3、回復(fù)“YD6G”免費(fèi)領(lǐng)取《中國移動(dòng):6G至簡無線接入網(wǎng)白皮書
  • 4、回復(fù)“LTBPS”免費(fèi)領(lǐng)取《《中國聯(lián)通5G終端白皮書》
  • 5、回復(fù)“ZGDX”免費(fèi)領(lǐng)取《中國電信5GNTN技術(shù)白皮書
  • 6、回復(fù)“TXSB”免費(fèi)領(lǐng)取《通信設(shè)備安裝工程施工工藝圖解
  • 7、回復(fù)“YDSL”免費(fèi)領(lǐng)取《中國移動(dòng)算力并網(wǎng)白皮書
  • 8、回復(fù)“5GX3”免費(fèi)領(lǐng)取《R1623501-g605G的系統(tǒng)架構(gòu)1
  • 本周熱點(diǎn)本月熱點(diǎn)

     

      最熱通信招聘

    業(yè)界最新資訊


      最新招聘信息