在嵌入式开发中,我们通常会碰到需要测试驱动程序完整性效果的地方。比如,一个LED工作在不同模式下会体现不同的特性,由于多种工作模式不容易模拟出来,这个时候我们要使用随机数程序来生成LED全部的工作路径,从而来测试LED驱动的完整性。
在线程中建立随机数执行路径,有两种方式:
(1)WaitForSingleObject带无限时间
HANDLE Nled_Test_Event; //线程事件申明i初始化:Nled_Test_Event = CreateEvent(NULL,TRUE,FALSE,NULL); //创建初始值为FALSE的手工复位事件CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Nled_Test_Thread,0,0,NULL); //创建线程SetEvent(Nled_Test_Event); //置事件有效。除非手工清除,否则该事件就算捕获到后也仍然有效线程函数:DWORD WINAPI Nled_Test_Thread(){ DWORD dwWaitTime = IN FINITE; //以无限时间等待 int status; int kCount;
srand(1); //以1为基准值,产生随机数种子。种子只产生一次 while(1) //因为循环中的事件是手工复位的,所以只要不复位,该事件是一直有效的,线程会一直执行下去 { status = WaitForSingleObject(Nled_Test_Event,dwWaitTime); //等待线程事件 if(status == WAIT_FAILED) { RETAILMSG(1, (TEXT("Nled_Test_Thread:Create failed /r/n"))); } kCount = rand()%5; //随机数对5取模,分成5个执行路径 switch(kCount) { case 0:break; case 1:break; case 2:break; case 3:break; case 4:break; default:break; } Sleep(20*1000); //每个路径有20S的时间来观察执行结果,并验证 } return TRUE;}(2)WaitForSingleObject带有限时间
初始化:
Nled_Test_Event = CreateEvent(NULL,TRUE,FALSE,NULL); //有限时间中,事件无论真假线程都会执行下去,所以忽略手工复位
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Nled_Test_Thread,0,0,NULL);线程函数:
DWORD WINAPI Nled_Test_Thread(){ int status; int kCount;
srand(1); //以1为基准值,产生随机数种子。种子只产生一次 while(1) //事件为真,每次马上执行;事件为假,20S后再执行,总之都会执行 { status = WaitForSingleObject(Nled_Test_Event,20*1000); //就算事件无效,线程也会每20S执行一次
if(status == WAIT_FAILED) { RETAILMSG(1, (TEXT("Nled_Test_Thread:Create failed /r/n"))); } kCount = rand()%5;
switch(kCount) { case 0:break; case 1:break; case 2:break; case 3:break; case 4:break; default:break; } } return TRUE;}