From 8795d6011446bb4d12968c7e155e047a8467e3db Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Wed, 9 Mar 2016 14:35:51 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9057 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/common/abstractions/nasa_osal/src/osapi.c | 82 ++++++++++------ test/nasa_osal/configuration.xml | 139 ++++++++++++++++++++++++++- test/nasa_osal/source/test/test_root.c | 2 + test/nasa_osal/source/test/test_root.h | 1 + test/nasa_osal/test.mk | 3 +- 5 files changed, 193 insertions(+), 34 deletions(-) diff --git a/os/common/abstractions/nasa_osal/src/osapi.c b/os/common/abstractions/nasa_osal/src/osapi.c index 7033716e6..685c936b6 100644 --- a/os/common/abstractions/nasa_osal/src/osapi.c +++ b/os/common/abstractions/nasa_osal/src/osapi.c @@ -190,6 +190,31 @@ static void timer_handler(void *p) { } } +/** + * @brief Finds a queue by name. + */ +uint32 queue_find(const char *queue_name) { + osal_queue_t *oqp; + + /* Searching the queue in the table.*/ + for (oqp = &osal.queues[0]; oqp < &osal.queues[OS_MAX_QUEUES]; oqp++) { + /* Entering a reentrant critical zone.*/ + syssts_t sts = chSysGetStatusAndLockX(); + + if (!oqp->is_free && + (strncmp(oqp->name, queue_name, OS_MAX_API_NAME - 1) == 0)) { + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + return (uint32)oqp; + } + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + } + + return 0; +} + /*===========================================================================*/ /* Module exported functions. */ /*===========================================================================*/ @@ -225,40 +250,40 @@ int32 OS_API_Init(void) { sizeof (osal_timer_t), NULL); chPoolLoadArray(&osal.timers_pool, - &osal.timers, - sizeof (osal_timer_t)); + &osal.timers[0], + OS_MAX_TIMERS); /* Queues pool initialization.*/ chPoolObjectInit(&osal.queues_pool, sizeof (osal_queue_t), NULL); chPoolLoadArray(&osal.queues_pool, - &osal.queues, - sizeof (osal_queue_t)); + &osal.queues[0], + OS_MAX_QUEUES); /* Binary Semaphores pool initialization.*/ chPoolObjectInit(&osal.binary_semaphores_pool, sizeof (binary_semaphore_t), NULL); chPoolLoadArray(&osal.binary_semaphores_pool, - &osal.binary_semaphores, - sizeof (binary_semaphore_t)); + &osal.binary_semaphores[0], + OS_MAX_BIN_SEMAPHORES); /* Counter Semaphores pool initialization.*/ chPoolObjectInit(&osal.count_semaphores_pool, sizeof (semaphore_t), NULL); chPoolLoadArray(&osal.count_semaphores_pool, - &osal.count_semaphores, - sizeof (semaphore_t)); + &osal.count_semaphores[0], + OS_MAX_COUNT_SEMAPHORES); /* Mutexes pool initialization.*/ chPoolObjectInit(&osal.mutexes_pool, sizeof (mutex_t), NULL); chPoolLoadArray(&osal.mutexes_pool, - &osal.mutexes, - sizeof (mutex_t)); + &osal.mutexes[0], + OS_MAX_MUTEXES); return OS_SUCCESS; } @@ -635,18 +660,27 @@ int32 OS_QueueCreate(uint32 *queue_id, const char *queue_name, /* Checking queue name length.*/ if (strlen(queue_name) >= OS_MAX_API_NAME) { + *queue_id = 0; return OS_ERR_NAME_TOO_LONG; } + /* Checking if the name is already taken.*/ + if (queue_find(queue_name) > 0) { + *queue_id = 0; + return OS_ERR_NAME_TAKEN; + } + /* Checks on queue limits. There is no dedicated error code.*/ - if ((data_size < MIN_MESSAGE_SIZE) || (data_size < MAX_MESSAGE_SIZE) || - (queue_depth < MIN_QUEUE_DEPTH) || (queue_depth < MAX_QUEUE_DEPTH)) { + if ((data_size < MIN_MESSAGE_SIZE) || (data_size > MAX_MESSAGE_SIZE) || + (queue_depth < MIN_QUEUE_DEPTH) || (queue_depth > MAX_QUEUE_DEPTH)) { + *queue_id = 0; return OS_ERROR; } /* Getting object.*/ oqp = chPoolAlloc(&osal.queues_pool); if (oqp == NULL) { + *queue_id = 0; return OS_ERR_NO_FREE_IDS; } @@ -656,6 +690,7 @@ int32 OS_QueueCreate(uint32 *queue_id, const char *queue_name, msgsize * (size_t)queue_depth, PORT_NATURAL_ALIGN); if (oqp->mb_buffer == NULL) { + *queue_id = 0; return OS_ERROR; } @@ -664,6 +699,7 @@ int32 OS_QueueCreate(uint32 *queue_id, const char *queue_name, sizeof (msg_t) * (size_t)queue_depth, PORT_NATURAL_ALIGN); if (oqp->q_buffer == NULL) { + *queue_id = 0; chHeapFree(oqp->mb_buffer); return OS_ERROR; } @@ -677,6 +713,7 @@ int32 OS_QueueCreate(uint32 *queue_id, const char *queue_name, oqp->depth = queue_depth; oqp->size = data_size; oqp->is_free = 0; /* Note, last.*/ + *queue_id = (uint32)oqp; return OS_SUCCESS; } @@ -867,7 +904,6 @@ int32 OS_QueuePut(uint32 queue_id, void *data, uint32 size, uint32 flags) { * @api */ int32 OS_QueueGetIdByName(uint32 *queue_id, const char *queue_name) { - osal_queue_t *oqp; /* NULL pointer checks.*/ if ((queue_id == NULL) || (queue_name == NULL)) { @@ -879,22 +915,10 @@ int32 OS_QueueGetIdByName(uint32 *queue_id, const char *queue_name) { return OS_ERR_NAME_TOO_LONG; } - /* Searching the queue in the table.*/ - for (oqp = &osal.queues[0]; oqp < &osal.queues[OS_MAX_QUEUES]; oqp++) { - /* Entering a reentrant critical zone.*/ - syssts_t sts = chSysGetStatusAndLockX(); - - if (!oqp->is_free && - (strncmp(oqp->name, queue_name, OS_MAX_API_NAME - 1) == 0)) { - *queue_id = (uint32)oqp; - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - return OS_SUCCESS; - } - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); + /* Searching the queue.*/ + *queue_id = queue_find(queue_name); + if (*queue_id > 0) { + return OS_SUCCESS; } return OS_ERR_NAME_NOT_FOUND; diff --git a/test/nasa_osal/configuration.xml b/test/nasa_osal/configuration.xml index 732f80946..e13b79ffa 100644 --- a/test/nasa_osal/configuration.xml +++ b/test/nasa_osal/configuration.xml @@ -592,13 +592,144 @@ test_assert(err == OS_SUCCESS, "deletable task creation failed");]]> + + + + + + + + + + + Internal Tests + + + Queues Functionality. + + + This sequence tests the NASA OSAL over ChibiOS/RT functionalities related to queues + + + + + + + + OS_QueueCreate() and OS_QueueDelete() errors + + + Parameters checking in OS_QueueCreate() and OS_QueueDelete() is tested. + + + + + + + + + + + + + + + + + + + OS_QueueCreate() is invoked with queue_id set to NULL, an error is expected. + + + + + + + + + + + OS_QueueCreate() is invoked with task_name set to NULL, an error is expected. + + + + +err = OS_QueueCreate(&qid, + NULL, /* Error.*/ + 4, + 128, + 0); +test_assert(err == OS_INVALID_POINTER, "NULL not detected");]]> + + + + + OS_QueueCreate() is invoked with a very long task name, an error is expected. + + + + + + + + + + + OS_QueueDelete() is invoked with queue_id set to -1, an error is expected. + + + + + + + + + + + OS_QueueCreate() is invoked twice with duplicated name, an error is expected, then the queue is deleted using OS_DeleteQueue(). + + + + + + diff --git a/test/nasa_osal/source/test/test_root.c b/test/nasa_osal/source/test/test_root.c index 0a1119188..4639ada20 100644 --- a/test/nasa_osal/source/test/test_root.c +++ b/test/nasa_osal/source/test/test_root.c @@ -22,6 +22,7 @@ * *

Test Sequences

* - @subpage test_sequence_001 + * - @subpage test_sequence_002 * . */ @@ -46,6 +47,7 @@ */ const testcase_t * const *test_suite[] = { test_sequence_001, + test_sequence_002, NULL }; diff --git a/test/nasa_osal/source/test/test_root.h b/test/nasa_osal/source/test/test_root.h index 53efafa5a..4790201e0 100644 --- a/test/nasa_osal/source/test/test_root.h +++ b/test/nasa_osal/source/test/test_root.h @@ -26,6 +26,7 @@ #define _SPC5_TEST_ROOT_H_ #include "test_sequence_001.h" +#include "test_sequence_002.h" /*===========================================================================*/ /* External declarations. */ diff --git a/test/nasa_osal/test.mk b/test/nasa_osal/test.mk index daf008362..1ed8cad43 100644 --- a/test/nasa_osal/test.mk +++ b/test/nasa_osal/test.mk @@ -1,7 +1,8 @@ # List of all the NASA OSAL over ChibiOS/RT test files. TESTSRC = ${CHIBIOS}/test/lib/ch_test.c \ ${CHIBIOS}/test/nasa_osal/source/test/test_root.c \ - ${CHIBIOS}/test/nasa_osal/source/test/test_sequence_001.c + ${CHIBIOS}/test/nasa_osal/source/test/test_sequence_001.c \ + ${CHIBIOS}/test/nasa_osal/source/test/test_sequence_002.c # Required include directories TESTINC = ${CHIBIOS}/test/lib \ -- cgit v1.2.3