在嵌入式开发中,我们通常会碰到需要测试驱动程序完整性效果的地方。比如,一个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;
}