#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>
#include <errno.h>
#include <sys/time.h>
#include <time.h>
#include <iothinx/iothinxio.h>
#include <sched.h>
{
int rc = 0;
int policy;
struct sched_param param = { 0 };
switch (priority_level)
{
case 1:
policy = SCHED_RR;
param.sched_priority = 1;
break;
case 2:
policy = SCHED_RR;
param.sched_priority = 49;
break;
case 3:
policy = SCHED_RR;
param.sched_priority = 99;
break;
case 0:
default:
policy = SCHED_OTHER;
param.sched_priority = 0;
break;
}
rc = sched_setscheduler(pid, policy, ¶m);
if (rc != 0)
{
perror("sched_setscheduler");
}
return rc;
}
int main(
int argc,
char **
const argv)
{
int32_t rc;
uint32_t do_slot = 2;
uint8_t do_channel = 0;
uint32_t do_values = 0;
uint32_t test_cnt = 1000;
uint32_t cycle_time_us = 10000;
uint32_t i;
time_t start_time_us, end_time_us;
time_t last_start_time_us = 0;
int priority_level = 3;
int32_t diff_us;
int32_t sum_us = 0;
int32_t max_us = 0;
struct timespec ts;
while (-1 != (rc = getopt(argc, argv, "c:hn:p:s:t:")))
{
switch (rc)
{
case 'c':
do_channel = atoi(optarg);
break;
case 'n':
test_cnt = atoi(optarg);
break;
case 'p':
priority_level = atoi(optarg);
break;
case 's':
do_slot = atoi(optarg);
break;
case 't':
cycle_time_us = atoi(optarg);
break;
case 'h':
default:
printf("Scheduling jitter sample program.\n\n");
printf("Usage: ./scheduling_jitter [OPTIONS]\n\n");
printf("Options: \n");
printf("\t %-8s Priority level[0-3]. Default level = %d\n", "-p", priority_level);
printf("\t %-8s Slot of DO module. Default slot = %d\n", "-s", do_slot);
printf("\t %-8s DO channel. Default channel = %d\n", "-c", do_channel);
printf("\t %-8s Testing loop count. Default count = %d\n", "-n", test_cnt);
printf("\t %-8s Testing loop cycle time (in us). Default time = %d us\n", "-t", cycle_time_us);
printf("\n");
return 0;
}
}
printf("Priority level = %d\n", priority_level);
printf("DO slot = %lu\n", do_slot);
printf("DO channel = %u\n", do_channel);
{
printf("ioThinx_IO_Client_Init() = %d\n", rc);
return -1;
}
{
printf("ioThinx_DO_Config_SetModes() = %d\n", rc);
return -1;
}
{
printf("ioThinx_IO_Config_Reload() = %d\n", rc);
return -1;
}
if (rc != 0)
{
return -1;
}
printf("Start testing ...\n");
for (i = 0; i < test_cnt; i++)
{
clock_gettime(CLOCK_MONOTONIC, &ts);
start_time_us = (ts.tv_sec * 1000000 + ts.tv_nsec / 1000);
diff_us = (last_start_time_us == 0) ? 0 : start_time_us - last_start_time_us - cycle_time_us;
sum_us += diff_us;
max_us = (diff_us > max_us) ? diff_us : max_us;
last_start_time_us = start_time_us;
if (do_values & (0x1 << do_channel))
{
do_values &= ~(0x1 << do_channel);
}
else
{
do_values |= 0x1 << do_channel;
}
{
printf("ioThinx_DO_SetValues() = %d\n", rc);
break;
}
clock_gettime(CLOCK_MONOTONIC, &ts);
end_time_us = (ts.tv_sec * 1000000 + ts.tv_nsec / 1000);
diff_us = cycle_time_us - (end_time_us - start_time_us);
ts.tv_sec = 0;
ts.tv_nsec = diff_us * 1000;
clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL);
}
printf("Done.\n");
printf("Scheduling jitter: Avg. = %.1f us, Max = %ld us\n",
(float)sum_us / (float)(test_cnt - 1), max_us);
return 0;
}
94 uint8_t do_channel = 0;
96 uint32_t do_values = 0;
97 uint32_t test_cnt = 1000;
98 uint32_t cycle_time_us = 10000;
100 time_t start_time_us, end_time_us;
101 time_t last_start_time_us = 0;
102 int priority_level = 3;
108 while (-1 != (rc = getopt(argc, argv,
"c:hn:p:s:t:")))
113 do_channel = atoi(optarg);
116 test_cnt = atoi(optarg);
119 priority_level = atoi(optarg);
122 do_slot = atoi(optarg);
125 cycle_time_us = atoi(optarg);
129 printf(
"Scheduling jitter sample program.\n\n");
130 printf(
"Usage: ./scheduling_jitter [OPTIONS]\n\n");
131 printf(
"Options: \n");
132 printf(
"\t %-8s Priority level[0-3]. Default level = %d\n",
"-p", priority_level);
133 printf(
"\t %-8s Slot of DO module. Default slot = %d\n",
"-s", do_slot);
134 printf(
"\t %-8s DO channel. Default channel = %d\n",
"-c", do_channel);
135 printf(
"\t %-8s Testing loop count. Default count = %d\n",
"-n", test_cnt);
136 printf(
"\t %-8s Testing loop cycle time (in us). Default time = %d us\n",
"-t", cycle_time_us);
142 printf(
"Priority level = %d\n", priority_level);
143 printf(
"DO slot = %lu\n", do_slot);
144 printf(
"DO channel = %u\n", do_channel);
150 printf(
"ioThinx_IO_Client_Init() = %d\n", rc);
158 printf(
"ioThinx_DO_Config_SetModes() = %d\n", rc);
166 printf(
"ioThinx_IO_Config_Reload() = %d\n", rc);
177 printf(
"Start testing ...\n");
179 for (i = 0; i < test_cnt; i++)
182 clock_gettime(CLOCK_MONOTONIC, &ts);
183 start_time_us = (ts.tv_sec * 1000000 + ts.tv_nsec / 1000);
184 diff_us = (last_start_time_us == 0) ? 0 : start_time_us - last_start_time_us - cycle_time_us;
186 max_us = (diff_us > max_us) ? diff_us : max_us;
187 last_start_time_us = start_time_us;
191 if (do_values & (0x1 << do_channel))
193 do_values &= ~(0x1 << do_channel);
197 do_values |= 0x1 << do_channel;
202 printf(
"ioThinx_DO_SetValues() = %d\n", rc);
207 clock_gettime(CLOCK_MONOTONIC, &ts);
208 end_time_us = (ts.tv_sec * 1000000 + ts.tv_nsec / 1000);
211 diff_us = cycle_time_us - (end_time_us - start_time_us);
213 ts.tv_nsec = diff_us * 1000;
216 clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL);
220 printf(
"Scheduling jitter: Avg. = %.1f us, Max = %ld us\n",
221 (
float)sum_us / (
float)(test_cnt - 1), max_us);
IOTHINX_ERR ioThinx_DO_SetValues(uint32_t slot, uint32_t values)
IOTHINX_ERR ioThinx_DO_Config_SetModes(uint32_t slot, uint8_t start, uint8_t count, uint8_t buf[])
IOTHINX_ERR ioThinx_IO_Config_Reload(void)
int set_process_priority(int pid, int priority_level)
IOTHINX_ERR ioThinx_IO_Client_Init(void)