zephyr/tests/benchmarks/app_kernel/src/master.c
Yong Cong Sin bbe5e1e6eb build: namespace the generated headers with zephyr/
Namespaced the generated headers with `zephyr` to prevent
potential conflict with other headers.

Introduce a temporary Kconfig `LEGACY_GENERATED_INCLUDE_PATH`
that is enabled by default. This allows the developers to
continue the use of the old include paths for the time being
until it is deprecated and eventually removed. The Kconfig will
generate a build-time warning message, similar to the
`CONFIG_TIMER_RANDOM_GENERATOR`.

Updated the includes path of in-tree sources accordingly.

Most of the changes here are scripted, check the PR for more
info.

Signed-off-by: Yong Cong Sin <ycsin@meta.com>
2024-05-28 22:03:55 +02:00

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;
}