aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2016-03-09 14:35:51 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2016-03-09 14:35:51 +0000
commit8795d6011446bb4d12968c7e155e047a8467e3db (patch)
tree02299fb686f5699c31ec9fbbd4c4ed9829122060
parent8b32e5715ec1c99b5407f582551cc88975d2a001 (diff)
downloadChibiOS-8795d6011446bb4d12968c7e155e047a8467e3db.tar.gz
ChibiOS-8795d6011446bb4d12968c7e155e047a8467e3db.tar.bz2
ChibiOS-8795d6011446bb4d12968c7e155e047a8467e3db.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9057 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--os/common/abstractions/nasa_osal/src/osapi.c82
-rw-r--r--test/nasa_osal/configuration.xml139
-rw-r--r--test/nasa_osal/source/test/test_root.c2
-rw-r--r--test/nasa_osal/source/test/test_root.h1
-rw-r--r--test/nasa_osal/test.mk3
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
@@ -593,12 +593,143 @@ test_assert(err == OS_SUCCESS, "deletable task creation failed");]]></value>
<value />
</tags>
<code>
+ <value><![CDATA[int32 err;
+
+(void) OS_TaskDelay(50);
+err = OS_TaskDelete(tid);
+test_assert(err == OS_SUCCESS, "delete failed");
+test_assert_sequence("ABC", "events order violation");]]></value>
+ </code>
+ </step>
+ </steps>
+ </case>
+ </cases>
+ </sequence>
+ <sequence>
+ <type index="0">
+ <value>Internal Tests</value>
+ </type>
+ <brief>
+ <value>Queues Functionality.</value>
+ </brief>
+ <description>
+ <value>This sequence tests the NASA OSAL over ChibiOS/RT functionalities related to queues</value>
+ </description>
+ <shared_code>
+ <value><![CDATA[#include "osapi.h"]]></value>
+ </shared_code>
+ <cases>
+ <case>
+ <brief>
+ <value>OS_QueueCreate() and OS_QueueDelete() errors</value>
+ </brief>
+ <description>
+ <value>Parameters checking in OS_QueueCreate() and OS_QueueDelete() is tested.</value>
+ </description>
+ <condition>
+ <value />
+ </condition>
+ <various_code>
+ <setup_code>
+ <value />
+ </setup_code>
+ <teardown_code>
+ <value />
+ </teardown_code>
+ <local_variables>
+ <value />
+ </local_variables>
+ </various_code>
+ <steps>
+ <step>
+ <description>
+ <value>OS_QueueCreate() is invoked with queue_id set to NULL, an error is expected.</value>
+ </description>
+ <tags>
+ <value />
+ </tags>
+ <code>
+ <value><![CDATA[int32 err;
+
+err = OS_QueueCreate(NULL, /* Error.*/
+ "failing queue",
+ 4,
+ 128,
+ 0);
+test_assert(err == OS_INVALID_POINTER, "NULL not detected");]]></value>
+ </code>
+ </step>
+ <step>
+ <description>
+ <value>OS_QueueCreate() is invoked with task_name set to NULL, an error is expected.</value>
+ </description>
+ <tags>
+ <value />
+ </tags>
+ <code>
<value><![CDATA[int32 err;
+uint32 qid;
-(void) OS_TaskDelay(50);
-err = OS_TaskDelete(tid);
-test_assert(err == OS_SUCCESS, "delete failed");
-test_assert_sequence("ABC", "events order violation");]]></value>
+err = OS_QueueCreate(&qid,
+ NULL, /* Error.*/
+ 4,
+ 128,
+ 0);
+test_assert(err == OS_INVALID_POINTER, "NULL not detected");]]></value>
+ </code>
+ </step>
+ <step>
+ <description>
+ <value>OS_QueueCreate() is invoked with a very long task name, an error is expected.</value>
+ </description>
+ <tags>
+ <value />
+ </tags>
+ <code>
+ <value><![CDATA[int32 err;
+uint32 qid;
+
+err = OS_QueueCreate(&qid,
+ "very very long queue name", /* Error.*/
+ 4,
+ 128,
+ 0);
+test_assert(err == OS_ERR_NAME_TOO_LONG, "name limit not detected");]]></value>
+ </code>
+ </step>
+ <step>
+ <description>
+ <value>OS_QueueDelete() is invoked with queue_id set to -1, an error is expected.</value>
+ </description>
+ <tags>
+ <value />
+ </tags>
+ <code>
+ <value><![CDATA[int32 err;
+
+err = OS_QueueDelete((uint32)-1);
+test_assert(err == OS_ERR_INVALID_ID, "wrong queue id not detected");]]></value>
+ </code>
+ </step>
+ <step>
+ <description>
+ <value>OS_QueueCreate() is invoked twice with duplicated name, an error is expected, then the queue is deleted using OS_DeleteQueue().</value>
+ </description>
+ <tags>
+ <value />
+ </tags>
+ <code>
+ <value><![CDATA[int32 err;
+uint32 qid1, qid2;
+
+err = OS_QueueCreate(&qid1, "my queue", 4, 128, 0);
+test_assert(err == OS_SUCCESS, "queue creation failed");
+
+err = OS_QueueCreate(&qid2, "my queue", 4, 128, 0);
+test_assert(err == OS_ERR_NAME_TAKEN, "name conflict not detected");
+
+err = OS_QueueDelete(qid1);
+test_assert(err == OS_SUCCESS, "queue deletion failed");]]></value>
</code>
</step>
</steps>
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 @@
*
* <h2>Test Sequences</h2>
* - @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 \