zephyr/tests/kernel/profiling/profiling_api/src/main.c
Andy Ross 32bb2395c2 timeout: Fix up API usage
Kernel timeouts have always been a 32 bit integer despite the
existence of generation macros, and existing code has been
inconsistent about using them.  Upcoming commits are going to make the
timeout arguments opaque, so fix things up to be rigorously correct.
Changes include:

+ Adding a K_TIMEOUT_EQ() macro for code that needs to compare timeout
  values for equality (e.g. with K_FOREVER or K_NO_WAIT).

+ Adding a k_msleep() synonym for k_sleep() which can continue to take
  integral arguments as k_sleep() moves away to timeout arguments.

+ Pervasively using the K_MSEC(), K_SECONDS(), et. al. macros to
  generate timeout arguments.

+ Removing the usage of K_NO_WAIT as the final argument to
  K_THREAD_DEFINE().  This is just a count of milliseconds and we need
  to use a zero.

This patch include no logic changes and should not affect generated
code at all.

Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
2020-03-31 19:40:47 -04:00

137 lines
3.0 KiB
C

/*
* Copyright (c) 2017 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <ztest.h>
#include <power/power.h>
#include <irq_offload.h>
#include <debug/stack.h>
#define SLEEP_MS 100
#define NUM_OF_WORK 2
#define TEST_STRING "TEST"
static struct k_work work[NUM_OF_WORK];
static struct k_sem sync_sema;
/**TESTPOINT: stack analyze*/
static void tdata_dump_callback(const struct k_thread *thread, void *user_data)
{
log_stack_usage(thread);
}
/*
* Weak power hook functions. Used on systems that have not implemented
* power management.
*/
__weak void sys_set_power_state(enum power_states state)
{
/* Never called. */
__ASSERT_NO_MSG(false);
}
__weak void _sys_pm_power_state_exit_post_ops(enum power_states state)
{
/* Never called. */
__ASSERT_NO_MSG(false);
}
/* Our PM policy handler */
enum power_states sys_pm_policy_next_state(s32_t ticks)
{
static bool test_flag;
/* Call k_thread_foreach only once otherwise it will
* flood the console with stack dumps.
*/
if (!test_flag) {
k_thread_foreach(tdata_dump_callback, NULL);
test_flag = true;
}
return SYS_POWER_STATE_ACTIVE;
}
/*work handler*/
static void work_handler(struct k_work *w)
{
k_thread_foreach(tdata_dump_callback, NULL);
k_sem_give(&sync_sema);
}
/**
* @brief Tests for kernel profiling
* @defgroup kernel_profiling_tests Profiling
* @ingroup all_tests
* @{
* @}
*/
/**
* @brief Test stack usage through main thread
*
* This test prints the main, idle, interrupt and system workqueue
* stack usage through main thread.
*
* @ingroup kernel_profiling_tests
*
* @see k_thread_foreach(), log_stack_usage()
*/
void test_call_stacks_analyze_main(void)
{
TC_PRINT("from main thread:\n");
k_thread_foreach(tdata_dump_callback, NULL);
}
/**
* @brief Test stack usage through idle thread
*
* This test prints the main, idle, interrupt and system workqueue
* stack usage through idle thread.
*
* @ingroup kernel_profiling_tests
*
* @see k_thread_foreach(), _sys_suspend(), _sys_resume(),
* log_stack_usage()
*/
void test_call_stacks_analyze_idle(void)
{
TC_PRINT("from idle thread:\n");
k_msleep(SLEEP_MS);
}
/**
* @brief Test stack usage through system workqueue
*
* This test prints the main, idle, interrupt and system workqueue
* stack usage through system workqueue.
*
* @ingroup kernel_profiling_tests
*
* @see k_thread_foreach(), k_work_init(), k_work_submit(),
* log_stack_usage()
*/
void test_call_stacks_analyze_workq(void)
{
TC_PRINT("from workq:\n");
k_sem_init(&sync_sema, 0, NUM_OF_WORK);
for (int i = 0; i < NUM_OF_WORK; i++) {
k_work_init(&work[i], work_handler);
k_work_submit(&work[i]);
k_sem_take(&sync_sema, K_FOREVER);
}
}
/*TODO: add test case to capture the usage of interrupt call stack*/
void test_main(void)
{
ztest_test_suite(profiling_api,
ztest_unit_test(test_call_stacks_analyze_main),
ztest_1cpu_unit_test(test_call_stacks_analyze_idle),
ztest_1cpu_unit_test(test_call_stacks_analyze_workq));
ztest_run_test_suite(profiling_api);
}