分享一個自己量產(chǎn)項(xiàng)目上的集成測試軟件MTTEST
好久沒寫公眾號了,最近兩個月基本忙成狗,沒辦法,工作和家庭都要相互兼顧,有了個小寶寶以后好多時間都沒那么自由啦,2020年第一篇就來分享一個剛畢業(yè)的時候?qū)懙囊粋€量產(chǎn)測試工具吧,采用的是C語言來編寫,剛開始應(yīng)用在Linux和Android平臺上,后面通過移植也用在單片機(jī)上,使用起來非常簡單,讓我們來看看怎么回事。
一、主程序源碼分析
int main(void){s32 i ;//初始化測試系統(tǒng)INIT_TEST_SYSTEM();//定義頭指針,初始化頭節(jié)點(diǎn)INIT_WORK(work_node);for(i = ZERO ; i < NR(work_Register) ; i++){//實(shí)現(xiàn)工作任務(wù)的注冊REGISTER_WORK(work_node , create_cwork(work_Register[i].work_num ,work_Register[i].work_name , work_Register[i].work_handler));}//調(diào)度工作任務(wù),編號從小到大排序SCHEDULING_WORK(work_node,Positive,NR(work_Register));while(True){;}DESTROY_WORK(work_node,work_Register);return SUCCESS ;}
這段程序的核心框架由四部分組成:
INIT_WORK
REGISTER_WORK
SCHEDULING_WORK
DESTROY_WORK
如果你不去追,你可能以為這是四個定義好的函數(shù),別被它的表面欺騙了,其實(shí)它們是宏,宏的下面一級才是函數(shù)的實(shí)現(xiàn):
#define __INIT_WORK(_work) \
do{ \
_work =Init_cwork(_work); \
}while(0)
#define INIT_WORK(work_node) \
_work work_node = NULL ; \
__INIT_WORK(work_node);
#define REGISTER_WORK(__work,new_work) \
Register_work_fuc(__work,new_work);
#define SCHEDULING_WORK(work_node,direction,array_size) \
Run_Priority_work(work_node,direction,array_size);
#define DESTROY_WORK(work_node,array) \
work_node =Destroy_work(work_node ,array);
各個子函數(shù)的實(shí)現(xiàn):
//初始化一個子任務(wù)
_work Init_cwork();
//創(chuàng)建一個子任務(wù)
_work create_cwork(s32 work_num,pchar work_name ,work_fun work_fuc);
//注冊子任務(wù)
No_returnRegister_work_fuc(_work __work,_work new_work);
//查找子任務(wù)的編號
s32 Find_Work_Num(_work headler,s32 work_num);
//查找子任務(wù)的名稱
pchar Find_Work_Name(_work headler,pchar work_name);
//執(zhí)行子任務(wù)----根據(jù)任務(wù)名稱來執(zhí)行
s32 Run_work_for_work_name(_work headler,pchar work_name);
//銷毀一個子任務(wù)
s32 Destroy_cwork(_work headler,pchar work_name);
//銷毀全部任務(wù)
_work Destroy_work(_work headler,_work array);
//工作優(yōu)先級調(diào)度執(zhí)行--->工作編號小的優(yōu)先級高,依次類推
s32 Run_Priority_work(_work handler,s32 direction,const s32 work_array_size);
通過宏調(diào)用各個子函數(shù)完成任務(wù)的初始化,注冊、執(zhí)行、銷毀,這個過程是由一個鏈表來實(shí)現(xiàn)的:
typedefstruct __Work
{
//任務(wù)編號
//根據(jù)任務(wù)編號決定工作任務(wù)的優(yōu)先級
//編號越小,優(yōu)先級越高
s32 work_num ;
//任務(wù)名稱
pchar work_name ;
//根據(jù)相應(yīng)的任務(wù)名稱,處理相應(yīng)的任務(wù)
void(*work_handler)(int);
struct __Work *next;
}work;
typedef work * _work ;
由于這是一個集成測試工具,所以存在著任務(wù)的并行執(zhí)行,所以當(dāng)執(zhí)行一個任務(wù)的時候其實(shí)就創(chuàng)建了一條線程,這個過程是在Run_Priority_work里實(shí)現(xiàn)的。
s32 Run_Priority_work(_work handler,s32 direction,const s32 work_array_size){s32 count = 0 ;s32 i ;assert(handler != NULL);_work temp = handler->next ;s32 Curent_node_Array[work_array_size];while(temp != NULL){Curent_node_Array[count] = temp->work_num ;temp = temp->next ;if(count < work_array_size)count++ ;}Sort_work_num(Curent_node_Array,NR(Curent_node_Array),direction) ;for(i = 0 ; i < NR(Curent_node_Array) ; i++)Run_work_for_work_num(handler,Curent_node_Array[i]);return SUCCESS ;}
核心的部分也就這些了,接下來講講怎么用吧。
二、使用MTTEST實(shí)現(xiàn)并行測試項(xiàng)
main.c的代碼一句都不用動,如果你要添加一個并行的測試項(xiàng)目,只需要在結(jié)構(gòu)體數(shù)組里聲明好,定義好測試任務(wù)函數(shù)就可以了,具體使用方法如下:
//按鍵測試
intTpad_Key_Test(int work_num);
//Gsensor測試
intTpad_Gsensor_Test(int work_num);
//時鐘測試
int RTC_Test(int work_num);
//電池電量測試
intBattery_Capacity_Test(int work_num);
//電池狀態(tài)測試
intBattery_Status_Test(int work_num);
//內(nèi)存測試
int DDR_Test(int work_num);
//EMMC測試
int EMMC_Test(int work_num);
//SD卡測試
int SD_Test(int work_num);
//WIFI MAC地址讀取測試
int NVRAM_WIFI_MAC_ADDRESS_READ_TEST(int work_num);
//WIFI ssid獲取測試
int WIFI_SSID_Test(int work_num);
//LCD RGB測試
int LCD_Test(int work_num);
//初始化測試系統(tǒng)
int INIT_TEST_SYSTEM();
//Camera旋轉(zhuǎn)按鍵測試
int camera_rotate_test(int work_num);
//結(jié)構(gòu)體數(shù)組描述:
/*
ep:
{1,"LCD_Test",LCD_Test},
1表示任務(wù)編號,同時也表示在LCD的哪一行進(jìn)行顯示
"LCD_Test"表示任務(wù)名稱
LCD_Test表示任務(wù)執(zhí)行函數(shù)
*/
work work_Register[]=
{
{1,"Tpad_Key_Test",Tpad_Key_Test},
{2,"Tpad_Gsensor_Test",Tpad_Gsensor_Test},
{3,"RTC_Test",RTC_Test},
{4,"Battery_Capacity_Test",Battery_Capacity_Test},
{5,"Battery_Status_Test",Battery_Status_Test},
{6,"DDR_Test",DDR_Test},
{7,"EMMC_Test",EMMC_Test},
{8,"SD_Test",SD_Test},
{9,"NVRAM_WIFI_MAC_ADDRESS_READ_TEST",NVRAM_WIFI_MAC_ADDRESS_READ_TEST},
{10,"WIFI_SSID_Test",WIFI_SSID_Test},
#ifndef __PLAN_A
{11,"camera_rotate_test",camera_rotate_test},
#endif
{12,"LCD_Test",LCD_Test},
};
預(yù)知詳情,請?jiān)敿?xì)看看我分享的項(xiàng)目代碼,注釋很詳細(xì)。
三、分享鏈接
鏈接:https://pan.baidu.com/s/1rPjS2r1-JgmzhF1nFhc0Kg
提取碼:dlv3
往期分享
分享一個非常有用且簡單C語言測試框架
C語言strstr函數(shù)解析自定義協(xié)議參數(shù)
深入淺出剖析C語言函數(shù)指針與回調(diào)函數(shù)
C語言數(shù)組結(jié)合位運(yùn)算實(shí)戰(zhàn)-位移與查表
我的創(chuàng)業(yè)故事
2019年和同學(xué)一起注冊了一家公司—深圳云之手科技有限公司,主要是物聯(lián)網(wǎng)相關(guān)產(chǎn)品的開發(fā),目前任副總經(jīng)理職位,我主要負(fù)責(zé)的是企業(yè)的經(jīng)營和管理,由于人員還沒有那么多,所以偶爾也會兼任產(chǎn)品的研發(fā)管理,如果各位有客戶需要開發(fā)相關(guān)產(chǎn)品可以通過以下名片聯(lián)系我,推薦成功的朋友有現(xiàn)金提成,絕對不低!
企業(yè)介紹
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!





