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