summaryrefslogtreecommitdiff
path: root/examples/utest/testcases/kernel
diff options
context:
space:
mode:
authorguo <[email protected]>2021-09-28 10:36:54 +0800
committerGitHub <[email protected]>2021-09-28 10:36:54 +0800
commit55a302cd092758a44b589d65470a69d9e8ae4ced (patch)
treee60fc53994c426007e9eb4877e5bd123f124ef39 /examples/utest/testcases/kernel
parent00727d6b6db92dc1cf98f028f26fd6168594b905 (diff)
parent00d42ef73cff61ecda7ff006b077a73e1a4ff669 (diff)
Merge branch 'master' into usbh_construct
Diffstat (limited to 'examples/utest/testcases/kernel')
-rw-r--r--examples/utest/testcases/kernel/Kconfig42
-rw-r--r--examples/utest/testcases/kernel/SConscript39
-rw-r--r--examples/utest/testcases/kernel/event_tc.c344
-rw-r--r--examples/utest/testcases/kernel/irq_tc.c78
-rw-r--r--examples/utest/testcases/kernel/mailbox_tc.c371
-rw-r--r--examples/utest/testcases/kernel/memheap_tc.c100
-rw-r--r--examples/utest/testcases/kernel/messagequeue_tc.c192
-rw-r--r--examples/utest/testcases/kernel/mutex_tc.c676
-rw-r--r--examples/utest/testcases/kernel/semaphore_tc.c559
-rw-r--r--examples/utest/testcases/kernel/signal_tc.c199
-rw-r--r--examples/utest/testcases/kernel/timer_tc.c520
11 files changed, 3120 insertions, 0 deletions
diff --git a/examples/utest/testcases/kernel/Kconfig b/examples/utest/testcases/kernel/Kconfig
new file mode 100644
index 0000000000..fba3b8c511
--- /dev/null
+++ b/examples/utest/testcases/kernel/Kconfig
@@ -0,0 +1,42 @@
+menu "Kernel Testcase"
+
+config UTEST_MEMHEAP_TC
+ bool "memheap stability test"
+ default y
+ depends on RT_USING_MEMHEAP
+
+config UTEST_IRQ_TC
+ bool "IRQ test"
+ default n
+
+config UTEST_SEMAPHORE_TC
+ bool "semaphore test"
+ default n
+ depends on RT_USING_SEMAPHORE
+
+config UTEST_EVENT_TC
+ bool "event test"
+ default n
+ depends on RT_USING_EVENT
+
+config UTEST_TIMER_TC
+ bool "timer test"
+ default n
+
+config UTEST_MESSAGEQUEUE_TC
+ bool "message queue test"
+ default n
+
+config UTEST_SIGNAL_TC
+ bool "signal test"
+ default n
+
+config UTEST_MUTEX_TC
+ bool "mutex test"
+ default n
+
+config UTEST_MAILBOX_TC
+ bool "mailbox test"
+ default n
+
+endmenu
diff --git a/examples/utest/testcases/kernel/SConscript b/examples/utest/testcases/kernel/SConscript
new file mode 100644
index 0000000000..484f1fbf3b
--- /dev/null
+++ b/examples/utest/testcases/kernel/SConscript
@@ -0,0 +1,39 @@
+Import('rtconfig')
+from building import *
+
+cwd = GetCurrentDir()
+src = Split('''
+''')
+
+if GetDepend(['UTEST_MEMHEAP_TC']):
+ src += ['memheap_tc.c']
+
+if GetDepend(['UTEST_IRQ_TC']):
+ src += ['irq_tc.c']
+
+if GetDepend(['UTEST_SEMAPHORE_TC']):
+ src += ['semaphore_tc.c']
+
+if GetDepend(['UTEST_EVENT_TC']):
+ src += ['event_tc.c']
+
+if GetDepend(['UTEST_TIMER_TC']):
+ src += ['timer_tc.c']
+
+if GetDepend(['UTEST_MESSAGEQUEUE_TC']):
+ src += ['messagequeue_tc.c']
+
+if GetDepend(['UTEST_SIGNAL_TC']):
+ src += ['signal_tc.c']
+
+if GetDepend(['UTEST_MUTEX_TC']):
+ src += ['mutex_tc.c']
+
+if GetDepend(['UTEST_MAILBOX_TC']):
+ src += ['mailbox_tc.c']
+
+CPPPATH = [cwd]
+
+group = DefineGroup('utestcases', src, depend = [], CPPPATH = CPPPATH)
+
+Return('group')
diff --git a/examples/utest/testcases/kernel/event_tc.c b/examples/utest/testcases/kernel/event_tc.c
new file mode 100644
index 0000000000..9847529214
--- /dev/null
+++ b/examples/utest/testcases/kernel/event_tc.c
@@ -0,0 +1,344 @@
+/*
+ * Copyright (c) 2006-2019, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-08-15 liukang the first version
+ */
+
+#include <rtthread.h>
+#include "utest.h"
+#include <stdlib.h>
+
+#define EVENT_FLAG3 (1 << 3)
+#define EVENT_FLAG5 (1 << 5)
+
+static struct rt_event static_event = {0};
+#ifdef RT_USING_HEAP
+static rt_event_t dynamic_event = RT_NULL;
+static rt_uint32_t dynamic_event_recv_thread_finish = 0, dynamic_event_send_thread_finish = 0;
+
+ALIGN(RT_ALIGN_SIZE)
+static char thread3_stack[1024];
+static struct rt_thread thread3;
+
+ALIGN(RT_ALIGN_SIZE)
+static char thread4_stack[1024];
+static struct rt_thread thread4;
+#endif /* RT_USING_HEAP */
+
+static rt_uint32_t recv_event_times1 = 0, recv_event_times2 = 0;
+static rt_uint32_t static_event_recv_thread_finish = 0, static_event_send_thread_finish = 0;
+
+ALIGN(RT_ALIGN_SIZE)
+static char thread1_stack[1024];
+static struct rt_thread thread1;
+
+ALIGN(RT_ALIGN_SIZE)
+static char thread2_stack[1024];
+static struct rt_thread thread2;
+
+#define THREAD_PRIORITY 9
+#define THREAD_TIMESLICE 5
+
+static void test_event_init(void)
+{
+ rt_err_t result;
+
+ result = rt_event_init(&static_event, "event", RT_IPC_FLAG_PRIO);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ result = rt_event_detach(&static_event);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ result = rt_event_init(&static_event, "event", RT_IPC_FLAG_FIFO);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ result = rt_event_detach(&static_event);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ uassert_true(1);
+}
+
+static void test_event_detach(void)
+{
+ rt_err_t result = RT_EOK;
+
+ result = rt_event_init(&static_event, "event", RT_IPC_FLAG_PRIO);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ result = rt_event_detach(&static_event);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ uassert_true(1);
+}
+
+static void thread1_recv_static_event(void *param)
+{
+ rt_uint32_t e;
+
+ if (rt_event_recv(&static_event, (EVENT_FLAG3 | EVENT_FLAG5),
+ RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
+ RT_WAITING_FOREVER, &e) != RT_EOK)
+ {
+ return;
+ }
+
+ recv_event_times1 = e;
+
+ rt_thread_mdelay(50);
+
+ if (rt_event_recv(&static_event, (EVENT_FLAG3 | EVENT_FLAG5),
+ RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
+ RT_WAITING_FOREVER, &e) != RT_EOK)
+ {
+ return;
+ }
+ recv_event_times2 = e;
+
+ static_event_recv_thread_finish = 1;
+}
+
+static void thread2_send_static_event(void *param)
+{
+ rt_event_send(&static_event, EVENT_FLAG3);
+ rt_thread_mdelay(10);
+
+ rt_event_send(&static_event, EVENT_FLAG5);
+ rt_thread_mdelay(10);
+
+ rt_event_send(&static_event, EVENT_FLAG3);
+
+ static_event_send_thread_finish = 1;
+}
+
+
+static void test_static_event_send_recv(void)
+{
+ rt_err_t result = RT_EOK;
+
+ result = rt_event_init(&static_event, "event", RT_IPC_FLAG_PRIO);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ rt_thread_init(&thread1,
+ "thread1",
+ thread1_recv_static_event,
+ RT_NULL,
+ &thread1_stack[0],
+ sizeof(thread1_stack),
+ THREAD_PRIORITY - 1, THREAD_TIMESLICE);
+ rt_thread_startup(&thread1);
+
+ rt_thread_init(&thread2,
+ "thread2",
+ thread2_send_static_event,
+ RT_NULL,
+ &thread2_stack[0],
+ sizeof(thread2_stack),
+ THREAD_PRIORITY, THREAD_TIMESLICE);
+ rt_thread_startup(&thread2);
+
+ while (static_event_recv_thread_finish != 1 || static_event_send_thread_finish != 1)
+ {
+ rt_thread_delay(1);
+ }
+
+ if (recv_event_times1 == EVENT_FLAG3 && recv_event_times2 == (EVENT_FLAG3 | EVENT_FLAG5))
+ {
+ if (rt_event_detach(&static_event) != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ uassert_true(1);
+ }
+ else
+ {
+ if (rt_event_detach(&static_event) != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ uassert_false(1);
+ }
+
+ return;
+}
+
+#ifdef RT_USING_HEAP
+static void test_event_create(void)
+{
+ rt_err_t result = RT_EOK;
+
+ dynamic_event = rt_event_create("dynamic_event", RT_IPC_FLAG_FIFO);
+ if (dynamic_event == RT_NULL)
+ {
+ uassert_false(1);
+ }
+
+ result = rt_event_delete(dynamic_event);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ uassert_true(1);
+}
+
+static void test_event_delete(void)
+{
+ rt_err_t result;
+
+ dynamic_event = rt_event_create("dynamic_event", RT_IPC_FLAG_FIFO);
+ if (dynamic_event == RT_NULL)
+ {
+ uassert_false(1);
+ }
+
+ result = rt_event_delete(dynamic_event);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ uassert_true(1);
+}
+
+static void thread3_recv_dynamic_event(void *param)
+{
+ rt_uint32_t e;
+
+ if (rt_event_recv(dynamic_event, (EVENT_FLAG3 | EVENT_FLAG5),
+ RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
+ RT_WAITING_FOREVER, &e) != RT_EOK)
+ {
+ return;
+ }
+
+ recv_event_times1 = e;
+
+ rt_thread_mdelay(50);
+
+ if (rt_event_recv(dynamic_event, (EVENT_FLAG3 | EVENT_FLAG5),
+ RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
+ RT_WAITING_FOREVER, &e) != RT_EOK)
+ {
+ return;
+ }
+ recv_event_times2 = e;
+
+ dynamic_event_recv_thread_finish = 1;
+}
+
+static void thread4_send_dynamic_event(void *param)
+{
+ rt_event_send(dynamic_event, EVENT_FLAG3);
+ rt_thread_mdelay(10);
+
+ rt_event_send(dynamic_event, EVENT_FLAG5);
+ rt_thread_mdelay(10);
+
+ rt_event_send(dynamic_event, EVENT_FLAG3);
+
+ dynamic_event_send_thread_finish = 1;
+}
+
+static void test_dynamic_event_send_recv(void)
+{
+ dynamic_event = rt_event_create("dynamic_event", RT_IPC_FLAG_PRIO);
+ if (dynamic_event == RT_NULL)
+ {
+ uassert_false(1);
+ }
+
+ rt_thread_init(&thread3,
+ "thread3",
+ thread3_recv_dynamic_event,
+ RT_NULL,
+ &thread3_stack[0],
+ sizeof(thread3_stack),
+ THREAD_PRIORITY - 1, THREAD_TIMESLICE);
+ rt_thread_startup(&thread3);
+
+ rt_thread_init(&thread4,
+ "thread4",
+ thread4_send_dynamic_event,
+ RT_NULL,
+ &thread4_stack[0],
+ sizeof(thread4_stack),
+ THREAD_PRIORITY, THREAD_TIMESLICE);
+ rt_thread_startup(&thread4);
+
+ while (dynamic_event_recv_thread_finish != 1 || dynamic_event_send_thread_finish != 1)
+ {
+ rt_thread_delay(1);
+ }
+
+ if (recv_event_times1 == EVENT_FLAG3 && recv_event_times2 == (EVENT_FLAG3 | EVENT_FLAG5))
+ {
+ if (rt_event_delete(dynamic_event) != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ uassert_true(1);
+ }
+ else
+ {
+ if (rt_event_delete(dynamic_event) != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ uassert_false(1);
+ }
+
+ return;
+}
+#endif
+
+static rt_err_t utest_tc_init(void)
+{
+ static_event_recv_thread_finish = 0;
+ static_event_send_thread_finish = 0;
+#ifdef RT_USING_HEAP
+ dynamic_event_recv_thread_finish = 0;
+ dynamic_event_send_thread_finish = 0;
+#endif
+ return RT_EOK;
+}
+
+static rt_err_t utest_tc_cleanup(void)
+{
+ return RT_EOK;
+}
+
+static void testcase(void)
+{
+ UTEST_UNIT_RUN(test_event_init);
+ UTEST_UNIT_RUN(test_event_detach);
+ UTEST_UNIT_RUN(test_static_event_send_recv);
+#ifdef RT_USING_HEAP
+ UTEST_UNIT_RUN(test_event_create);
+ UTEST_UNIT_RUN(test_event_delete);
+ UTEST_UNIT_RUN(test_dynamic_event_send_recv);
+#endif
+}
+UTEST_TC_EXPORT(testcase, "src.ipc.event_tc", utest_tc_init, utest_tc_cleanup, 60);
diff --git a/examples/utest/testcases/kernel/irq_tc.c b/examples/utest/testcases/kernel/irq_tc.c
new file mode 100644
index 0000000000..86b6c144f1
--- /dev/null
+++ b/examples/utest/testcases/kernel/irq_tc.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-08-15 supperthomas add irq_test
+ */
+
+#include <rtthread.h>
+#include "utest.h"
+#include "rthw.h"
+
+#define UTEST_NAME "irq_tc"
+static uint32_t irq_count = 0;
+static uint32_t max_get_nest_count = 0;
+
+static void irq_callback()
+{
+ if(rt_interrupt_get_nest() > max_get_nest_count)
+ {
+ max_get_nest_count = rt_interrupt_get_nest();
+ }
+ irq_count ++;
+}
+
+static void irq_test(void)
+{
+ irq_count = 0;
+ rt_interrupt_enter_sethook(irq_callback);
+ rt_interrupt_leave_sethook(irq_callback);
+ rt_thread_mdelay(2);
+ LOG_D("%s test irq_test! irq_count %d max_get_nest_count %d\n", UTEST_NAME, irq_count, max_get_nest_count);
+ uassert_int_not_equal(0, irq_count);
+ uassert_int_not_equal(0, max_get_nest_count);
+ rt_interrupt_enter_sethook(RT_NULL);
+ rt_interrupt_leave_sethook(RT_NULL);
+ LOG_D("irq_test OK!\n");
+}
+
+static rt_err_t utest_tc_init(void)
+{
+ irq_count = 0;
+ max_get_nest_count = 0;
+ return RT_EOK;
+}
+
+static rt_err_t utest_tc_cleanup(void)
+{
+ return RT_EOK;
+}
+
+static void interrupt_test(void)
+{
+ rt_base_t level;
+ uint32_t i = 1000;
+
+ rt_interrupt_enter_sethook(irq_callback);
+ rt_interrupt_leave_sethook(irq_callback);
+ irq_count = 0;
+ level = rt_hw_interrupt_disable();
+ while(i)
+ {
+ i --;
+ }
+ uassert_int_equal(0, irq_count);
+ rt_hw_interrupt_enable(level);
+ rt_interrupt_enter_sethook(RT_NULL);
+ rt_interrupt_leave_sethook(RT_NULL);
+
+}
+static void testcase(void)
+{
+ UTEST_UNIT_RUN(irq_test);
+ UTEST_UNIT_RUN(interrupt_test);
+}
+UTEST_TC_EXPORT(testcase, "testcases.kernel.irq_tc", utest_tc_init, utest_tc_cleanup, 10);
diff --git a/examples/utest/testcases/kernel/mailbox_tc.c b/examples/utest/testcases/kernel/mailbox_tc.c
new file mode 100644
index 0000000000..e18613b559
--- /dev/null
+++ b/examples/utest/testcases/kernel/mailbox_tc.c
@@ -0,0 +1,371 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-09-08 liukang the first version
+ */
+
+#include <rtthread.h>
+#include "utest.h"
+#include <stdlib.h>
+
+static struct rt_mailbox test_static_mb;
+static char mb_pool[128];
+
+static rt_mailbox_t test_dynamic_mb;
+
+static uint8_t static_mb_recv_thread_finish, static_mb_send_thread_finish;
+static uint8_t dynamic_mb_recv_thread_finish, dynamic_mb_send_thread_finish;
+
+ALIGN(RT_ALIGN_SIZE)
+static char thread1_stack[1024];
+static struct rt_thread thread1;
+
+ALIGN(RT_ALIGN_SIZE)
+static char thread2_stack[1024];
+static struct rt_thread thread2;
+
+#define THREAD_PRIORITY 9
+#define THREAD_TIMESLICE 5
+
+static rt_thread_t mb_send = RT_NULL;
+static rt_thread_t mb_recv = RT_NULL;
+
+static rt_uint8_t mb_send_str1[] = "this is first mail!";
+static rt_uint8_t mb_send_str2[] = "this is second mail!";
+static rt_uint8_t mb_send_str3[] = "this is thirdy mail!";
+
+static rt_uint8_t *mb_recv_str1;
+static rt_uint8_t *mb_recv_str2;
+static rt_uint8_t *mb_recv_str3;
+
+static void test_mailbox_init(void)
+{
+ rt_err_t result;
+
+ result = rt_mb_init(&test_static_mb, "mbt", &mb_pool[0], sizeof(mb_pool) / 4, RT_IPC_FLAG_FIFO);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ result = rt_mb_detach(&test_static_mb);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ result = rt_mb_init(&test_static_mb, "mbt", &mb_pool[0], sizeof(mb_pool) / 4, RT_IPC_FLAG_PRIO);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ result = rt_mb_detach(&test_static_mb);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ uassert_true(1);
+}
+
+static void test_mailbox_deatch(void)
+{
+ rt_err_t result;
+
+ result = rt_mb_init(&test_static_mb, "mbt", &mb_pool[0], sizeof(mb_pool) / 4, RT_IPC_FLAG_FIFO);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ result = rt_mb_detach(&test_static_mb);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ result = rt_mb_init(&test_static_mb, "mbt", &mb_pool[0], sizeof(mb_pool) / 4, RT_IPC_FLAG_PRIO);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ result = rt_mb_detach(&test_static_mb);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ uassert_true(1);
+}
+
+static void test_mailbox_create(void)
+{
+ rt_err_t result;
+
+ test_dynamic_mb = rt_mb_create("test_dynamic_mb", sizeof(mb_pool) / 4, RT_IPC_FLAG_FIFO);
+ if (test_dynamic_mb == RT_NULL)
+ {
+ uassert_false(1);
+ }
+ result = rt_mb_delete(test_dynamic_mb);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ test_dynamic_mb = rt_mb_create("test_dynamic_mb", sizeof(mb_pool) / 4, RT_IPC_FLAG_PRIO);
+ if (test_dynamic_mb == RT_NULL)
+ {
+ uassert_false(1);
+ }
+ result = rt_mb_delete(test_dynamic_mb);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ uassert_true(1);
+}
+
+static void test_mailbox_delete(void)
+{
+ rt_err_t result;
+
+ test_dynamic_mb = rt_mb_create("test_dynamic_mb", sizeof(mb_pool) / 4, RT_IPC_FLAG_FIFO);
+ if (test_dynamic_mb == RT_NULL)
+ {
+ uassert_false(1);
+ }
+ result = rt_mb_delete(test_dynamic_mb);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ test_dynamic_mb = rt_mb_create("test_dynamic_mb", sizeof(mb_pool) / 4, RT_IPC_FLAG_PRIO);
+ if (test_dynamic_mb == RT_NULL)
+ {
+ uassert_false(1);
+ }
+ result = rt_mb_delete(test_dynamic_mb);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ uassert_true(1);
+}
+
+static void thread2_send_static_mb(void *arg)
+{
+ rt_err_t res = RT_EOK;
+
+ res = rt_mb_send(&test_static_mb, (rt_ubase_t)&mb_send_str1);
+ if (res != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ rt_thread_mdelay(100);
+
+ res = rt_mb_send_wait(&test_static_mb, (rt_ubase_t)&mb_send_str2, 10);
+ if (res != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ rt_thread_mdelay(100);
+
+ res = rt_mb_urgent(&test_static_mb, (rt_ubase_t)&mb_send_str3);
+ if (res != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ static_mb_send_thread_finish = 1;
+}
+
+static void thread1_recv_static_mb(void *arg)
+{
+ rt_err_t result = RT_EOK;
+
+ result = rt_mb_recv(&test_static_mb, (rt_ubase_t *)&mb_recv_str1, RT_WAITING_FOREVER);
+ if (result != RT_EOK || strcmp(mb_recv_str1, mb_send_str1) != 0)
+ {
+ uassert_false(1);
+ }
+
+ result = rt_mb_recv(&test_static_mb, (rt_ubase_t *)&mb_recv_str2, RT_WAITING_FOREVER);
+ if (result != RT_EOK || strcmp(mb_recv_str2, mb_send_str2) != 0)
+ {
+ uassert_false(1);
+ }
+
+ result = rt_mb_recv(&test_static_mb, (rt_ubase_t *)&mb_recv_str3, RT_WAITING_FOREVER);
+ if (result != RT_EOK || strcmp(mb_recv_str3, mb_send_str3) != 0)
+ {
+ uassert_false(1);
+ }
+
+ static_mb_recv_thread_finish = 1;
+}
+
+static void test_static_mailbox_send_recv(void)
+{
+ rt_err_t result;
+
+ result = rt_mb_init(&test_static_mb, "mbt", &mb_pool[0], sizeof(mb_pool) / 4, RT_IPC_FLAG_FIFO);
+ if (result != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ rt_thread_init(&thread1,
+ "thread1",
+ thread1_recv_static_mb,
+ RT_NULL,
+ &thread1_stack[0],
+ sizeof(thread1_stack),
+ THREAD_PRIORITY - 1, THREAD_TIMESLICE);
+ rt_thread_startup(&thread1);
+
+ rt_thread_init(&thread2,
+ "thread2",
+ thread2_send_static_mb,
+ RT_NULL,
+ &thread2_stack[0],
+ sizeof(thread2_stack),
+ THREAD_PRIORITY, THREAD_TIMESLICE);
+ rt_thread_startup(&thread2);
+
+ while (static_mb_recv_thread_finish != 1 || static_mb_send_thread_finish != 1)
+ {
+ rt_thread_delay(1);
+ }
+
+ if (rt_mb_detach(&test_static_mb) != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ uassert_true(1);
+}
+
+static void thread4_send_dynamic_mb(void *arg)
+{
+ rt_err_t res = RT_EOK;
+
+ res = rt_mb_send(test_dynamic_mb, (rt_ubase_t)&mb_send_str1);
+ if (res != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ rt_thread_mdelay(100);
+
+ res = rt_mb_send_wait(test_dynamic_mb, (rt_ubase_t)&mb_send_str2, 10);
+ if (res != RT_EOK)
+ {
+ uassert_false(1);
+ }
+ rt_thread_mdelay(100);
+
+ res = rt_mb_urgent(test_dynamic_mb, (rt_ubase_t)&mb_send_str3);
+ if (res != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ dynamic_mb_send_thread_finish = 1;
+}
+
+static void thread3_recv_dynamic_mb(void *arg)
+{
+ rt_err_t result = RT_EOK;
+
+ result = rt_mb_recv(test_dynamic_mb, (rt_ubase_t *)&mb_recv_str1, RT_WAITING_FOREVER);
+ if (result != RT_EOK || strcmp(mb_recv_str1, mb_send_str1) != 0)
+ {
+ uassert_false(1);
+ }
+
+ result = rt_mb_recv(test_dynamic_mb, (rt_ubase_t *)&mb_recv_str2, RT_WAITING_FOREVER);
+ if (result != RT_EOK || strcmp(mb_recv_str2, mb_send_str2) != 0)
+ {
+ uassert_false(1);
+ }
+
+ result = rt_mb_recv(test_dynamic_mb, (rt_ubase_t *)&mb_recv_str3, RT_WAITING_FOREVER);
+ if (result != RT_EOK || strcmp(mb_recv_str3, mb_send_str3) != 0)
+ {
+ uassert_false(1);
+ }
+
+ dynamic_mb_recv_thread_finish = 1;
+}
+
+static void test_dynamic_mailbox_send_recv(void)
+{
+ test_dynamic_mb = rt_mb_create("mbt", sizeof(mb_pool) / 4, RT_IPC_FLAG_FIFO);
+ if (test_dynamic_mb == RT_NULL)
+ {
+ uassert_false(1);
+ }
+
+ mb_recv = rt_thread_create("mb_recv_thread",
+ thread3_recv_dynamic_mb,
+ RT_NULL,
+ 1024,
+ THREAD_PRIORITY - 1,
+ THREAD_TIMESLICE);
+ if (mb_recv == RT_NULL)
+ {
+ uassert_false(1);
+ }
+ rt_thread_startup(mb_recv);
+
+ mb_send = rt_thread_create("mb_send_thread",
+ thread4_send_dynamic_mb,
+ RT_NULL,
+ 1024,
+ THREAD_PRIORITY - 1,
+ THREAD_TIMESLICE);
+ if (mb_send == RT_NULL)
+ {
+ uassert_false(1);
+ }
+ rt_thread_startup(mb_send);
+
+ while (dynamic_mb_recv_thread_finish != 1 || dynamic_mb_send_thread_finish != 1)
+ {
+ rt_thread_delay(1);
+ }
+
+ if (rt_mb_delete(test_dynamic_mb) != RT_EOK)
+ {
+ uassert_false(1);
+ }
+
+ uassert_true(1);
+}
+
+static rt_err_t utest_tc_init(void)
+{
+ return RT_EOK;
+}
+
+static rt_err_t utest_tc_cleanup(void)
+{
+ return RT_EOK;
+}
+
+static void testcase(void)
+{
+ UTEST_UNIT_RUN(test_mailbox_init);
+ UTEST_UNIT_RUN(test_mailbox_deatch);
+ UTEST_UNIT_RUN(test_mailbox_create);
+ UTEST_UNIT_RUN(test_mailbox_delete);
+ UTEST_UNIT_RUN(test_static_mailbox_send_recv);
+ UTEST_UNIT_RUN(test_dynamic_mailbox_send_recv);
+}
+UTEST_TC_EXPORT(testcase, "src.ipc.mailbox_tc", utest_tc_init, utest_tc_cleanup, 60);
diff --git a/examples/utest/testcases/kernel/memheap_tc.c b/examples/utest/testcases/kernel/memheap_tc.c
new file mode 100644
index 0000000000..ee52bdb185
--- /dev/null
+++ b/examples/utest/testcases/kernel/memheap_tc.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2006-2019, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2019-01-16 flybreak the first version
+ */
+
+#include <rtthread.h>
+#include <stdlib.h>
+#include "utest.h"
+
+#define HEAP_SIZE (64 * 1024)
+#define HEAP_ALIGN (4)
+#define SLICE_NUM (40)
+#define TEST_TIMES (100000)
+#define HEAP_NAME "heap1"
+#define SLICE_SIZE_MAX (HEAP_SIZE/SLICE_NUM)
+
+static void memheap_test(void)
+{
+ struct rt_memheap heap1;
+ rt_uint32_t ptr_start;
+ void *ptr[SLICE_NUM];
+ int i, cnt = 0;
+
+ /* init heap */
+ ptr_start = (rt_uint32_t)rt_malloc_align(HEAP_SIZE, HEAP_ALIGN);
+ if (ptr_start == RT_NULL)
+ {
+ rt_kprintf("totle size too big,can not malloc memory!");
+ return;
+ }
+
+ rt_memheap_init(&heap1, HEAP_NAME, (void *)ptr_start, HEAP_SIZE);
+
+ /* test start */
+ for (i = 0; i < SLICE_NUM; i++)
+ {
+ ptr[i] = 0;
+ }
+ /* test alloc */
+ for (i = 0; i < SLICE_NUM; i++)
+ {
+ rt_uint32_t slice_size = rand() % SLICE_SIZE_MAX;
+ ptr[i] = rt_memheap_alloc(&heap1, slice_size);
+ }
+ /* test realloc */
+ while (cnt < TEST_TIMES)
+ {
+ rt_uint32_t slice_size = rand() % SLICE_SIZE_MAX;
+ rt_uint32_t ptr_index = rand() % SLICE_NUM;
+ rt_uint32_t operation = rand() % 2;
+
+ if (ptr[ptr_index])
+ {
+ if (operation == 0) /* free and malloc */
+ {
+ if (ptr[ptr_index])
+ {
+ rt_memheap_free(ptr[ptr_index]);
+ }
+ ptr[ptr_index] = rt_memheap_alloc(&heap1, slice_size);
+ }
+ else /* realloc */
+ {
+ ptr[ptr_index] = rt_memheap_realloc(&heap1, ptr[ptr_index], slice_size);
+ }
+ }
+ cnt ++;
+ if (cnt % (TEST_TIMES / 10) == 0)
+ {
+ rt_kprintf(">");
+ }
+ }
+
+ rt_kprintf("test OK!\n");
+
+ /* test end */
+ rt_memheap_detach(&heap1);
+ rt_free_align((void *)ptr_start);
+}
+
+static rt_err_t utest_tc_init(void)
+{
+ return RT_EOK;
+}
+
+static rt_err_t utest_tc_cleanup(void)
+{
+ return RT_EOK;
+}
+
+static void testcase(void)
+{
+ UTEST_UNIT_RUN(memheap_test);
+}
+UTEST_TC_EXPORT(testcase, "testcases.kernel.memheap_tc", utest_tc_init, utest_tc_cleanup, 10);
diff --git a/examples/utest/testcases/kernel/messagequeue_tc.c b/examples/utest/testcases/kernel/messagequeue_tc.c
new file mode 100644
index 0000000000..335c591ab6
--- /dev/null
+++ b/examples/utest/testcases/kernel/messagequeue_tc.c
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-08-28 Sherman the first version
+ */
+
+#include <rtthread.h>
+#include "utest.h"
+
+#define MSG_SIZE 4
+#define MAX_MSGS 5
+
+static struct rt_messagequeue static_mq;
+static rt_uint8_t mq_buf[(MSG_SIZE + 4) * MAX_MSGS];
+
+static struct rt_thread mq_send_thread;
+static struct rt_thread mq_recv_thread;
+static rt_uint8_t mq_send_stack[512];
+static rt_uint8_t mq_recv_stack[512];
+
+static struct rt_event finish_e;
+#define MQSEND_FINISH 0x01
+#define MQRECV_FINIHS 0x02
+
+#ifdef RT_USING_HEAP
+static rt_mq_t dynamic_mq;
+#endif /* RT_USING_HEAP */
+
+static void test_mq_init(void)
+{
+ rt_err_t ret;
+ ret = rt_mq_init(&static_mq,"testmq1", mq_buf, MSG_SIZE, sizeof(mq_buf), RT_IPC_FLAG_FIFO);
+ uassert_true(ret == RT_EOK);
+}
+
+static void test_mq_create(void)
+{
+#ifdef RT_USING_HEAP
+ dynamic_mq = rt_mq_create("testmq2", MSG_SIZE, MAX_MSGS, RT_IPC_FLAG_FIFO);
+ uassert_true(dynamic_mq != RT_NULL);
+#endif /* RT_USING_HEAP */
+}
+
+static void mq_send_case(rt_mq_t testmq)
+{
+ rt_uint32_t send_buf[MAX_MSGS+1] = {0};
+ rt_err_t ret = RT_EOK;
+
+ for (int var = 0; var < MAX_MSGS; ++var)
+ {
+ send_buf[var] = var + 1;
+ ret = rt_mq_send_wait(testmq, &send_buf[var], sizeof(send_buf[0]), RT_WAITING_FOREVER);
+ uassert_true(ret == RT_EOK);
+ }
+ send_buf[MAX_MSGS] = MAX_MSGS + 1;
+ ret = rt_mq_send(testmq, &send_buf[MAX_MSGS], sizeof(send_buf[0]));
+ uassert_true(ret == -RT_EFULL);
+
+ ret = rt_mq_send_wait(testmq, &send_buf[MAX_MSGS], sizeof(send_buf[0]), RT_WAITING_FOREVER);
+ uassert_true(ret == RT_EOK);
+
+ while (testmq->entry != 0)
+ {
+ rt_thread_delay(100);
+ }
+
+ ret = rt_mq_send(testmq, &send_buf[1], sizeof(send_buf[0]));
+ uassert_true(ret == RT_EOK);
+
+ ret = rt_mq_send(testmq, &send_buf[2], sizeof(send_buf[0]));
+ uassert_true(ret == RT_EOK);
+
+ ret = rt_mq_urgent(testmq, &send_buf[0], sizeof(send_buf[0]));
+ uassert_true(ret == RT_EOK);
+
+ while (testmq->entry != 0)
+ {
+ rt_thread_delay(100);
+ }
+
+ ret = rt_mq_send(testmq, &send_buf[1], sizeof(send_buf[0]));
+ uassert_true(ret == RT_EOK);
+ ret = rt_mq_control(testmq, RT_IPC_CMD_RESET, RT_NULL);
+ uassert_true(ret == RT_EOK);
+ uassert_true(testmq->entry == 0);
+}
+
+static void mq_send_entry(void *param)
+{
+ mq_send_case(&static_mq);
+
+#ifdef RT_USING_HEAP
+ if(dynamic_mq != RT_NULL)
+ {
+ mq_send_case(dynamic_mq);
+ }
+#endif /* RT_USING_HEAP */
+
+ rt_event_send(&finish_e, MQSEND_FINISH);
+}
+
+static void mq_recv_case(rt_mq_t testmq)
+{
+ rt_uint32_t recv_buf[MAX_MSGS+1] = {0};
+ rt_err_t ret = RT_EOK;
+
+ for (int var = 0; var < MAX_MSGS + 1; ++var)
+ {
+ ret = rt_mq_recv(testmq, &recv_buf[var], sizeof(recv_buf[0]), RT_WAITING_FOREVER);
+ uassert_true(ret == RT_EOK);
+ uassert_true(recv_buf[var] == (var + 1));
+ }
+
+ for (int var = 0; var < 3; ++var)
+ {
+ ret = rt_mq_recv(testmq, &recv_buf[var], sizeof(recv_buf[0]), RT_WAITING_FOREVER);
+ uassert_true(ret == RT_EOK);
+ uassert_true(recv_buf[var] == (var + 1));
+ }
+}
+
+static void mq_recv_entry(void *param)
+{
+ mq_recv_case(&static_mq);
+
+#ifdef RT_USING_HEAP
+ if(dynamic_mq != RT_NULL)
+ {
+ mq_recv_case(dynamic_mq);
+ }
+#endif /* RT_USING_HEAP */
+ rt_event_send(&finish_e, MQRECV_FINIHS);
+}
+
+static void test_mq_testcase(void)
+{
+ rt_thread_startup(&mq_send_thread);
+ rt_thread_startup(&mq_recv_thread);
+
+ rt_event_recv(&finish_e, MQSEND_FINISH | MQRECV_FINIHS, RT_EVENT_FLAG_AND, RT_WAITING_FOREVER, RT_NULL);
+}
+
+static void test_mq_detach(void)
+{
+ rt_err_t ret = rt_mq_detach(&static_mq);
+ uassert_true(ret == RT_EOK);
+}
+
+static void test_mq_delete(void)
+{
+#ifdef RT_USING_HEAP
+ rt_err_t ret = rt_mq_delete(dynamic_mq);
+ uassert_true(ret == RT_EOK);
+#endif /* RT_USING_HEAP */
+}
+
+static rt_err_t utest_tc_init(void)
+{
+ rt_err_t ret ;
+ ret = rt_thread_init(&mq_send_thread, "mq_send", mq_send_entry, RT_NULL, mq_send_stack, sizeof(mq_send_stack), 22, 20);
+ if(ret != RT_EOK)
+ return -RT_ERROR;
+
+ ret = rt_thread_init(&mq_recv_thread, "mq_recv", mq_recv_entry, RT_NULL, mq_recv_stack, sizeof(mq_recv_stack), 23, 20);
+ if(ret != RT_EOK)
+ return -RT_ERROR;
+
+ ret = rt_event_init(&finish_e, "finish", RT_IPC_FLAG_FIFO);
+ if(ret != RT_EOK)
+ return -RT_ERROR;
+
+ return RT_EOK;
+}
+
+static rt_err_t utest_tc_cleanup(void)
+{
+ return RT_EOK;
+}
+
+static void testcase(void)
+{
+ UTEST_UNIT_RUN(test_mq_init);
+ UTEST_UNIT_RUN(test_mq_create);
+ UTEST_UNIT_RUN(test_mq_testcase);
+ UTEST_UNIT_RUN(test_mq_detach);
+ UTEST_UNIT_RUN(test_mq_delete);
+}
+UTEST_TC_EXPORT(testcase, "testcases.kernel.messagequeue_tc", utest_tc_init, utest_tc_cleanup, 1000);
diff --git a/examples/utest/testcases/kernel/mutex_tc.c b/examples/utest/testcases/kernel/mutex_tc.c
new file mode 100644
index 0000000000..f50e3e43f7
--- /dev/null
+++ b/examples/utest/testcases/kernel/mutex_tc.c
@@ -0,0 +1,676 @@
+/*
+ * Copyright (c) 2006-2019, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-09.01 luckyzjq the first version
+ */
+
+#include <rtthread.h>
+#include <stdlib.h>
+#include "utest.h"
+
+static struct rt_mutex static_mutex;
+
+#ifdef RT_USING_HEAP
+static rt_mutex_t dynamic_mutex;
+#endif /* RT_USING_HEAP */
+
+/* init test */
+static void test_static_mutex_init(void)
+{
+ rt_err_t result = -RT_ERROR;
+
+ result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ result = rt_mutex_detach(&static_mutex);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_FIFO);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ result = rt_mutex_detach(&static_mutex);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ uassert_true(RT_TRUE);
+}
+
+/* static take test */
+static void static_mutex_take_entry(void *param)
+{
+ rt_err_t result;
+ rt_mutex_t mutex;
+
+ int rand_num = rand() % 0x1000;
+ mutex = (rt_mutex_t)param;
+
+ result = rt_mutex_take(mutex, rand_num);
+ if (RT_EOK == result)
+ {
+ uassert_true(RT_FALSE);
+ }
+}
+static void test_static_mutex_take(void)
+{
+ rt_err_t result;
+
+ result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* take mutex and not release */
+ result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ rt_thread_t tid = rt_thread_create("mutex_th",
+ static_mutex_take_entry,
+ &static_mutex,
+ 2048,
+ 10,
+ 10);
+ if (RT_NULL == tid)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* startup thread take second */
+ rt_thread_startup(tid);
+
+ /* let system schedule */
+ rt_thread_mdelay(5);
+
+ result = rt_mutex_detach(&static_mutex);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ uassert_true(RT_TRUE);
+}
+
+/* static release test */
+static void static_mutex_release_entry(void *param)
+{
+ rt_err_t result;
+ rt_mutex_t mutex;
+
+ int rand_num = rand() % 0x1000;
+ mutex = (rt_mutex_t)param;
+
+ result = rt_mutex_take(mutex, rand_num);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+}
+static void test_static_mutex_release(void)
+{
+ rt_err_t result;
+
+ result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* take mutex */
+ result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ /* release mutex */
+ result = rt_mutex_release(&static_mutex);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ rt_thread_t tid = rt_thread_create("mutex_th",
+ static_mutex_release_entry,
+ &static_mutex,
+ 2048,
+ 10,
+ 10);
+ if (RT_NULL == tid)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* startup thread and take mutex second */
+ rt_thread_startup(tid);
+
+ /* let system schedule */
+ rt_thread_mdelay(5);
+
+ result = rt_mutex_detach(&static_mutex);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ uassert_true(RT_TRUE);
+}
+
+/* static trytake test */
+static void static_mutex_trytake_entry(void *param)
+{
+ rt_err_t result;
+ rt_mutex_t mutex;
+
+ mutex = (rt_mutex_t)param;
+
+ result = rt_mutex_trytake(mutex);
+ if (RT_EOK == result)
+ {
+ uassert_true(RT_FALSE);
+ }
+}
+static void test_static_mutex_trytake(void)
+{
+ rt_err_t result;
+
+ result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* take mutex and not release */
+ result = rt_mutex_take(&static_mutex, RT_WAITING_FOREVER);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ rt_thread_t tid = rt_thread_create("mutex_th",
+ static_mutex_trytake_entry,
+ &static_mutex,
+ 2048,
+ 10,
+ 10);
+ if (RT_NULL == tid)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* startup thread and trytake mutex second */
+ rt_thread_startup(tid);
+
+ /* let system schedule */
+ rt_thread_mdelay(5);
+
+ result = rt_mutex_detach(&static_mutex);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ uassert_true(RT_TRUE);
+}
+
+static rt_thread_t tid1 = RT_NULL;
+static rt_thread_t tid2 = RT_NULL;
+static rt_thread_t tid3 = RT_NULL;
+
+/* static mutex priority reverse test */
+static void static_thread1_entry(void *param)
+{
+ /* let system schedule */
+ rt_thread_mdelay(100);
+
+ /* thread3 hode mutex thread2 take mutex */
+ /* check thread2 and thread3 priority */
+ if (tid2->current_priority != tid3->current_priority)
+ {
+ uassert_true(RT_FALSE);
+ }
+ else
+ {
+ uassert_true(RT_TRUE);
+ }
+}
+
+static void static_thread2_entry(void *param)
+{
+ rt_err_t result;
+ rt_mutex_t mutex = (rt_mutex_t)param;
+
+ /* let system schedule */
+ rt_thread_mdelay(50);
+
+ result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
+ if (result == RT_EOK)
+ {
+ rt_mutex_release(mutex);
+ }
+}
+static void static_thread3_entry(void *param)
+{
+ rt_tick_t tick;
+ rt_err_t result;
+ rt_mutex_t mutex = (rt_mutex_t)param;
+
+ result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
+ if (result != RT_EOK)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ tick = rt_tick_get();
+ while (rt_tick_get() - tick < (RT_TICK_PER_SECOND / 2));
+
+ rt_mutex_release(mutex);
+}
+
+static void test_static_pri_reverse(void)
+{
+ rt_err_t result;
+ tid1 = RT_NULL;
+ tid2 = RT_NULL;
+ tid3 = RT_NULL;
+
+ result = rt_mutex_init(&static_mutex, "static_mutex", RT_IPC_FLAG_PRIO);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* thread1 */
+ tid1 = rt_thread_create("thread1",
+ static_thread1_entry,
+ &static_mutex,
+ 1024,
+ 10 - 1,
+ 10);
+ if (tid1 != RT_NULL)
+ rt_thread_startup(tid1);
+
+ /* thread2 */
+ tid2 = rt_thread_create("thread2",
+ static_thread2_entry,
+ &static_mutex,
+ 1024,
+ 10,
+ 10);
+ if (tid2 != RT_NULL)
+ rt_thread_startup(tid2);
+
+ /* thread3 */
+ tid3 = rt_thread_create("thread3",
+ static_thread3_entry,
+ &static_mutex,
+ 1024,
+ 10 + 1,
+ 10);
+ if (tid3 != RT_NULL)
+ rt_thread_startup(tid3);
+
+ rt_thread_mdelay(1000);
+
+ result = rt_mutex_detach(&static_mutex);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ uassert_true(RT_TRUE);
+}
+
+/* create test */
+static void test_dynamic_mutex_create(void)
+{
+ rt_err_t result = -RT_ERROR;
+
+ /* PRIO mode */
+ dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_PRIO);
+ if (RT_NULL == result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ result = rt_mutex_delete(dynamic_mutex);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ /* FIFO mode */
+ dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_FIFO);
+ if (RT_NULL == dynamic_mutex)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ result = rt_mutex_delete(dynamic_mutex);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ uassert_true(RT_TRUE);
+}
+
+/* dynamic take test */
+static void dynamic_mutex_take_entry(void *param)
+{
+ rt_err_t result;
+ rt_mutex_t mutex;
+
+ int rand_num = rand() % 0x1000;
+ mutex = (rt_mutex_t)param;
+
+ result = rt_mutex_take(mutex, rand_num);
+ if (RT_EOK == result)
+ {
+ uassert_true(RT_FALSE);
+ }
+}
+static void test_dynamic_mutex_take(void)
+{
+ rt_err_t result;
+
+ dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_PRIO);
+ if (RT_NULL == dynamic_mutex)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* take mutex and not release */
+ result = rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ rt_thread_t tid = rt_thread_create("mutex_th",
+ dynamic_mutex_take_entry,
+ dynamic_mutex,
+ 2048,
+ 10,
+ 10);
+ if (RT_NULL == tid)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* startup thread take second */
+ rt_thread_startup(tid);
+
+ /* let system schedule */
+ rt_thread_mdelay(5);
+
+ result = rt_mutex_delete(dynamic_mutex);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ uassert_true(RT_TRUE);
+}
+
+/* dynamic release test */
+static void dynamic_mutex_release_entry(void *param)
+{
+ rt_err_t result;
+ rt_mutex_t mutex;
+
+ int rand_num = rand() % 0x1000;
+ mutex = (rt_mutex_t)param;
+
+ result = rt_mutex_take(mutex, rand_num);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+}
+static void test_dynamic_mutex_release(void)
+{
+ rt_err_t result;
+
+ dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_PRIO);
+ if (RT_NULL == dynamic_mutex)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* take mutex */
+ result = rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ /* release mutex */
+ result = rt_mutex_release(dynamic_mutex);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ rt_thread_t tid = rt_thread_create("mutex_th",
+ dynamic_mutex_release_entry,
+ dynamic_mutex,
+ 2048,
+ 10,
+ 10);
+ if (RT_NULL == tid)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* startup thread and take mutex second */
+ rt_thread_startup(tid);
+
+ /* let system schedule */
+ rt_thread_mdelay(5);
+
+ result = rt_mutex_delete(dynamic_mutex);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ uassert_true(RT_TRUE);
+}
+
+/* dynamic trytake test */
+static void dynamic_mutex_trytake_entry(void *param)
+{
+ rt_err_t result;
+ rt_mutex_t mutex;
+
+ mutex = (rt_mutex_t)param;
+
+ result = rt_mutex_trytake(mutex);
+ if (RT_EOK == result)
+ {
+ uassert_true(RT_FALSE);
+ }
+}
+static void test_dynamic_mutex_trytake(void)
+{
+ rt_err_t result;
+
+ dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_PRIO);
+ if (RT_NULL == dynamic_mutex)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* take mutex and not release */
+ result = rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ rt_thread_t tid = rt_thread_create("mutex_th",
+ dynamic_mutex_trytake_entry,
+ dynamic_mutex,
+ 2048,
+ 10,
+ 10);
+ if (RT_NULL == tid)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* startup thread and trytake mutex second */
+ rt_thread_startup(tid);
+
+ /* let system schedule */
+ rt_thread_mdelay(5);
+
+ result = rt_mutex_delete(dynamic_mutex);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ uassert_true(RT_TRUE);
+}
+
+/* dynamic mutex priority reverse test */
+static void dynamic_thread1_entry(void *param)
+{
+ /* let system schedule */
+ rt_thread_mdelay(100);
+
+ /* thread3 hode mutex thread2 take mutex */
+ /* check thread2 and thread3 priority */
+ if (tid2->current_priority != tid3->current_priority)
+ {
+ uassert_true(RT_FALSE);
+ }
+ else
+ {
+ uassert_true(RT_TRUE);
+ }
+}
+
+static void dynamic_thread2_entry(void *param)
+{
+ rt_err_t result;
+ rt_mutex_t mutex = (rt_mutex_t)param;
+
+ /* let system schedule */
+ rt_thread_mdelay(50);
+
+ result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
+ if (result == RT_EOK)
+ {
+ rt_mutex_release(mutex);
+ }
+}
+static void dynamic_thread3_entry(void *param)
+{
+ rt_tick_t tick;
+ rt_err_t result;
+ rt_mutex_t mutex = (rt_mutex_t)param;
+
+ result = rt_mutex_take(mutex, RT_WAITING_FOREVER);
+ if (result != RT_EOK)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ tick = rt_tick_get();
+ while (rt_tick_get() - tick < (RT_TICK_PER_SECOND / 2));
+
+ rt_mutex_release(mutex);
+}
+
+static void test_dynamic_pri_reverse(void)
+{
+ rt_err_t result;
+ tid1 = RT_NULL;
+ tid2 = RT_NULL;
+ tid3 = RT_NULL;
+
+ dynamic_mutex = rt_mutex_create("dynamic_mutex", RT_IPC_FLAG_PRIO);
+ if (RT_NULL == dynamic_mutex)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* thread1 */
+ tid1 = rt_thread_create("thread1",
+ dynamic_thread1_entry,
+ dynamic_mutex,
+ 1024,
+ 10 - 1,
+ 10);
+ if (tid1 != RT_NULL)
+ rt_thread_startup(tid1);
+
+ /* thread2 */
+ tid2 = rt_thread_create("thread2",
+ dynamic_thread2_entry,
+ dynamic_mutex,
+ 1024,
+ 10,
+ 10);
+ if (tid2 != RT_NULL)
+ rt_thread_startup(tid2);
+
+ /* thread3 */
+ tid3 = rt_thread_create("thread3",
+ dynamic_thread3_entry,
+ dynamic_mutex,
+ 1024,
+ 10 + 1,
+ 10);
+ if (tid3 != RT_NULL)
+ rt_thread_startup(tid3);
+
+ rt_thread_mdelay(1000);
+
+ result = rt_mutex_delete(dynamic_mutex);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ uassert_true(RT_TRUE);
+}
+
+static rt_err_t utest_tc_init(void)
+{
+#ifdef RT_USING_HEAP
+ dynamic_mutex = RT_NULL;
+#endif /* RT_USING_HEAP */
+
+ return RT_EOK;
+}
+
+static rt_err_t utest_tc_cleanup(void)
+{
+#ifdef RT_USING_HEAP
+ dynamic_mutex = RT_NULL;
+#endif /* RT_USING_HEAP */
+
+ return RT_EOK;
+}
+
+static void testcase(void)
+{
+ UTEST_UNIT_RUN(test_static_mutex_init);
+ UTEST_UNIT_RUN(test_static_mutex_take);
+ UTEST_UNIT_RUN(test_static_mutex_release);
+ UTEST_UNIT_RUN(test_static_mutex_trytake);
+ UTEST_UNIT_RUN(test_static_pri_reverse);
+#ifdef RT_USING_HEAP
+ UTEST_UNIT_RUN(test_dynamic_mutex_create);
+ UTEST_UNIT_RUN(test_dynamic_mutex_take);
+ UTEST_UNIT_RUN(test_dynamic_mutex_release);
+ UTEST_UNIT_RUN(test_dynamic_mutex_trytake);
+ UTEST_UNIT_RUN(test_dynamic_pri_reverse);
+#endif
+}
+UTEST_TC_EXPORT(testcase, "testcases.kernel.mutex_tc", utest_tc_init, utest_tc_cleanup, 1000);
+
+/********************* end of file ************************/
diff --git a/examples/utest/testcases/kernel/semaphore_tc.c b/examples/utest/testcases/kernel/semaphore_tc.c
new file mode 100644
index 0000000000..2992831d87
--- /dev/null
+++ b/examples/utest/testcases/kernel/semaphore_tc.c
@@ -0,0 +1,559 @@
+/*
+ * Copyright (c) 2006-2019, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-08-12 luckyzjq the first version
+ */
+
+#include <rtthread.h>
+#include <stdlib.h>
+#include "utest.h"
+
+static struct rt_semaphore static_semaphore;
+#ifdef RT_USING_HEAP
+static rt_sem_t dynamic_semaphore;
+#endif /* RT_USING_HEAP */
+
+static void test_static_semaphore_init(void)
+{
+ rt_err_t result;
+ int rand_num = rand() % 0x10000;
+
+ for (int i = 0; i < rand_num; i++)
+ {
+ result = rt_sem_init(&static_semaphore, "static_sem", i, RT_IPC_FLAG_PRIO);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ break;
+ }
+ rt_sem_detach(&static_semaphore);
+
+ result = rt_sem_init(&static_semaphore, "static_sem", i, RT_IPC_FLAG_FIFO);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ break;
+ }
+ rt_sem_detach(&static_semaphore);
+ }
+
+ uassert_true(RT_TRUE);
+}
+
+static void test_static_semaphore_detach(void)
+{
+ rt_err_t result;
+ int rand_num = rand() % 0x10000;
+
+ for (int i = 0; i < rand_num; i++)
+ {
+ result = rt_sem_init(&static_semaphore, "static_sem", i, RT_IPC_FLAG_PRIO);
+ if (RT_EOK != result)
+ {
+ break;
+ }
+
+ result = rt_sem_detach(&static_semaphore);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ break;
+ }
+
+ result = rt_sem_init(&static_semaphore, "static_sem", i, RT_IPC_FLAG_FIFO);
+ if (RT_EOK != result)
+ {
+ break;
+ }
+ result = rt_sem_detach(&static_semaphore);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ break;
+ }
+ }
+
+ uassert_true(RT_TRUE);
+}
+
+static void test_static_semaphore_take(void)
+{
+ rt_err_t result;
+ result = rt_sem_init(&static_semaphore, "static_sem", 1, RT_IPC_FLAG_PRIO);
+ if (RT_EOK == result)
+ {
+ /* first take */
+ result = rt_sem_take(&static_semaphore, RT_WAITING_FOREVER);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+ /* second take */
+ result = rt_sem_take(&static_semaphore, 100);
+ if (-RT_ETIMEOUT != result)
+ uassert_true(RT_FALSE);
+ }
+ else
+ {
+ return;
+ }
+
+ rt_sem_detach(&static_semaphore);
+ uassert_true(RT_TRUE);
+
+ return;
+}
+
+static void test_static_semaphore_trytake(void)
+{
+ rt_err_t result;
+ result = rt_sem_init(&static_semaphore, "static_sem", 1, RT_IPC_FLAG_PRIO);
+ if (RT_EOK == result)
+ {
+ /* first take */
+ result = rt_sem_trytake(&static_semaphore);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+ /* second take */
+ result = rt_sem_trytake(&static_semaphore);
+ if (-RT_ETIMEOUT != result)
+ uassert_true(RT_FALSE);
+ }
+ else
+ {
+ return;
+ }
+
+ rt_sem_detach(&static_semaphore);
+ uassert_true(RT_TRUE);
+
+ return;
+}
+
+static void test_static_semaphore_release(void)
+{
+ rt_err_t result;
+ result = rt_sem_init(&static_semaphore, "static_sem", 0, RT_IPC_FLAG_PRIO);
+ if (RT_EOK == result)
+ {
+ /* first take */
+ result = rt_sem_take(&static_semaphore, 100);
+ if (-RT_ETIMEOUT != result)
+ uassert_true(RT_FALSE);
+
+ /* release */
+ result = rt_sem_release(&static_semaphore);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ /* second take */
+ result = rt_sem_take(&static_semaphore, RT_WAITING_FOREVER);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+ }
+ else
+ {
+ return;
+ }
+
+ rt_sem_detach(&static_semaphore);
+ uassert_true(RT_TRUE);
+
+ return;
+}
+
+static void test_static_semaphore_control(void)
+{
+ rt_err_t result;
+ int value = 0;
+
+ value = rand() % 100;
+ result = rt_sem_init(&static_semaphore, "static_sem", 1, RT_IPC_FLAG_PRIO);
+ if (RT_EOK == result)
+ {
+ result = rt_sem_control(&static_semaphore, RT_IPC_CMD_RESET, &value);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+ }
+ else
+ {
+ return;
+ }
+
+ for (int i = 0; i < value; i++)
+ {
+ result = rt_sem_take(&static_semaphore, 10);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+ }
+
+ rt_sem_detach(&static_semaphore);
+ uassert_true(RT_TRUE);
+}
+
+static void static_release_isr_hardware_callback(void *param)
+{
+ rt_err_t result;
+
+ result = rt_sem_release(&static_semaphore);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+}
+
+static void static_release_isr_software_callback(void *param)
+{
+ rt_err_t result;
+
+ result = rt_sem_release(&static_semaphore);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+}
+
+static void test_static_semaphore_release_isr(void)
+{
+ rt_err_t result;
+ rt_timer_t hardware_timer;
+ rt_timer_t software_timer;
+
+ /* create timer */
+ hardware_timer = rt_timer_create("release_isr",
+ static_release_isr_hardware_callback,
+ RT_NULL,
+ 100,
+ RT_TIMER_FLAG_HARD_TIMER | RT_TIMER_FLAG_ONE_SHOT);
+ software_timer = rt_timer_create("release_isr",
+ static_release_isr_software_callback,
+ RT_NULL,
+ 100,
+ RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT);
+ /* start tiemr */
+ if (hardware_timer)
+ rt_timer_start(hardware_timer);
+ if (software_timer)
+ rt_timer_start(software_timer);
+
+ result = rt_sem_init(&static_semaphore, "static_sem", 0, RT_IPC_FLAG_PRIO);
+ if (RT_EOK == result)
+ {
+ for (int i = 0; i < 2; i++)
+ {
+ result = rt_sem_take(&static_semaphore, 1000);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+ }
+ }
+ else
+ {
+ return;
+ }
+
+ rt_sem_detach(&static_semaphore);
+ rt_timer_delete(hardware_timer);
+ rt_timer_delete(software_timer);
+
+ uassert_true(RT_TRUE);
+}
+
+#ifdef RT_USING_HEAP
+static void test_dynamic_semaphore_create(void)
+{
+ rt_err_t result;
+ int rand_num = rand() % 0x10000;
+
+ for (int i = 0; i < rand_num; i++)
+ {
+ dynamic_semaphore = rt_sem_create("static_sem", i, RT_IPC_FLAG_PRIO);
+ if (RT_NULL == dynamic_semaphore)
+ {
+ uassert_true(RT_FALSE);
+ break;
+ }
+ rt_sem_delete(dynamic_semaphore);
+
+ dynamic_semaphore = rt_sem_create("static_sem", i, RT_IPC_FLAG_FIFO);
+ if (RT_NULL == dynamic_semaphore)
+ {
+ uassert_true(RT_FALSE);
+ break;
+ }
+ rt_sem_delete(dynamic_semaphore);
+ }
+
+ uassert_true(RT_TRUE);
+}
+
+static void test_dynamic_semaphore_delete(void)
+{
+ rt_err_t result;
+ int rand_num = rand() % 0x10000;
+
+ for (int i = 0; i < rand_num; i++)
+ {
+ dynamic_semaphore = rt_sem_create("static_sem", i, RT_IPC_FLAG_PRIO);
+ if (RT_NULL == dynamic_semaphore)
+ {
+ break;
+ }
+
+ result = rt_sem_delete(dynamic_semaphore);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ break;
+ }
+
+ dynamic_semaphore = rt_sem_create("static_sem", i, RT_IPC_FLAG_FIFO);
+ if (RT_NULL == dynamic_semaphore)
+ {
+ break;
+ }
+ result = rt_sem_delete(dynamic_semaphore);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ break;
+ }
+ }
+
+ uassert_true(RT_TRUE);
+}
+
+static void test_dynamic_semaphore_take(void)
+{
+ rt_err_t result;
+ dynamic_semaphore = rt_sem_create("static_sem", 1, RT_IPC_FLAG_PRIO);
+ if (RT_NULL != dynamic_semaphore)
+ {
+ /* first take */
+ result = rt_sem_take(dynamic_semaphore, RT_WAITING_FOREVER);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+ /* second take */
+ result = rt_sem_take(dynamic_semaphore, 100);
+ if (-RT_ETIMEOUT != result)
+ uassert_true(RT_FALSE);
+ }
+ else
+ {
+ return;
+ }
+
+ rt_sem_delete(dynamic_semaphore);
+ uassert_true(RT_TRUE);
+
+ return;
+}
+
+static void test_dynamic_semaphore_trytake(void)
+{
+ rt_err_t result;
+ dynamic_semaphore = rt_sem_create("static_sem", 1, RT_IPC_FLAG_PRIO);
+ if (RT_NULL != dynamic_semaphore)
+ {
+ /* first take */
+ result = rt_sem_trytake(dynamic_semaphore);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+ /* second take */
+ result = rt_sem_trytake(dynamic_semaphore);
+ if (-RT_ETIMEOUT != result)
+ uassert_true(RT_FALSE);
+ }
+ else
+ {
+ return;
+ }
+
+ rt_sem_delete(dynamic_semaphore);
+ uassert_true(RT_TRUE);
+
+ return;
+}
+
+static void test_dynamic_semaphore_release(void)
+{
+ rt_err_t result;
+ dynamic_semaphore = rt_sem_create("static_sem", 0, RT_IPC_FLAG_PRIO);
+ if (RT_NULL != dynamic_semaphore)
+ {
+ /* first take */
+ result = rt_sem_take(dynamic_semaphore, 100);
+ if (-RT_ETIMEOUT != result)
+ uassert_true(RT_FALSE);
+
+ /* release */
+ result = rt_sem_release(dynamic_semaphore);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+
+ /* second take */
+ result = rt_sem_take(dynamic_semaphore, RT_WAITING_FOREVER);
+ if (RT_EOK != result)
+ uassert_true(RT_FALSE);
+ }
+ else
+ {
+ return;
+ }
+
+ rt_sem_delete(dynamic_semaphore);
+ uassert_true(RT_TRUE);
+
+ return;
+}
+
+static void test_dynamic_semaphore_control(void)
+{
+ rt_err_t result;
+ int value = 0;
+
+ value = rand() % 100;
+ dynamic_semaphore = rt_sem_create("static_sem", 1, RT_IPC_FLAG_PRIO);
+ if (RT_NULL != dynamic_semaphore)
+ {
+ result = rt_sem_control(dynamic_semaphore, RT_IPC_CMD_RESET, &value);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+ }
+ else
+ {
+ return;
+ }
+
+ for (int i = 0; i < value; i++)
+ {
+ result = rt_sem_take(dynamic_semaphore, 10);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+ }
+
+ rt_sem_delete(dynamic_semaphore);
+ uassert_true(RT_TRUE);
+}
+
+static void dynamic_release_isr_hardware_callback(void *param)
+{
+ rt_err_t result;
+
+ result = rt_sem_release(dynamic_semaphore);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+}
+
+static void dynamic_release_isr_software_callback(void *param)
+{
+ rt_err_t result;
+
+ result = rt_sem_release(dynamic_semaphore);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+}
+
+static void test_dynamic_semaphore_release_isr(void)
+{
+ rt_err_t result;
+ rt_timer_t hardware_timer;
+ rt_timer_t software_timer;
+
+ /* create timer */
+ hardware_timer = rt_timer_create("release_isr",
+ dynamic_release_isr_hardware_callback,
+ RT_NULL,
+ 100,
+ RT_TIMER_FLAG_HARD_TIMER | RT_TIMER_FLAG_ONE_SHOT);
+ software_timer = rt_timer_create("release_isr",
+ dynamic_release_isr_software_callback,
+ RT_NULL,
+ 100,
+ RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT);
+ /* start tiemr */
+ if (hardware_timer)
+ rt_timer_start(hardware_timer);
+ if (software_timer)
+ rt_timer_start(software_timer);
+
+ dynamic_semaphore = rt_sem_create("static_sem", 0, RT_IPC_FLAG_PRIO);
+ if (RT_NULL != dynamic_semaphore)
+ {
+ for (int i = 0; i < 2; i++)
+ {
+ result = rt_sem_take(dynamic_semaphore, 1000);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+ }
+ }
+ else
+ {
+ return;
+ }
+
+ rt_sem_delete(dynamic_semaphore);
+ rt_timer_delete(hardware_timer);
+ rt_timer_delete(software_timer);
+
+ uassert_true(RT_TRUE);
+}
+
+#endif /* RT_USING_HEAP */
+
+static rt_err_t utest_tc_init(void)
+{
+#ifdef RT_USING_HEAP
+ dynamic_semaphore = RT_NULL;
+#endif /* RT_USING_HEAP */
+
+ return RT_EOK;
+}
+
+static rt_err_t utest_tc_cleanup(void)
+{
+#ifdef RT_USING_HEAP
+ dynamic_semaphore = RT_NULL;
+#endif /* RT_USING_HEAP */
+
+ return RT_EOK;
+}
+
+static void testcase(void)
+{
+ UTEST_UNIT_RUN(test_static_semaphore_init);
+ UTEST_UNIT_RUN(test_static_semaphore_take);
+ UTEST_UNIT_RUN(test_static_semaphore_release);
+ UTEST_UNIT_RUN(test_static_semaphore_detach);
+ UTEST_UNIT_RUN(test_static_semaphore_trytake);
+ UTEST_UNIT_RUN(test_static_semaphore_control);
+ UTEST_UNIT_RUN(test_static_semaphore_release_isr);
+
+#ifdef RT_USING_HEAP
+ UTEST_UNIT_RUN(test_dynamic_semaphore_create);
+ UTEST_UNIT_RUN(test_dynamic_semaphore_take);
+ UTEST_UNIT_RUN(test_dynamic_semaphore_release);
+ UTEST_UNIT_RUN(test_dynamic_semaphore_delete);
+ UTEST_UNIT_RUN(test_dynamic_semaphore_trytake);
+ UTEST_UNIT_RUN(test_dynamic_semaphore_control);
+ UTEST_UNIT_RUN(test_dynamic_semaphore_release_isr);
+#endif /* RT_USING_HEAP */
+}
+UTEST_TC_EXPORT(testcase, "testcases.kernel.semaphore_tc", utest_tc_init, utest_tc_cleanup, 1000);
diff --git a/examples/utest/testcases/kernel/signal_tc.c b/examples/utest/testcases/kernel/signal_tc.c
new file mode 100644
index 0000000000..40c08f7402
--- /dev/null
+++ b/examples/utest/testcases/kernel/signal_tc.c
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-08-12 flybreak the first version
+ *
+ * case 1:rt_signal_install, install all available signal
+ * case 2:rt_signal_install, install illegal signal
+ * case 3:rt_signal_mask/unmask, one thread self, install and unmask, then kill, should received.
+ * case 4:rt_signal_mask/unmask, one thread self, install and unmask and mask, then kill, should can't received.
+ * case 5:rt_signal_wait, two thread, thread1: install and unmask, then wait 1s; thread2: kill, should received.
+ * case 6:rt_signal_wait, two thread, thread1: install and unmask, then wait 1s; thread2: sleep 2s then kill, should can't received.
+ * case 7:rt_signal_kill, kill legal thread, return 0;
+ * case 8:rt_signal_kill, kill illegal thread, return failed (unused);
+ * case 9:rt_signal_kill, kill illegal signo, return -RT_EINVAL;
+ *
+ */
+
+#include <rtthread.h>
+#include "utest.h"
+
+int recive_sig = 0;
+
+void sig_handle_default(int signo)
+{
+ recive_sig = signo;
+}
+
+static void rt_signal_install_test(void)
+{
+ int signo;
+ rt_sighandler_t result;
+
+ /* case 1:rt_signal_install, install all available signal. */
+ for (signo = 0; signo < RT_SIG_MAX; signo++)
+ {
+ result = rt_signal_install(signo, sig_handle_default);
+ uassert_true(result != SIG_ERR);
+ }
+ /* case 2:rt_signal_install, install illegal signal. */
+ result = rt_signal_install(signo, sig_handle_default);
+ uassert_true(result == SIG_ERR);
+
+ return;
+}
+
+static void rt_signal_mask_test(void)
+{
+ int signo;
+ rt_sighandler_t result;
+
+ /* case 3:rt_signal_mask/unmask, one thread self, install and unmask, then kill, should received. */
+ for (signo = 0; signo < RT_SIG_MAX; signo++)
+ {
+ recive_sig = -1;
+ result = rt_signal_install(signo, sig_handle_default);
+ uassert_true(result != SIG_ERR);
+ rt_signal_unmask(signo);
+ uassert_int_equal(rt_thread_kill(rt_thread_self(), signo), RT_EOK);
+ rt_thread_mdelay(1);
+ uassert_int_equal(recive_sig, signo);
+ }
+
+ return;
+}
+
+static void rt_signal_unmask_test(void)
+{
+ int signo;
+ rt_sighandler_t result;
+
+ /* case 4:rt_signal_mask/unmask, one thread self, install and unmask and mask, then kill, should can't received. */
+ for (signo = 0; signo < RT_SIG_MAX; signo++)
+ {
+ recive_sig = -1;
+ result = rt_signal_install(signo, sig_handle_default);
+ uassert_true(result != SIG_ERR);
+ rt_signal_unmask(signo);
+ rt_signal_mask(signo);
+ uassert_int_equal(rt_thread_kill(rt_thread_self(), signo), RT_EOK);
+ rt_thread_mdelay(1);
+ uassert_int_not_equal(recive_sig, signo);
+ }
+
+ return;
+}
+
+static void rt_signal_kill_test(void)
+{
+ int signo;
+ rt_sighandler_t result;
+
+ /* case 7:rt_signal_kill, kill legal thread, return 0; */
+ for (signo = 0; signo < RT_SIG_MAX; signo++)
+ {
+ recive_sig = -1;
+ result = rt_signal_install(signo, sig_handle_default);
+ uassert_true(result != SIG_ERR);
+ rt_signal_unmask(signo);
+ uassert_int_equal(rt_thread_kill(rt_thread_self(), signo), RT_EOK);
+ rt_thread_mdelay(1);
+ uassert_int_equal(recive_sig, signo);
+ }
+ /* case 8:rt_signal_kill, kill illegal thread, return failed; */
+// uassert_true(rt_thread_kill((rt_thread_t)-1, signo) == -RT_ERROR);
+
+ /* case 9:rt_signal_kill, kill illegal signo, return -RT_EINVAL; */
+ uassert_true(rt_thread_kill(rt_thread_self(), -1) == -RT_EINVAL);
+
+ return;
+}
+
+void rt_signal_wait_thread(void *parm)
+{
+ sigset_t selectset;
+ siginfo_t recive_si;
+
+ rt_signal_install(SIGUSR1, sig_handle_default);
+ rt_signal_unmask(SIGUSR1);
+
+ sigemptyset(&selectset);
+ sigaddset(&selectset, SIGUSR1);
+
+ /* case 5:rt_signal_wait, two thread, thread1: install and unmask, then wait 1s; thread2: kill, should received. */
+ if (rt_signal_wait(&selectset, &recive_si, RT_TICK_PER_SECOND) != RT_EOK)
+ {
+ return;
+ }
+
+ recive_sig = recive_si.si_signo;
+}
+
+static void rt_signal_wait_test(void)
+{
+ rt_thread_t t1;
+
+ recive_sig = -1;
+ t1 = rt_thread_create("sig_t1", rt_signal_wait_thread, 0, 4096, 14, 10);
+ if (t1)
+ {
+ rt_thread_startup(t1);
+ }
+
+ rt_thread_mdelay(1);
+ /* case 5:rt_signal_wait, two thread, thread1: install and unmask, then wait 1s; thread2: kill, should received. */
+ uassert_int_equal(rt_thread_kill(t1, SIGUSR1), RT_EOK);
+ rt_thread_mdelay(1);
+ uassert_int_equal(recive_sig, SIGUSR1);
+
+ return;
+}
+
+static void rt_signal_wait_test2(void)
+{
+ rt_thread_t t1;
+
+ recive_sig = -1;
+ t1 = rt_thread_create("sig_t1", rt_signal_wait_thread, 0, 4096, 14, 10);
+ if (t1)
+ {
+ rt_thread_startup(t1);
+ }
+
+ /* case 6:rt_signal_wait, two thread, thread1: install and unmask, then wait 1s; thread2: sleep 2s then kill, should can't received. */
+ rt_thread_mdelay(2000);
+ uassert_int_equal(rt_thread_kill(t1, SIGUSR1), RT_EOK);
+ rt_thread_mdelay(1);
+ uassert_int_not_equal(recive_sig, SIGUSR1);
+
+ return;
+}
+
+static rt_err_t utest_tc_init(void)
+{
+ return RT_EOK;
+}
+
+static rt_err_t utest_tc_cleanup(void)
+{
+ return RT_EOK;
+}
+
+static void testcase(void)
+{
+#ifdef RT_USING_HEAP
+ UTEST_UNIT_RUN(rt_signal_install_test);
+ UTEST_UNIT_RUN(rt_signal_mask_test);
+ UTEST_UNIT_RUN(rt_signal_unmask_test);
+ UTEST_UNIT_RUN(rt_signal_kill_test);
+ UTEST_UNIT_RUN(rt_signal_wait_test);
+ UTEST_UNIT_RUN(rt_signal_wait_test2);
+#endif /* RT_USING_HEAP */
+}
+UTEST_TC_EXPORT(testcase, "testcases.kernel.signal_tc", utest_tc_init, utest_tc_cleanup, 1000);
+
+/*********************** end of file ****************************/
diff --git a/examples/utest/testcases/kernel/timer_tc.c b/examples/utest/testcases/kernel/timer_tc.c
new file mode 100644
index 0000000000..e7fffcb617
--- /dev/null
+++ b/examples/utest/testcases/kernel/timer_tc.c
@@ -0,0 +1,520 @@
+/*
+ * Copyright (c) 2006-2019, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-08-12 luckyzjq the first version
+ */
+
+#include <rtthread.h>
+#include <stdlib.h>
+#include "utest.h"
+
+static rt_uint8_t timer_flag_oneshot[] = {
+ RT_TIMER_FLAG_ONE_SHOT,
+ RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_HARD_TIMER,
+ RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER,
+};
+
+static rt_uint8_t timer_flag_periodic[] = {
+ RT_TIMER_FLAG_PERIODIC,
+ RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_HARD_TIMER,
+ RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER,
+};
+
+typedef struct test_timer_struct
+{
+ struct rt_timer static_timer; /* static timer handler */
+ rt_timer_t dynamic_timer; /* dynamic timer pointer */
+ rt_tick_t expect_tick; /* expect tick */
+ rt_uint8_t test_flag; /* timer callback done flag */
+} timer_struct;
+static timer_struct timer;
+
+#define test_static_timer_start test_static_timer_init
+#define test_static_timer_stop test_static_timer_init
+#define test_static_timer_detach test_static_timer_init
+
+static void static_timer_oneshot(void *param)
+{
+ timer_struct *timer_call;
+ timer_call = (timer_struct *)param;
+ timer_call->test_flag = RT_TRUE;
+
+ /* check expect tick */
+ if (rt_tick_get() - timer_call->expect_tick > 1)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ return;
+}
+static void static_timer_periodic(void *param)
+{
+ rt_err_t result;
+ timer_struct *timer_call;
+ timer_call = (timer_struct *)param;
+ timer_call->test_flag = RT_TRUE;
+
+ /* check expect tick */
+ if (rt_tick_get() - timer_call->expect_tick > 1)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ /* periodic timer can stop */
+ result = rt_timer_stop(&timer_call->static_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ return;
+}
+
+static void test_static_timer_init(void)
+{
+ rt_err_t result;
+ int rand_num = rand() % 10;
+
+ /* one shot timer test */
+ for (int time_out = 0; time_out < rand_num; time_out++)
+ {
+ for (int i = 0; i < sizeof(timer_flag_oneshot); i++)
+ {
+ rt_timer_init(&timer.static_timer,
+ "static_timer",
+ static_timer_oneshot,
+ &timer,
+ time_out,
+ timer_flag_oneshot[i]);
+
+ /* calc expect tick */
+ timer.expect_tick = rt_tick_get() + time_out;
+
+ /* start timer */
+ result = rt_timer_start(&timer.static_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* wait for timerout */
+ rt_thread_delay(time_out + 1);
+
+ /* detach timer */
+ result = rt_timer_detach(&timer.static_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ if (timer.test_flag != RT_TRUE)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+ }
+ }
+
+ /* periodic timer test */
+ for (int time_out = 0; time_out < rand_num; time_out++)
+ {
+ for (int i = 0; i < sizeof(timer_flag_periodic); i++)
+ {
+ rt_timer_init(&timer.static_timer,
+ "static_timer",
+ static_timer_periodic,
+ &timer,
+ time_out,
+ timer_flag_periodic[i]);
+
+ /* calc expect tick */
+ timer.expect_tick = rt_tick_get() + time_out;
+
+ /* start timer */
+ result = rt_timer_start(&timer.static_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* wait for timerout */
+ rt_thread_delay(time_out + 1);
+
+ /* detach timer */
+ result = rt_timer_detach(&timer.static_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ if (timer.test_flag != RT_TRUE)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+ }
+ }
+
+ timer.test_flag = RT_FALSE;
+ uassert_true(RT_TRUE);
+
+ return;
+}
+
+static void static_timer_control(void *param)
+{
+ rt_err_t result;
+ timer_struct *timer_call;
+ timer_call = (timer_struct *)param;
+ timer_call->test_flag = RT_TRUE;
+
+ /* check expect tick */
+ if (rt_tick_get() - timer_call->expect_tick > 1)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ /* periodic timer can stop */
+ result = rt_timer_stop(&timer_call->static_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ return;
+}
+
+static void test_static_timer_control(void)
+{
+ rt_err_t result;
+ int rand_num = rand() % 10;
+ int set_data;
+ int get_data;
+
+ rt_timer_init(&timer.static_timer,
+ "static_timer",
+ static_timer_control,
+ &timer,
+ 5,
+ RT_TIMER_FLAG_PERIODIC);
+
+ /* test set data */
+ set_data = rand_num;
+ result = rt_timer_control(&timer.static_timer, RT_TIMER_CTRL_SET_TIME, &set_data);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ /* test get data */
+ result = rt_timer_control(&timer.static_timer, RT_TIMER_CTRL_GET_TIME, &get_data);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ /* a set of test */
+ if (set_data != get_data)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ /* calc expect tick */
+ timer.expect_tick = rt_tick_get() + set_data;
+
+ /* start timer */
+ result = rt_timer_start(&timer.static_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ rt_thread_delay(set_data + 1);
+
+ /* detach timer */
+ result = rt_timer_detach(&timer.static_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ if (timer.test_flag != RT_TRUE)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ timer.test_flag = RT_FALSE;
+ uassert_true(RT_TRUE);
+}
+
+#ifdef RT_USING_HEAP
+
+#define test_dynamic_timer_start test_dynamic_timer_create
+#define test_dynamic_timer_stop test_dynamic_timer_create
+#define test_dynamic_timer_delete test_dynamic_timer_create
+
+static void dynamic_timer_oneshot(void *param)
+{
+ timer_struct *timer_call;
+ timer_call = (timer_struct *)param;
+ timer_call->test_flag = RT_TRUE;
+
+ /* check expect tick */
+ if (rt_tick_get() - timer_call->expect_tick > 1)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ return;
+}
+static void dynamic_timer_periodic(void *param)
+{
+ rt_err_t result;
+ timer_struct *timer_call;
+ timer_call = (timer_struct *)param;
+ timer_call->test_flag = RT_TRUE;
+
+ /* check expect tick */
+ if (rt_tick_get() - timer_call->expect_tick > 1)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ /* periodic timer can stop */
+ result = rt_timer_stop(timer_call->dynamic_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ return;
+}
+
+static void test_dynamic_timer_create(void)
+{
+ rt_err_t result;
+ int rand_num = rand() % 10;
+
+ /* one shot timer test */
+ for (int time_out = 0; time_out < rand_num; time_out++)
+ {
+ for (int i = 0; i < sizeof(timer_flag_oneshot); i++)
+ {
+ timer.dynamic_timer = rt_timer_create("dynamic_timer",
+ dynamic_timer_oneshot,
+ &timer,
+ time_out,
+ timer_flag_oneshot[i]);
+
+ /* calc expect tick */
+ timer.expect_tick = rt_tick_get() + time_out;
+
+ /* start timer */
+ result = rt_timer_start(timer.dynamic_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* wait for timerout */
+ rt_thread_delay(time_out + 1);
+
+ /* detach timer */
+ result = rt_timer_delete(timer.dynamic_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ if (timer.test_flag != RT_TRUE)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+ }
+ }
+
+ /* periodic timer test */
+ for (int time_out = 0; time_out < rand_num; time_out++)
+ {
+ for (int i = 0; i < sizeof(timer_flag_periodic); i++)
+ {
+ timer.dynamic_timer = rt_timer_create("dynamic_timer",
+ dynamic_timer_periodic,
+ &timer,
+ time_out,
+ timer_flag_periodic[i]);
+
+ /* calc expect tick */
+ timer.expect_tick = rt_tick_get() + time_out;
+
+ /* start timer */
+ result = rt_timer_start(timer.dynamic_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ /* wait for timerout */
+ rt_thread_delay(time_out + 1);
+
+ /* detach timer */
+ result = rt_timer_delete(timer.dynamic_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ if (timer.test_flag != RT_TRUE)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+ }
+ }
+
+ timer.test_flag = RT_FALSE;
+ uassert_true(RT_TRUE);
+
+ return;
+}
+
+static void dynamic_timer_control(void *param)
+{
+ rt_err_t result;
+ timer_struct *timer_call;
+ timer_call = (timer_struct *)param;
+ timer_call->test_flag = RT_TRUE;
+
+ /* check expect tick */
+ if (rt_tick_get() - timer_call->expect_tick > 1)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ /* periodic timer can stop */
+ result = rt_timer_stop(timer_call->dynamic_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ return;
+}
+
+static void test_dynamic_timer_control(void)
+{
+ rt_err_t result;
+ int rand_num = rand() % 10;
+ int set_data;
+ int get_data;
+
+ timer.dynamic_timer = rt_timer_create("dynamic_timer",
+ dynamic_timer_control,
+ &timer,
+ 5,
+ RT_TIMER_FLAG_PERIODIC);
+
+ /* test set data */
+ set_data = rand_num;
+ result = rt_timer_control(timer.dynamic_timer, RT_TIMER_CTRL_SET_TIME, &set_data);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ /* test get data */
+ result = rt_timer_control(timer.dynamic_timer, RT_TIMER_CTRL_GET_TIME, &get_data);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ /* a set of test */
+ if (set_data != get_data)
+ {
+ uassert_true(RT_FALSE);
+ }
+
+ /* calc expect tick */
+ timer.expect_tick = rt_tick_get() + set_data;
+
+ /* start timer */
+ result = rt_timer_start(timer.dynamic_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ rt_thread_delay(set_data + 1);
+
+ /* detach timer */
+ result = rt_timer_delete(timer.dynamic_timer);
+ if (RT_EOK != result)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ if (timer.test_flag != RT_TRUE)
+ {
+ uassert_true(RT_FALSE);
+ return;
+ }
+
+ timer.test_flag = RT_FALSE;
+ uassert_true(RT_TRUE);
+}
+
+#endif /* RT_USING_HEAP */
+
+static rt_err_t utest_tc_init(void)
+{
+ timer.dynamic_timer = RT_NULL;
+ timer.test_flag = RT_FALSE;
+
+ return RT_EOK;
+}
+
+static rt_err_t utest_tc_cleanup(void)
+{
+ timer.dynamic_timer = RT_NULL;
+ timer.test_flag = RT_FALSE;
+
+ return RT_EOK;
+}
+
+static void testcase(void)
+{
+ UTEST_UNIT_RUN(test_static_timer_init);
+ UTEST_UNIT_RUN(test_static_timer_start);
+ UTEST_UNIT_RUN(test_static_timer_stop);
+ UTEST_UNIT_RUN(test_static_timer_detach);
+ UTEST_UNIT_RUN(test_static_timer_control);
+#ifdef RT_USING_HEAP
+ UTEST_UNIT_RUN(test_dynamic_timer_create);
+ UTEST_UNIT_RUN(test_dynamic_timer_start);
+ UTEST_UNIT_RUN(test_dynamic_timer_stop);
+ UTEST_UNIT_RUN(test_dynamic_timer_delete);
+ UTEST_UNIT_RUN(test_dynamic_timer_control);
+#endif /* RT_USING_HEAP */
+}
+UTEST_TC_EXPORT(testcase, "testcases.kernel.timer_tc", utest_tc_init, utest_tc_cleanup, 1000);
+
+/*********************** end of file ****************************/