自从我写了公共帐户以来已经有很长时间了。在过去的两个月中,我基本上已经成为狗。我无能为力工作和家庭必须互相照顾。生完孩子以后,我会在很多时间里没有那么自由。我刚毕业时写了一个量产测试工具。它是用C语言编写的。它首先应用于Linux和Android平台。后来,它也通过移植在单片机上使用。使用非常简单。让我们来看看。发生了什么。 1.主程序源代码分析int main(void){s32 i; //初始化测试系统INIT_TEST_SYSTEM(); //定义头指针,初始化头节点INIT_WORK(work_node); for(i = 0; i& lt; NR(work_Register); i ++){//实现工作任务的注册REGISTER_WORK(work_node,create_cwork(work_Register [i] .work_num,work_Register [i] .work_name,work_Register [i] ] .work_handler));} //安排工作任务,从小型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别紧追它,您可能会认为这是四个已定义的函数。不要被他们的外表所迷惑。实际上,它们是宏。宏的下一层是函数的实现:#define __INIT_WORK(_work)do {_work = Init_cwork(_work); } while(0)#定义INIT_WORK(work_node)_work work_node = NULL; __INIT_WORK(工作节点); #define REGISTER_WORK(__ work,new_work)Register_work_fuc(__ work,new_work); #define SCHEDULING_WORK(work_node,direction,arra y_size)Run_Priority_work(work_node,direction,array_size); #定义DESTROY_WORK(work_node,array)work_node = Destroy_work(work_node,array);每个子功能的实现://初始化一个子任务_work Init_cwork(); //创建一个子任务_work create_cwork(s32 work_num,pchar work_name,work_fun work_fuc); //注册子任务No_returnRegister_work_fuc(_work __work,_work new_work); //查找子任务编号s32 Find_Work_Num(_work headler,s32 work_num); //查找子任务的名称pchar Find_Work_Name(_work headler,pchar work_name); //执行子任务----根据任务名称Run_work_for_work_name(_work headler,pchar work_name)执行s32 //销毁子任务s32 Destroy_cwork(_work headler,pchar work_name); //销毁所有任务_work Destroy_work(_work headler,_work array); //工作优先级安排和执行--->工作编号越小,优先级越高,依此类推。s32 Run_Priority_work(_work handler,s32 direction,const s32 work_array_size);通过宏调用每个子功能来完成任务的初始化,注册,执行和销毁。这个过程是通过一个链表来实现的:typedefstruct __Work {//任务号//根据任务号Level //确定工作任务的优先级。 //任务名称pchar work_name; //根据相应的任务名称处理相应的任务void(* work_handler)(int);结构__Work * next; }工作; typedef work * _work;由于这是一个集成的测试工具,因此可以并行执行任务,因此当执行任务时,实际上会创建一个线程。此过程在Run_Priority_work中实现。 s32 Run_Priority_work(_work handler,s32 direction,const s32 work_array_size){s32 count = 0; s32我; assert(handler!= NULL); _work temp = handler-> next; s32 Curent_node_Array [work_array_size]; while(temp!= NULL){Curent_node_Array [count] = temp-& gt; work_num; temp = temp-&n; next; if(count& lt; work_array_size)count ++;} Sort_work_num(Curent_node_Array,NR(Curent_node_Array),direction); for(i = 0; i& lt; NR(Curent_node_Array); i ++)Run_work_for_work_num(handler,Curent_node_Array [i]); return SUCCESS;}这就是核心部分,所以我们来谈谈如何使用它。 2.使用MTTEST实现并行测试项目main.c代码,而无需移动单个句子。如果要添加并行测试项目,只需在结构数组中声明它并定义测试任务功能。具体用法如下://按键测试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); //电池状态测试intBattery_Status_Test(int work_num); //内存测试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); //初始化测试系统int INIT_TEST_SYSTEM(); //相机旋转按钮测试int camera_rotate_test(int work_num); //结构数组描述:/ * ep:{1,“ LCD_Test”,LCD_Test}