diff options
Diffstat (limited to 'tests/benchmark/sys_kernel/src/sema.c')
-rw-r--r-- | tests/benchmark/sys_kernel/src/sema.c | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/tests/benchmark/sys_kernel/src/sema.c b/tests/benchmark/sys_kernel/src/sema.c new file mode 100644 index 000000000..77d4660d4 --- /dev/null +++ b/tests/benchmark/sys_kernel/src/sema.c @@ -0,0 +1,189 @@ +/* sema.c */ + +/* + * Copyright (c) 1997-2010, 2013-2014 Wind River Systems, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "syskernel.h" + +struct k_sem sem1; +struct k_sem sem2; + +/** + * + * @brief Initialize semaphores for the test + * + * @return N/A + */ +void sema_test_init(void) +{ + k_sem_init(&sem1, 0, 1); + k_sem_init(&sem2, 0, 1); +} + + +/** + * + * @brief Semaphore test thread + * + * @param par1 Ignored parameter. + * @param par2 Number of test loops. + * + * @return N/A + */ +void sema_thread1(void *par1, void *par2, void *par3) +{ + int i; + int num_loops = (int) par2; + + ARG_UNUSED(par1); + ARG_UNUSED(par3); + + for (i = 0; i < num_loops; i++) { + k_sem_take(&sem1, K_FOREVER); + k_sem_give(&sem2); + } +} + + +/** + * + * @brief Semaphore test thread + * + * @param par1 Address of the counter. + * @param par2 Number of test cycles. + * + * @return N/A + */ +void sema_thread2(void *par1, void *par2, void *par3) +{ + int i; + int *pcounter = (int *)par1; + int num_loops = (int) par2; + + ARG_UNUSED(par3); + + for (i = 0; i < num_loops; i++) { + k_sem_give(&sem1); + k_sem_take(&sem2, K_FOREVER); + (*pcounter)++; + } +} + +/** + * + * @brief Semaphore test thread + * + * @param par1 Address of the counter. + * @param par2 Number of test cycles. + * + * @return N/A + */ +void sema_thread3(void *par1, void *par2, void *par3) +{ + int i; + int *pcounter = (int *)par1; + int num_loops = (int) par2; + + ARG_UNUSED(par3); + + for (i = 0; i < num_loops; i++) { + k_sem_give(&sem1); + while (k_sem_take(&sem2, K_NO_WAIT) != 0) { + k_yield(); + } + (*pcounter)++; + } +} + + +/** + * + * @brief The main test entry + * + * @return 1 if success and 0 on failure + */ +int sema_test(void) +{ + uint32_t t; + int i = 0; + int return_value = 0; + + fprintf(output_file, sz_test_case_fmt, + "Semaphore #1"); + fprintf(output_file, sz_description, + "\n\tk_sem_init" + "\n\tk_sem_take(TICKS_UNLIMITED)" + "\n\tk_sem_give"); + printf(sz_test_start_fmt); + + sema_test_init(); + + t = BENCH_START(); + + k_thread_spawn(thread_stack1, STACK_SIZE, sema_thread1, + NULL, (void *) NUMBER_OF_LOOPS, NULL, + K_PRIO_COOP(3), 0, K_NO_WAIT); + k_thread_spawn(thread_stack2, STACK_SIZE, sema_thread2, + (void *) &i, (void *) NUMBER_OF_LOOPS, NULL, + K_PRIO_COOP(3), 0, K_NO_WAIT); + + t = TIME_STAMP_DELTA_GET(t); + + return_value += check_result(i, t); + + fprintf(output_file, sz_test_case_fmt, + "Semaphore #2"); + fprintf(output_file, sz_description, + "\n\tk_sem_init" + "\n\tk_sem_take(TICKS_NONE)" + "\n\tk_yield" + "\n\tk_sem_give"); + printf(sz_test_start_fmt); + + sema_test_init(); + i = 0; + + t = BENCH_START(); + + k_thread_spawn(thread_stack1, STACK_SIZE, sema_thread1, + NULL, (void *) NUMBER_OF_LOOPS, NULL, + K_PRIO_COOP(3), 0, K_NO_WAIT); + k_thread_spawn(thread_stack2, STACK_SIZE, sema_thread3, + (void *) &i, (void *) NUMBER_OF_LOOPS, NULL, + K_PRIO_COOP(3), 0, K_NO_WAIT); + + t = TIME_STAMP_DELTA_GET(t); + + return_value += check_result(i, t); + + fprintf(output_file, sz_test_case_fmt, + "Semaphore #3"); + fprintf(output_file, sz_description, + "\n\tk_sem_init" + "\n\tk_sem_take(TICKS_UNLIMITED)" + "\n\tk_sem_give" + "\n\tk_sem_give" + "\n\tk_sem_take(TICKS_UNLIMITED)"); + printf(sz_test_start_fmt); + + sema_test_init(); + + t = BENCH_START(); + + k_thread_spawn(thread_stack1, STACK_SIZE, sema_thread1, + NULL, (void *) NUMBER_OF_LOOPS, NULL, + K_PRIO_COOP(3), 0, K_NO_WAIT); + for (i = 0; i < NUMBER_OF_LOOPS; i++) { + k_sem_give(&sem1); + k_sem_take(&sem2, K_FOREVER); + } + + t = TIME_STAMP_DELTA_GET(t); + + return_value += check_result(i, t); + + return return_value; +} |