git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9010 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
Giovanni Di Sirio 2016-03-04 14:25:48 +00:00
parent 81b60dab38
commit 572f22cd20
7 changed files with 606 additions and 3 deletions

View File

@ -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

View File

@ -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);
}
}

8
test/nasa_osal/test.mk Normal file
View File

@ -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

View File

@ -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. */
/*===========================================================================*/
/** @} */

View File

@ -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_ */
/** @} */

View File

@ -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
};

View File

@ -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_ */