aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2016-03-04 14:25:48 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2016-03-04 14:25:48 +0000
commit572f22cd20c155c6a75485335892a5ab8a27903c (patch)
treef838318fc09f09264b79cb124096131911d2bd3c
parent81b60dab38bad8213a7167d016eb49318ad7df16 (diff)
downloadChibiOS-572f22cd20c155c6a75485335892a5ab8a27903c.tar.gz
ChibiOS-572f22cd20c155c6a75485335892a5ab8a27903c.tar.bz2
ChibiOS-572f22cd20c155c6a75485335892a5ab8a27903c.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9010 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/Makefile2
-rw-r--r--demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/main.c6
-rw-r--r--test/nasa_osal/test.mk8
-rw-r--r--test/nasa_osal/test_root.c50
-rw-r--r--test/nasa_osal/test_root.h68
-rw-r--r--test/nasa_osal/test_sequence_001.c453
-rw-r--r--test/nasa_osal/test_sequence_001.h22
7 files changed, 606 insertions, 3 deletions
diff --git a/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/Makefile b/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/Makefile
index 87ddba648..8a4a876f1 100644
--- a/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/Makefile
+++ b/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/Makefile
@@ -98,7 +98,7 @@ include $(CHIBIOS)/os/hal/osal/rt/osal.mk
include $(CHIBIOS)/os/rt/rt.mk
include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk
# Other files (optional).
-include $(CHIBIOS)/test/rt/test.mk
+include $(CHIBIOS)/test/nasa_osal/test.mk
include $(CHIBIOS)/os/common/abstractions/nasa_osal/nasa_osal.mk
# Define linker script file here
diff --git a/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/main.c b/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/main.c
index ba102be73..c17109ff1 100644
--- a/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/main.c
+++ b/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/main.c
@@ -15,6 +15,7 @@
*/
#include "hal.h"
+#include "ch_test.h"
#include "osapi.h"
/*
@@ -62,9 +63,10 @@ int main(void) {
/* In the ChibiOS/RT OSAL implementation the main() function is an
usable thread with priority 128 (NORMALPRIO), here we just sleep
- in a loop printing a message on the serial port.*/
+ waiting for a button event, then the test suite is executed.*/
while (true) {
- sdWrite(&SD2, (uint8_t *)"Hello World!\r\n", 14);
+ if (palReadLine(LINE_BUTTON))
+ test_execute((BaseSequentialStream *)&SD2);
OS_TaskDelay(500);
}
}
diff --git a/test/nasa_osal/test.mk b/test/nasa_osal/test.mk
new file mode 100644
index 000000000..dcaa7197f
--- /dev/null
+++ b/test/nasa_osal/test.mk
@@ -0,0 +1,8 @@
+# List of all the NASA OSAL over ChibiOS/RT test files.
+TESTSRC = ${CHIBIOS}/test/lib/ch_test.c \
+ ${CHIBIOS}/test/nasa_osal/test_root.c \
+ ${CHIBIOS}/test/nasa_osal/test_sequence_001.c
+
+# Required include directories
+TESTINC = ${CHIBIOS}/test/lib \
+ ${CHIBIOS}/test/nasa_osal
diff --git a/test/nasa_osal/test_root.c b/test/nasa_osal/test_root.c
new file mode 100644
index 000000000..e6a803c40
--- /dev/null
+++ b/test/nasa_osal/test_root.c
@@ -0,0 +1,50 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file test_root.c
+ * @brief Test Suite root structures code.
+ *
+ * @addtogroup CH_TEST_ROOT
+ * @{
+ */
+
+#include "hal.h"
+#include "ch_test.h"
+#include "osapi.h"
+
+/*===========================================================================*/
+/* Module exported variables. */
+/*===========================================================================*/
+
+THD_WORKING_AREA(wa_test1, TASKS_STACK_SIZE);
+THD_WORKING_AREA(wa_test2, TASKS_STACK_SIZE);
+THD_WORKING_AREA(wa_test3, TASKS_STACK_SIZE);
+THD_WORKING_AREA(wa_test4, TASKS_STACK_SIZE);
+
+/**
+ * @brief Array of all the test sequences.
+ */
+const testcase_t * const *test_suite[] = {
+ test_sequence_001,
+ NULL
+};
+
+/*===========================================================================*/
+/* Shared code. */
+/*===========================================================================*/
+
+/** @} */
diff --git a/test/nasa_osal/test_root.h b/test/nasa_osal/test_root.h
new file mode 100644
index 000000000..a30317d22
--- /dev/null
+++ b/test/nasa_osal/test_root.h
@@ -0,0 +1,68 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file test_root.h
+ * @brief Test Suite root structures header.
+ *
+ * @addtogroup CH_TEST_ROOT
+ * @{
+ */
+
+#ifndef _TEST_ROOT_H_
+#define _TEST_ROOT_H_
+
+#include "ch.h"
+
+#include "test_sequence_001.h"
+
+/*===========================================================================*/
+/* Default definitions. */
+/*===========================================================================*/
+
+/* Global test suite name, it is printed on top of the test
+ report header.*/
+#define TEST_SUITE_NAME "NASA OSAL over ChibiOS/RT Test Suite"
+
+#define TASKS_BASE_PRIORITY 200
+#define TASKS_STACK_SIZE 256
+
+/*===========================================================================*/
+/* External declarations. */
+/*===========================================================================*/
+
+extern const testcase_t * const *test_suite[];
+
+extern THD_WORKING_AREA(wa_test1, TASKS_STACK_SIZE);
+extern THD_WORKING_AREA(wa_test2, TASKS_STACK_SIZE);
+extern THD_WORKING_AREA(wa_test3, TASKS_STACK_SIZE);
+extern THD_WORKING_AREA(wa_test4, TASKS_STACK_SIZE);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/*===========================================================================*/
+/* Shared definitions. */
+/*===========================================================================*/
+
+#endif /* _TEST_ROOT_H_ */
+
+/** @} */
diff --git a/test/nasa_osal/test_sequence_001.c b/test/nasa_osal/test_sequence_001.c
new file mode 100644
index 000000000..0e4063289
--- /dev/null
+++ b/test/nasa_osal/test_sequence_001.c
@@ -0,0 +1,453 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#include "hal.h"
+#include "ch.h"
+#include "osapi.h"
+#include "ch_test.h"
+
+/**
+ * @page test_sequence_001 Threads Functionality
+ *
+ * File: @ref test_sequence_001.c
+ *
+ * <h2>Description</h2>
+ * This sequence tests the NASA OSAL over ChibiOS/RT functionalities related
+ * to threading.
+ *
+ * <h2>Test Cases</h2>
+ * - @subpage test_001_001
+ * .
+ */
+
+/****************************************************************************
+ * Shared code.
+ ****************************************************************************/
+
+static void test_thread1(void) {
+
+ test_emit_token('A');
+}
+
+static void test_thread2(void) {
+
+ test_emit_token('B');
+}
+
+static void test_thread3(void) {
+
+ test_emit_token('C');
+}
+
+static void test_thread4(void) {
+
+ test_emit_token('D');
+}
+
+/****************************************************************************
+ * Test cases.
+ ****************************************************************************/
+
+#if TRUE || defined(__DOXYGEN__)
+/**
+ * @page test_001_001 OS_TaskCreate() errors
+ *
+ * <h2>Description</h2>
+ * Parameters checking in OS_TaskCreate() is tested.
+ *
+ * <h2>Conditions</h2>
+ * None.
+ *
+ * <h2>Test Steps</h2>
+ * - Testing NULL task_id.
+ * - Testing NULL task_name.
+ * - Testing NULL stack_pointer.
+ * - Testing long task name.
+ * - Testing priority limits.
+ * - Testing insufficient stack size.
+ * - Testing task name or task stack conflict.
+ * .
+ */
+
+static void test_001_001_execute(void) {
+
+ /* Testing NULL task_id.*/
+ test_set_step(1);
+ {
+ int32 err;
+
+ err = OS_TaskCreate(NULL, /* Error.*/
+ "failing thread",
+ test_thread1,
+ (uint32 *)wa_test1,
+ sizeof wa_test1,
+ TASKS_BASE_PRIORITY,
+ 0);
+ test_assert(err == OS_INVALID_POINTER, "NULL not detected");
+ test_assert_sequence("", "task executed");
+ }
+
+ /* Testing NULL task_name.*/
+ test_set_step(2);
+ {
+ int32 err;
+ uint32 tid;
+
+ err = OS_TaskCreate(&tid,
+ NULL, /* Error.*/
+ test_thread1,
+ (uint32 *)wa_test1,
+ sizeof wa_test1,
+ TASKS_BASE_PRIORITY,
+ 0);
+ test_assert(err == OS_INVALID_POINTER, "NULL not detected");
+ test_assert_sequence("", "task executed");
+ }
+
+ /* Testing NULL stack_pointer.*/
+ test_set_step(3);
+ {
+ int32 err;
+ uint32 tid;
+
+ err = OS_TaskCreate(&tid,
+ "failing thread",
+ test_thread1,
+ (uint32 *)NULL, /* Error.*/
+ sizeof wa_test1,
+ TASKS_BASE_PRIORITY,
+ 0);
+ test_assert(err == OS_INVALID_POINTER, "NULL not detected");
+ test_assert_sequence("", "task executed");
+ }
+
+ /* Testing long task name.*/
+ test_set_step(4);
+ {
+ int32 err;
+ uint32 tid;
+
+ err = OS_TaskCreate(&tid,
+ "this is a very very long task name", /* Error.*/
+ test_thread1,
+ (uint32 *)wa_test1,
+ sizeof wa_test1,
+ TASKS_BASE_PRIORITY,
+ 0);
+ test_assert(err == OS_ERR_NAME_TOO_LONG, "name limit not detected");
+ test_assert_sequence("", "task executed");
+ }
+
+ /* Testing priority limits.*/
+ test_set_step(5);
+ {
+ int32 err;
+ uint32 tid;
+
+ err = OS_TaskCreate(&tid,
+ "failing thread",
+ test_thread1,
+ (uint32 *)wa_test1,
+ sizeof wa_test1,
+ 0, /* Error.*/
+ 0);
+ test_assert(err == OS_ERR_INVALID_PRIORITY, "priority error not detected");
+ test_assert_sequence("", "task executed");
+
+ err = OS_TaskCreate(&tid,
+ "failing thread",
+ test_thread1,
+ (uint32 *)wa_test1,
+ sizeof wa_test1,
+ 256, /* Error.*/
+ 0);
+ test_assert(err == OS_ERR_INVALID_PRIORITY, "priority error not detected");
+ test_assert_sequence("", "task executed");
+ }
+
+ /* Testing insufficient stack size.*/
+ test_set_step(6);
+ {
+ int32 err;
+ uint32 tid;
+
+ err = OS_TaskCreate(&tid,
+ "failing thread",
+ test_thread1,
+ (uint32 *)wa_test1,
+ 16, /* Error.*/
+ TASKS_BASE_PRIORITY,
+ 0);
+ test_assert(err == OS_INVALID_INT_NUM, "stack insufficient size not detected");
+ test_assert_sequence("", "task executed");
+ }
+
+ /* Testing task name or task stack conflict.*/
+ test_set_step(7);
+ {
+ int32 err;
+ uint32 tid;
+
+ err = OS_TaskCreate(&tid,
+ "running thread",
+ test_thread1,
+ (uint32 *)wa_test1,
+ sizeof wa_test1,
+ TASKS_BASE_PRIORITY,
+ 0);
+ test_assert(err == OS_SUCCESS, "task creation failed");
+
+ err = OS_TaskCreate(&tid,
+ "running thread",
+ test_thread2,
+ (uint32 *)wa_test2,
+ sizeof wa_test2,
+ TASKS_BASE_PRIORITY,
+ 0);
+ test_assert(err == OS_ERR_NAME_TAKEN, "name conflict not detected");
+
+ err = OS_TaskCreate(&tid,
+ "another running thread",
+ test_thread1,
+ (uint32 *)wa_test1,
+ sizeof wa_test1,
+ TASKS_BASE_PRIORITY,
+ 0);
+ test_assert(err == OS_ERR_NO_FREE_IDS, "stack conflict not detected");
+
+ OS_TaskDelay(5);
+ test_assert_sequence("A", "task not executed");
+
+ err = OS_TaskCreate(&tid,
+ "running thread",
+ test_thread1,
+ (uint32 *)wa_test1,
+ sizeof wa_test1,
+ TASKS_BASE_PRIORITY,
+ 0);
+ test_assert(err == OS_SUCCESS, "task creation failed");
+
+ OS_TaskDelay(5);
+ test_assert_sequence("A", "task not executed");
+ }
+}
+
+static const testcase_t test_001_001 = {
+ "OS_TaskCreate() errors",
+ NULL,
+ NULL,
+ test_001_001_execute
+};
+#endif /* TRUE */
+
+#if TRUE || defined(__DOXYGEN__)
+/**
+ * @page test_001_001 OS_TaskCreate() priority ordering
+ *
+ * <h2>Description</h2>
+ * Four tasks are created at different priorities and in different orders
+ * then their execution order is tested.
+ *
+ * <h2>Conditions</h2>
+ * None.
+ *
+ * <h2>Test Steps</h2>
+ * - Tasks are created in priority order from low to high.
+ * - Tasks are made runnable atomically and their execution order tested.
+ * - Tasks are created in priority order from high to low.
+ * - Tasks are made runnable atomically and their execution order tested.
+ * - Tasks are created in an not ordered way.
+ * - Tasks are made runnable atomically and their execution order tested.
+ * .
+ */
+
+static void test_001_002_execute(void) {
+
+ /* Tasks are created in priority order from low to high.*/
+ test_set_step(1);
+ {
+ int32 err;
+ uint32 tid1, tid2, tid3, tid4;
+
+ err = OS_TaskCreate(&tid4,
+ "running thread 4",
+ test_thread4,
+ (uint32 *)wa_test4,
+ sizeof wa_test4,
+ TASKS_BASE_PRIORITY - 0,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 4 creation failed");
+
+ err = OS_TaskCreate(&tid3,
+ "running thread 3",
+ test_thread3,
+ (uint32 *)wa_test3,
+ sizeof wa_test3,
+ TASKS_BASE_PRIORITY - 1,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 3 creation failed");
+
+ err = OS_TaskCreate(&tid2,
+ "running thread 2",
+ test_thread2,
+ (uint32 *)wa_test2,
+ sizeof wa_test2,
+ TASKS_BASE_PRIORITY - 2,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 2 creation failed");
+
+ err = OS_TaskCreate(&tid1,
+ "running thread 1",
+ test_thread1,
+ (uint32 *)wa_test1,
+ sizeof wa_test1,
+ TASKS_BASE_PRIORITY - 3,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 1 creation failed");
+ }
+
+ /* Tasks are made runnable atomically and their execution order tested.*/
+ test_set_step(2);
+ {
+ OS_TaskDelay(5);
+ test_assert_sequence("ABCD", "task order violation");
+ }
+
+ /* Tasks are created in priority order from high to low.*/
+ test_set_step(3);
+ {
+ int32 err;
+ uint32 tid1, tid2, tid3, tid4;
+
+ err = OS_TaskCreate(&tid1,
+ "running thread 1",
+ test_thread1,
+ (uint32 *)wa_test1,
+ sizeof wa_test1,
+ TASKS_BASE_PRIORITY - 3,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 1 creation failed");
+
+ err = OS_TaskCreate(&tid2,
+ "running thread 2",
+ test_thread2,
+ (uint32 *)wa_test2,
+ sizeof wa_test2,
+ TASKS_BASE_PRIORITY - 2,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 2 creation failed");
+
+ err = OS_TaskCreate(&tid3,
+ "running thread 3",
+ test_thread3,
+ (uint32 *)wa_test3,
+ sizeof wa_test3,
+ TASKS_BASE_PRIORITY - 1,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 3 creation failed");
+
+ err = OS_TaskCreate(&tid4,
+ "running thread 4",
+ test_thread4,
+ (uint32 *)wa_test4,
+ sizeof wa_test4,
+ TASKS_BASE_PRIORITY - 0,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 4 creation failed");
+ }
+
+ /* Tasks are made runnable atomically and their execution order tested.*/
+ test_set_step(4);
+ {
+ OS_TaskDelay(5);
+ test_assert_sequence("ABCD", "task order violation");
+ }
+
+ /* Tasks are created in an not ordered way.*/
+ test_set_step(5);
+ {
+ int32 err;
+ uint32 tid1, tid2, tid3, tid4;
+
+ err = OS_TaskCreate(&tid2,
+ "running thread 2",
+ test_thread2,
+ (uint32 *)wa_test2,
+ sizeof wa_test2,
+ TASKS_BASE_PRIORITY - 2,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 2 creation failed");
+
+ err = OS_TaskCreate(&tid1,
+ "running thread 1",
+ test_thread1,
+ (uint32 *)wa_test1,
+ sizeof wa_test1,
+ TASKS_BASE_PRIORITY - 3,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 1 creation failed");
+
+ err = OS_TaskCreate(&tid4,
+ "running thread 4",
+ test_thread4,
+ (uint32 *)wa_test4,
+ sizeof wa_test4,
+ TASKS_BASE_PRIORITY - 0,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 4 creation failed");
+
+ err = OS_TaskCreate(&tid3,
+ "running thread 3",
+ test_thread3,
+ (uint32 *)wa_test3,
+ sizeof wa_test3,
+ TASKS_BASE_PRIORITY - 1,
+ 0);
+ test_assert(err == OS_SUCCESS, "task 3 creation failed");
+ }
+
+ /* Tasks are made runnable atomically and their execution order tested.*/
+ test_set_step(6);
+ {
+ OS_TaskDelay(5);
+ test_assert_sequence("ABCD", "task order violation");
+ }
+}
+
+static const testcase_t test_001_002 = {
+ "OS_TaskCreate() priority ordering",
+ NULL,
+ NULL,
+ test_001_002_execute
+};
+#endif /* TRUE */
+
+/****************************************************************************
+ * Exported data.
+ ****************************************************************************/
+
+/**
+ * @brief Sequence brief description.
+ */
+const testcase_t * const test_sequence_001[] = {
+#if TRUE || defined(__DOXYGEN__)
+ &test_001_001,
+#endif
+#if TRUE || defined(__DOXYGEN__)
+ &test_001_002,
+#endif
+ NULL
+};
diff --git a/test/nasa_osal/test_sequence_001.h b/test/nasa_osal/test_sequence_001.h
new file mode 100644
index 000000000..91c2181d0
--- /dev/null
+++ b/test/nasa_osal/test_sequence_001.h
@@ -0,0 +1,22 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#ifndef _TEST_SEQUENCE_001_H_
+#define _TEST_SEQUENCE_001_H_
+
+extern const testcase_t * const test_sequence_001[];
+
+#endif /* _TEST_SEQUENCE_001_H_ */