本發(fā)明涉及嵌入式軟件黑盒自動化測試領域,尤其涉及一種基于雙緩沖同步機制的測試數(shù)據(jù)處理方法。
背景技術:
在嵌入式軟件黑盒自動化測試領域,特別是在實時性能要求比較高的環(huán)境中,在測試過程中,往往會實時產(chǎn)生大數(shù)據(jù)量的測試數(shù)據(jù),如果不能及時的對這些數(shù)據(jù)進行處理,則很可能會影響測試結果的自動分析和判斷,從而造成測試結論的不準確;傳統(tǒng)的處理方法有以下兩種:
方法一:對于周期性采樣的采樣器,測試人員設置一定的采樣頻率進行采樣,采樣到數(shù)據(jù)儲存到數(shù)據(jù)文件中;對于非周期性采樣的采樣器,采用觸發(fā)的方式接收數(shù)據(jù),然后儲存到數(shù)據(jù)文件中。測試人員在采樣結束后,然后再對采樣到數(shù)據(jù)文件進行處理分析,進而得出測試結論。這對測試人員提出了很高的要求,而且由于測試數(shù)據(jù)不能得到實時的處理,所以測試效率低。
方法二:采用多線程的方式進行實時處理,測試過程中收到數(shù)據(jù)后,即開啟一個數(shù)據(jù)處理線程,在數(shù)據(jù)處理線程中對收到的數(shù)據(jù)進行實時的處理。此方法有個弊端,就是當接收到的數(shù)據(jù)很快而且數(shù)據(jù)量大或者數(shù)據(jù)處理算法比較復雜時,往往數(shù)據(jù)處理線程還沒處理完上一次收到的數(shù)據(jù),新的數(shù)據(jù)又收到了,這時又開啟一個新的數(shù)據(jù)處理線程來處理新的數(shù)據(jù),如此反復,最后系統(tǒng)中可能同時存在n個數(shù)據(jù)處理線程在同時處理數(shù)據(jù),很有可能造成系統(tǒng)異常、延時等待時間長、數(shù)據(jù)丟包等現(xiàn)象。
技術實現(xiàn)要素:
鑒于目前存在的上述不足,本發(fā)明提供一種基于雙緩沖同步機制的測試數(shù)據(jù)處理方法,測試人員只需按此方法即可對測試數(shù)據(jù)進行實時準確的處理。
為達到上述目的,本發(fā)明的實施例采用如下技術方案:
一種基于雙緩沖同步機制的測試數(shù)據(jù)處理方法,包括如下步驟:
步驟101,開始;
步驟102,分配第一緩沖區(qū)、第二緩沖區(qū),初始化線程同步鎖和緩沖區(qū)標志;
步驟103,開啟數(shù)據(jù)采集線程和數(shù)據(jù)處理線程;
步驟104,等待外部結束信號,否則否則繼續(xù)等待;
步驟105,結束;
其中,所述數(shù)據(jù)采集線程的實現(xiàn)流程,包括如下步驟:
步驟201,開始;
步驟202,循環(huán)開始;
步驟203,判斷循環(huán)結束標志是否為真,若是則轉到步驟209,否則轉到步驟204;
步驟204,采集到數(shù)據(jù);
步驟205,以阻塞模式獲取所述線程同步鎖的使用權;
步驟206,獲取所述數(shù)據(jù)處理線程正在使用的緩沖區(qū)編號;
步驟207,若緩沖區(qū)編號為1,則將采集到的數(shù)據(jù)儲存到所述第二緩沖區(qū)中,否則儲存到所述第一緩沖區(qū)中;
步驟208,釋放所述線程同步鎖的使用權,然后轉到步驟203;
步驟209,循環(huán)結束;
步驟210,結束;
其中,所述數(shù)據(jù)處理線程的實現(xiàn)流程,包括如下步驟:
步驟301,開始;
步驟302,循環(huán)開始;
步驟303,判斷循環(huán)結束標志是否為真,若是則轉到步驟310,否則轉到步驟304;
步驟304,采集到數(shù)據(jù);
步驟305,以阻塞模式獲取所述線程同步鎖的使用權;
步驟306,獲取當前正在使用的緩沖區(qū)編號;
步驟307,釋放所述線程同步鎖的使用權;
步驟308,若緩沖區(qū)編號為1,則處理所述第一緩沖區(qū)中數(shù)據(jù),否則處理所述第二緩沖區(qū)中的數(shù)據(jù);
步驟309,數(shù)據(jù)處理完畢后,清空當前正在處理的緩沖區(qū)中的數(shù)據(jù)信息,然后轉到步驟303;
步驟310,循環(huán)結束;
步驟311,結束。
依照本發(fā)明的一個方面,所述步驟205中阻塞模式的工作方式為:阻塞并一直等待,直到步驟307中所述數(shù)據(jù)處理線程釋放所述線程同步鎖的使用權后,步驟205中所述數(shù)據(jù)采集線程獲取到所述線程同步鎖的使用權為止,解除阻塞。
依照本發(fā)明的一個方面,當步驟208中所述數(shù)據(jù)采集線程釋放所述線程同步鎖的使用權后,步驟305中的所述數(shù)據(jù)處理線程就能獲取所述線程同步鎖的使用權。
依照本發(fā)明的一個方面,所述步驟305中阻塞模式的工作方式為:阻塞并一直等待,直到步驟208中所述數(shù)據(jù)采集線程釋放所述線程同步鎖的使用權后,步驟305中所述數(shù)據(jù)處理線程獲取到所述線程同步鎖的使用權為止,解除阻塞。
依照本發(fā)明的一個方面,當步驟307中所述數(shù)據(jù)處理線程釋放所述線程同步鎖的使用權后,步驟205中的所述數(shù)據(jù)采集線程就能獲取所述線程同步鎖的使用權。
依照本發(fā)明的一個方面,所述線程同步鎖在同一時刻只能被一個線程使用,若所述數(shù)據(jù)采集線程使用了該鎖,則所述數(shù)據(jù)處理線程必須等到所述數(shù)據(jù)采集線釋放了所述線程同步鎖后才能使用;反之亦然。
依照本發(fā)明的一個方面,所述緩沖區(qū)標志記錄當前數(shù)據(jù)處理線程正在使用的緩沖區(qū)編號。
依照本發(fā)明的一個方面,所述方法在windows平臺的實現(xiàn)如下:
1)定義和實現(xiàn)緩沖區(qū)數(shù)據(jù)結構信息;
2)定義包括緩沖區(qū)、第一緩沖區(qū)指針、第二緩沖區(qū)指針、當前可以寫入數(shù)據(jù)的緩沖區(qū)指針、線程同步鎖在內(nèi)的全局變量;
3)初始化包括緩沖區(qū)在內(nèi)的信息;
4)創(chuàng)建數(shù)據(jù)采集線程和數(shù)據(jù)處理線程;
5)實現(xiàn)數(shù)據(jù)采集線程;
6)實現(xiàn)數(shù)據(jù)處理線程。
依照本發(fā)明的一個方面,所述方法在linux平臺的實現(xiàn)如下:
1)定義和實現(xiàn)緩沖區(qū)數(shù)據(jù)結構信息;
2)定義包括緩沖區(qū)、第一緩沖區(qū)指針、第二緩沖區(qū)指針、當前可以寫入數(shù)據(jù)的緩沖區(qū)指針、線程同步鎖在內(nèi)的全局變量;
3)初始化包括緩沖區(qū)在內(nèi)的信息;
4)創(chuàng)建數(shù)據(jù)采集線程和數(shù)據(jù)處理線程;
5)實現(xiàn)數(shù)據(jù)采集線程;
6)實現(xiàn)數(shù)據(jù)處理線程。
本發(fā)明實施的優(yōu)點:
本發(fā)明基于雙緩沖同步機制,是一種采用多線程和線程同步的方法對數(shù)據(jù)進行實時處理的技術。
與傳統(tǒng)的測試數(shù)據(jù)處理方法相比,本發(fā)明的優(yōu)勢主要表現(xiàn)在:
1、通用性強,適用于windows、linux、vxworks等常用測試平臺。
2、測試數(shù)據(jù)能夠?qū)崟r地處理,且不丟包。
3、更好地利用資源。提高了測試數(shù)據(jù)的處理準確性和實時性,在嵌入式軟件黑盒自動化測試領域更好的幫助測試人員分析和得出測試結論,提高了測試效率。
4、方法的復用性。針對不同的嵌入式被測系統(tǒng),如果測試數(shù)據(jù)的格式相同,則此方法不做修改即可直接使用;如果測試數(shù)據(jù)的格式不同,只需對測試數(shù)據(jù)的格式進行相應的修改,即可對方法進行重用,大大的節(jié)約了測試時間。
附圖說明
為了更清楚地說明本發(fā)明實施例中的技術方案,下面將對實施例中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為雙緩沖同步機制數(shù)據(jù)處理方法實現(xiàn)流程圖。
圖2為數(shù)據(jù)采集線程實現(xiàn)流程圖。
圖3為數(shù)據(jù)處理線程實現(xiàn)流程圖。
具體實施方式
下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領域普通技術人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
本發(fā)明針對的是嵌入式軟件黑盒測試領域,下文主要包括三部分內(nèi)容,雙緩沖同步機制的原理、windows平臺方法的實現(xiàn)和linux平臺方法的實現(xiàn)。
一、雙緩沖同步機制的原理
如圖1所示,雙緩沖同步機制的實現(xiàn)流程,包括如下步驟:
步驟101,開始;
步驟102,分配第一緩沖區(qū)、第二緩沖區(qū),初始化線程同步鎖和緩沖區(qū)標志;
步驟103,開啟數(shù)據(jù)采集線程和數(shù)據(jù)處理線程;
步驟104,等待外部結束信號,否則循環(huán)該步驟;
步驟105,結束;
上述線程同步鎖在同一時刻只能被一個線程使用,例如,若數(shù)據(jù)采集線程使用了該鎖,則數(shù)據(jù)處理線程必須等到數(shù)據(jù)采集線釋放了線程同步鎖后才能使用;反之亦然。
上述緩沖區(qū)標志記錄當前數(shù)據(jù)處理線程正在使用的緩沖區(qū)編號。
如圖2所示,數(shù)據(jù)采集線程實現(xiàn)流程,包括如下步驟:
步驟201,開始;
步驟202,循環(huán)開始;
步驟203,判斷循環(huán)結束標志是否為真,若是則轉到步驟209,否則轉到步驟204;
步驟204,采集到數(shù)據(jù);
步驟205,以阻塞模式獲取所述線程同步鎖的使用權;該方式會一直等待,直到數(shù)據(jù)處理線程釋放線程同步鎖的使用權后,本線程獲取到線程同步鎖的使用權為止;
步驟206,獲取所述數(shù)據(jù)處理線程正在使用的緩沖區(qū)編號;
步驟207,若緩沖區(qū)編號為1,則將采集到的數(shù)據(jù)儲存到所述第二緩沖區(qū)中,否則儲存到所述第一緩沖區(qū)中;
步驟208,釋放所述線程同步鎖的使用權,然后轉到步驟203;釋放后,數(shù)據(jù)處理線程就能獲取線程同步鎖的使用權;
步驟209,循環(huán)結束;
步驟210,結束;
如圖3所示,數(shù)據(jù)處理線程實現(xiàn)流程,包括如下步驟:
步驟301,開始;
步驟302,循環(huán)開始;
步驟303,判斷循環(huán)結束標志是否為真,若是則轉到步驟310,否則轉到步驟304;
步驟304,采集到數(shù)據(jù);
步驟305,以阻塞模式獲取所述線程同步鎖的使用權;該方式會一直,直到數(shù)據(jù)采集線程釋放線程同步鎖的使用權后,本線程獲取到線程同步鎖的使用權為止;
步驟306,獲取當前正在使用的緩沖區(qū)編號;
步驟307,釋放所述線程同步鎖的使用權;釋放后,數(shù)據(jù)采集線程就能獲取線程同步鎖的使用權;
步驟308,若緩沖區(qū)編號為1,則處理所述第一緩沖區(qū)中數(shù)據(jù),否則處理所述第二緩沖區(qū)中的數(shù)據(jù);
步驟309,數(shù)據(jù)處理完畢后,清空當前正在處理的緩沖區(qū)中的數(shù)據(jù)信息,然后轉到步驟303;
步驟310,循環(huán)結束;
步驟311,結束。
通過上述的方案,本發(fā)明采用雙緩沖、雙線程加上線程同步鎖的方式,能夠有效地在短時間內(nèi)對大數(shù)據(jù)量進行同步處理。本方法并不局限于windows、linux平臺,也適用于vxworks、qnx、wince等常用嵌入式系統(tǒng)平臺。
以下僅對windows平臺和linux平臺使用c/c++語言實現(xiàn)此方法進行說明,其它平臺的方法僅需更換創(chuàng)建線程、創(chuàng)建和使用線程鎖的方 法即可。
二、windows平臺實現(xiàn)方法(采用vc實現(xiàn)):
第一步:定義和實現(xiàn)緩沖區(qū)數(shù)據(jù)結構信息
1、定義cls_framebuf,存放每次采集到的數(shù)據(jù)信息,包括數(shù)據(jù)長度和數(shù)據(jù)內(nèi)容存放指針;
2、cls_framebuf類的實現(xiàn),對長度和數(shù)據(jù)內(nèi)容指針進行初始化和釋放;
3、定義cls_databuf,雙緩沖區(qū)數(shù)據(jù)結構信息,用來存放一組采集到的數(shù)據(jù),數(shù)據(jù)按先后順序存放入list鏈表中;
4、cls_databuf類的實現(xiàn),對鏈表指針進行初始化和釋放以及實現(xiàn)添加數(shù)據(jù)信息到鏈表信息的接口;
說明:cls_framebuf類和cls_databuf類的名稱使用者可以替換成任何符合c/c++編程規(guī)范的類名稱。
第二步:定義緩沖區(qū)等全局變量
1、定義數(shù)據(jù)處理線程當前正在使用的緩沖區(qū)編號;
2、定義第一緩沖區(qū)指針;
3、定義第二緩沖區(qū)指針;
4、當前可以寫入數(shù)據(jù)的緩沖區(qū)指針;
5、定義線程同步鎖。
第三步:初始化緩沖區(qū)等信息
將此步驟的實現(xiàn)方法封裝成c/c++的函數(shù)形式,函數(shù)聲明暫定為:voidinit_memory(void);其中的函數(shù)名稱并不局限于此,使用者可以替換成任何符合c/c++編程規(guī)范的函數(shù)名稱均可。
第四步:創(chuàng)建數(shù)據(jù)采集線程和數(shù)據(jù)處理線程
windows平臺采用_beginthreadex的方式創(chuàng)建線程。
1、創(chuàng)建數(shù)據(jù)采集線程;
2、創(chuàng)建數(shù)據(jù)處理線程。
第五步:實現(xiàn)數(shù)據(jù)采集線程
數(shù)據(jù)采集線程的實現(xiàn)
1、實現(xiàn)數(shù)據(jù)采集或接收數(shù)據(jù)的方法,假設采集到或收到的數(shù)據(jù)的 長度值為lrecvsize,數(shù)據(jù)內(nèi)容存放在recvbuf中;
2、采集數(shù)據(jù);
3、調(diào)用addtobuffer函數(shù)將收到的數(shù)據(jù)信息存放入當前可以存放的緩沖區(qū);
addtobuffer函數(shù)的實現(xiàn)
1、創(chuàng)建數(shù)據(jù)內(nèi)容指針存儲采集到的數(shù)據(jù);
2、獲取線程同步鎖的使用權;
3、如果當前數(shù)據(jù)處理線程正在使用第一緩沖區(qū),則表明第二緩沖區(qū)可以寫入待處理的數(shù)據(jù);反之則可將待處理的數(shù)據(jù)寫入第一緩沖區(qū);
4、待處理數(shù)據(jù)寫入緩沖區(qū)后,釋放線程同步鎖。
第六步:實現(xiàn)數(shù)據(jù)處理線程
數(shù)據(jù)采集線程的實現(xiàn)
1、獲取當前可以讀的緩沖區(qū),然后將可讀緩沖區(qū)內(nèi)的數(shù)據(jù)讀取出來進行處理;
2、使用者完成自己的數(shù)據(jù)處理方式;
3、數(shù)據(jù)處理功能的實現(xiàn);
4、當前緩沖區(qū)內(nèi)的數(shù)據(jù)處理完畢后,將自動處理另一個緩沖區(qū)內(nèi)的數(shù)據(jù),此時只需更改緩沖區(qū)標志即可;
5、獲取線程同步鎖的使用權,然后對緩沖區(qū)標志進行更改;
getreadbuf函數(shù)功能的實現(xiàn)
1、獲取線程同步鎖的使用權;
2、若當前可讀的緩沖區(qū)為第一緩沖區(qū),則返回第一緩沖區(qū)的地址;否則返回第二緩沖區(qū)的地址;
3、在返回可讀的緩沖區(qū)地址之前釋放線程同步鎖,用來避免系統(tǒng)出現(xiàn)死鎖的現(xiàn)象。
三、inux平臺實現(xiàn)方法(采用c++實現(xiàn)):
第一步:定義和實現(xiàn)緩沖區(qū)數(shù)據(jù)結構信息,與windows平臺一樣
1、定義cls_framebuf,存放每次采集到的數(shù)據(jù)信息,包括數(shù)據(jù)長度和數(shù)據(jù)內(nèi)容存放指針;
2、cls_framebuf類的實現(xiàn),對長度和數(shù)據(jù)內(nèi)容指針進行初始化和 釋放;
3、定義cls_databuf,雙緩沖區(qū)數(shù)據(jù)結構信息,用來存放一組采集到的數(shù)據(jù),數(shù)據(jù)按先后順序存放入list鏈表中;
4、cls_databuf類的實現(xiàn),對鏈表指針進行初始化和釋放以及實現(xiàn)添加數(shù)據(jù)信息到鏈表信息的接口;
說明:cls_framebuf類和cls_databuf類的名稱使用者可以替換成任何符合c/c++編程規(guī)范的類名稱。
第二步:定義緩沖區(qū)等全局變量
1、定義數(shù)據(jù)處理線程當前正在使用的緩沖區(qū)編號;
2、定義第一緩沖區(qū)指針;
3、定義第二緩沖區(qū)指針;
4、定義當前可以寫入數(shù)據(jù)的緩沖區(qū)指針;
5、定義線程同步鎖。
第三步:初始化緩沖區(qū)等信息
將此步驟的實現(xiàn)方法封裝成c/c++的函數(shù)形式,函數(shù)聲明暫定為:voidinit_memory(void);其中的函數(shù)名稱并不局限于此,使用者可以替換成任何符合c/c++編程規(guī)范的函數(shù)名稱均可。
第四步:創(chuàng)建數(shù)據(jù)采集線程和數(shù)據(jù)處理線程
linux平臺采用pthread_create的方式創(chuàng)建線程。
1、創(chuàng)建數(shù)據(jù)采集線程;
2、創(chuàng)建數(shù)據(jù)處理線程。
第五步:實現(xiàn)數(shù)據(jù)采集線程
數(shù)據(jù)采集線程的實現(xiàn)
1、實現(xiàn)數(shù)據(jù)采集或接收數(shù)據(jù)的方法,假設采集到或收到的數(shù)據(jù)的長度值為lrecvsize,數(shù)據(jù)內(nèi)容存放在recvbuf中;
2、采集數(shù)據(jù);
3、調(diào)用addtobuffer函數(shù)將收到的數(shù)據(jù)信息存放入當前可以存放的緩沖區(qū);
addtobuffer函數(shù)的實現(xiàn)
1、創(chuàng)建數(shù)據(jù)內(nèi)容指針存儲采集到的數(shù)據(jù);
2、獲取線程同步鎖的使用權;
3、如果當前數(shù)據(jù)處理線程正在使用第一緩沖區(qū),則表明第二緩沖區(qū)可以寫入待處理的數(shù)據(jù);反之則可將待處理的數(shù)據(jù)寫入第一緩沖區(qū);
4、待處理數(shù)據(jù)寫入緩沖區(qū)后,釋放線程同步鎖。
第六步:實現(xiàn)數(shù)據(jù)處理線程
數(shù)據(jù)采集線程的實現(xiàn)
1、獲取當前可以讀的緩沖區(qū),然后將可讀緩沖區(qū)內(nèi)的數(shù)據(jù)讀取出來進行處理;
2、使用者完成自己的數(shù)據(jù)處理方式;
3、數(shù)據(jù)處理功能的實現(xiàn);
4、當前緩沖區(qū)內(nèi)的數(shù)據(jù)處理完畢后,將自動處理另一個緩沖區(qū)內(nèi)的數(shù)據(jù),此時只需更改緩沖區(qū)標志即可;
5、獲取線程同步鎖的使用權,然后對緩沖區(qū)標志進行更改;
getreadbuf函數(shù)功能的實現(xiàn)
1、獲取線程同步鎖的使用權;
2、若當前可讀的緩沖區(qū)為第一緩沖區(qū),則返回第一緩沖區(qū)的地址;否則返回第二緩沖區(qū)的地址;
3、在返回可讀的緩沖區(qū)地址之前釋放線程同步鎖,用來避免系統(tǒng)出現(xiàn)死鎖的現(xiàn)象。
從上可以看出,windows平臺和linux平臺的實現(xiàn)步驟完全一樣,所不同的只是創(chuàng)建線程和使用線程同步鎖的方法不一樣,這個是由于平臺的不同所決定的。同上原理,vxworks、qnx、wince等平臺也可以采用此雙緩沖同步機制來進行數(shù)據(jù)的實時處理,只需要將創(chuàng)建線程和使用線程同步鎖的方法替換成該平臺下可用的方法即可。
以上所述,僅為本發(fā)明的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何熟悉本領域技術的技術人員在本發(fā)明公開的技術范圍內(nèi),可輕易想到的變化或替換,都應涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應以所述權利要求的保護范圍為準。