/*
* Copyright (c) 2020 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/timing/timing.h>
#include "utils.h"
#define STACK_SIZE (512 + CONFIG_TEST_EXTRA_STACK_SIZE)
/* stack used by the threads */
static K_THREAD_STACK_DEFINE(t1_stack, STACK_SIZE);
static struct k_thread t1;
timing_t timestamp_start_create_c;
timing_t timestamp_end_create_c;
timing_t timestamp_start_start_c;
timing_t timestamp_end_start_c;
timing_t timestamp_start_suspend_c;
timing_t timestamp_end_suspend_c;
timing_t timestamp_start_resume_c;
timing_t timestamp_end_resume_c;
timing_t timestamp_start_abort_1;
timing_t timestamp_end_abort_1;
void thread_suspend_resume(void *p1, void *p2, void *p3)
{
timestamp_start_suspend_c = timing_counter_get();
k_thread_suspend(_current);
/* comes to this line once its resumed*/
timestamp_start_resume_c = timing_counter_get();
}
int suspend_resume(void)
{
uint32_t diff;
timing_start();
timestamp_start_create_c = timing_counter_get();
k_tid_t t1_tid = k_thread_create(&t1, t1_stack, STACK_SIZE,
thread_suspend_resume, NULL, NULL,
NULL, K_PRIO_PREEMPT(6), 0, K_FOREVER);
timestamp_end_create_c = timing_counter_get();
k_thread_name_set(t1_tid, "t1");
timestamp_start_start_c = timing_counter_get();
k_thread_start(t1_tid);
timestamp_end_suspend_c = timing_counter_get();
k_thread_resume(t1_tid);
timestamp_end_resume_c = timing_counter_get();
diff = timing_cycles_get(×tamp_start_create_c,
×tamp_end_create_c);
PRINT_STATS("Time to create a thread (without start)", diff);
diff = timing_cycles_get(×tamp_start_start_c,
×tamp_start_suspend_c);
PRINT_STATS("Time to start a thread", diff);
diff = timing_cycles_get(×tamp_start_suspend_c,
×tamp_end_suspend_c);
PRINT_STATS("Time to suspend a thread", diff);
diff = timing_cycles_get(×tamp_start_resume_c,
×tamp_end_resume_c);
PRINT_STATS("Time to resume a thread", diff);
timestamp_start_abort_1 = timing_counter_get();
k_thread_abort(t1_tid);
timestamp_end_abort_1 = timing_counter_get();
diff = timing_cycles_get(×tamp_start_abort_1,
×tamp_end_abort_1);
PRINT_STATS("Time to abort a thread (not running)", diff);
timing_stop();
return 0;
}