Abort a essential thread and handle the fatal error. Signed-off-by: Meng xianglin <xianglinx.meng@intel.com>
97 lines
2.1 KiB
C
97 lines
2.1 KiB
C
/*
|
|
* Copyright (c) 2016 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#include <ztest.h>
|
|
#include <kernel.h>
|
|
#include <kernel_structs.h>
|
|
#include <kernel_internal.h>
|
|
|
|
struct k_thread kthread_thread;
|
|
|
|
#define STACKSIZE (1024 + CONFIG_TEST_EXTRA_STACKSIZE)
|
|
K_THREAD_STACK_DEFINE(kthread_stack, STACKSIZE);
|
|
K_SEM_DEFINE(sync_sem, 0, 1);
|
|
|
|
static void thread_entry(void *p1, void *p2, void *p3)
|
|
{
|
|
z_thread_essential_set();
|
|
|
|
if (z_is_thread_essential()) {
|
|
k_busy_wait(100);
|
|
} else {
|
|
zassert_unreachable("The thread is not set as essential");
|
|
}
|
|
|
|
z_thread_essential_clear();
|
|
zassert_false(z_is_thread_essential(),
|
|
"Essential flag of the thread is not cleared");
|
|
|
|
k_sem_give(&sync_sem);
|
|
}
|
|
|
|
/**
|
|
* @brief Test to validate essential flag set/clear
|
|
*
|
|
* @ingroup kernel_thread_tests
|
|
*
|
|
* @see #K_ESSENTIAL(x)
|
|
*/
|
|
void test_essential_thread_operation(void)
|
|
{
|
|
k_tid_t tid = k_thread_create(&kthread_thread, kthread_stack,
|
|
STACKSIZE, (k_thread_entry_t)thread_entry, NULL,
|
|
NULL, NULL, K_PRIO_PREEMPT(0), 0,
|
|
K_NO_WAIT);
|
|
|
|
k_sem_take(&sync_sem, K_FOREVER);
|
|
k_thread_abort(tid);
|
|
}
|
|
|
|
void k_sys_fatal_error_handler(unsigned int reason,
|
|
const z_arch_esf_t *esf)
|
|
{
|
|
ARG_UNUSED(esf);
|
|
ARG_UNUSED(reason);
|
|
|
|
z_thread_essential_clear();
|
|
}
|
|
|
|
static void abort_thread_entry(void *p1, void *p2, void *p3)
|
|
{
|
|
z_thread_essential_set();
|
|
|
|
if (z_is_thread_essential()) {
|
|
k_busy_wait(100);
|
|
} else {
|
|
zassert_unreachable("The thread is not set as essential");
|
|
}
|
|
|
|
k_sem_give(&sync_sem);
|
|
k_sleep(K_FOREVER);
|
|
}
|
|
|
|
/**
|
|
* @brief Abort an essential thread
|
|
*
|
|
* @details The kernel shall raise a fatal system error if an essential thread
|
|
* aborts, implement k_sys_fatal_error_handler to handle this error.
|
|
*
|
|
* @ingroup kernel_thread_tests
|
|
*
|
|
* @see #K_ESSENTIAL(x)
|
|
*/
|
|
|
|
void test_essential_thread_abort(void)
|
|
{
|
|
k_tid_t tid = k_thread_create(&kthread_thread, kthread_stack, STACKSIZE,
|
|
(k_thread_entry_t)abort_thread_entry,
|
|
NULL, NULL, NULL, K_PRIO_PREEMPT(0), 0,
|
|
K_NO_WAIT);
|
|
|
|
k_sem_take(&sync_sem, K_FOREVER);
|
|
k_thread_abort(tid);
|
|
|
|
}
|