Description
I want to compare the scheduler of Nuttx with other RTOS, so I wrote a simple test and run it in hello.c
static pthread_mutex_t g_mutex;
static volatile uint32_t g_count1 = 0;
static volatile uint32_t g_count2 = 0;
static volatile int isexit = 0;
static void *low_task1(char *argv)
{
while (!isexit) {
pthread_mutex_lock(&g_mutex);
g_count1++;
pthread_mutex_unlock(&g_mutex);
}
return 0;
}
static void * low_task2(char *arg)
{
while (!isexit) {
pthread_mutex_lock(&g_mutex);
g_count2++;
pthread_mutex_unlock(&g_mutex);
}
return 0;
}
static void *hi_task(char *argv)
{
struct timespec start, end;
uint32_t total_ops;
double elapsed_ms;
pthread_mutex_init(&g_mutex, NULL);
clock_gettime(CLOCK_MONOTONIC, &start);
sleep(5);
clock_gettime(CLOCK_MONOTONIC, &end);
total_ops = g_count1 + g_count2;
elapsed_ms = (end.tv_sec - start.tv_sec) * 1000.0 +
(end.tv_nsec - start.tv_nsec) / 1000000.0;
printf("Low task 1 count: %" PRIu32 "\n", g_count1);
printf("Low task 2 count: %" PRIu32 "\n", g_count2);
printf("Total operations: %" PRIu32 "\n", total_ops);
printf("Elapsed time: %.2f ms\n", elapsed_ms);
if (total_ops > 0) {
printf("Average time per operation: %.3f us\n",
(elapsed_ms * 1000.0) / total_ops);
}
pthread_mutex_destroy(&g_mutex);
isexit = 1;
return 0;
}
int cs_test_main(int argc, char *argv[])
{
pthread_t hi, low1, low2;
pthread_attr_t attr_hi, attr_low;
struct sched_param param_hi, param_low;
pthread_attr_init(&attr_hi);
pthread_attr_init(&attr_low);
param_hi.sched_priority = 200;
pthread_attr_setschedpolicy(&attr_hi, SCHED_RR);
pthread_attr_setschedparam(&attr_hi, ¶m_hi);
pthread_attr_setinheritsched(&attr_low, PTHREAD_EXPLICIT_SCHED);
if (pthread_create(&hi, &attr_hi, hi_task, NULL) != 0) {
perror("pthread_create hi");
return 1;
}
if (pthread_create(&low1, &attr_low, low_task1, NULL) != 0) {
perror("pthread_create low1");
return 1;
}
if (pthread_create(&low2, &attr_low, low_task2, NULL) != 0) {
perror("pthread_create low2");
return 1;
}
pthread_attr_destroy(&attr_hi);
pthread_attr_destroy(&attr_low);
pthread_join(hi, NULL);
pthread_join(low1, NULL);
pthread_join(low2, NULL);
return 0;
}
A high prio task sleeps 5 seconds, then 2 lower tasks runs in ping-pong way be getting/putting mutex. After 5 seconds, high task shows the results.
Here is my testing results.
Low task 1 count: 1828625
Low task 2 count: 1716974
Total operations: 3545599
Elapsed time: *float* ms
Average time per operation: *float* us
In the same hardware, another RTOS got followings.
Low task 1 count: 1519473
Low task 2 count: 1519472
Total operations: 3038945
The Nuttx's configuration of scheduler is
CONFIG_RR_INTERVAL=200
# CONFIG_SCHED_SPORADIC is not set
I tested in qemu-arma7 with SCHED configurations,
cat .config | grep SCHED
# CONFIG_DEBUG_SCHED is not set
# CONFIG_SCHED_TICKLESS is not set
# CONFIG_SCHED_SPORADIC is not set
CONFIG_SCHED_HAVE_PARENT=y
# CONFIG_SCHED_CHILD_STATUS is not set
CONFIG_SCHED_WAITPID=y
# CONFIG_SCHED_DUMP_LEAK is not set
# CONFIG_SCHED_DUMP_ON_EXIT is not set
# CONFIG_SCHED_USER_IDENTITY is not set
# CONFIG_SCHED_THREAD_LOCAL is not set
# CONFIG_SCHED_IRQMONITOR is not set
# CONFIG_SCHED_CRITMONITOR is not set
CONFIG_SCHED_CPULOAD_NONE=y
# CONFIG_SCHED_CPULOAD_SYSCLK is not set
# CONFIG_SCHED_CPULOAD_EXTCLK is not set
CONFIG_SCHED_CPULOAD_TICKSPERSEC=100
CONFIG_SCHED_PROFILE_TICKSPERSEC=1000
# CONFIG_SCHED_INSTRUMENTATION is not set
CONFIG_SCHED_STACK_RECORD=0
CONFIG_SCHED_WORKQUEUE=y
CONFIG_SCHED_HPWORK=y
CONFIG_SCHED_HPNTHREADS=1
CONFIG_SCHED_HPWORKPRIORITY=192
CONFIG_SCHED_HPWORKSTACKSIZE=4096
CONFIG_SCHED_HPWORKSTACKSECTION=""
# CONFIG_SCHED_LPWORK is not set
# CONFIG_SCHED_BACKTRACE is not set
# CONFIG_SCHED_EVENTS is not set
and got this,
nsh> hello
Low task 1 count: 4312752
Low task 2 count: 3142026
Total operations: 7454778
Elapsed time: 5001.00 ms
My question is: Why counts of 2 two lower prio tasks are different too much, while in another RTOS, the two counts are very close?
Verification
Description
I want to compare the scheduler of Nuttx with other RTOS, so I wrote a simple test and run it in hello.c
A high prio task sleeps 5 seconds, then 2 lower tasks runs in ping-pong way be getting/putting mutex. After 5 seconds, high task shows the results.
Here is my testing results.
In the same hardware, another RTOS got followings.
The Nuttx's configuration of scheduler is
I tested in qemu-arma7 with
SCHEDconfigurations,and got this,
My question is: Why counts of 2 two lower prio tasks are different too much, while in another RTOS, the two counts are very close?
Verification