git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9057 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
8b32e5715e
commit
8795d60114
|
@ -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,24 +915,12 @@ 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);
|
||||
/* Searching the queue.*/
|
||||
*queue_id = queue_find(queue_name);
|
||||
if (*queue_id > 0) {
|
||||
return OS_SUCCESS;
|
||||
}
|
||||
|
||||
/* Leaving the critical zone.*/
|
||||
chSysRestoreStatusX(sts);
|
||||
}
|
||||
|
||||
return OS_ERR_NAME_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
|
|
@ -605,6 +605,137 @@ test_assert_sequence("ABC", "events order violation");]]></value>
|
|||
</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;
|
||||
|
||||
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>
|
||||
</case>
|
||||
</cases>
|
||||
</sequence>
|
||||
</sequences>
|
||||
</instance>
|
||||
</instances>
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#define _SPC5_TEST_ROOT_H_
|
||||
|
||||
#include "test_sequence_001.h"
|
||||
#include "test_sequence_002.h"
|
||||
|
||||
/*===========================================================================*/
|
||||
/* External declarations. */
|
||||
|
|
|
@ -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 \
|
||||
|
|
Loading…
Reference in New Issue