aboutsummaryrefslogtreecommitdiffstats
path: root/os
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2016-03-02 12:32:55 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2016-03-02 12:32:55 +0000
commite10bb0e48feb56384b29b969b41fc931ca000166 (patch)
tree672e41b54f7e8e5825d75214fd86e2af6b2a9b8c /os
parent24b3b3472ddfcd186043fd81e9fc4d38ac9a0360 (diff)
downloadChibiOS-e10bb0e48feb56384b29b969b41fc931ca000166.tar.gz
ChibiOS-e10bb0e48feb56384b29b969b41fc931ca000166.tar.bz2
ChibiOS-e10bb0e48feb56384b29b969b41fc931ca000166.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9005 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os')
-rw-r--r--os/common/abstractions/nasa_osal/src/osapi.c141
1 files changed, 126 insertions, 15 deletions
diff --git a/os/common/abstractions/nasa_osal/src/osapi.c b/os/common/abstractions/nasa_osal/src/osapi.c
index f24b25d3c..7cf42b5a6 100644
--- a/os/common/abstractions/nasa_osal/src/osapi.c
+++ b/os/common/abstractions/nasa_osal/src/osapi.c
@@ -380,10 +380,10 @@ int32 OS_TimerCreate(uint32 *timer_id, const char *timer_name,
strncpy(otp->name, timer_name, OS_MAX_API_NAME);
chVTObjectInit(&otp->vt);
- otp->is_free = 0;
otp->start_time = 0;
otp->interval_time = 0;
otp->callback_ptr = callback_ptr;
+ otp->is_free = 0; /* Note, last.*/
*clock_accuracy = (uint32)(1000000 / CH_CFG_ST_FREQUENCY);
@@ -412,6 +412,9 @@ int32 OS_TimerDelete(uint32 timer_id) {
chSysLock();
+ /* Marking as no more free, will be overwritten by the pool pointer.*/
+ otp->is_free = 1;
+
/* Resetting the timer.*/
chVTResetI(&otp->vt);
otp->start_time = 0;
@@ -476,9 +479,10 @@ int32 OS_TimerSet(uint32 timer_id, uint32 start_time, uint32 interval_time) {
* @api
*/
int32 OS_TimerGetIdByName(uint32 *timer_id, const char *timer_name) {
+ osal_timer_t *otp;
/* NULL pointer checks.*/
- if ((timer_id == NULL) || (timer_id == NULL)) {
+ if ((timer_id == NULL) || (timer_name == NULL)) {
return OS_INVALID_POINTER;
}
@@ -487,7 +491,25 @@ int32 OS_TimerGetIdByName(uint32 *timer_id, const char *timer_name) {
return OS_ERR_NAME_TOO_LONG;
}
- return OS_ERR_NOT_IMPLEMENTED;
+ /* Searching the timer in the table.*/
+ for (otp = &osal.timers[0]; otp < &osal.timers[OS_MAX_QUEUES]; otp++) {
+ /* Entering a reentrant critical zone.*/
+ syssts_t sts = chSysGetStatusAndLockX();
+
+ if (!otp->is_free &&
+ (strncmp(otp->name, timer_name, OS_MAX_API_NAME - 1) == 0)) {
+ *timer_id = (uint32)otp;
+
+ /* Leaving the critical zone.*/
+ chSysRestoreStatusX(sts);
+ return OS_SUCCESS;
+ }
+
+ /* Leaving the critical zone.*/
+ chSysRestoreStatusX(sts);
+ }
+
+ return OS_ERR_NAME_NOT_FOUND;
}
/**
@@ -519,7 +541,7 @@ int32 OS_TimerGetInfo(uint32 timer_id, OS_timer_prop_t *timer_prop) {
/* Entering a reentrant critical zone.*/
sts = chSysGetStatusAndLockX();
- /* If the semaphore is not in use then error.*/
+ /* If the timer is not in use then error.*/
if (otp->is_free) {
/* Leaving the critical zone.*/
chSysRestoreStatusX(sts);
@@ -595,7 +617,7 @@ int32 OS_QueueCreate(uint32 *queue_id, const char *queue_name,
chPoolLoadArray(&oqp->messages, oqp->mb_buffer, (size_t)queue_depth);
oqp->depth = queue_depth;
oqp->size = data_size;
- oqp->is_free = 0;
+ oqp->is_free = 0; /* Note, last.*/
return OS_SUCCESS;
}
@@ -614,7 +636,7 @@ int32 OS_QueueDelete(uint32 queue_id) {
/* Critical zone.*/
chSysLock();
- /* Marking as no more free.*/
+ /* Marking as no more free, will be overwritten by the pool pointer.*/
oqp->is_free = 1;
/* Pointers to areas to be freed.*/
@@ -701,27 +723,116 @@ int32 OS_QueueGet(uint32 queue_id, void *data, uint32 size,
}
int32 OS_QueuePut(uint32 queue_id, void *data, uint32 size, uint32 flags) {
+ osal_queue_t *oqp = (osal_queue_t *)queue_id;
+ msg_t msgsts;
+ osal_message_t *omsg;
- (void)queue_id;
- (void)data;
- (void)size;
(void)flags;
- return OS_ERR_NOT_IMPLEMENTED;
+ /* NULL pointer checks.*/
+ if (data == NULL) {
+ return OS_INVALID_POINTER;
+ }
+
+ /* Range check.*/
+ if ((oqp < &osal.queues[0]) ||
+ (oqp >= &osal.queues[OS_MAX_QUEUES]) ||
+ (oqp->is_free)) {
+ return OS_ERR_INVALID_ID;
+ }
+
+ /* Check on maximum size.*/
+ if (size > oqp->size) {
+ return OS_QUEUE_INVALID_SIZE;
+ }
+
+ /* Getting a message buffer from the pool.*/
+ msgsts = chSemWait(&oqp->free_msgs);
+ if (msgsts < MSG_OK) {
+ return OS_ERROR;
+ }
+ omsg = chPoolAlloc(&oqp->messages);
+
+ /* Filling message size and data.*/
+ omsg->size = (size_t)size;
+ memcpy(omsg->buf, data, size);
+
+ /* Posting the message.*/
+ msgsts = chMBPost(&oqp->mb, (msg_t)omsg, TIME_INFINITE);
+ if (msgsts < MSG_OK) {
+ return OS_ERROR;
+ }
+
+ return OS_SUCCESS;
}
int32 OS_QueueGetIdByName(uint32 *queue_id, const char *queue_name) {
+ osal_queue_t *oqp;
- (void)queue_id;
- (void)queue_name;
+ /* NULL pointer checks.*/
+ if ((queue_id == NULL) || (queue_name == NULL)) {
+ return OS_INVALID_POINTER;
+ }
- return OS_ERR_NOT_IMPLEMENTED;
+ /* Checking name length.*/
+ if (strlen(queue_name) >= OS_MAX_API_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);
+ }
+
+ return OS_ERR_NAME_NOT_FOUND;
}
int32 OS_QueueGetInfo (uint32 queue_id, OS_queue_prop_t *queue_prop) {
+ osal_queue_t *oqp = (osal_queue_t *)queue_id;
+ syssts_t sts;
+
+ /* NULL pointer checks.*/
+ if (queue_prop == NULL) {
+ return OS_INVALID_POINTER;
+ }
- (void)queue_id;
- (void)queue_prop;
+ /* Range check.*/
+ if ((oqp < &osal.queues[0]) ||
+ (oqp >= &osal.queues[OS_MAX_QUEUES]) ||
+ (oqp->is_free)) {
+ return OS_ERR_INVALID_ID;
+ }
+
+ /* Entering a reentrant critical zone.*/
+ sts = chSysGetStatusAndLockX();
+
+ /* If the queue is not in use then error.*/
+ if (oqp->is_free) {
+ /* Leaving the critical zone.*/
+ chSysRestoreStatusX(sts);
+ return OS_ERR_INVALID_ID;
+ }
+
+ strncpy(queue_prop->name, oqp->name, OS_MAX_API_NAME - 1);
+ queue_prop->creator = (uint32)0;
+
+ /* Leaving the critical zone.*/
+ chSysRestoreStatusX(sts);
+
+ return OS_SUCCESS;
return OS_ERR_NOT_IMPLEMENTED;
}