... now that the new pipe implementation supports it. Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
262 lines
6.7 KiB
C
262 lines
6.7 KiB
C
/* master.c */
|
|
|
|
/*
|
|
* Copyright (c) 1997-2010,2013-2015 Wind River Systems, Inc.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/*
|
|
* File Naming information.
|
|
* ------------------------
|
|
* Files that end with:
|
|
* _B : Is a file that contains a benchmark function
|
|
* _R : Is a file that contains the receiver task
|
|
* of a benchmark function
|
|
*/
|
|
#include <zephyr/tc_util.h>
|
|
#include "master.h"
|
|
|
|
#define RECV_STACK_SIZE (1024 + CONFIG_TEST_EXTRA_STACK_SIZE)
|
|
#define TEST_STACK_SIZE (1024 + CONFIG_TEST_EXTRA_STACK_SIZE)
|
|
|
|
BENCH_BMEM char msg[MAX_MSG];
|
|
BENCH_BMEM char data_bench[MESSAGE_SIZE];
|
|
|
|
BENCH_DMEM struct k_pipe *test_pipes[] = {&PIPE_NOBUFF, &PIPE_SMALLBUFF, &PIPE_BIGBUFF};
|
|
BENCH_BMEM char sline[SLINE_LEN + 1];
|
|
|
|
/*
|
|
* Time in timer cycles necessary to read time.
|
|
* Used for correction in time measurements.
|
|
*/
|
|
uint32_t tm_off;
|
|
|
|
static BENCH_DMEM char *test_type_str[] = {
|
|
"| K E R N E L - - > K E R N E L | |\n",
|
|
"| K E R N E L - - > U S E R | |\n",
|
|
"| U S E R - - > K E R N E L | |\n",
|
|
"| U S E R - - > U S E R | |\n"
|
|
};
|
|
|
|
/********************************************************************/
|
|
/* static allocation */
|
|
|
|
static struct k_thread test_thread;
|
|
static struct k_thread recv_thread;
|
|
K_THREAD_STACK_DEFINE(test_stack, TEST_STACK_SIZE);
|
|
K_THREAD_STACK_DEFINE(recv_stack, RECV_STACK_SIZE);
|
|
|
|
#ifdef CONFIG_USERSPACE
|
|
K_APPMEM_PARTITION_DEFINE(bench_mem_partition);
|
|
#endif
|
|
|
|
K_MSGQ_DEFINE(DEMOQX1, 1, 500, 4);
|
|
K_MSGQ_DEFINE(DEMOQX4, 4, 500, 4);
|
|
K_MSGQ_DEFINE(DEMOQX192, 192, 500, 4);
|
|
K_MSGQ_DEFINE(MB_COMM, 12, 1, 4);
|
|
K_MSGQ_DEFINE(CH_COMM, 12, 1, 4);
|
|
|
|
K_MEM_SLAB_DEFINE(MAP1, 16, 2, 4);
|
|
|
|
K_SEM_DEFINE(SEM0, 0, 1);
|
|
K_SEM_DEFINE(SEM1, 0, 1);
|
|
K_SEM_DEFINE(SEM2, 0, 1);
|
|
K_SEM_DEFINE(SEM3, 0, 1);
|
|
K_SEM_DEFINE(SEM4, 0, 1);
|
|
K_SEM_DEFINE(STARTRCV, 0, 1);
|
|
|
|
K_MBOX_DEFINE(MAILB1);
|
|
|
|
K_MUTEX_DEFINE(DEMO_MUTEX);
|
|
|
|
K_PIPE_DEFINE(PIPE_NOBUFF, 0, 4);
|
|
K_PIPE_DEFINE(PIPE_SMALLBUFF, 256, 4);
|
|
K_PIPE_DEFINE(PIPE_BIGBUFF, 4096, 4);
|
|
|
|
/*
|
|
* Custom syscalls
|
|
*/
|
|
|
|
/**
|
|
* @brief Obtain a timestamp
|
|
*
|
|
* Architecture timestamp routines often require MMIO that is not mapped to
|
|
* the user threads. Use a custom system call to get the timestamp.
|
|
*/
|
|
timing_t z_impl_timing_timestamp_get(void)
|
|
{
|
|
return timing_counter_get();
|
|
}
|
|
|
|
#ifdef CONFIG_USERSPACE
|
|
static timing_t z_vrfy_timing_timestamp_get(void)
|
|
{
|
|
return z_impl_timing_timestamp_get();
|
|
}
|
|
|
|
#include <zephyr/syscalls/timing_timestamp_get_mrsh.c>
|
|
#endif
|
|
|
|
/*
|
|
* Main test
|
|
*/
|
|
|
|
/**
|
|
* @brief Entry point for test thread
|
|
*/
|
|
static void test_thread_entry(void *p1, void *p2, void *p3)
|
|
{
|
|
bool skip_mem_and_mbox = (bool)(uintptr_t)(p2);
|
|
|
|
ARG_UNUSED(p3);
|
|
|
|
PRINT_STRING("\n");
|
|
PRINT_STRING(dashline);
|
|
PRINT_STRING("| S I M P L E S E R V I C E "
|
|
"M E A S U R E M E N T S | nsec |\n");
|
|
#ifdef CONFIG_USERSPACE
|
|
PRINT_STRING((const char *)p1);
|
|
#endif
|
|
PRINT_STRING(dashline);
|
|
|
|
message_queue_test();
|
|
sema_test();
|
|
mutex_test();
|
|
|
|
if (!skip_mem_and_mbox) {
|
|
memorymap_test();
|
|
mailbox_test();
|
|
}
|
|
|
|
pipe_test();
|
|
}
|
|
|
|
/**
|
|
* @brief Perform all benchmarks
|
|
*/
|
|
int main(void)
|
|
{
|
|
int priority;
|
|
|
|
priority = k_thread_priority_get(k_current_get());
|
|
|
|
#ifdef CONFIG_USERSPACE
|
|
k_mem_domain_add_partition(&k_mem_domain_default,
|
|
&bench_mem_partition);
|
|
#endif
|
|
|
|
bench_test_init();
|
|
|
|
timing_init();
|
|
|
|
timing_start();
|
|
|
|
/* ********* All threads are kernel threads ********** */
|
|
|
|
k_thread_create(&test_thread, test_stack,
|
|
K_THREAD_STACK_SIZEOF(test_stack),
|
|
test_thread_entry,
|
|
test_type_str[0], (void *)(uintptr_t)false, NULL,
|
|
priority, 0, K_FOREVER);
|
|
|
|
k_thread_create(&recv_thread, recv_stack,
|
|
K_THREAD_STACK_SIZEOF(recv_stack),
|
|
recvtask, (void *)(uintptr_t)false, NULL, NULL,
|
|
5, 0, K_FOREVER);
|
|
|
|
k_thread_start(&recv_thread);
|
|
k_thread_start(&test_thread);
|
|
|
|
k_thread_join(&test_thread, K_FOREVER);
|
|
k_thread_abort(&recv_thread);
|
|
|
|
#ifdef CONFIG_USERSPACE
|
|
/* ****** Main thread is kernel, receiver is user thread ******* */
|
|
|
|
k_thread_create(&test_thread, test_stack,
|
|
K_THREAD_STACK_SIZEOF(test_stack),
|
|
test_thread_entry,
|
|
test_type_str[1], (void *)(uintptr_t)true, NULL,
|
|
priority, 0, K_FOREVER);
|
|
|
|
k_thread_create(&recv_thread, recv_stack,
|
|
K_THREAD_STACK_SIZEOF(recv_stack),
|
|
recvtask, (void *)(uintptr_t)true, NULL, NULL,
|
|
5, K_USER, K_FOREVER);
|
|
|
|
k_thread_access_grant(&recv_thread, &DEMOQX1, &DEMOQX4, &DEMOQX192,
|
|
&MB_COMM, &CH_COMM, &SEM0, &SEM1, &SEM2, &SEM3,
|
|
&SEM4, &STARTRCV, &DEMO_MUTEX,
|
|
&PIPE_NOBUFF, &PIPE_SMALLBUFF, &PIPE_BIGBUFF);
|
|
|
|
k_thread_start(&recv_thread);
|
|
k_thread_start(&test_thread);
|
|
|
|
k_thread_join(&test_thread, K_FOREVER);
|
|
k_thread_abort(&recv_thread);
|
|
|
|
/* ****** Main thread is user, receiver is kernel thread ******* */
|
|
|
|
k_thread_create(&test_thread, test_stack,
|
|
K_THREAD_STACK_SIZEOF(test_stack),
|
|
test_thread_entry,
|
|
test_type_str[2], (void *)(uintptr_t)true, NULL,
|
|
priority, K_USER, K_FOREVER);
|
|
|
|
k_thread_create(&recv_thread, recv_stack,
|
|
K_THREAD_STACK_SIZEOF(recv_stack),
|
|
recvtask, (void *)(uintptr_t)true, NULL, NULL,
|
|
5, 0, K_FOREVER);
|
|
|
|
k_thread_access_grant(&test_thread, &DEMOQX1, &DEMOQX4, &DEMOQX192,
|
|
&MB_COMM, &CH_COMM, &SEM0, &SEM1, &SEM2, &SEM3,
|
|
&SEM4, &STARTRCV, &DEMO_MUTEX,
|
|
&PIPE_NOBUFF, &PIPE_SMALLBUFF, &PIPE_BIGBUFF);
|
|
|
|
k_thread_start(&recv_thread);
|
|
k_thread_start(&test_thread);
|
|
|
|
k_thread_join(&test_thread, K_FOREVER);
|
|
k_thread_abort(&recv_thread);
|
|
|
|
/* ********* All threads are user threads ********** */
|
|
|
|
k_thread_create(&test_thread, test_stack,
|
|
K_THREAD_STACK_SIZEOF(test_stack),
|
|
test_thread_entry,
|
|
test_type_str[3], (void *)(uintptr_t)true, NULL,
|
|
priority, K_USER, K_FOREVER);
|
|
|
|
k_thread_create(&recv_thread, recv_stack,
|
|
K_THREAD_STACK_SIZEOF(recv_stack),
|
|
recvtask, (void *)(uintptr_t)true, NULL, NULL,
|
|
5, K_USER, K_FOREVER);
|
|
|
|
k_thread_access_grant(&test_thread, &DEMOQX1, &DEMOQX4, &DEMOQX192,
|
|
&MB_COMM, &CH_COMM, &SEM0, &SEM1, &SEM2, &SEM3,
|
|
&SEM4, &STARTRCV, &DEMO_MUTEX,
|
|
&PIPE_NOBUFF, &PIPE_SMALLBUFF, &PIPE_BIGBUFF);
|
|
k_thread_access_grant(&recv_thread, &DEMOQX1, &DEMOQX4, &DEMOQX192,
|
|
&MB_COMM, &CH_COMM, &SEM0, &SEM1, &SEM2, &SEM3,
|
|
&SEM4, &STARTRCV, &DEMO_MUTEX,
|
|
&PIPE_NOBUFF, &PIPE_SMALLBUFF, &PIPE_BIGBUFF);
|
|
|
|
k_thread_start(&recv_thread);
|
|
k_thread_start(&test_thread);
|
|
|
|
k_thread_join(&test_thread, K_FOREVER);
|
|
k_thread_abort(&recv_thread);
|
|
#endif /* CONFIG_USERSPACE */
|
|
|
|
timing_stop();
|
|
|
|
PRINT_STRING("| END OF TESTS "
|
|
" |\n");
|
|
PRINT_STRING(dashline);
|
|
PRINT_STRING("PROJECT EXECUTION SUCCESSFUL\n");
|
|
TC_PRINT_RUNID;
|
|
|
|
return 0;
|
|
}
|