blob: 1fe104da5f1b340fb4e8f1549b920c5267480b38 [file] [log] [blame]
/* stack.c */
/*
* Copyright (c) 1997-2010, 2013-2014 Wind River Systems, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "syskernel.h"
struct k_stack stack_1;
struct k_stack stack_2;
stack_data_t stack1[2];
stack_data_t stack2[2];
/**
*
* @brief Initialize stacks for the test
*
*/
void stack_test_init(void)
{
k_stack_init(&stack_1, stack1, 2);
k_stack_init(&stack_2, stack2, 2);
}
/**
*
* @brief Stack test thread
*
* @param par1 Ignored parameter.
* @param par2 Number of test loops.
* @param par3 Unused
*
*/
void stack_thread1(void *par1, void *par2, void *par3)
{
int num_loops = POINTER_TO_INT(par2) / 2;
int i;
stack_data_t data;
ARG_UNUSED(par1);
ARG_UNUSED(par3);
for (i = 0; i < num_loops; i++) {
k_stack_pop(&stack_1, &data, K_FOREVER);
if (data != 2 * i) {
break;
}
data = 2 * i;
k_stack_push(&stack_2, data);
k_stack_pop(&stack_1, &data, K_FOREVER);
if (data != 2 * i + 1) {
break;
}
data = 2 * i + 1;
k_stack_push(&stack_2, data);
}
}
/**
*
* @brief Stack test thread
*
* @param par1 Address of the counter.
* @param par2 Number of test cycles.
* @param par3 Unused
*
*/
void stack_thread2(void *par1, void *par2, void *par3)
{
int i;
stack_data_t data;
int *pcounter = par1;
int num_loops = POINTER_TO_INT(par2);
ARG_UNUSED(par3);
for (i = 0; i < num_loops; i++) {
data = i;
k_stack_push(&stack_1, data);
k_stack_pop(&stack_2, &data, K_FOREVER);
if (data != i) {
break;
}
(*pcounter)++;
}
}
/**
*
* @brief Stack test thread
*
* @param par1 Address of the counter.
* @param par2 Number of test cycles.
* @param par3 Unused
*
*/
void stack_thread3(void *par1, void *par2, void *par3)
{
int i;
stack_data_t data;
int *pcounter = par1;
int num_loops = POINTER_TO_INT(par2);
ARG_UNUSED(par3);
for (i = 0; i < num_loops; i++) {
data = i;
k_stack_push(&stack_1, data);
data = 0xffffffff;
while (k_stack_pop(&stack_2, &data,
K_NO_WAIT) != 0) {
k_yield();
}
if (data != i) {
break;
}
(*pcounter)++;
}
}
/**
*
* @brief The main test entry
*
* @return 1 if success and 0 on failure
*
*/
int stack_test(void)
{
uint32_t t;
int i = 0;
int return_value = 0;
/* test get wait & put stack functions between co-op threads */
fprintf(output_file, sz_test_case_fmt,
"Stack #1");
fprintf(output_file, sz_description,
"\n\tk_stack_init"
"\n\tk_stack_pop(K_FOREVER)"
"\n\tk_stack_push");
printf(sz_test_start_fmt);
stack_test_init();
t = BENCH_START();
k_thread_create(&thread_data1, thread_stack1, STACK_SIZE, stack_thread1,
0, INT_TO_POINTER(number_of_loops), NULL,
K_PRIO_COOP(3), 0, K_NO_WAIT);
k_thread_create(&thread_data2, thread_stack2, STACK_SIZE, stack_thread2,
(void *) &i, INT_TO_POINTER(number_of_loops), NULL,
K_PRIO_COOP(3), 0, K_NO_WAIT);
t = TIME_STAMP_DELTA_GET(t);
return_value += check_result(i, t);
/* test get/yield & put stack functions between co-op threads */
fprintf(output_file, sz_test_case_fmt,
"Stack #2");
fprintf(output_file, sz_description,
"\n\tk_stack_init"
"\n\tk_stack_pop(K_FOREVER)"
"\n\tk_stack_pop"
"\n\tk_stack_push"
"\n\tk_yield");
printf(sz_test_start_fmt);
stack_test_init();
t = BENCH_START();
i = 0;
k_thread_create(&thread_data1, thread_stack1, STACK_SIZE, stack_thread1,
0, INT_TO_POINTER(number_of_loops), NULL,
K_PRIO_COOP(3), 0, K_NO_WAIT);
k_thread_create(&thread_data2, thread_stack2, STACK_SIZE, stack_thread3,
(void *) &i, INT_TO_POINTER(number_of_loops), NULL,
K_PRIO_COOP(3), 0, K_NO_WAIT);
t = TIME_STAMP_DELTA_GET(t);
return_value += check_result(i, t);
/* test get wait & put stack functions across co-op and preemptive
* threads
*/
fprintf(output_file, sz_test_case_fmt,
"Stack #3");
fprintf(output_file, sz_description,
"\n\tk_stack_init"
"\n\tk_stack_pop(K_FOREVER)"
"\n\tk_stack_push"
"\n\tk_stack_pop(K_FOREVER)"
"\n\tk_stack_push");
printf(sz_test_start_fmt);
stack_test_init();
t = BENCH_START();
k_thread_create(&thread_data1, thread_stack1, STACK_SIZE, stack_thread1,
0, INT_TO_POINTER(number_of_loops), NULL,
K_PRIO_COOP(3), 0, K_NO_WAIT);
for (i = 0; i < number_of_loops / 2U; i++) {
stack_data_t data;
data = 2 * i;
k_stack_push(&stack_1, data);
data = 2 * i + 1;
k_stack_push(&stack_1, data);
k_stack_pop(&stack_2, &data, K_FOREVER);
if (data != 2 * i + 1) {
break;
}
k_stack_pop(&stack_2, &data, K_FOREVER);
if (data != 2 * i) {
break;
}
}
t = TIME_STAMP_DELTA_GET(t);
return_value += check_result(i * 2, t);
return return_value;
}