OS test: Some extensions to the sporadic scheduler test

This commit is contained in:
Gregory Nutt 2015-07-24 18:16:10 -06:00
parent bc4a0ec95f
commit e15a186530

View File

@ -63,23 +63,34 @@
***********************************************************************/ ***********************************************************************/
static sem_t g_sporadic_sem; static sem_t g_sporadic_sem;
static time_t g_start_time;
/*********************************************************************** /***********************************************************************
* Private Functions * Private Functions
***********************************************************************/ ***********************************************************************/
static void *nuisance_func(void *parameter)
{
while (sem_wait(&g_sporadic_sem) < 0);
for (;;)
{
usleep(500*1000);
}
return NULL;
}
static void *fifo_func(void *parameter) static void *fifo_func(void *parameter)
{ {
struct sched_param param; struct sched_param param;
time_t start;
time_t last; time_t last;
time_t now; time_t now;
int ret; int ret;
while (sem_wait(&g_sporadic_sem) < 0); while (sem_wait(&g_sporadic_sem) < 0);
start = time(NULL); last = g_start_time;
last = start;
for (;;) for (;;)
{ {
@ -97,7 +108,7 @@ static void *fifo_func(void *parameter)
while (now == last); while (now == last);
printf("%4lu FIFO: %d\n", printf("%4lu FIFO: %d\n",
(unsigned long)(now-start), param.sched_priority); (unsigned long)(now-g_start_time), param.sched_priority);
last = now; last = now;
} }
} }
@ -105,7 +116,6 @@ static void *fifo_func(void *parameter)
static void *sporadic_func(void *parameter) static void *sporadic_func(void *parameter)
{ {
struct sched_param param; struct sched_param param;
time_t start;
time_t last; time_t last;
time_t now; time_t now;
int prio = 0; int prio = 0;
@ -113,8 +123,7 @@ static void *sporadic_func(void *parameter)
while (sem_wait(&g_sporadic_sem) < 0); while (sem_wait(&g_sporadic_sem) < 0);
start = time(NULL); last = g_start_time;
last = start;
for (;;) for (;;)
{ {
@ -132,7 +141,7 @@ static void *sporadic_func(void *parameter)
while (now == last && prio == param.sched_priority); while (now == last && prio == param.sched_priority);
printf("%4lu SPORADIC: %d->%d\n", printf("%4lu SPORADIC: %d->%d\n",
(unsigned long)(now-start), prio, param.sched_priority); (unsigned long)(now-g_start_time), prio, param.sched_priority);
prio = param.sched_priority; prio = param.sched_priority;
last = now; last = now;
} }
@ -144,6 +153,7 @@ static void *sporadic_func(void *parameter)
void sporadic_test(void) void sporadic_test(void)
{ {
pthread_t nuisance_thread = (pthread_t)0;
pthread_t sporadic_thread = (pthread_t)0; pthread_t sporadic_thread = (pthread_t)0;
pthread_t fifo_thread = (pthread_t)0; pthread_t fifo_thread = (pthread_t)0;
#ifdef SDCC #ifdef SDCC
@ -170,7 +180,7 @@ void sporadic_test(void)
prio_mid = (prio_min + prio_max) >> 1; prio_mid = (prio_min + prio_max) >> 1;
prio_high = prio_max - ((prio_max - prio_min) >> 2); prio_high = prio_max - ((prio_max - prio_min) >> 2);
/* Temporarily set our priority to prio_high + 1 */ /* Temporarily set our priority to prio_high + 2 */
ret = sched_getparam(0, &myparam); ret = sched_getparam(0, &myparam);
if (ret != OK) if (ret != OK)
@ -178,7 +188,7 @@ void sporadic_test(void)
printf("sporadic_test: ERROR: sched_getparam failed, ret=%d\n", ret); printf("sporadic_test: ERROR: sched_getparam failed, ret=%d\n", ret);
} }
sparam.sched_priority = prio_high+1; sparam.sched_priority = prio_high + 2;
ret = sched_setparam(0, &sparam); ret = sched_setparam(0, &sparam);
if (ret != OK) if (ret != OK)
{ {
@ -196,7 +206,7 @@ void sporadic_test(void)
sched_lock(); sched_lock();
sem_init(&g_sporadic_sem, 0, 0); sem_init(&g_sporadic_sem, 0, 0);
/* Start a FIFO thread at the middle priority */ /* Start a FIFO thread at the highest priority (prio_max + 1) */
printf("sporadic_test: Starting FIFO thread at priority %d\n", prio_mid); printf("sporadic_test: Starting FIFO thread at priority %d\n", prio_mid);
@ -206,6 +216,21 @@ void sporadic_test(void)
printf("sporadic_test: ERROR: pthread_attr_setschedpolicy failed, ret=%d\n", ret); printf("sporadic_test: ERROR: pthread_attr_setschedpolicy failed, ret=%d\n", ret);
} }
sparam.sched_priority = prio_high + 1;
ret = pthread_attr_setschedparam(&attr, &sparam);
if (ret != OK)
{
printf("sporadic_test: ERROR: pthread_attr_setschedparam failed, ret=%d\n", ret);
}
ret = pthread_create(&nuisance_thread, &attr, nuisance_func, NULL);
if (ret != 0)
{
printf("sporadic_test: ERROR: FIFO thread creation failed: %d\n", ret);
}
/* Start a FIFO thread at the middle priority */
sparam.sched_priority = prio_mid; sparam.sched_priority = prio_mid;
ret = pthread_attr_setschedparam(&attr, &sparam); ret = pthread_attr_setschedparam(&attr, &sparam);
if (ret != OK) if (ret != OK)
@ -249,6 +274,9 @@ void sporadic_test(void)
printf("sporadic_test: ERROR: sporadic thread creation failed: %d\n", ret); printf("sporadic_test: ERROR: sporadic thread creation failed: %d\n", ret);
} }
g_start_time = time(NULL);
sem_post(&g_sporadic_sem);
sem_post(&g_sporadic_sem); sem_post(&g_sporadic_sem);
sem_post(&g_sporadic_sem); sem_post(&g_sporadic_sem);
@ -258,9 +286,15 @@ void sporadic_test(void)
ret = pthread_cancel(fifo_thread); ret = pthread_cancel(fifo_thread);
pthread_join(fifo_thread, &result); pthread_join(fifo_thread, &result);
/* Wait a bit longer */ /* Wait a bit longer then kill the nuisance thread */
sleep(12); sleep(8);
ret = pthread_cancel(nuisance_thread);
pthread_join(nuisance_thread, &result);
/* Wait a bit longer then kill the sporadic thread */
sleep(8);
ret = pthread_cancel(sporadic_thread); ret = pthread_cancel(sporadic_thread);
pthread_join(sporadic_thread, &result); pthread_join(sporadic_thread, &result);
sched_unlock(); sched_unlock();