From 430facf5652c09fee1d77ebad2fb1cca641de544 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Tue, 23 Feb 2016 09:31:25 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@8931 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/STM32/CMSIS-STM32F407-DISCOVERY/Makefile | 2 +- demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/Makefile | 2 +- os/common/abstractions/cmsis_os/cmsis_os.c | 555 +++++++++ os/common/abstractions/cmsis_os/cmsis_os.h | 522 +++++++++ os/common/abstractions/cmsis_os/cmsis_os.mk | 4 + .../abstractions/nasa-osal/include/common_types.h | 267 +++++ .../abstractions/nasa-osal/include/osapi-os-core.h | 274 +++++ .../nasa-osal/include/osapi-os-filesys.h | 419 +++++++ .../nasa-osal/include/osapi-os-loader.h | 91 ++ .../abstractions/nasa-osal/include/osapi-os-net.h | 61 + .../nasa-osal/include/osapi-os-timer.h | 68 ++ .../abstractions/nasa-osal/include/osapi-version.h | 48 + os/common/abstractions/nasa-osal/include/osapi.h | 142 +++ os/common/abstractions/nasa-osal/nasa-osal.mk | 4 + os/common/abstractions/nasa-osal/src/osapi.c | 1227 ++++++++++++++++++++ os/common/ext/nasa-osal/include/common_types.h | 267 ----- os/common/ext/nasa-osal/include/osapi-os-core.h | 274 ----- os/common/ext/nasa-osal/include/osapi-os-filesys.h | 419 ------- os/common/ext/nasa-osal/include/osapi-os-loader.h | 91 -- os/common/ext/nasa-osal/include/osapi-os-net.h | 61 - os/common/ext/nasa-osal/include/osapi-os-timer.h | 68 -- os/common/ext/nasa-osal/include/osapi-version.h | 48 - os/common/ext/nasa-osal/include/osapi.h | 142 --- os/common/ext/nasa-osal/nasa-osal.mk | 4 - os/common/ext/nasa-osal/src/osapi.c | 1227 -------------------- os/common/ports/ARMCMx/cmsis_os/cmsis_os.c | 555 --------- os/common/ports/ARMCMx/cmsis_os/cmsis_os.h | 522 --------- os/common/ports/ARMCMx/cmsis_os/cmsis_os.mk | 4 - readme.txt | 3 + 29 files changed, 3687 insertions(+), 3684 deletions(-) create mode 100644 os/common/abstractions/cmsis_os/cmsis_os.c create mode 100644 os/common/abstractions/cmsis_os/cmsis_os.h create mode 100644 os/common/abstractions/cmsis_os/cmsis_os.mk create mode 100644 os/common/abstractions/nasa-osal/include/common_types.h create mode 100644 os/common/abstractions/nasa-osal/include/osapi-os-core.h create mode 100644 os/common/abstractions/nasa-osal/include/osapi-os-filesys.h create mode 100644 os/common/abstractions/nasa-osal/include/osapi-os-loader.h create mode 100644 os/common/abstractions/nasa-osal/include/osapi-os-net.h create mode 100644 os/common/abstractions/nasa-osal/include/osapi-os-timer.h create mode 100644 os/common/abstractions/nasa-osal/include/osapi-version.h create mode 100644 os/common/abstractions/nasa-osal/include/osapi.h create mode 100644 os/common/abstractions/nasa-osal/nasa-osal.mk create mode 100644 os/common/abstractions/nasa-osal/src/osapi.c delete mode 100644 os/common/ext/nasa-osal/include/common_types.h delete mode 100644 os/common/ext/nasa-osal/include/osapi-os-core.h delete mode 100644 os/common/ext/nasa-osal/include/osapi-os-filesys.h delete mode 100644 os/common/ext/nasa-osal/include/osapi-os-loader.h delete mode 100644 os/common/ext/nasa-osal/include/osapi-os-net.h delete mode 100644 os/common/ext/nasa-osal/include/osapi-os-timer.h delete mode 100644 os/common/ext/nasa-osal/include/osapi-version.h delete mode 100644 os/common/ext/nasa-osal/include/osapi.h delete mode 100644 os/common/ext/nasa-osal/nasa-osal.mk delete mode 100644 os/common/ext/nasa-osal/src/osapi.c delete mode 100644 os/common/ports/ARMCMx/cmsis_os/cmsis_os.c delete mode 100644 os/common/ports/ARMCMx/cmsis_os/cmsis_os.h delete mode 100644 os/common/ports/ARMCMx/cmsis_os/cmsis_os.mk diff --git a/demos/STM32/CMSIS-STM32F407-DISCOVERY/Makefile b/demos/STM32/CMSIS-STM32F407-DISCOVERY/Makefile index ee50b2c53..72731e95e 100644 --- a/demos/STM32/CMSIS-STM32F407-DISCOVERY/Makefile +++ b/demos/STM32/CMSIS-STM32F407-DISCOVERY/Makefile @@ -99,7 +99,7 @@ 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)/os/common/ports/ARMCMx/cmsis_os/cmsis_os.mk +include $(CHIBIOS)/os/common/abstractions/cmsis_os/cmsis_os.mk # Define linker script file here LDSCRIPT= $(STARTUPLD)/STM32F407xG.ld diff --git a/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/Makefile b/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/Makefile index f22a0062a..9c2e46520 100644 --- a/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/Makefile +++ b/demos/STM32/NASA-OSAL-STM32F407-DISCOVERY/Makefile @@ -99,7 +99,7 @@ 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)/os/common/ext/nasa-osal/nasa-osal.mk +include $(CHIBIOS)/os/common/abstractions/nasa-osal/nasa-osal.mk # Define linker script file here LDSCRIPT= $(STARTUPLD)/STM32F407xG.ld diff --git a/os/common/abstractions/cmsis_os/cmsis_os.c b/os/common/abstractions/cmsis_os/cmsis_os.c new file mode 100644 index 000000000..04bebeb1d --- /dev/null +++ b/os/common/abstractions/cmsis_os/cmsis_os.c @@ -0,0 +1,555 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/* + Concepts and parts of this file have been contributed by Andre R. + */ + +/** + * @file cmsis_os.c + * @brief CMSIS RTOS module code. + * + * @addtogroup CMSIS_OS + * @{ + */ + +#include "cmsis_os.h" +#include + +/*===========================================================================*/ +/* Module local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +int32_t cmsis_os_started; + +/*===========================================================================*/ +/* Module local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local variables. */ +/*===========================================================================*/ + +static memory_pool_t sempool; +static semaphore_t semaphores[CMSIS_CFG_NUM_SEMAPHORES]; + +static memory_pool_t timpool; +static struct os_timer_cb timers[CMSIS_CFG_NUM_TIMERS]; + +/*===========================================================================*/ +/* Module local functions. */ +/*===========================================================================*/ + +/** + * @brief Virtual timers common callback. + */ +static void timer_cb(void const *arg) { + + osTimerId timer_id = (osTimerId)arg; + timer_id->ptimer(timer_id->argument); + if (timer_id->type == osTimerPeriodic) { + chSysLockFromISR(); + chVTDoSetI(&timer_id->vt, MS2ST(timer_id->millisec), + (vtfunc_t)timer_cb, timer_id); + chSysUnlockFromISR(); + } +} + +/*===========================================================================*/ +/* Module exported functions. */ +/*===========================================================================*/ + +/** + * @brief Kernel initialization. + */ +osStatus osKernelInitialize(void) { + + cmsis_os_started = 0; + + chSysInit(); + chThdSetPriority(HIGHPRIO); + + chPoolObjectInit(&sempool, sizeof(semaphore_t), chCoreAllocAligned); + chPoolLoadArray(&sempool, semaphores, CMSIS_CFG_NUM_SEMAPHORES); + + chPoolObjectInit(&timpool, sizeof(virtual_timer_t), chCoreAllocAligned); + chPoolLoadArray(&timpool, timers, CMSIS_CFG_NUM_TIMERS); + + return osOK; +} + +/** + * @brief Kernel start. + */ +osStatus osKernelStart(void) { + + cmsis_os_started = 1; + + chThdSetPriority(NORMALPRIO); + + return osOK; +} + +/** + * @brief Creates a thread. + */ +osThreadId osThreadCreate(const osThreadDef_t *thread_def, void *argument) { + size_t size; + + size = thread_def->stacksize == 0 ? CMSIS_CFG_DEFAULT_STACK : + thread_def->stacksize; + return (osThreadId)chThdCreateFromHeap(0, + THD_WORKING_AREA_SIZE(size), + thread_def->name, + NORMALPRIO+thread_def->tpriority, + (tfunc_t)thread_def->pthread, + argument); +} + +/** + * @brief Thread termination. + * @note The thread is not really terminated but asked to terminate which + * is not compliant. + */ +osStatus osThreadTerminate(osThreadId thread_id) { + + if (thread_id == osThreadGetId()) { + /* Note, no memory will be recovered unless a cleaner thread is + implemented using the registry.*/ + chThdExit(0); + } + chEvtSignal((thread_t *)thread_id, CH_EVENT_TERMINATE); + chThdWait((thread_t *)thread_id); + + return osOK; +} + +/** + * @brief Change thread priority. + * @note This can interfere with the priority inheritance mechanism. + */ +osStatus osThreadSetPriority(osThreadId thread_id, osPriority newprio) { + osPriority oldprio; + thread_t * tp = (thread_t *)thread_id; + + chSysLock(); + + /* Changing priority.*/ +#if CH_CFG_USE_MUTEXES + oldprio = (osPriority)tp->realprio; + if ((tp->prio == tp->realprio) || ((tprio_t)newprio > tp->prio)) + tp->prio = (tprio_t)newprio; + tp->realprio = (tprio_t)newprio; +#else + oldprio = tp->prio; + tp->prio = (tprio_t)newprio; +#endif + + /* The following states need priority queues reordering.*/ + switch (tp->state) { +#if CH_CFG_USE_MUTEXES | \ + CH_CFG_USE_CONDVARS | \ + (CH_CFG_USE_SEMAPHORES && CH_CFG_USE_SEMAPHORES_PRIORITY) | \ + (CH_CFG_USE_MESSAGES && CH_CFG_USE_MESSAGES_PRIORITY) +#if CH_CFG_USE_MUTEXES + case CH_STATE_WTMTX: +#endif +#if CH_CFG_USE_CONDVARS + case CH_STATE_WTCOND: +#endif +#if CH_CFG_USE_SEMAPHORES && CH_CFG_USE_SEMAPHORES_PRIORITY + case CH_STATE_WTSEM: +#endif +#if CH_CFG_USE_MESSAGES && CH_CFG_USE_MESSAGES_PRIORITY + case CH_STATE_SNDMSGQ: +#endif + /* Re-enqueues tp with its new priority on the queue.*/ + queue_prio_insert(queue_dequeue(tp), + (threads_queue_t *)tp->u.wtobjp); + break; +#endif + case CH_STATE_READY: +#if CH_DBG_ENABLE_ASSERTS + /* Prevents an assertion in chSchReadyI().*/ + tp->state = CH_STATE_CURRENT; +#endif + /* Re-enqueues tp with its new priority on the ready list.*/ + chSchReadyI(queue_dequeue(tp)); + break; + } + + /* Rescheduling.*/ + chSchRescheduleS(); + + chSysUnlock(); + + return oldprio; +} + +/** + * @brief Create a timer. + */ +osTimerId osTimerCreate(const osTimerDef_t *timer_def, + os_timer_type type, + void *argument) { + + osTimerId timer = chPoolAlloc(&timpool); + chVTObjectInit(&timer->vt); + timer->ptimer = timer_def->ptimer; + timer->type = type; + timer->argument = argument; + return timer; +} + +/** + * @brief Start a timer. + */ +osStatus osTimerStart(osTimerId timer_id, uint32_t millisec) { + + if ((millisec == 0) || (millisec == osWaitForever)) + return osErrorValue; + + timer_id->millisec = millisec; + chVTSet(&timer_id->vt, MS2ST(millisec), (vtfunc_t)timer_cb, timer_id); + + return osOK; +} + +/** + * @brief Stop a timer. + */ +osStatus osTimerStop(osTimerId timer_id) { + + chVTReset(&timer_id->vt); + + return osOK; +} + +/** + * @brief Delete a timer. + */ +osStatus osTimerDelete(osTimerId timer_id) { + + chVTReset(&timer_id->vt); + chPoolFree(&timpool, (void *)timer_id); + + return osOK; +} + +/** + * @brief Send signals. + */ +int32_t osSignalSet(osThreadId thread_id, int32_t signals) { + int32_t oldsignals; + + syssts_t sts = chSysGetStatusAndLockX(); + oldsignals = (int32_t)thread_id->epending; + chEvtSignalI((thread_t *)thread_id, (eventmask_t)signals); + chSysRestoreStatusX(sts); + + return oldsignals; +} + +/** + * @brief Clear signals. + */ +int32_t osSignalClear(osThreadId thread_id, int32_t signals) { + eventmask_t m; + + chSysLock(); + + m = thread_id->epending & (eventmask_t)signals; + thread_id->epending &= ~(eventmask_t)signals; + + chSysUnlock(); + + return (int32_t)m; +} + +/** + * @brief Wait for signals. + */ +osEvent osSignalWait(int32_t signals, uint32_t millisec) { + osEvent event; + systime_t timeout = ((millisec == 0) || (millisec == osWaitForever)) ? + TIME_INFINITE : MS2ST(millisec); + + if (signals == 0) + event.value.signals = (uint32_t)chEvtWaitAnyTimeout(ALL_EVENTS, timeout); + else + event.value.signals = (uint32_t)chEvtWaitAllTimeout((eventmask_t)signals, + timeout); + + /* Type of event.*/ + if (event.value.signals == 0) + event.status = osEventTimeout; + else + event.status = osEventSignal; + + return event; +} + +/** + * @brief Create a semaphore. + * @note @p semaphore_def is not used. + * @note Can involve memory allocation. + */ +osSemaphoreId osSemaphoreCreate(const osSemaphoreDef_t *semaphore_def, + int32_t count) { + + (void)semaphore_def; + + semaphore_t *sem = chPoolAlloc(&sempool); + chSemObjectInit(sem, (cnt_t)count); + return sem; +} + +/** + * @brief Wait on a semaphore. + */ +int32_t osSemaphoreWait(osSemaphoreId semaphore_id, uint32_t millisec) { + systime_t timeout = ((millisec == 0) || (millisec == osWaitForever)) ? + TIME_INFINITE : MS2ST(millisec); + + msg_t msg = chSemWaitTimeout((semaphore_t *)semaphore_id, timeout); + switch (msg) { + case MSG_OK: + return osOK; + case MSG_TIMEOUT: + return osErrorTimeoutResource; + } + return osErrorResource; +} + +/** + * @brief Release a semaphore. + */ +osStatus osSemaphoreRelease(osSemaphoreId semaphore_id) { + + syssts_t sts = chSysGetStatusAndLockX(); + chSemSignalI((semaphore_t *)semaphore_id); + chSysRestoreStatusX(sts); + + return osOK; +} + +/** + * @brief Deletes a semaphore. + * @note After deletion there could be references in the system to a + * non-existent semaphore. + */ +osStatus osSemaphoreDelete(osSemaphoreId semaphore_id) { + + chSemReset((semaphore_t *)semaphore_id, 0); + chPoolFree(&sempool, (void *)semaphore_id); + + return osOK; +} + +/** + * @brief Create a mutex. + * @note @p mutex_def is not used. + * @note Can involve memory allocation. + */ +osMutexId osMutexCreate(const osMutexDef_t *mutex_def) { + + (void)mutex_def; + + binary_semaphore_t *mtx = chPoolAlloc(&sempool); + chBSemObjectInit(mtx, false); + return mtx; +} + +/** + * @brief Wait on a mutex. + */ +osStatus osMutexWait(osMutexId mutex_id, uint32_t millisec) { + systime_t timeout = ((millisec == 0) || (millisec == osWaitForever)) ? + TIME_INFINITE : MS2ST(millisec); + + msg_t msg = chBSemWaitTimeout((binary_semaphore_t *)mutex_id, timeout); + switch (msg) { + case MSG_OK: + return osOK; + case MSG_TIMEOUT: + return osErrorTimeoutResource; + } + return osErrorResource; +} + +/** + * @brief Release a mutex. + */ +osStatus osMutexRelease(osMutexId mutex_id) { + + syssts_t sts = chSysGetStatusAndLockX(); + chBSemSignalI((binary_semaphore_t *)mutex_id); + chSysRestoreStatusX(sts); + + return osOK; +} + +/** + * @brief Deletes a mutex. + * @note After deletion there could be references in the system to a + * non-existent semaphore. + */ +osStatus osMutexDelete(osMutexId mutex_id) { + + chSemReset((semaphore_t *)mutex_id, 0); + chPoolFree(&sempool, (void *)mutex_id); + + return osOK; +} + +/** + * @brief Create a memory pool. + * @note The pool is not really created because it is allocated statically, + * this function just re-initializes it. + */ +osPoolId osPoolCreate(const osPoolDef_t *pool_def) { + + chPoolObjectInit(pool_def->pool, (size_t)pool_def->item_sz, NULL); + chPoolLoadArray(pool_def->pool, pool_def->items, (size_t)pool_def->pool_sz); + + return (osPoolId)pool_def->pool; +} + +/** + * @brief Allocate an object. + */ +void *osPoolAlloc(osPoolId pool_id) { + void *object; + + syssts_t sts = chSysGetStatusAndLockX(); + object = chPoolAllocI((memory_pool_t *)pool_id); + chSysRestoreStatusX(sts); + + return object; +} + +/** + * @brief Allocate an object clearing it. + */ +void *osPoolCAlloc(osPoolId pool_id) { + void *object; + + object = chPoolAllocI((memory_pool_t *)pool_id); + memset(object, 0, pool_id->object_size); + return object; +} + +/** + * @brief Free an object. + */ +osStatus osPoolFree(osPoolId pool_id, void *block) { + + syssts_t sts = chSysGetStatusAndLockX(); + chPoolFreeI((memory_pool_t *)pool_id, block); + chSysRestoreStatusX(sts); + + return osOK; +} + +/** + * @brief Create a message queue. + * @note The queue is not really created because it is allocated statically, + * this function just re-initializes it. + */ +osMessageQId osMessageCreate(const osMessageQDef_t *queue_def, + osThreadId thread_id) { + + /* Ignoring this parameter for now.*/ + (void)thread_id; + + if (queue_def->item_sz > sizeof (msg_t)) + return NULL; + + chMBObjectInit(queue_def->mailbox, + queue_def->items, + (size_t)queue_def->queue_sz); + + return (osMessageQId) queue_def->mailbox; +} + +/** + * @brief Put a message in the queue. + */ +osStatus osMessagePut(osMessageQId queue_id, + uint32_t info, + uint32_t millisec) { + msg_t msg; + systime_t timeout = ((millisec == 0) || (millisec == osWaitForever)) ? + TIME_INFINITE : MS2ST(millisec); + + if (port_is_isr_context()) { + + /* Waiting makes no sense in ISRs so any value except "immediate" + makes no sense.*/ + if (millisec != 0) + return osErrorValue; + + chSysLockFromISR(); + msg = chMBPostI((mailbox_t *)queue_id, (msg_t)info); + chSysUnlockFromISR(); + } + else + msg = chMBPost((mailbox_t *)queue_id, (msg_t)info, timeout); + + return msg == MSG_OK ? osOK : osEventTimeout; +} + +/** + * @brief Get a message from the queue. + */ +osEvent osMessageGet(osMessageQId queue_id, + uint32_t millisec) { + msg_t msg; + osEvent event; + systime_t timeout = ((millisec == 0) || (millisec == osWaitForever)) ? + TIME_INFINITE : MS2ST(millisec); + + event.def.message_id = queue_id; + + if (port_is_isr_context()) { + + /* Waiting makes no sense in ISRs so any value except "immediate" + makes no sense.*/ + if (millisec != 0) { + event.status = osErrorValue; + return event; + } + + chSysLockFromISR(); + msg = chMBFetchI((mailbox_t *)queue_id, (msg_t*)&event.value.v); + chSysUnlockFromISR(); + } + else { + msg = chMBFetch((mailbox_t *)queue_id, (msg_t*)&event.value.v, timeout); + } + + /* Returned event type.*/ + event.status = msg == MSG_OK ? osEventMessage : osEventTimeout; + return event; +} + +/** @} */ diff --git a/os/common/abstractions/cmsis_os/cmsis_os.h b/os/common/abstractions/cmsis_os/cmsis_os.h new file mode 100644 index 000000000..1c0998baf --- /dev/null +++ b/os/common/abstractions/cmsis_os/cmsis_os.h @@ -0,0 +1,522 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/* + Concepts and parts of this file have been contributed by Andre R. + */ + +/** + * @file cmsis_os.h + * @brief CMSIS RTOS module macros and structures. + * + * @addtogroup CMSIS_OS + * @{ + */ + +#ifndef _CMSIS_OS_H_ +#define _CMSIS_OS_H_ + +#include "ch.h" + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/** + * @brief API version. + */ +#define osCMSIS 0x10002 + +/** + * @brief Kernel version. + */ +#define osKernelSystemId "KERNEL V1.00" + +/** + * @brief ChibiOS/RT version encoded for CMSIS. + */ +#define osCMSIS_KERNEL ((CH_KERNEL_MAJOR << 16) | \ + (CH_KERNEL_MINOR << 8) | \ + (CH_KERNEL_PATCH)) + +/** + * @name CMSIS Capabilities + * @{ + */ +#define osFeature_MainThread 1 +#define osFeature_Pool 1 +#define osFeature_MailQ 0 +#define osFeature_MessageQ 1 +#define osFeature_Signals 24 +#define osFeature_Semaphore ((1U << 31) - 1U) +#define osFeature_Wait 0 +#define osFeature_SysTick 1 +/**< @} */ + +/** + * @brief Wait forever specification for timeouts. + */ +#define osWaitForever TIME_INFINITE + +/** + * @brief System tick frequency. + */ +#define osKernelSysTickFrequency CH_CFG_FREQUENCY + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/** + * @brief Number of pre-allocated static semaphores/mutexes. + */ +#if !defined(CMSIS_CFG_DEFAULT_STACK) +#define CMSIS_CFG_DEFAULT_STACK 256 +#endif + +/** + * @brief Number of pre-allocated static semaphores/mutexes. + */ +#if !defined(CMSIS_CFG_NUM_SEMAPHORES) +#define CMSIS_CFG_NUM_SEMAPHORES 4 +#endif + +/** + * @brief Number of pre-allocated static timers. + */ +#if !defined(CMSIS_CFG_NUM_TIMERS) +#define CMSIS_CFG_NUM_TIMERS 4 +#endif + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if !CH_CFG_USE_MEMPOOLS +#error "CMSIS RTOS requires CH_CFG_USE_MEMPOOLS" +#endif + +#if !CH_CFG_USE_EVENTS +#error "CMSIS RTOS requires CH_CFG_USE_EVENTS" +#endif + +#if !CH_CFG_USE_EVENTS_TIMEOUT +#error "CMSIS RTOS requires CH_CFG_USE_EVENTS_TIMEOUT" +#endif + +#if !CH_CFG_USE_SEMAPHORES +#error "CMSIS RTOS requires CH_CFG_USE_SEMAPHORES" +#endif + +#if !CH_CFG_USE_DYNAMIC +#error "CMSIS RTOS requires CH_CFG_USE_DYNAMIC" +#endif + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/** + * @brief Type of priority levels. + */ +typedef enum { + osPriorityIdle = -3, + osPriorityLow = -2, + osPriorityBelowNormal = -1, + osPriorityNormal = 0, + osPriorityAboveNormal = +1, + osPriorityHigh = +2, + osPriorityRealtime = +3, + osPriorityError = 0x84 +} osPriority; + +/** + * @brief Type of error codes. + */ +typedef enum { + osOK = 0, + osEventSignal = 0x08, + osEventMessage = 0x10, + osEventMail = 0x20, + osEventTimeout = 0x40, + osErrorParameter = 0x80, + osErrorResource = 0x81, + osErrorTimeoutResource = 0xC1, + osErrorISR = 0x82, + osErrorISRRecursive = 0x83, + osErrorPriority = 0x84, + osErrorNoMemory = 0x85, + osErrorValue = 0x86, + osErrorOS = 0xFF, + os_status_reserved = 0x7FFFFFFF +} osStatus; + +/** + * @brief Type of a timer mode. + */ +typedef enum { + osTimerOnce = 0, + osTimerPeriodic = 1 +} os_timer_type; + +/** + * @brief Type of thread functions. + */ +typedef void (*os_pthread) (void const *argument); + +/** + * @brief Type of timer callback. + */ +typedef void (*os_ptimer) (void const *argument); + +/** + * @brief Type of pointer to thread control block. + */ +typedef thread_t *osThreadId; + +/** + * @brief Type of pointer to timer control block. + */ +typedef struct os_timer_cb { + virtual_timer_t vt; + os_timer_type type; + os_ptimer ptimer; + void *argument; + uint32_t millisec; +} *osTimerId; + +/** + * @brief Type of pointer to mutex control block. + */ +typedef binary_semaphore_t *osMutexId; + +/** + * @brief Type of pointer to semaphore control block. + */ +typedef semaphore_t *osSemaphoreId; + +/** + * @brief Type of pointer to memory pool control block. + */ +typedef memory_pool_t *osPoolId; + +/** + * @brief Type of pointer to message queue control block. + */ +typedef struct mailbox *osMessageQId; + +/** + * @brief Type of an event. + */ +typedef struct { + osStatus status; + union { + uint32_t v; + void *p; + int32_t signals; + } value; + union { +/* osMailQId mail_id;*/ + osMessageQId message_id; + } def; +} osEvent; + +/** + * @brief Type of a thread definition block. + */ +typedef struct os_thread_def { + os_pthread pthread; + osPriority tpriority; + uint32_t stacksize; + const char *name; +} osThreadDef_t; + +/** + * @brief Type of a timer definition block. + */ +typedef struct os_timer_def { + os_ptimer ptimer; +} osTimerDef_t; + +/** + * @brief Type of a mutex definition block. + */ +typedef struct os_mutex_def { + uint32_t dummy; +} osMutexDef_t; + +/** + * @brief Type of a semaphore definition block. + */ +typedef struct os_semaphore_def { + uint32_t dummy; +} osSemaphoreDef_t; + +/** + * @brief Type of a memory pool definition block. + */ +typedef struct os_pool_def { + uint32_t pool_sz; + uint32_t item_sz; + memory_pool_t *pool; + void *items; +} osPoolDef_t; + +/** + * @brief Type of a message queue definition block. + */ +typedef struct os_messageQ_def { + uint32_t queue_sz; + uint32_t item_sz; + mailbox_t *mailbox; + void *items; +} osMessageQDef_t; + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/** + * @brief Convert a microseconds value to a RTOS kernel system timer value. + */ +#define osKernelSysTickMicroSec(microsec) (((uint64_t)microsec * \ + (osKernelSysTickFrequency)) / \ + 1000000) + +/** + * @brief Create a Thread definition. + */ +#if defined(osObjectsExternal) +#define osThreadDef(thd, priority, stacksz, name) \ + extern const osThreadDef_t os_thread_def_##thd +#else +#define osThreadDef(thd, priority, stacksz, name) \ +const osThreadDef_t os_thread_def_##thd = { \ + (thd), \ + (priority), \ + (stacksz), \ + (name) \ +} +#endif + +/** + * @brief Access a Thread definition. + */ +#define osThread(name) &os_thread_def_##name + +/** + * @brief Define a Timer object. + */ +#if defined(osObjectsExternal) +#define osTimerDef(name, function) \ + extern const osTimerDef_t os_timer_def_##name +#else +#define osTimerDef(name, function) \ +const osTimerDef_t os_timer_def_##name = { \ + (function) \ +} +#endif + +/** + * @brief Access a Timer definition. + */ +#define osTimer(name) &os_timer_def_##name + +/** + * @brief Define a Mutex. + */ +#if defined(osObjectsExternal) +#define osMutexDef(name) extern const osMutexDef_t os_mutex_def_##name +#else +#define osMutexDef(name) const osMutexDef_t os_mutex_def_##name = {0} +#endif + +/** + * @brief Access a Mutex definition. + */ +#define osMutex(name) &os_mutex_def_##name + +/** + * @brief Define a Semaphore. + */ +#if defined(osObjectsExternal) +#define osSemaphoreDef(name) \ + extern const osSemaphoreDef_t os_semaphore_def_##name +#else // define the object +#define osSemaphoreDef(name) \ + const osSemaphoreDef_t os_semaphore_def_##name = {0} +#endif + +/** + * @brief Access a Semaphore definition. + */ +#define osSemaphore(name) &os_semaphore_def_##name + +/** + * @brief Define a Memory Pool. + */ +#if defined(osObjectsExternal) +#define osPoolDef(name, no, type) \ + extern const osPoolDef_t os_pool_def_##name +#else +#define osPoolDef(name, no, type) \ +static const type os_pool_buf_##name[no]; \ +static memory_pool_t os_pool_obj_##name; \ +const osPoolDef_t os_pool_def_##name = { \ + (no), \ + sizeof (type), \ + (void *)&os_pool_obj_##name, \ + (void *)&os_pool_buf_##name[0] \ +} +#endif + +/** + * @brief Access a Memory Pool definition. + */ +#define osPool(name) &os_pool_def_##name + +/** + * @brief Define a Message Queue. + */ +#if defined(osObjectsExternal) +#define osMessageQDef(name, queue_sz, type) \ + extern const osMessageQDef_t os_messageQ_def_##name +#else +#define osMessageQDef(name, queue_sz, type) \ +static const msg_t os_messageQ_buf_##name[queue_sz]; \ +static mailbox_t os_messageQ_obj_##name; \ +const osMessageQDef_t os_messageQ_def_##name = { \ + (queue_sz), \ + sizeof (type) \ + (void *)&os_messageQ_obj_##name, \ + (void *)&os_messageQ_buf_##name[0] \ +} +#endif + +/** + * @brief Access a Message Queue definition. + */ +#define osMessageQ(name) &os_messageQ_def_##name + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +extern int32_t cmsis_os_started; + +#ifdef __cplusplus +extern "C" { +#endif + osStatus osKernelInitialize(void); + osStatus osKernelStart(void); + osThreadId osThreadCreate(const osThreadDef_t *thread_def, void *argument); + osStatus osThreadTerminate(osThreadId thread_id); + osStatus osThreadSetPriority(osThreadId thread_id, osPriority newprio); + /*osEvent osWait(uint32_t millisec);*/ + osTimerId osTimerCreate(const osTimerDef_t *timer_def, + os_timer_type type, + void *argument); + osStatus osTimerStart(osTimerId timer_id, uint32_t millisec); + osStatus osTimerStop(osTimerId timer_id); + osStatus osTimerDelete(osTimerId timer_id); + int32_t osSignalSet(osThreadId thread_id, int32_t signals); + int32_t osSignalClear(osThreadId thread_id, int32_t signals); + osEvent osSignalWait(int32_t signals, uint32_t millisec); + osSemaphoreId osSemaphoreCreate(const osSemaphoreDef_t *semaphore_def, + int32_t count); + int32_t osSemaphoreWait(osSemaphoreId semaphore_id, uint32_t millisec); + osStatus osSemaphoreRelease(osSemaphoreId semaphore_id); + osStatus osSemaphoreDelete(osSemaphoreId semaphore_id); + osMutexId osMutexCreate(const osMutexDef_t *mutex_def); + osStatus osMutexWait(osMutexId mutex_id, uint32_t millisec); + osStatus osMutexRelease(osMutexId mutex_id); + osStatus osMutexDelete(osMutexId mutex_id); + osPoolId osPoolCreate(const osPoolDef_t *pool_def); + void *osPoolAlloc(osPoolId pool_id); + void *osPoolCAlloc(osPoolId pool_id); + osStatus osPoolFree(osPoolId pool_id, void *block); + osMessageQId osMessageCreate(const osMessageQDef_t *queue_def, + osThreadId thread_id); + osStatus osMessagePut(osMessageQId queue_id, + uint32_t info, + uint32_t millisec); + osEvent osMessageGet(osMessageQId queue_id, + uint32_t millisec); +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +/** + * @brief To be or not to be. + */ +static inline int32_t osKernelRunning(void) { + + return cmsis_os_started; +} + +/** + * @brief System ticks since start. + */ +static inline uint32_t osKernelSysTick(void) { + + return (uint32_t)chVTGetSystemTimeX(); +} + +/** + * @brief Returns the current thread. + */ +static inline osThreadId osThreadGetId(void) { + + return (osThreadId)chThdGetSelfX(); +} + +/** + * @brief Thread time slice yield. + */ +static inline osStatus osThreadYield(void) { + + chThdYield(); + + return osOK; +} + +/** + * @brief Returns priority of a thread. + */ +static inline osPriority osThreadGetPriority(osThreadId thread_id) { + + return thread_id->prio; +} + +/** + * @brief Thread delay in milliseconds. + */ +static inline osStatus osDelay(uint32_t millisec) { + + chThdSleepMilliseconds(millisec); + + return osOK; +} + +#endif /* _CMSIS_OS_H_ */ + +/** @} */ diff --git a/os/common/abstractions/cmsis_os/cmsis_os.mk b/os/common/abstractions/cmsis_os/cmsis_os.mk new file mode 100644 index 000000000..eb35bc574 --- /dev/null +++ b/os/common/abstractions/cmsis_os/cmsis_os.mk @@ -0,0 +1,4 @@ +# List of the ChibiOS/RT CMSIS RTOS wrapper. +CMSISRTOSSRC = ${CHIBIOS}/os/common/abstractions/cmsis_os/cmsis_os.c + +CMSISRTOSINC = ${CHIBIOS}/os/common/abstractions/cmsis_os diff --git a/os/common/abstractions/nasa-osal/include/common_types.h b/os/common/abstractions/nasa-osal/include/common_types.h new file mode 100644 index 000000000..100a9c72e --- /dev/null +++ b/os/common/abstractions/nasa-osal/include/common_types.h @@ -0,0 +1,267 @@ +/*--------------------------------------------------------------------------- +** +** Filename: +** $Id: common_types.h 1.9 2014/01/14 16:28:32GMT-05:00 acudmore Exp $ +** +** Copyright (c) 2004-2006, United States government as represented by the +** administrator of the National Aeronautics Space Administration. +** All rights reserved. This software was created at NASAs Goddard +** Space Flight Center pursuant to government contracts. +** +** This is governed by the NASA Open Source Agreement and may be used, +** distributed and modified only pursuant to the terms of that agreement. +** +** Purpose: +** Unit specification for common types. +** +** Design Notes: +** Assumes make file has defined processor family +** +** References: +** Flight Software Branch C Coding Standard Version 1.0a +** +** +** Notes: +** +** +** $Date: 2014/01/14 16:28:32GMT-05:00 $ +** $Revision: 1.9 $ +** $Log: common_types.h $ +** Revision 1.9 2014/01/14 16:28:32GMT-05:00 acudmore +** Fixed typo in macro for x86-64 +** Revision 1.8 2013/08/09 13:58:04GMT-05:00 acudmore +** Added int64 type, added support for ARM arch, added 64 bit x86 arch, added arch check for GCC arch macros, added check for proper data type sizes +** Revision 1.7 2013/07/25 10:01:29GMT-05:00 acudmore +** Added C++ support +** Revision 1.6 2012/04/11 09:19:03GMT-05:00 acudmore +** added OS_USED attribute +** Revision 1.5 2010/02/18 16:43:29EST acudmore +** Added SPARC processor section +** Removed special characters from comments that cause problems with some tools. +** Revision 1.4 2010/02/18 16:41:39EST acudmore +** Added a block of defines for GCC specific pragmas and extensions. +** Removed RTEMS boolean related ifdefs +** moved OS_PACK into the GCC specific block +** Revision 1.3 2010/02/01 12:31:17EST acudmore +** Added uint64 type +** Revision 1.2 2009/07/07 16:30:05EDT acudmore +** Removed conditinal comp. around boolean for m68k. +** This will need to be done for all RTEMS targets +** Revision 1.1 2009/06/02 10:04:58EDT acudmore +** Initial revision +** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj +** Revision 1.1 2008/04/20 22:35:58EDT ruperera +** Initial revision +** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/inc/project.pj +** Revision 1.1 2007/10/16 16:14:49EDT apcudmore +** Initial revision +** Member added to project d:/mksdata/MKS-OSAL-REPOSITORY/src/inc/project.pj +** Revision 1.2 2006/06/08 14:28:32EDT David Kobe (dlkobe) +** Added NASA Open Source Legal Statement +** Revision 1.1 2005/06/09 09:57:51GMT-05:00 rperera +** Initial revision +** Member added to project d:/mksdata/MKS-CFE-REPOSITORY/cfe-core/inc/project.pj +** Revision 1.6 2005/03/24 19:20:52 rmcgraw +** Wrapped the boolean defintion for all three processors with #ifndef _USING_RTEMS_INCLUDES_ +** +** Revision 1.5 2005/03/10 16:59:08 acudmore +** removed boolean prefix to TRUE and FALSE defintion to avoid vxWorks conflict. +** +** Revision 1.4 2005/03/07 20:23:34 acudmore +** removed duplicate boolean definition +** +** Revision 1.3 2005/03/07 20:05:17 acudmore +** updated with __PPC__ macro that gnu compiler uses +** +** Revision 1.2 2005/03/04 16:02:44 acudmore +** added coldfire architecture +** +** Revision 1.1 2005/03/04 15:58:45 acudmore +** Added common_types.h +** +** +** +**-------------------------------------------------------------------------*/ + +#ifndef _common_types_ +#define _common_types_ + +#ifdef __cplusplus + extern "C" { +#endif + +/* +** Includes +*/ + +/* +** Macro Definitions +*/ + +/* +** Condition = TRUE is ok, Condition = FALSE is error +*/ +#define CompileTimeAssert(Condition, Message) typedef char Message[(Condition) ? 1 : -1] + + +/* +** Define compiler specific macros +** The __extension__ compiler pragma is required +** for the uint64 type using GCC with the ANSI C90 standard. +** Other macros can go in here as needed, for example alignment +** pragmas. +*/ +#if defined (__GNUC__) + #define _EXTENSION_ __extension__ + #define OS_PACK __attribute__ ((packed)) + #define OS_ALIGN(n) __attribute__((aligned(n))) + #define OS_USED __attribute__((used)) +#else + #define _EXTENSION_ + #define OS_PACK + #define OS_ALIGN(n) + #define OS_USED +#endif + +#if defined(_ix86_) || defined (__i386__) +/* ----------------------- Intel x86 processor family -------------------------*/ + /* Little endian */ + #undef _STRUCT_HIGH_BIT_FIRST_ + #define _STRUCT_LOW_BIT_FIRST_ + + typedef unsigned char boolean; + typedef signed char int8; + typedef short int int16; + typedef long int int32; + _EXTENSION_ typedef long long int int64; + typedef unsigned char uint8; + typedef unsigned short int uint16; + typedef unsigned long int uint32; + _EXTENSION_ typedef unsigned long long int uint64; + + typedef unsigned long int cpuaddr; + +#elif defined (_ix64_) || defined (__x86_64__) +/* ----------------------- Intel/AMD x64 processor family -------------------------*/ + /* Little endian */ + #undef _STRUCT_HIGH_BIT_FIRST_ + #define _STRUCT_LOW_BIT_FIRST_ + + typedef unsigned char boolean; + typedef signed char int8; + typedef short int int16; + typedef int int32; + typedef long int int64; + typedef unsigned char uint8; + typedef unsigned short int uint16; + typedef unsigned int uint32; + typedef unsigned long int uint64; + + typedef unsigned long int cpuaddr; + +#elif defined(__PPC__) || defined (__ppc__) + /* ----------------------- Motorola Power PC family ---------------------------*/ + /* The PPC can be programmed to be big or little endian, we assume native */ + /* Big endian */ + #define _STRUCT_HIGH_BIT_FIRST_ + #undef _STRUCT_LOW_BIT_FIRST_ + + typedef unsigned char boolean; + typedef signed char int8; + typedef short int int16; + typedef long int int32; + _EXTENSION_ typedef long long int int64; + typedef unsigned char uint8; + typedef unsigned short int uint16; + typedef unsigned long int uint32; + _EXTENSION_ typedef unsigned long long int uint64; + + typedef unsigned long int cpuaddr; + +#elif defined(_m68k_) || defined(__m68k__) + /* ----------------------- Motorola m68k/Coldfire family ---------------------------*/ + /* Big endian */ + #define _STRUCT_HIGH_BIT_FIRST_ + #undef _STRUCT_LOW_BIT_FIRST_ + + typedef unsigned char boolean; + typedef signed char int8; + typedef short int int16; + typedef long int int32; + _EXTENSION_ typedef long long int int64; + typedef unsigned char uint8; + typedef unsigned short int uint16; + typedef unsigned long int uint32; + _EXTENSION_ typedef unsigned long long int uint64; + + typedef unsigned long int cpuaddr; + +#elif defined (__ARM__) || defined(__arm__) +/* ----------------------- ARM processor family -------------------------*/ + /* Little endian */ + #undef _STRUCT_HIGH_BIT_FIRST_ + #define _STRUCT_LOW_BIT_FIRST_ + + typedef unsigned char boolean; + typedef signed char int8; + typedef short int int16; + typedef long int int32; + _EXTENSION_ typedef long long int int64; + typedef unsigned char uint8; + typedef unsigned short int uint16; + typedef unsigned long int uint32; + _EXTENSION_ typedef unsigned long long int uint64; + + typedef unsigned long int cpuaddr; + +#elif defined(__SPARC__) || defined (_sparc_) + /* ----------------------- SPARC/LEON family ---------------------------*/ + /* SPARC Big endian */ + #define _STRUCT_HIGH_BIT_FIRST_ + #undef _STRUCT_LOW_BIT_FIRST_ + + typedef unsigned char boolean; + typedef signed char int8; + typedef short int int16; + typedef long int int32; + _EXTENSION_ typedef long long int int64; + typedef unsigned char uint8; + typedef unsigned short int uint16; + typedef unsigned long int uint32; + _EXTENSION_ typedef unsigned long long int uint64; + + typedef unsigned long int cpuaddr; + +#else /* not any of the above */ + #error undefined processor +#endif /* processor types */ + +#ifndef NULL /* pointer to nothing */ + #define NULL ((void *) 0) +#endif + +#ifndef TRUE /* Boolean true */ + #define TRUE (1) +#endif + +#ifndef FALSE /* Boolean false */ + #define FALSE (0) +#endif + +/* +** Check Sizes +*/ +CompileTimeAssert(sizeof(uint8)==1, TypeUint8WrongSize); +CompileTimeAssert(sizeof(uint16)==2, TypeUint16WrongSize); +CompileTimeAssert(sizeof(uint32)==4, TypeUint32WrongSize); +CompileTimeAssert(sizeof(uint64)==8, TypeUint64WrongSize); +CompileTimeAssert(sizeof(int8)==1, Typeint8WrongSize); +CompileTimeAssert(sizeof(int16)==2, Typeint16WrongSize); +CompileTimeAssert(sizeof(int32)==4, Typeint32WrongSize); +CompileTimeAssert(sizeof(int64)==8, Typeint64WrongSize); + +#ifdef __cplusplus + } +#endif + +#endif /* _common_types_ */ diff --git a/os/common/abstractions/nasa-osal/include/osapi-os-core.h b/os/common/abstractions/nasa-osal/include/osapi-os-core.h new file mode 100644 index 000000000..8c9b13a78 --- /dev/null +++ b/os/common/abstractions/nasa-osal/include/osapi-os-core.h @@ -0,0 +1,274 @@ +/* +** File: osapi-os-core.h +** +** Copyright (c) 2004-2006, United States government as represented by the +** administrator of the National Aeronautics Space Administration. +** All rights reserved. This software was created at NASAs Goddard +** Space Flight Center pursuant to government contracts. +** +** This is governed by the NASA Open Source Agreement and may be used, +** distributed and modified only pursuant to the terms of that agreement. +** +** Author: Ezra Yeheksli -Code 582/Raytheon +** +** Purpose: Contains functions prototype definitions and variables declarations +** for the OS Abstraction Layer, Core OS module +** +** $Revision: 1.8 $ +** +** $Date: 2013/07/25 10:02:00GMT-05:00 $ +** +** $Log: osapi-os-core.h $ +** Revision 1.8 2013/07/25 10:02:00GMT-05:00 acudmore +** removed circular include "osapi.h" +** Revision 1.7 2012/04/11 09:30:48GMT-05:00 acudmore +** Added OS_printf_enable and OS_printf_disable +** Revision 1.6 2010/11/12 12:00:17EST acudmore +** replaced copyright character with (c) and added open source notice where needed. +** Revision 1.5 2010/11/10 15:33:14EST acudmore +** Updated IntAttachHandler prototype +** Revision 1.4 2010/03/08 12:06:28EST acudmore +** added function pointer type to get rid of warnings +** Revision 1.3 2010/02/01 12:37:15EST acudmore +** added return code to OS API init +** Revision 1.2 2009/08/04 10:49:09EDT acudmore +** +*/ + +#ifndef _osapi_core_ +#define _osapi_core_ + +#include /* for va_list */ + +/*difines constants for OS_BinSemCreate for state of semaphore */ +#define OS_SEM_FULL 1 +#define OS_SEM_EMPTY 0 + +/* #define for enabling floating point operations on a task*/ +#define OS_FP_ENABLED 1 + +/* tables for the properties of objects */ + +/*tasks */ +typedef struct +{ + char name [OS_MAX_API_NAME]; + uint32 creator; + uint32 stack_size; + uint32 priority; + uint32 OStask_id; +}OS_task_prop_t; + +/* queues */ +typedef struct +{ + char name [OS_MAX_API_NAME]; + uint32 creator; +}OS_queue_prop_t; + +/* Binary Semaphores */ +typedef struct +{ + char name [OS_MAX_API_NAME]; + uint32 creator; + int32 value; +}OS_bin_sem_prop_t; + +/* Counting Semaphores */ +typedef struct +{ + char name [OS_MAX_API_NAME]; + uint32 creator; + int32 value; +}OS_count_sem_prop_t; + +/* Mutexes */ +typedef struct +{ + char name [OS_MAX_API_NAME]; + uint32 creator; +}OS_mut_sem_prop_t; + + +/* struct for OS_GetLocalTime() */ + +typedef struct +{ + uint32 seconds; + uint32 microsecs; +}OS_time_t; + +/* heap info */ +typedef struct +{ + uint32 free_bytes; + uint32 free_blocks; + uint32 largest_free_block; +}OS_heap_prop_t; + + +/* This typedef is for the OS_GetErrorName function, to ensure + * everyone is making an array of the same length */ + +typedef char os_err_name_t[35]; + +/* +** These typedefs are for the task entry point +*/ +typedef void osal_task; +typedef osal_task ((*osal_task_entry)(void)); + +/* +** Exported Functions +*/ + +/* +** Initialization of API +*/ +int32 OS_API_Init (void); + + +/* +** Task API +*/ + +int32 OS_TaskCreate (uint32 *task_id, const char *task_name, + osal_task_entry function_pointer, + const uint32 *stack_pointer, + uint32 stack_size, + uint32 priority, uint32 flags); + +int32 OS_TaskDelete (uint32 task_id); +void OS_TaskExit (void); +int32 OS_TaskInstallDeleteHandler(void *function_pointer); +int32 OS_TaskDelay (uint32 millisecond); +int32 OS_TaskSetPriority (uint32 task_id, uint32 new_priority); +int32 OS_TaskRegister (void); +uint32 OS_TaskGetId (void); +int32 OS_TaskGetIdByName (uint32 *task_id, const char *task_name); +int32 OS_TaskGetInfo (uint32 task_id, OS_task_prop_t *task_prop); + +/* +** Message Queue API +*/ + +/* +** Queue Create now has the Queue ID returned to the caller. +*/ +int32 OS_QueueCreate (uint32 *queue_id, const char *queue_name, + uint32 queue_depth, uint32 data_size, uint32 flags); +int32 OS_QueueDelete (uint32 queue_id); +int32 OS_QueueGet (uint32 queue_id, void *data, uint32 size, + uint32 *size_copied, int32 timeout); +int32 OS_QueuePut (uint32 queue_id, void *data, uint32 size, + uint32 flags); +int32 OS_QueueGetIdByName (uint32 *queue_id, const char *queue_name); +int32 OS_QueueGetInfo (uint32 queue_id, OS_queue_prop_t *queue_prop); + +/* +** Semaphore API +*/ + +int32 OS_BinSemCreate (uint32 *sem_id, const char *sem_name, + uint32 sem_initial_value, uint32 options); +int32 OS_BinSemFlush (uint32 sem_id); +int32 OS_BinSemGive (uint32 sem_id); +int32 OS_BinSemTake (uint32 sem_id); +int32 OS_BinSemTimedWait (uint32 sem_id, uint32 msecs); +int32 OS_BinSemDelete (uint32 sem_id); +int32 OS_BinSemGetIdByName (uint32 *sem_id, const char *sem_name); +int32 OS_BinSemGetInfo (uint32 sem_id, OS_bin_sem_prop_t *bin_prop); + +int32 OS_CountSemCreate (uint32 *sem_id, const char *sem_name, + uint32 sem_initial_value, uint32 options); +int32 OS_CountSemGive (uint32 sem_id); +int32 OS_CountSemTake (uint32 sem_id); +int32 OS_CountSemTimedWait (uint32 sem_id, uint32 msecs); +int32 OS_CountSemDelete (uint32 sem_id); +int32 OS_CountSemGetIdByName (uint32 *sem_id, const char *sem_name); +int32 OS_CountSemGetInfo (uint32 sem_id, OS_count_sem_prop_t *count_prop); + +/* +** Mutex API +*/ + +int32 OS_MutSemCreate (uint32 *sem_id, const char *sem_name, uint32 options); +int32 OS_MutSemGive (uint32 sem_id); +int32 OS_MutSemTake (uint32 sem_id); +int32 OS_MutSemDelete (uint32 sem_id); +int32 OS_MutSemGetIdByName (uint32 *sem_id, const char *sem_name); +int32 OS_MutSemGetInfo (uint32 sem_id, OS_mut_sem_prop_t *mut_prop); + +/* +** OS Time/Tick related API +*/ + +int32 OS_Milli2Ticks (uint32 milli_seconds); +int32 OS_Tick2Micros (void); +int32 OS_GetLocalTime (OS_time_t *time_struct); +int32 OS_SetLocalTime (OS_time_t *time_struct); + +/* +** Exception API +*/ + +int32 OS_ExcAttachHandler (uint32 ExceptionNumber, + void (*ExceptionHandler)(uint32, uint32 *,uint32), + int32 parameter); +int32 OS_ExcEnable (int32 ExceptionNumber); +int32 OS_ExcDisable (int32 ExceptionNumber); + +/* +** Floating Point Unit API +*/ + +int32 OS_FPUExcAttachHandler (uint32 ExceptionNumber, void * ExceptionHandler , + int32 parameter); +int32 OS_FPUExcEnable (int32 ExceptionNumber); +int32 OS_FPUExcDisable (int32 ExceptionNumber); +int32 OS_FPUExcSetMask (uint32 mask); +int32 OS_FPUExcGetMask (uint32 *mask); + +/* +** Interrupt API +*/ +int32 OS_IntAttachHandler (uint32 InterruptNumber, osal_task_entry InterruptHandler, int32 parameter); +int32 OS_IntUnlock (int32 IntLevel); +int32 OS_IntLock (void); + +int32 OS_IntEnable (int32 Level); +int32 OS_IntDisable (int32 Level); + +int32 OS_IntSetMask (uint32 mask); +int32 OS_IntGetMask (uint32 *mask); +int32 OS_IntAck (int32 InterruptNumber); + +/* +** Shared memory API +*/ +int32 OS_ShMemInit (void); +int32 OS_ShMemCreate (uint32 *Id, uint32 NBytes, char* SegName); +int32 OS_ShMemSemTake (uint32 Id); +int32 OS_ShMemSemGive (uint32 Id); +int32 OS_ShMemAttach (uint32 * Address, uint32 Id); +int32 OS_ShMemGetIdByName (uint32 *ShMemId, const char *SegName ); + +/* +** Heap API +*/ +int32 OS_HeapGetInfo (OS_heap_prop_t *heap_prop); + +/* +** API for useful debugging function +*/ +int32 OS_GetErrorName (int32 error_num, os_err_name_t* err_name); + + +/* +** Abstraction for printf statements +*/ +void OS_printf( const char *string, ...); +void OS_printf_disable(void); +void OS_printf_enable(void); + +#endif diff --git a/os/common/abstractions/nasa-osal/include/osapi-os-filesys.h b/os/common/abstractions/nasa-osal/include/osapi-os-filesys.h new file mode 100644 index 000000000..c46800341 --- /dev/null +++ b/os/common/abstractions/nasa-osal/include/osapi-os-filesys.h @@ -0,0 +1,419 @@ +/* +** File: osapi-os-filesys.h +** +** Copyright (c) 2004-2006, United States government as represented by the +** administrator of the National Aeronautics Space Administration. +** All rights reserved. This software was created at NASAs Goddard +** Space Flight Center pursuant to government contracts. +** +** This is governed by the NASA Open Source Agreement and may be used, +** distributed and modified only pursuant to the terms of that agreement. +** +** Author: Alan Cudmore Code 582 +** +** Purpose: Contains functions prototype definitions and variables declarations +** for the OS Abstraction Layer, File System module +** +** $Revision: 1.11 $ +** +** $Date: 2013/12/16 12:57:41GMT-05:00 $ +** +** $Log: osapi-os-filesys.h $ +** Revision 1.11 2013/12/16 12:57:41GMT-05:00 acudmore +** Added macros for Volume name length and physical device name length +** Revision 1.10 2013/07/29 12:05:48GMT-05:00 acudmore +** Added define for device and volume name length +** Revision 1.9 2013/07/25 14:31:21GMT-05:00 acudmore +** Added prototype and datatype for OS_GetFsInfo +** Revision 1.8 2011/12/05 12:04:21GMT-05:00 acudmore +** Added OS_rewinddir API +** Revision 1.7 2011/04/05 16:01:12EDT acudmore +** Added OS_CloseFileByName and OS_CloseAllFiles +** Revision 1.6 2010/11/15 11:04:38EST acudmore +** Added OS_FileOpenCheck function. +** Revision 1.5 2010/11/12 12:00:18EST acudmore +** replaced copyright character with (c) and added open source notice where needed. +** Revision 1.4 2010/02/01 12:28:57EST acudmore +** Added OS_fsBytesFree API +** Revision 1.3 2010/01/25 14:44:26EST acudmore +** renamed "new" variable to avoid C++ reserved name conflict. +** Revision 1.2 2009/07/14 15:16:05EDT acudmore +** Added OS_TranslatePath to the API +** Revision 1.1 2008/04/20 22:36:01EDT ruperera +** Initial revision +** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj +** Revision 1.1 2007/10/16 16:14:52EDT apcudmore +** Initial revision +** Member added to project d:/mksdata/MKS-OSAL-REPOSITORY/src/os/inc/project.pj +** Revision 1.1 2007/08/24 13:43:24EDT apcudmore +** Initial revision +** Member added to project d:/mksdata/MKS-CFE-PROJECT/fsw/cfe-core/os/inc/project.pj +** Revision 1.17 2007/06/07 09:59:14EDT njyanchik +** I replaced the second OS_cp definition with OS_mv +** Revision 1.16 2007/06/05 16:25:33EDT apcudmore +** Increased Number of volume table entries from 10 to 14. +** Added 2 extra EEPROM disk mappings to RAD750 Volume table + 2 spares +** Added 4 spares to every other volume table. +** Revision 1.15 2007/05/25 09:17:56EDT njyanchik +** I added the rmfs call to the OSAL and updated the unit test stubs to match +** Revision 1.14 2007/03/21 10:15:29EST njyanchik +** I mistakenly put the wrong length in for the path in the OS_FDTableEntry structure, and I added +** some code that will set and out of range file descriptors .IsValid flag to false in OS_FDGetInfo +** Revision 1.13 2007/03/06 11:52:46EST njyanchik +** This change goes with the previous CP, I forgot to include it +** Revision 1.12 2007/02/28 14:57:45EST njyanchik +** The updates for supporting copying and moving files are now supported +** Revision 1.11 2007/02/27 15:22:11EST njyanchik +** This CP has the initial import of the new file descripor table mechanism +** Revision 1.10 2006/12/20 10:27:09EST njyanchik +** This change package incorporates all the changes necessary for the addition +** of a new API to get the real physical drive undernieth a mount point +** Revision 1.9 2006/11/14 14:44:28GMT-05:00 njyanchik +** Checks were added to the OS fs calls that look at the return of a function that +** changes the name of paths from abstracted to local path names. +** Revision 1.8 2006/10/30 16:12:19GMT-05:00 apcudmore +** Updated Compact flash and RAM device names for vxWorks 6.2 changes. +** Revision 1.7 2006/10/25 11:31:18EDT njyanchik +** This CP incorporates changes to every bsp_voltab.c file. I increased the number +** entries in the volume table to 10. I also changed the #define in the os_filesys.h +** file for the number of entries to match. +** +** This update also includes adding the prototype for OS_initfs in os_filesys.h +** Revision 1.6 2006/09/26 09:03:46GMT-05:00 njyanchik +** Contains the initial import of the ES Shell commands interface +** Revision 1.5 2006/07/25 15:37:52EDT njyanchik +** It turns out the both the FS app and the OSAL were incorrect where file descriptors are +** concerned. the file descriptors should be int32 across the board. +** Revision 1.4 2006/01/20 11:56:18EST njyanchik +** Fixed header file information to match api document +** Revision 1.26 2005/07/12 17:13:56 nyanchik +** Moved the Volume table to a bsp table in the arch directories. +** +** Revision 1.2 2005/07/11 16:26:57EDT apcudmore +** OSAPI 2.0 integration +** Revision 1.25 2005/07/06 16:11:17 nyanchik +** *** empty log message *** +** +** Revision 1.24 2005/07/05 18:34:55 nyanchik +** fixed issues found in code walkthrogh. Also removed the OS_Info* functions that are going in the BSP +** +** Revision 1.23 2005/06/17 19:46:34 nyanchik +** added new file system style to linux and rtems. +** +** Revision 1.22 2005/06/15 16:43:48 nyanchik +** added extra parenthesis for the .h file # defines +** +** Revision 1.21 2005/06/06 14:17:42 nyanchik +** added headers to osapi-os-core.h and osapi-os-filesys.h +** +** Revision 1.20 2005/06/02 18:04:24 nyanchik +** *** empty log message *** +** +** Revision 1.1 2005/03/15 18:26:32 nyanchik +** *** empty log message *** +** +** +** Date Written: +** +** +*/ + +#ifndef _osapi_filesys_ +#define _osapi_filesys_ +#include +#include +#include +#include + +#define OS_READ_ONLY 0 +#define OS_WRITE_ONLY 1 +#define OS_READ_WRITE 2 + +#define OS_SEEK_SET 0 +#define OS_SEEK_CUR 1 +#define OS_SEEK_END 2 + +#define OS_CHK_ONLY 0 +#define OS_REPAIR 1 + +#define FS_BASED 0 +#define RAM_DISK 1 +#define EEPROM_DISK 2 +#define ATA_DISK 3 + + +/* +** Number of entries in the internal volume table +*/ +#define NUM_TABLE_ENTRIES 14 + +/* +** Length of a Device and Volume name +*/ +#define OS_FS_DEV_NAME_LEN 32 +#define OS_FS_PHYS_NAME_LEN 64 +#define OS_FS_VOL_NAME_LEN 32 + + +/* +** Defines for File System Calls +*/ +#define OS_FS_SUCCESS 0 +#define OS_FS_ERROR (-1) +#define OS_FS_ERR_INVALID_POINTER (-2) +#define OS_FS_ERR_PATH_TOO_LONG (-3) +#define OS_FS_ERR_NAME_TOO_LONG (-4) +#define OS_FS_UNIMPLEMENTED (-5) +#define OS_FS_ERR_DRIVE_NOT_CREATED (-6) +#define OS_FS_ERR_DEVICE_NOT_FREE (-7) +#define OS_FS_ERR_PATH_INVALID (-8) +#define OS_FS_ERR_NO_FREE_FDS (-9) +#define OS_FS_ERR_INVALID_FD (-10) + +/* This typedef is for the OS_FS_GetErrorName function, to ensure + * everyone is making an array of the same length */ + +typedef char os_fs_err_name_t[35]; + + +/* +** Internal structure of the OS volume table for +** mounted file systems and path translation +*/ +typedef struct +{ + char DeviceName [OS_FS_DEV_NAME_LEN]; + char PhysDevName [OS_FS_PHYS_NAME_LEN]; + uint32 VolumeType; + uint8 VolatileFlag; + uint8 FreeFlag; + uint8 IsMounted; + char VolumeName [OS_FS_VOL_NAME_LEN]; + char MountPoint [OS_MAX_PATH_LEN]; + uint32 BlockSize; + +}OS_VolumeInfo_t; + +typedef struct +{ + int32 OSfd; /* The underlying OS's file descriptor */ + char Path[OS_MAX_PATH_LEN]; /* The path of the file opened */ + uint32 User; /* The task id of the task who opened the file*/ + uint8 IsValid; /* Whether or not this entry is valid */ +}OS_FDTableEntry; + +typedef struct +{ + uint32 MaxFds; /* Total number of file descriptors */ + uint32 FreeFds; /* Total number that are free */ + uint32 MaxVolumes; /* Maximum number of volumes */ + uint32 FreeVolumes; /* Total number of volumes free */ +} os_fsinfo_t; + +/* modified to posix calls, since all of the + * applicable OSes use the posix calls */ + +typedef struct stat os_fstat_t; +typedef DIR* os_dirp_t; +typedef struct dirent os_dirent_t; +/* still don't know what this should be*/ +typedef unsigned long int os_fshealth_t; + +/* + * Exported Functions +*/ + + +/****************************************************************************** +** Standard File system API +******************************************************************************/ +/* + * Initializes the File System functions +*/ + +int32 OS_FS_Init(void); + +/* + * Creates a file specified by path +*/ +int32 OS_creat (const char *path, int32 access); + +/* + * Opend a file for reading/writing. Returns file descriptor +*/ +int32 OS_open (const char *path, int32 access, uint32 mode); + +/* + * Closes an open file. +*/ +int32 OS_close (int32 filedes); + +/* + * Reads nbytes bytes from file into buffer +*/ +int32 OS_read (int32 filedes, void *buffer, uint32 nbytes); + +/* + * Write nybytes bytes of buffer into the file +*/ +int32 OS_write (int32 filedes, void *buffer, uint32 nbytes); + +/* + * Changes the permissions of a file +*/ +int32 OS_chmod (const char *path, uint32 access); + +/* + * Returns file status information in filestats +*/ +int32 OS_stat (const char *path, os_fstat_t *filestats); + +/* + * Seeks to the specified position of an open file +*/ +int32 OS_lseek (int32 filedes, int32 offset, uint32 whence); + +/* + * Removes a file from the file system +*/ +int32 OS_remove (const char *path); + +/* + * Renames a file in the file system +*/ +int32 OS_rename (const char *old_filename, const char *new_filename); + +/* + * copies a single file from src to dest +*/ +int32 OS_cp (const char *src, const char *dest); + +/* + * moves a single file from src to dest +*/ +int32 OS_mv (const char *src, const char *dest); + +/* + * Copies the info of an open file to the structure +*/ +int32 OS_FDGetInfo (int32 filedes, OS_FDTableEntry *fd_prop); + +/* +** Check to see if a file is open +*/ +int32 OS_FileOpenCheck(char *Filename); + +/* +** Close all open files +*/ +int32 OS_CloseAllFiles(void); + +/* +** Close a file by filename +*/ +int32 OS_CloseFileByName(char *Filename); + + +/****************************************************************************** +** Directory API +******************************************************************************/ + +/* + * Makes a new directory +*/ +int32 OS_mkdir (const char *path, uint32 access); + +/* + * Opens a directory for searching +*/ +os_dirp_t OS_opendir (const char *path); + +/* + * Closes an open directory +*/ +int32 OS_closedir(os_dirp_t directory); + +/* + * Rewinds an open directory +*/ +void OS_rewinddir(os_dirp_t directory); + +/* + * Reads the next object in the directory +*/ +os_dirent_t * OS_readdir (os_dirp_t directory); + +/* + * Removes an empty directory from the file system. +*/ +int32 OS_rmdir (const char *path); + +/****************************************************************************** +** System Level API +******************************************************************************/ +/* + * Makes a file system +*/ +int32 OS_mkfs (char *address,char *devname, char *volname, + uint32 blocksize, uint32 numblocks); +/* + * Mounts a file system +*/ +int32 OS_mount (const char *devname, char *mountpoint); + +/* + * Initializes an existing file system +*/ +int32 OS_initfs (char *address,char *devname, char *volname, + uint32 blocksize, uint32 numblocks); + +/* + * removes a file system +*/ +int32 OS_rmfs (char *devname); + +/* + * Unmounts a mounted file system +*/ +int32 OS_unmount (const char *mountpoint); + +/* + * Returns the number of free blocks in a file system +*/ +int32 OS_fsBlocksFree (const char *name); + +/* +** Returns the number of free bytes in a file system +** Note the 64 bit data type to support filesystems that +** are greater than 4 Gigabytes +*/ +int32 OS_fsBytesFree (const char *name, uint64 *bytes_free); + +/* + * Checks the health of a file system and repairs it if neccesary +*/ +os_fshealth_t OS_chkfs (const char *name, boolean repair); + +/* + * Returns in the parameter the physical drive underneith the mount point +*/ +int32 OS_FS_GetPhysDriveName (char * PhysDriveName, char * MountPoint); + +/* +** Translates a OSAL Virtual file system path to a host Local path +*/ +int32 OS_TranslatePath ( const char *VirtualPath, char *LocalPath); + +/* +** Returns information about the file system in an os_fsinfo_t +*/ +int32 OS_GetFsInfo(os_fsinfo_t *filesys_info); + +/****************************************************************************** +** Shell API +******************************************************************************/ + +/* executes the shell command passed into is and writes the output of that + * command to the file specified by the given OSAPI file descriptor */ +int32 OS_ShellOutputToFile(char* Cmd, int32 OS_fd); +#endif diff --git a/os/common/abstractions/nasa-osal/include/osapi-os-loader.h b/os/common/abstractions/nasa-osal/include/osapi-os-loader.h new file mode 100644 index 000000000..4f0b21b62 --- /dev/null +++ b/os/common/abstractions/nasa-osal/include/osapi-os-loader.h @@ -0,0 +1,91 @@ +/* +** File: osapi-os-loader.h +** +** Copyright (c) 2004-2006, United States government as represented by the +** administrator of the National Aeronautics Space Administration. +** All rights reserved. This software was created at NASAs Goddard +** Space Flight Center pursuant to government contracts. +** +** This is governed by the NASA Open Source Agreement and may be used, +** distributed and modified only pursuant to the terms of that agreement. +** +** Author: Alan Cudmore - Code 582 +** +** Purpose: Contains functions prototype definitions and variables declarations +** for the OS Abstraction Layer, Object file loader API +** +** $Revision: 1.5 $ +** +** $Date: 2013/07/25 10:02:08GMT-05:00 $ +** +** $Log: osapi-os-loader.h $ +** Revision 1.5 2013/07/25 10:02:08GMT-05:00 acudmore +** removed circular include "osapi.h" +** Revision 1.4 2010/11/12 12:00:18GMT-05:00 acudmore +** replaced copyright character with (c) and added open source notice where needed. +** Revision 1.3 2010/02/01 12:38:06EST acudmore +** added return code to OS_ModuleTableInit +** Revision 1.2 2008/06/20 15:13:43EDT apcudmore +** Checked in new Module loader/symbol table functionality +** Revision 1.1 2008/04/20 22:36:02EDT ruperera +** Initial revision +** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj +** Revision 1.1 2008/02/07 11:08:24EST apcudmore +** Initial revision +** Member added to project d:/mksdata/MKS-OSAL-REPOSITORY/src/os/inc/project.pj +** +** +*/ + +#ifndef _osapi_loader_ +#define _osapi_loader_ + +/* +** Defines +*/ + + +/* +** Typedefs +*/ + +typedef struct +{ + uint32 valid; + uint32 code_address; + uint32 code_size; + uint32 data_address; + uint32 data_size; + uint32 bss_address; + uint32 bss_size; + uint32 flags; +} OS_module_address_t; + +typedef struct +{ + int free; + uint32 entry_point; + uint32 host_module_id; + char filename[OS_MAX_PATH_LEN]; + char name[OS_MAX_API_NAME]; + OS_module_address_t addr; + +} OS_module_record_t; + +/* +** Loader API +*/ +int32 OS_ModuleTableInit ( void ); + +int32 OS_SymbolLookup (uint32 *symbol_address, char *symbol_name ); + +int32 OS_SymbolTableDump ( char *filename, uint32 size_limit ); + +int32 OS_ModuleLoad ( uint32 *module_id, char *module_name, char *filename ); + +int32 OS_ModuleUnload ( uint32 module_id ); + +int32 OS_ModuleInfo ( uint32 module_id, OS_module_record_t *module_info ); + + +#endif diff --git a/os/common/abstractions/nasa-osal/include/osapi-os-net.h b/os/common/abstractions/nasa-osal/include/osapi-os-net.h new file mode 100644 index 000000000..b8cc67d69 --- /dev/null +++ b/os/common/abstractions/nasa-osal/include/osapi-os-net.h @@ -0,0 +1,61 @@ +/* +** File: osapi-os-net.h +** +** Copyright (c) 2004-2006, United States government as represented by the +** administrator of the National Aeronautics Space Administration. +** All rights reserved. This software was created at NASAs Goddard +** Space Flight Center pursuant to government contracts. +** +** This is governed by the NASA Open Source Agreement and may be used, +** distributed and modified only pursuant to the terms of that agreement. +** +** Author: Alan Cudmore Code 582 +** +** Purpose: Contains functions prototype definitions and variables declarations +** for the OS Abstraction Layer, Network Module +** +** $Revision: 1.2 $ +** +** $Date: 2010/11/12 12:00:19GMT-05:00 $ +** +** $Log: osapi-os-net.h $ +** Revision 1.2 2010/11/12 12:00:19GMT-05:00 acudmore +** replaced copyright character with (c) and added open source notice where needed. +** Revision 1.1 2008/04/20 22:36:02EDT ruperera +** Initial revision +** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj +** Revision 1.1 2007/10/16 16:14:52EDT apcudmore +** Initial revision +** Member added to project d:/mksdata/MKS-OSAL-REPOSITORY/src/os/inc/project.pj +** Revision 1.1 2007/08/24 13:43:25EDT apcudmore +** Initial revision +** Member added to project d:/mksdata/MKS-CFE-PROJECT/fsw/cfe-core/os/inc/project.pj +** Revision 1.3 2006/01/20 11:56:18EST njyanchik +** Fixed header file information to match api document +** Revision 1.4 2005/06/07 16:49:31 nyanchik +** changed returns code for osapi.c to all int32 from uint32 +** +** Revision 1.3 2005/03/22 19:04:54 acudmore +** fixed uint type +** +** Revision 1.2 2005/03/22 18:59:33 acudmore +** updated prototype +** +** Revision 1.1 2005/03/22 18:58:51 acudmore +** added osapi network interface +** +** Revision 1.1 2005/03/15 18:26:32 nyanchik +** *** empty log message *** +** +** +** Date Written: +** +** +*/ +#ifndef _osapi_network_ +#define _osapi_network_ + +int32 OS_NetworkGetID (void); +int32 OS_NetworkGetHostName (char *host_name, uint32 name_len); + +#endif diff --git a/os/common/abstractions/nasa-osal/include/osapi-os-timer.h b/os/common/abstractions/nasa-osal/include/osapi-os-timer.h new file mode 100644 index 000000000..8082c6227 --- /dev/null +++ b/os/common/abstractions/nasa-osal/include/osapi-os-timer.h @@ -0,0 +1,68 @@ +/* +** File: osapi-os-timer.h +** +** Copyright (c) 2004-2006, United States government as represented by the +** administrator of the National Aeronautics Space Administration. +** All rights reserved. This software was created at NASAs Goddard +** Space Flight Center pursuant to government contracts. +** +** This is governed by the NASA Open Source Agreement and may be used, +** distributed and modified only pursuant to the terms of that agreement. +** +** Author: Alan Cudmore - Code 582 +** +** Purpose: Contains functions prototype definitions and variable declarations +** for the OS Abstraction Layer, Timer API +** +** $Revision: 1.5 $ +** +** $Date: 2013/07/25 10:02:20GMT-05:00 $ +** +** $Log: osapi-os-timer.h $ +** Revision 1.5 2013/07/25 10:02:20GMT-05:00 acudmore +** removed circular include "osapi.h" +** Revision 1.4 2010/11/12 12:00:19GMT-05:00 acudmore +** replaced copyright character with (c) and added open source notice where needed. +** Revision 1.3 2010/02/01 12:38:34EST acudmore +** Added return code to OS_TimerAPIInit +** Revision 1.2 2008/08/26 13:52:52EDT apcudmore +** removed linux specific define +** Revision 1.1 2008/08/20 16:12:07EDT apcudmore +** Initial revision +** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj +** +** +*/ + +#ifndef _osapi_timer_ +#define _osapi_timer_ + +/* +** Typedefs +*/ +typedef void (*OS_TimerCallback_t)(uint32 timer_id); + +typedef struct +{ + char name[OS_MAX_API_NAME]; + uint32 creator; + uint32 start_time; + uint32 interval_time; + uint32 accuracy; + +} OS_timer_prop_t; + + +/* +** Timer API +*/ +int32 OS_TimerAPIInit (void); + +int32 OS_TimerCreate (uint32 *timer_id, const char *timer_name, uint32 *clock_accuracy, OS_TimerCallback_t callback_ptr); +int32 OS_TimerSet (uint32 timer_id, uint32 start_msec, uint32 interval_msec); +int32 OS_TimerDelete (uint32 timer_id); + +int32 OS_TimerGetIdByName (uint32 *timer_id, const char *timer_name); +int32 OS_TimerGetInfo (uint32 timer_id, OS_timer_prop_t *timer_prop); + +#endif diff --git a/os/common/abstractions/nasa-osal/include/osapi-version.h b/os/common/abstractions/nasa-osal/include/osapi-version.h new file mode 100644 index 000000000..331e96c94 --- /dev/null +++ b/os/common/abstractions/nasa-osal/include/osapi-version.h @@ -0,0 +1,48 @@ +/************************************************************************ +** File: +** $Id: osapi-version.h 1.11 2014/05/02 13:53:14GMT-05:00 acudmore Exp $ +** +** Copyright (c) 2004-2006, United States government as represented by the +** administrator of the National Aeronautics Space Administration. +** All rights reserved. This software was created at NASAs Goddard +** Space Flight Center pursuant to government contracts. +** +** This is governed by the NASA Open Source Agreement and may be used, +** distributed and modified only pursuant to the terms of that agreement. +** +** Purpose: +** The OSAL version numbers +** +** Notes: +** +** $Log: osapi-version.h $ +** Revision 1.11 2014/05/02 13:53:14GMT-05:00 acudmore +** Updated version to 4.1.1 +** Revision 1.10 2014/01/23 16:33:31GMT-05:00 acudmore +** Update for 4.1 release +** Revision 1.9 2013/01/16 14:35:18GMT-05:00 acudmore +** updated version label +** Revision 1.8 2012/04/16 14:57:04GMT-05:00 acudmore +** Updated version label to 3.5.0.0 +** Revision 1.7 2012/01/17 16:04:29EST acudmore +** Updated version to 3.4.1 +** Revision 1.6 2011/12/05 15:45:16EST acudmore +** Updated version label to 3.4.0 +** Initial revision +** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj +** +*************************************************************************/ +#ifndef _osapi_version_h_ +#define _osapi_version_h_ + +#define OS_MAJOR_VERSION (4) +#define OS_MINOR_VERSION (1) +#define OS_REVISION (1) +#define OS_MISSION_REV (0) + + +#endif /* _osapi_version_h_ */ + +/************************/ +/* End of File Comment */ +/************************/ diff --git a/os/common/abstractions/nasa-osal/include/osapi.h b/os/common/abstractions/nasa-osal/include/osapi.h new file mode 100644 index 000000000..46f6dc031 --- /dev/null +++ b/os/common/abstractions/nasa-osal/include/osapi.h @@ -0,0 +1,142 @@ +/* +** File: osapi.h +** +** Copyright (c) 2004-2006, United States government as represented by the +** administrator of the National Aeronautics Space Administration. +** All rights reserved. This software was created at NASAs Goddard +** Space Flight Center pursuant to government contracts. +** +** This is governed by the NASA Open Source Agreement and may be used, +** distributed and modified only pursuant to the terms of that agreement. +** +** Author: Alan Cudmore - Code 582 +** +** Purpose: Contains functions prototype definitions and variables declarations +** for the OS Abstraction Layer, Core OS module +** +** $Revision: 1.10 $ +** +** $Date: 2013/07/25 10:01:32GMT-05:00 $ +** +** $Log: osapi.h $ +** Revision 1.10 2013/07/25 10:01:32GMT-05:00 acudmore +** Added C++ support +** Revision 1.9 2010/11/12 12:00:17GMT-05:00 acudmore +** replaced copyright character with (c) and added open source notice where needed. +** Revision 1.8 2010/03/08 15:57:20EST acudmore +** include new OSAL version header file +** Revision 1.7 2009/08/10 14:01:10EDT acudmore +** Reset OSAL version for trunk +** Revision 1.6 2009/08/10 13:55:49EDT acudmore +** Updated OSAL version defines to 3.0 +** Revision 1.5 2009/06/10 14:15:55EDT acudmore +** Removed HAL include files. HAL code was removed from OSAL. +** Revision 1.4 2008/08/20 16:12:51EDT apcudmore +** Updated timer error codes +** Revision 1.3 2008/08/20 15:46:27EDT apcudmore +** Add support for timer API +** Revision 1.2 2008/06/20 15:13:43EDT apcudmore +** Checked in new Module loader/symbol table functionality +** Revision 1.1 2008/04/20 22:36:02EDT ruperera +** Initial revision +** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj +** Revision 1.6 2008/02/14 11:29:10EST apcudmore +** Updated version define ( 2.11 ) +** Revision 1.5 2008/02/07 11:31:58EST apcudmore +** Fixed merge problem +** Revision 1.4 2008/02/07 11:07:29EST apcudmore +** Added dynamic loader / Symbol lookup API +** -- API only, next release will have functionality +** Revision 1.2 2008/01/29 14:30:49EST njyanchik +** I added code to all the ports that allow the values of both binary and counting semaphores to be +** gotten through the OS_*SemGetInfo API. +** Revision 1.1 2007/10/16 16:14:52EDT apcudmore +** Initial revision +** Member added to project d:/mksdata/MKS-OSAL-REPOSITORY/src/os/inc/project.pj +** Revision 1.2 2007/09/28 15:46:49EDT rjmcgraw +** Updated version numbers to 5.0 +** Revision 1.1 2007/08/24 13:43:25EDT apcudmore +** Initial revision +** Member added to project d:/mksdata/MKS-CFE-PROJECT/fsw/cfe-core/os/inc/project.pj +** Revision 1.9.1.1 2007/05/21 08:58:51EDT njyanchik +** The trunk version number has been updated to version 0.0 +** Revision 1.9 2006/06/12 10:20:07EDT rjmcgraw +** Updated OS_MINOR_VERSION from 3 to 4 +** Revision 1.8 2006/02/03 09:30:45EST njyanchik +** Changed version number to 2.3 +** Revision 1.7 2006/01/20 11:56:16EST njyanchik +** Fixed header file information to match api document +** Revision 1.15 2005/11/09 13:35:49 nyanchik +** Revisions for 2.2 include: +** a new scheduler mapper for Linux and OS X +** addition of OS_printf function +** fixed issues that would cause warnings at compile time +** +** +*/ + +#ifndef _osapi_ +#define _osapi_ + +#include "common_types.h" + +#ifdef __cplusplus + extern "C" { +#endif + +#define OS_SUCCESS (0) +#define OS_ERROR (-1) +#define OS_INVALID_POINTER (-2) +#define OS_ERROR_ADDRESS_MISALIGNED (-3) +#define OS_ERROR_TIMEOUT (-4) +#define OS_INVALID_INT_NUM (-5) +#define OS_SEM_FAILURE (-6) +#define OS_SEM_TIMEOUT (-7) +#define OS_QUEUE_EMPTY (-8) +#define OS_QUEUE_FULL (-9) +#define OS_QUEUE_TIMEOUT (-10) +#define OS_QUEUE_INVALID_SIZE (-11) +#define OS_QUEUE_ID_ERROR (-12) +#define OS_ERR_NAME_TOO_LONG (-13) +#define OS_ERR_NO_FREE_IDS (-14) +#define OS_ERR_NAME_TAKEN (-15) +#define OS_ERR_INVALID_ID (-16) +#define OS_ERR_NAME_NOT_FOUND (-17) +#define OS_ERR_SEM_NOT_FULL (-18) +#define OS_ERR_INVALID_PRIORITY (-19) +#define OS_INVALID_SEM_VALUE (-20) +#define OS_ERR_FILE (-27) +#define OS_ERR_NOT_IMPLEMENTED (-28) +#define OS_TIMER_ERR_INVALID_ARGS (-29) +#define OS_TIMER_ERR_TIMER_ID (-30) +#define OS_TIMER_ERR_UNAVAILABLE (-31) +#define OS_TIMER_ERR_INTERNAL (-32) + +/* +** Defines for Queue Timeout parameters +*/ +#define OS_PEND (0) +#define OS_CHECK (-1) + +#include "osapi-version.h" + +/* +** Include the configuration file +*/ +#include "osconfig.h" + +/* +** Include the OS API modules +*/ +#include "osapi-os-core.h" +//#include "osapi-os-filesys.h" +//#include "osapi-os-net.h" +//#include "osapi-os-loader.h" +#include "osapi-os-timer.h" + +#ifdef __cplusplus + } +#endif + +#endif + diff --git a/os/common/abstractions/nasa-osal/nasa-osal.mk b/os/common/abstractions/nasa-osal/nasa-osal.mk new file mode 100644 index 000000000..9562970a0 --- /dev/null +++ b/os/common/abstractions/nasa-osal/nasa-osal.mk @@ -0,0 +1,4 @@ +# NASAOSAL files. +NASAOSALSRC = $(CHIBIOS)/os/common/abstractions/nasa-osal/src/osapi.c + +NASAOSALINC = $(CHIBIOS)/os/common/abstractions/nasa-osal/include diff --git a/os/common/abstractions/nasa-osal/src/osapi.c b/os/common/abstractions/nasa-osal/src/osapi.c new file mode 100644 index 000000000..b69caea62 --- /dev/null +++ b/os/common/abstractions/nasa-osal/src/osapi.c @@ -0,0 +1,1227 @@ +/* + ChibiOS - Copyright (C) 2006..2016 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 osapi.c + * @brief OS API module code. + * + * @addtogroup nasa_osapi + * @{ + */ + +#include + +#include "ch.h" + +#include "common_types.h" +#include "osapi.h" + +#if CH_CFG_USE_MUTEXES == FALSE +#error "NASA OSAL requires CH_CFG_USE_MUTEXES" +#endif + +#if CH_CFG_USE_SEMAPHORES == FALSE +#error "NASA OSAL requires CH_CFG_USE_SEMAPHORES" +#endif + +#if CH_CFG_USE_REGISTRY == FALSE +#error "NASA OSAL requires CH_CFG_USE_REGISTRY" +#endif + +#if CH_CFG_USE_MEMCORE == FALSE +#error "NASA OSAL requires CH_CFG_USE_MEMCORE" +#endif + +#if CH_CFG_USE_MEMPOOLS == FALSE +#error "NASA OSAL requires CH_CFG_USE_MEMPOOLS" +#endif + +/*===========================================================================*/ +/* Module local definitions. */ +/*===========================================================================*/ + +#define MIN_PRIORITY 1 +#define MAX_PRIORITY 255 + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local types. */ +/*===========================================================================*/ + +/** + * @brief Type of OSAL main structure. + */ +typedef struct { + bool printf_enabled; + memory_pool_t binary_semaphores_pool; + memory_pool_t count_semaphores_pool; + memory_pool_t mutexes_pool; + binary_semaphore_t binary_semaphores[OS_MAX_BIN_SEMAPHORES]; + semaphore_t count_semaphores[OS_MAX_COUNT_SEMAPHORES]; + mutex_t mutexes[OS_MAX_MUTEXES]; +} osal_t; + +/*===========================================================================*/ +/* Module local variables. */ +/*===========================================================================*/ + +static osal_t osal; + +/*===========================================================================*/ +/* Module local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported functions. */ +/*===========================================================================*/ + +/*-- Initialization API -----------------------------------------------------*/ + +/** + * @brief OS initialization. + * @details This function returns initializes the internal data structures + * of the OS Abstraction Layer. It must be called in the application + * startup code before calling any other OS routines. + * + * @return kAn error code. + * + * @api + */ +int32 OS_API_Init(void) { + + chSysInit(); + + /* OS_printf() initially disabled.*/ + osal.printf_enabled = false; + + /* 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)); + + /* Counter Semaphores pool initialization.*/ + chPoolObjectInit(&osal.count_semaphores_pool, + sizeof (semaphore_t), + NULL); + chPoolLoadArray(&osal.count_semaphores_pool, + &osal.count_semaphores, + sizeof (semaphore_t)); + + /* Mutexes pool initialization.*/ + chPoolObjectInit(&osal.mutexes_pool, + sizeof (mutex_t), + NULL); + chPoolLoadArray(&osal.mutexes_pool, + &osal.mutexes, + sizeof (mutex_t)); + + return OS_SUCCESS; +} + +/*-- Various API -----------------------------------------------------------*/ + +/** + * @brief OS printf-like function. + * @note It is initially disabled. + * @note It is not currently implemented. + * + * @param[in] string formatter string + * + * @api + */ +void OS_printf(const char *string, ...) { + + (void)string; + + if (osal.printf_enabled) { + + } +} + +/** + * @brief Disables @p OS_printf(). + * + * @api + */ +void OS_printf_disable(void) { + + osal.printf_enabled = false; +} + +/** + * @brief Enables @p OS_printf(). + * + * @api + */ +void OS_printf_enable(void) { + + osal.printf_enabled = true; +} + +/** + * @brief System tick period in microseconds. + * + * @return The system tick period. + */ +int32 OS_Tick2Micros(void) { + + return 1000000 / CH_CFG_ST_FREQUENCY; +} + +/** + * @brief Returns the local time. + * @note It is not currently implemented. + * + * @param[out] time_struct the system time + * @return An error code. + * + * @api + */ +int32 OS_GetLocalTime(OS_time_t *time_struct) { + + if (time_struct == NULL) { + return OS_INVALID_POINTER; + } + + time_struct->seconds = 0; + time_struct->microsecs = 0; + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** + * @brief Changes the local time. + * @note It is not currently implemented. + * + * @param[in] time_struct the system time + * @return An error code. + * + * @api + */ +int32 OS_SetLocalTime(OS_time_t *time_struct) { + + if (time_struct == NULL) { + return OS_INVALID_POINTER; + } + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** + * @brief Conversion from milliseconds to ticks. + * + * @param[in] milli_seconds the time in milliseconds + * @return The system ticks. + * + * @api + */ +int32 OS_Milli2Ticks(uint32 milli_seconds) { + + return (int32)MS2ST(milli_seconds); +} + +/*-- Queues API -------------------------------------------------------------*/ + +/*-- Binary Semaphore API ---------------------------------------------------*/ + +/** + * @brief Binary semaphore creation. + * + * @param[out] sem_id pointer to a binary semaphore id variable + * @param[in] sem_name the binary semaphore name + * @param[in] sem_initial_value semaphore initial value + * @param[in] options semaphore options + * @return An error code. + * + * @api + */ +int32 OS_BinSemCreate (uint32 *sem_id, const char *sem_name, + uint32 sem_initial_value, uint32 options) { + binary_semaphore_t *bsp; + + (void)options; + + /* NULL pointer checks.*/ + if ((sem_id == NULL) || (sem_name == NULL)) { + return OS_INVALID_POINTER; + } + + /* Checking semaphore name length.*/ + if (strlen(sem_name) >= OS_MAX_API_NAME) { + return OS_ERR_NAME_TOO_LONG; + } + + /* Semaphore counter check, it is binary so only 0 and 1.*/ + if (sem_initial_value > 1) { + return OS_INVALID_INT_NUM; + } + + bsp = chPoolAlloc(&osal.binary_semaphores_pool); + + if (bsp == 0) { + return OS_SEM_FAILURE; + } + + /* Semaphore is initialized.*/ + chBSemObjectInit(bsp, sem_initial_value == 0 ? false : true); + + *sem_id = (uint32)bsp; + + return OS_SUCCESS; +} + +/** + * @brief Binary semaphore deletion. + * + * @param[in] sem_id binary semaphore id variable + * @return An error code. + * + * @api + */ +int32 OS_BinSemDelete(uint32 sem_id) { + binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; + + if ((bsp < &osal.binary_semaphores[0]) || + (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* Resetting the semaphore, no threads in queue.*/ + chBSemResetI(bsp, true); + + /* Flagging it as unused and returning it to the pool.*/ + bsp->sem.queue.prev = NULL; + chPoolFreeI(&osal.binary_semaphores_pool, (void *)bsp); + + /* Required because some thread could have been made ready.*/ + chSchRescheduleS(); + + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Binary semaphore flush. + * @note The state of the binary semaphore is not changed. + * + * @param[in] sem_id binary semaphore id variable + * @return An error code. + * + * @api + */ +int32 OS_BinSemFlush(uint32 sem_id) { + binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; + + if ((bsp < &osal.binary_semaphores[0]) || + (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* If the semaphore is not in use then error.*/ + if (bsp->sem.queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + if (bsp->sem.cnt < 0) { + chBSemResetI(bsp, true); + chSchRescheduleS(); + } + + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Binary semaphore give. + * + * @param[in] sem_id binary semaphore id variable + * @return An error code. + * + * @api + */ +int32 OS_BinSemGive(uint32 sem_id) { + binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; + + if ((bsp < &osal.binary_semaphores[0]) || + (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* If the semaphore is not in use then error.*/ + if (bsp->sem.queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + chBSemSignalI(bsp); + chSchRescheduleS(); + + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Binary semaphore take. + * + * @param[in] sem_id binary semaphore id variable + * @return An error code. + * + * @api + */ +int32 OS_BinSemTake(uint32 sem_id) { + binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; + + if ((bsp < &osal.binary_semaphores[0]) || + (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* If the semaphore is not in use then error.*/ + if (bsp->sem.queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + (void) chBSemWaitS(bsp); + + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Binary semaphore take with timeout. + * + * @param[in] sem_id binary semaphore id variable + * @param[in] msecs timeout in milliseconds + * @return An error code. + * + * @api + */ +int32 OS_BinSemTimedWait(uint32 sem_id, uint32 msecs) { + binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; + msg_t msg; + + if ((bsp < &osal.binary_semaphores[0]) || + (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + /* Timeouts of zero not allowed.*/ + if (msecs == 0) { + return OS_INVALID_INT_NUM; + } + + chSysLock(); + + /* If the semaphore is not in use then error.*/ + if (bsp->sem.queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + msg = chBSemWaitTimeoutS(bsp, MS2ST(msecs)); + + chSysUnlock(); + + return msg == MSG_TIMEOUT ? OS_SEM_TIMEOUT : OS_SUCCESS; +} + +/** + * @brief Retrieves a binary semaphore id by name. + * @note It is not currently implemented. + * + * @param[out] sem_id pointer to a binary semaphore id variable + * @param[in] sem_name the binary semaphore name + * @return An error code. + * + * @api + */ +int32 OS_BinSemGetIdByName(uint32 *sem_id, const char *sem_name) { + + /* NULL pointer checks.*/ + if ((sem_id == NULL) || (sem_name == NULL)) { + return OS_INVALID_POINTER; + } + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** + * @brief Returns binary semaphore information. + * + * @param[in] sem_id binary semaphore id variable + * @param[in] bin_prop binary semaphore properties + * @return An error code. + * + * @api + */ +int32 OS_BinSemGetInfo(uint32 sem_id, OS_bin_sem_prop_t *bin_prop) { + binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; + + /* NULL pointer checks.*/ + if (bin_prop == NULL) { + return OS_INVALID_POINTER; + } + + if ((bsp < &osal.binary_semaphores[0]) || + (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* If the semaphore is not in use then error.*/ + if (bsp->sem.queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + chSysUnlock(); + + return OS_ERR_NOT_IMPLEMENTED; +} + +/*-- Counter Semaphore API --------------------------------------------------*/ + +/** + * @brief Counter semaphore creation. + * + * @param[out] sem_id pointer to a counter semaphore id variable + * @param[in] sem_name the counter semaphore name + * @param[in] sem_initial_value semaphore initial value + * @param[in] options semaphore options + * @return An error code. + * + * @api + */ +int32 OS_CountSemCreate (uint32 *sem_id, const char *sem_name, + uint32 sem_initial_value, uint32 options) { + semaphore_t *sp; + + (void)options; + + /* NULL pointer checks.*/ + if ((sem_id == NULL) || (sem_name == NULL)) { + return OS_INVALID_POINTER; + } + + /* Checking semaphore name length.*/ + if (strlen(sem_name) >= OS_MAX_API_NAME) { + return OS_ERR_NAME_TOO_LONG; + } + + /* Semaphore counter check, it must be non-negative.*/ + if ((int32)sem_initial_value < 0) { + return OS_INVALID_INT_NUM; + } + + sp = chPoolAlloc(&osal.count_semaphores_pool); + + if (sp == 0) { + return OS_SEM_FAILURE; + } + + /* Semaphore is initialized.*/ + chSemObjectInit(sp, (cnt_t)sem_initial_value); + + *sem_id = (uint32)sp; + + return OS_SUCCESS; +} + +/** + * @brief Counter semaphore deletion. + * + * @param[in] sem_id counter semaphore id variable + * @return An error code. + * + * @api + */ +int32 OS_CountSemDelete(uint32 sem_id) { + semaphore_t *sp = (semaphore_t *)sem_id; + + if ((sp < &osal.count_semaphores[0]) || + (sp >= &osal.count_semaphores[OS_MAX_COUNT_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* Resetting the semaphore, no threads in queue.*/ + chSemResetI(sp, 0); + + /* Flagging it as unused and returning it to the pool.*/ + sp->queue.prev = NULL; + chPoolFreeI(&osal.count_semaphores_pool, (void *)sp); + + /* Required because some thread could have been made ready.*/ + chSchRescheduleS(); + + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Counter semaphore give. + * + * @param[in] sem_id counter semaphore id variable + * @return An error code. + * + * @api + */ +int32 OS_CountSemGive(uint32 sem_id) { + semaphore_t *sp = (semaphore_t *)sem_id; + + if ((sp < &osal.count_semaphores[0]) || + (sp >= &osal.count_semaphores[OS_MAX_COUNT_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* If the semaphore is not in use then error.*/ + if (sp->queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + chSemSignalI(sp); + chSchRescheduleS(); + + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Counter semaphore take. + * + * @param[in] sem_id counter semaphore id variable + * @return An error code. + * + * @api + */ +int32 OS_CountSemTake(uint32 sem_id) { + semaphore_t *sp = (semaphore_t *)sem_id; + + if ((sp < &osal.count_semaphores[0]) || + (sp >= &osal.count_semaphores[OS_MAX_COUNT_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* If the semaphore is not in use then error.*/ + if (sp->queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + (void) chSemWaitS(sp); + + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Counter semaphore take with timeout. + * + * @param[in] sem_id counter semaphore id variable + * @param[in] msecs timeout in milliseconds + * @return An error code. + * + * @api + */ +int32 OS_CountSemTimedWait(uint32 sem_id, uint32 msecs) { + semaphore_t *sp = (semaphore_t *)sem_id; + msg_t msg; + + if ((sp < &osal.count_semaphores[0]) || + (sp >= &osal.count_semaphores[OS_MAX_COUNT_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + /* Timeouts of zero not allowed.*/ + if (msecs == 0) { + return OS_INVALID_INT_NUM; + } + + chSysLock(); + + /* If the semaphore is not in use then error.*/ + if (sp->queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + msg = chSemWaitTimeoutS(sp, MS2ST(msecs)); + + chSysUnlock(); + + return msg == MSG_TIMEOUT ? OS_SEM_TIMEOUT : OS_SUCCESS; +} + +/** + * @brief Retrieves a counter semaphore id by name. + * @note It is not currently implemented. + * + * @param[out] sem_id pointer to a counter semaphore id variable + * @param[in] sem_name the counter semaphore name + * @return An error code. + * + * @api + */ +int32 OS_CountSemGetIdByName(uint32 *sem_id, const char *sem_name) { + + /* NULL pointer checks.*/ + if ((sem_id == NULL) || (sem_name == NULL)) { + return OS_INVALID_POINTER; + } + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** + * @brief Returns counter semaphore information. + * + * @param[in] sem_id counter semaphore id variable + * @param[in] sem_prop counter semaphore properties + * @return An error code. + * + * @api + */ +int32 OS_CountSemGetInfo(uint32 sem_id, OS_count_sem_prop_t *sem_prop) { + semaphore_t *sp = (semaphore_t *)sem_id; + + /* NULL pointer checks.*/ + if (sem_prop == NULL) { + return OS_INVALID_POINTER; + } + + if ((sp < &osal.count_semaphores[0]) || + (sp >= &osal.count_semaphores[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* If the semaphore is not in use then error.*/ + if (sp->queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + chSysUnlock(); + + return OS_ERR_NOT_IMPLEMENTED; +} + +/*-- Mutex API --------------------------------------------------------------*/ + +/** + * @brief Mutex creation. + * + * @param[out] sem_id pointer to a mutex id variable + * @param[in] sem_name the mutex name + * @param[in] options mutex options + * @return An error code. + * + * @api + */ +int32 OS_MutSemCreate (uint32 *sem_id, const char *sem_name, uint32 options) { + mutex_t *mp; + + (void)options; + + /* NULL pointer checks.*/ + if ((sem_id == NULL) || (sem_name == NULL)) { + return OS_INVALID_POINTER; + } + + /* Checking semaphore name length.*/ + if (strlen(sem_name) >= OS_MAX_API_NAME) { + return OS_ERR_NAME_TOO_LONG; + } + + mp = chPoolAlloc(&osal.mutexes_pool); + + if (mp == 0) { + return OS_SEM_FAILURE; + } + + /* Semaphore is initialized.*/ + chMtxObjectInit(mp); + + *sem_id = (uint32)mp; + + return OS_SUCCESS; +} + +/** + * @brief Mutex deletion. + * + * @param[in] sem_id mutex id variable + * @return An error code. + * + * @api + */ +int32 OS_MutSemDelete(uint32 sem_id) { + mutex_t *mp = (mutex_t *)sem_id; + + if ((mp < &osal.mutexes[0]) || + (mp >= &osal.mutexes[OS_MAX_MUTEXES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* Resetting the mutex, no threads in queue.*/ + chMtxUnlockAllS(); + + /* Flagging it as unused and returning it to the pool.*/ + mp->queue.prev = NULL; + chPoolFreeI(&osal.mutexes_pool, (void *)mp); + + /* Required because some thread could have been made ready.*/ + chSchRescheduleS(); + + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Mutex give. + * + * @param[in] sem_id mutex id variable + * @return An error code. + * + * @api + */ +int32 OS_MutSemGive(uint32 sem_id) { + mutex_t *mp = (mutex_t *)sem_id; + + if ((mp < &osal.mutexes[0]) || + (mp >= &osal.mutexes[OS_MAX_COUNT_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* If the mutex is not in use then error.*/ + if (mp->queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + chMtxUnlockS(mp); + chSchRescheduleS(); + + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Mutex take. + * + * @param[in] sem_id mutex id variable + * @return An error code. + * + * @api + */ +int32 OS_MutSemTake(uint32 sem_id) { + mutex_t *mp = (mutex_t *)sem_id; + + if ((mp < &osal.mutexes[0]) || + (mp >= &osal.mutexes[OS_MAX_COUNT_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* If the mutex is not in use then error.*/ + if (mp->queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + chMtxLockS(mp); + + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Retrieves a mutex id by name. + * @note It is not currently implemented. + * + * @param[out] sem_id pointer to a mutex id variable + * @param[in] sem_name the mutex name + * @return An error code. + * + * @api + */ +int32 OS_MutSemGetIdByName(uint32 *sem_id, const char *sem_name) { + + /* NULL pointer checks.*/ + if ((sem_id == NULL) || (sem_name == NULL)) { + return OS_INVALID_POINTER; + } + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** + * @brief Returns mutex information. + * + * @param[in] sem_id mutex id variable + * @param[in] sem_prop mutex properties + * @return An error code. + * + * @api + */ +int32 OS_MutSemGetInfo(uint32 sem_id, OS_mut_sem_prop_t *sem_prop) { + mutex_t *mp = (mutex_t *)sem_id; + + /* NULL pointer checks.*/ + if (sem_prop == NULL) { + return OS_INVALID_POINTER; + } + + if ((mp < &osal.mutexes[0]) || + (mp >= &osal.mutexes[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* If the mutex is not in use then error.*/ + if (mp->queue.prev == NULL) { + chSysUnlock(); + return OS_SEM_FAILURE; + } + + chSysUnlock(); + + return OS_ERR_NOT_IMPLEMENTED; +} + +/*-- Task Control API -------------------------------------------------------*/ + +/** + * @brief Task creation. + * + * @param[out] task_id pointer to a task id variable + * @param[in] task_name the task name + * @param[in] function_pointer the task function + * @param[in] stack_pointer base of stack area + * @param[in] stack_size size of stack area + * @param[in] priority the task priority + * @param[in] flags task attributes + * @return An error code. + * + * @api + */ +int32 OS_TaskCreate(uint32 *task_id, + const char *task_name, + osal_task_entry function_pointer, + const uint32 *stack_pointer, + uint32 stack_size, + uint32 priority, + uint32 flags) { + tprio_t rt_prio; + thread_t *tp; + + (void)flags; + + /* NULL pointer checks.*/ + if ((task_id == NULL) || (task_name == NULL) || + (function_pointer == NULL) || (stack_pointer == NULL)) { + return OS_INVALID_POINTER; + } + + /* Checking alignment of stack base and size, it is application + responsibility to pass correct values.*/ + if (!MEM_IS_ALIGNED(stack_pointer, PORT_WORKING_AREA_ALIGN) || + !MEM_IS_ALIGNED(stack_size, sizeof (stkalign_t))) { + return OS_ERROR_ADDRESS_MISALIGNED; + } + + /* Checking task name length.*/ + if (strlen(task_name) >= OS_MAX_API_NAME) { + return OS_ERR_NAME_TOO_LONG; + } + + /* Checking priority range.*/ + if ((priority < MIN_PRIORITY) || (priority > MAX_PRIORITY)) { + return OS_ERR_INVALID_PRIORITY; + } + + /* Checking if the specified stack size is below the bare minimum.*/ + if (stack_size < (uint32)THD_WORKING_AREA_SIZE(0)) { + return OS_INVALID_INT_NUM; + } + + /* Converting priority to RT type.*/ + rt_prio = (tprio_t)256 - (tprio_t)priority; + + tp = chThdCreateFromHeap(NULL, (size_t)stack_size, task_name, + rt_prio, (tfunc_t)function_pointer, NULL); + + /* Out-of-memory condition.*/ + if (tp == NULL) { + return OS_ERROR; + } + + /* Storing the task id.*/ + *task_id = (uint32)tp; + + return OS_SUCCESS; +} + +/** + * @brief Installs a deletion handler. + * @note It is not currently implemented. + * + * @param[in] function_pointer the handler function + * @return An error code. + * + * @api + */ +int32 OS_TaskInstallDeleteHandler(void *function_pointer) { + + (void)function_pointer; + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** + * @brief Task delete. + * @note It is not currently implemented. + * + * @param[in] task_id the task id + * @return An error code. + * + * @api + */ +int32 OS_TaskDelete(uint32 task_id) { + + (void)task_id; + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** + * @brief Task exit. + * + * @api + */ +void OS_TaskExit(void) { + + chThdExit(MSG_OK); +} + +/** + * @brief Task delay. + * + * @param[in] milli_second the period in miliseconds + * @return An error code. + * + * @api + */ +int32 OS_TaskDelay(uint32 milli_second) { + + chThdSleepMilliseconds(milli_second); + return OS_SUCCESS; +} + +/** + * @brief Change task priority. + * + * @param[in] task_id the task id + * @param[in] new_priority the task new priority + * @return An error code. + * + * @api + */ +int32 OS_TaskSetPriority (uint32 task_id, uint32 new_priority) { + tprio_t rt_newprio; + thread_t *tp = (thread_t *)task_id; + + /* Checking priority range.*/ + if ((new_priority < MIN_PRIORITY) || (new_priority > MAX_PRIORITY)) { + return OS_ERR_INVALID_PRIORITY; + } + + /* Converting priority to RT type.*/ + rt_newprio = (tprio_t)256 - (tprio_t)new_priority; + + if (chThdGetPriorityX() == rt_newprio) { + return OS_SUCCESS; + } + + chSysLock(); + + /* Changing priority.*/ + if ((tp->prio == tp->realprio) || (rt_newprio > tp->prio)) { + tp->prio = rt_newprio; + } + tp->realprio = rt_newprio; + + /* The following states need priority queues reordering.*/ + switch (tp->state) { + case CH_STATE_WTMTX: +#if CH_CFG_USE_CONDVARS + case CH_STATE_WTCOND: +#endif +#if CH_CFG_USE_SEMAPHORES_PRIORITY + case CH_STATE_WTSEM: +#endif +#if CH_CFG_USE_MESSAGES && CH_CFG_USE_MESSAGES_PRIORITY + case CH_STATE_SNDMSGQ: +#endif + /* Re-enqueues tp with its new priority on the queue.*/ + queue_prio_insert(queue_dequeue(tp), + (threads_queue_t *)tp->u.wtobjp); + break; + case CH_STATE_READY: +#if CH_DBG_ENABLE_ASSERTS + /* Prevents an assertion in chSchReadyI().*/ + tp->state = CH_STATE_CURRENT; +#endif + /* Re-enqueues tp with its new priority on the ready list.*/ + chSchReadyI(queue_dequeue(tp)); + break; + } + + /* Rescheduling.*/ + chSchRescheduleS(); + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Task registration. + * @note In ChibiOS/RT it does nothing. + * + * @return An error code. + * + * @api + */ +int32 OS_TaskRegister(void) { + + return OS_SUCCESS; +} + +/** + * @brief Current task id. + * + * @return The current task id. + * + * @api + */ +uint32 OS_TaskGetId(void) { + + return (uint32)chThdGetSelfX(); +} + +/** + * @brief Retrieves a task id by name. + * + * @param[out] task_id pointer to a task id variable + * @param[in] task_name the task name + * @return An error code. + * + * @api + */ +int32 OS_TaskGetIdByName (uint32 *task_id, const char *task_name) { + thread_t *tp; + + /* NULL pointer checks.*/ + if ((task_id == NULL) || (task_name == NULL)) { + return OS_INVALID_POINTER; + } + + /* Checking task name length.*/ + if (strlen(task_name) >= OS_MAX_API_NAME) { + return OS_ERR_NAME_TOO_LONG; + } + + /* Scanning registry.*/ + tp = chRegFirstThread(); + do { + if (strcmp(chRegGetThreadNameX(tp), task_name) == 0) { + *task_id = (uint32)tp; + return OS_SUCCESS; + } + tp = chRegNextThread(tp); + } while (tp != NULL); + + return OS_ERR_NAME_NOT_FOUND; +} + +/** + * @brief Returns task information. + * + * @param[in] task_id the task id + * @param[in] task_prop task properties + * @return An error code. + * + * @api + */ +int32 OS_TaskGetInfo(uint32 task_id, OS_task_prop_t *task_prop) { + thread_t *tp = (thread_t *)task_id; + size_t wasize = (size_t)tp - (size_t)tp->stklimit + sizeof (thread_t); + + /* NULL pointer checks.*/ + if (task_prop == NULL) { + return OS_INVALID_POINTER; + } + + strncpy(task_prop->name, tp->name, OS_MAX_API_NAME - 1); + task_prop->creator = (uint32)chSysGetIdleThreadX(); + task_prop->stack_size = (uint32)MEM_ALIGN_NEXT(wasize, PORT_STACK_ALIGN); + task_prop->priority = (uint32)256U - (uint32)tp->realprio; + task_prop->OStask_id = task_id; + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** @} */ diff --git a/os/common/ext/nasa-osal/include/common_types.h b/os/common/ext/nasa-osal/include/common_types.h deleted file mode 100644 index 100a9c72e..000000000 --- a/os/common/ext/nasa-osal/include/common_types.h +++ /dev/null @@ -1,267 +0,0 @@ -/*--------------------------------------------------------------------------- -** -** Filename: -** $Id: common_types.h 1.9 2014/01/14 16:28:32GMT-05:00 acudmore Exp $ -** -** Copyright (c) 2004-2006, United States government as represented by the -** administrator of the National Aeronautics Space Administration. -** All rights reserved. This software was created at NASAs Goddard -** Space Flight Center pursuant to government contracts. -** -** This is governed by the NASA Open Source Agreement and may be used, -** distributed and modified only pursuant to the terms of that agreement. -** -** Purpose: -** Unit specification for common types. -** -** Design Notes: -** Assumes make file has defined processor family -** -** References: -** Flight Software Branch C Coding Standard Version 1.0a -** -** -** Notes: -** -** -** $Date: 2014/01/14 16:28:32GMT-05:00 $ -** $Revision: 1.9 $ -** $Log: common_types.h $ -** Revision 1.9 2014/01/14 16:28:32GMT-05:00 acudmore -** Fixed typo in macro for x86-64 -** Revision 1.8 2013/08/09 13:58:04GMT-05:00 acudmore -** Added int64 type, added support for ARM arch, added 64 bit x86 arch, added arch check for GCC arch macros, added check for proper data type sizes -** Revision 1.7 2013/07/25 10:01:29GMT-05:00 acudmore -** Added C++ support -** Revision 1.6 2012/04/11 09:19:03GMT-05:00 acudmore -** added OS_USED attribute -** Revision 1.5 2010/02/18 16:43:29EST acudmore -** Added SPARC processor section -** Removed special characters from comments that cause problems with some tools. -** Revision 1.4 2010/02/18 16:41:39EST acudmore -** Added a block of defines for GCC specific pragmas and extensions. -** Removed RTEMS boolean related ifdefs -** moved OS_PACK into the GCC specific block -** Revision 1.3 2010/02/01 12:31:17EST acudmore -** Added uint64 type -** Revision 1.2 2009/07/07 16:30:05EDT acudmore -** Removed conditinal comp. around boolean for m68k. -** This will need to be done for all RTEMS targets -** Revision 1.1 2009/06/02 10:04:58EDT acudmore -** Initial revision -** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj -** Revision 1.1 2008/04/20 22:35:58EDT ruperera -** Initial revision -** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/inc/project.pj -** Revision 1.1 2007/10/16 16:14:49EDT apcudmore -** Initial revision -** Member added to project d:/mksdata/MKS-OSAL-REPOSITORY/src/inc/project.pj -** Revision 1.2 2006/06/08 14:28:32EDT David Kobe (dlkobe) -** Added NASA Open Source Legal Statement -** Revision 1.1 2005/06/09 09:57:51GMT-05:00 rperera -** Initial revision -** Member added to project d:/mksdata/MKS-CFE-REPOSITORY/cfe-core/inc/project.pj -** Revision 1.6 2005/03/24 19:20:52 rmcgraw -** Wrapped the boolean defintion for all three processors with #ifndef _USING_RTEMS_INCLUDES_ -** -** Revision 1.5 2005/03/10 16:59:08 acudmore -** removed boolean prefix to TRUE and FALSE defintion to avoid vxWorks conflict. -** -** Revision 1.4 2005/03/07 20:23:34 acudmore -** removed duplicate boolean definition -** -** Revision 1.3 2005/03/07 20:05:17 acudmore -** updated with __PPC__ macro that gnu compiler uses -** -** Revision 1.2 2005/03/04 16:02:44 acudmore -** added coldfire architecture -** -** Revision 1.1 2005/03/04 15:58:45 acudmore -** Added common_types.h -** -** -** -**-------------------------------------------------------------------------*/ - -#ifndef _common_types_ -#define _common_types_ - -#ifdef __cplusplus - extern "C" { -#endif - -/* -** Includes -*/ - -/* -** Macro Definitions -*/ - -/* -** Condition = TRUE is ok, Condition = FALSE is error -*/ -#define CompileTimeAssert(Condition, Message) typedef char Message[(Condition) ? 1 : -1] - - -/* -** Define compiler specific macros -** The __extension__ compiler pragma is required -** for the uint64 type using GCC with the ANSI C90 standard. -** Other macros can go in here as needed, for example alignment -** pragmas. -*/ -#if defined (__GNUC__) - #define _EXTENSION_ __extension__ - #define OS_PACK __attribute__ ((packed)) - #define OS_ALIGN(n) __attribute__((aligned(n))) - #define OS_USED __attribute__((used)) -#else - #define _EXTENSION_ - #define OS_PACK - #define OS_ALIGN(n) - #define OS_USED -#endif - -#if defined(_ix86_) || defined (__i386__) -/* ----------------------- Intel x86 processor family -------------------------*/ - /* Little endian */ - #undef _STRUCT_HIGH_BIT_FIRST_ - #define _STRUCT_LOW_BIT_FIRST_ - - typedef unsigned char boolean; - typedef signed char int8; - typedef short int int16; - typedef long int int32; - _EXTENSION_ typedef long long int int64; - typedef unsigned char uint8; - typedef unsigned short int uint16; - typedef unsigned long int uint32; - _EXTENSION_ typedef unsigned long long int uint64; - - typedef unsigned long int cpuaddr; - -#elif defined (_ix64_) || defined (__x86_64__) -/* ----------------------- Intel/AMD x64 processor family -------------------------*/ - /* Little endian */ - #undef _STRUCT_HIGH_BIT_FIRST_ - #define _STRUCT_LOW_BIT_FIRST_ - - typedef unsigned char boolean; - typedef signed char int8; - typedef short int int16; - typedef int int32; - typedef long int int64; - typedef unsigned char uint8; - typedef unsigned short int uint16; - typedef unsigned int uint32; - typedef unsigned long int uint64; - - typedef unsigned long int cpuaddr; - -#elif defined(__PPC__) || defined (__ppc__) - /* ----------------------- Motorola Power PC family ---------------------------*/ - /* The PPC can be programmed to be big or little endian, we assume native */ - /* Big endian */ - #define _STRUCT_HIGH_BIT_FIRST_ - #undef _STRUCT_LOW_BIT_FIRST_ - - typedef unsigned char boolean; - typedef signed char int8; - typedef short int int16; - typedef long int int32; - _EXTENSION_ typedef long long int int64; - typedef unsigned char uint8; - typedef unsigned short int uint16; - typedef unsigned long int uint32; - _EXTENSION_ typedef unsigned long long int uint64; - - typedef unsigned long int cpuaddr; - -#elif defined(_m68k_) || defined(__m68k__) - /* ----------------------- Motorola m68k/Coldfire family ---------------------------*/ - /* Big endian */ - #define _STRUCT_HIGH_BIT_FIRST_ - #undef _STRUCT_LOW_BIT_FIRST_ - - typedef unsigned char boolean; - typedef signed char int8; - typedef short int int16; - typedef long int int32; - _EXTENSION_ typedef long long int int64; - typedef unsigned char uint8; - typedef unsigned short int uint16; - typedef unsigned long int uint32; - _EXTENSION_ typedef unsigned long long int uint64; - - typedef unsigned long int cpuaddr; - -#elif defined (__ARM__) || defined(__arm__) -/* ----------------------- ARM processor family -------------------------*/ - /* Little endian */ - #undef _STRUCT_HIGH_BIT_FIRST_ - #define _STRUCT_LOW_BIT_FIRST_ - - typedef unsigned char boolean; - typedef signed char int8; - typedef short int int16; - typedef long int int32; - _EXTENSION_ typedef long long int int64; - typedef unsigned char uint8; - typedef unsigned short int uint16; - typedef unsigned long int uint32; - _EXTENSION_ typedef unsigned long long int uint64; - - typedef unsigned long int cpuaddr; - -#elif defined(__SPARC__) || defined (_sparc_) - /* ----------------------- SPARC/LEON family ---------------------------*/ - /* SPARC Big endian */ - #define _STRUCT_HIGH_BIT_FIRST_ - #undef _STRUCT_LOW_BIT_FIRST_ - - typedef unsigned char boolean; - typedef signed char int8; - typedef short int int16; - typedef long int int32; - _EXTENSION_ typedef long long int int64; - typedef unsigned char uint8; - typedef unsigned short int uint16; - typedef unsigned long int uint32; - _EXTENSION_ typedef unsigned long long int uint64; - - typedef unsigned long int cpuaddr; - -#else /* not any of the above */ - #error undefined processor -#endif /* processor types */ - -#ifndef NULL /* pointer to nothing */ - #define NULL ((void *) 0) -#endif - -#ifndef TRUE /* Boolean true */ - #define TRUE (1) -#endif - -#ifndef FALSE /* Boolean false */ - #define FALSE (0) -#endif - -/* -** Check Sizes -*/ -CompileTimeAssert(sizeof(uint8)==1, TypeUint8WrongSize); -CompileTimeAssert(sizeof(uint16)==2, TypeUint16WrongSize); -CompileTimeAssert(sizeof(uint32)==4, TypeUint32WrongSize); -CompileTimeAssert(sizeof(uint64)==8, TypeUint64WrongSize); -CompileTimeAssert(sizeof(int8)==1, Typeint8WrongSize); -CompileTimeAssert(sizeof(int16)==2, Typeint16WrongSize); -CompileTimeAssert(sizeof(int32)==4, Typeint32WrongSize); -CompileTimeAssert(sizeof(int64)==8, Typeint64WrongSize); - -#ifdef __cplusplus - } -#endif - -#endif /* _common_types_ */ diff --git a/os/common/ext/nasa-osal/include/osapi-os-core.h b/os/common/ext/nasa-osal/include/osapi-os-core.h deleted file mode 100644 index 8c9b13a78..000000000 --- a/os/common/ext/nasa-osal/include/osapi-os-core.h +++ /dev/null @@ -1,274 +0,0 @@ -/* -** File: osapi-os-core.h -** -** Copyright (c) 2004-2006, United States government as represented by the -** administrator of the National Aeronautics Space Administration. -** All rights reserved. This software was created at NASAs Goddard -** Space Flight Center pursuant to government contracts. -** -** This is governed by the NASA Open Source Agreement and may be used, -** distributed and modified only pursuant to the terms of that agreement. -** -** Author: Ezra Yeheksli -Code 582/Raytheon -** -** Purpose: Contains functions prototype definitions and variables declarations -** for the OS Abstraction Layer, Core OS module -** -** $Revision: 1.8 $ -** -** $Date: 2013/07/25 10:02:00GMT-05:00 $ -** -** $Log: osapi-os-core.h $ -** Revision 1.8 2013/07/25 10:02:00GMT-05:00 acudmore -** removed circular include "osapi.h" -** Revision 1.7 2012/04/11 09:30:48GMT-05:00 acudmore -** Added OS_printf_enable and OS_printf_disable -** Revision 1.6 2010/11/12 12:00:17EST acudmore -** replaced copyright character with (c) and added open source notice where needed. -** Revision 1.5 2010/11/10 15:33:14EST acudmore -** Updated IntAttachHandler prototype -** Revision 1.4 2010/03/08 12:06:28EST acudmore -** added function pointer type to get rid of warnings -** Revision 1.3 2010/02/01 12:37:15EST acudmore -** added return code to OS API init -** Revision 1.2 2009/08/04 10:49:09EDT acudmore -** -*/ - -#ifndef _osapi_core_ -#define _osapi_core_ - -#include /* for va_list */ - -/*difines constants for OS_BinSemCreate for state of semaphore */ -#define OS_SEM_FULL 1 -#define OS_SEM_EMPTY 0 - -/* #define for enabling floating point operations on a task*/ -#define OS_FP_ENABLED 1 - -/* tables for the properties of objects */ - -/*tasks */ -typedef struct -{ - char name [OS_MAX_API_NAME]; - uint32 creator; - uint32 stack_size; - uint32 priority; - uint32 OStask_id; -}OS_task_prop_t; - -/* queues */ -typedef struct -{ - char name [OS_MAX_API_NAME]; - uint32 creator; -}OS_queue_prop_t; - -/* Binary Semaphores */ -typedef struct -{ - char name [OS_MAX_API_NAME]; - uint32 creator; - int32 value; -}OS_bin_sem_prop_t; - -/* Counting Semaphores */ -typedef struct -{ - char name [OS_MAX_API_NAME]; - uint32 creator; - int32 value; -}OS_count_sem_prop_t; - -/* Mutexes */ -typedef struct -{ - char name [OS_MAX_API_NAME]; - uint32 creator; -}OS_mut_sem_prop_t; - - -/* struct for OS_GetLocalTime() */ - -typedef struct -{ - uint32 seconds; - uint32 microsecs; -}OS_time_t; - -/* heap info */ -typedef struct -{ - uint32 free_bytes; - uint32 free_blocks; - uint32 largest_free_block; -}OS_heap_prop_t; - - -/* This typedef is for the OS_GetErrorName function, to ensure - * everyone is making an array of the same length */ - -typedef char os_err_name_t[35]; - -/* -** These typedefs are for the task entry point -*/ -typedef void osal_task; -typedef osal_task ((*osal_task_entry)(void)); - -/* -** Exported Functions -*/ - -/* -** Initialization of API -*/ -int32 OS_API_Init (void); - - -/* -** Task API -*/ - -int32 OS_TaskCreate (uint32 *task_id, const char *task_name, - osal_task_entry function_pointer, - const uint32 *stack_pointer, - uint32 stack_size, - uint32 priority, uint32 flags); - -int32 OS_TaskDelete (uint32 task_id); -void OS_TaskExit (void); -int32 OS_TaskInstallDeleteHandler(void *function_pointer); -int32 OS_TaskDelay (uint32 millisecond); -int32 OS_TaskSetPriority (uint32 task_id, uint32 new_priority); -int32 OS_TaskRegister (void); -uint32 OS_TaskGetId (void); -int32 OS_TaskGetIdByName (uint32 *task_id, const char *task_name); -int32 OS_TaskGetInfo (uint32 task_id, OS_task_prop_t *task_prop); - -/* -** Message Queue API -*/ - -/* -** Queue Create now has the Queue ID returned to the caller. -*/ -int32 OS_QueueCreate (uint32 *queue_id, const char *queue_name, - uint32 queue_depth, uint32 data_size, uint32 flags); -int32 OS_QueueDelete (uint32 queue_id); -int32 OS_QueueGet (uint32 queue_id, void *data, uint32 size, - uint32 *size_copied, int32 timeout); -int32 OS_QueuePut (uint32 queue_id, void *data, uint32 size, - uint32 flags); -int32 OS_QueueGetIdByName (uint32 *queue_id, const char *queue_name); -int32 OS_QueueGetInfo (uint32 queue_id, OS_queue_prop_t *queue_prop); - -/* -** Semaphore API -*/ - -int32 OS_BinSemCreate (uint32 *sem_id, const char *sem_name, - uint32 sem_initial_value, uint32 options); -int32 OS_BinSemFlush (uint32 sem_id); -int32 OS_BinSemGive (uint32 sem_id); -int32 OS_BinSemTake (uint32 sem_id); -int32 OS_BinSemTimedWait (uint32 sem_id, uint32 msecs); -int32 OS_BinSemDelete (uint32 sem_id); -int32 OS_BinSemGetIdByName (uint32 *sem_id, const char *sem_name); -int32 OS_BinSemGetInfo (uint32 sem_id, OS_bin_sem_prop_t *bin_prop); - -int32 OS_CountSemCreate (uint32 *sem_id, const char *sem_name, - uint32 sem_initial_value, uint32 options); -int32 OS_CountSemGive (uint32 sem_id); -int32 OS_CountSemTake (uint32 sem_id); -int32 OS_CountSemTimedWait (uint32 sem_id, uint32 msecs); -int32 OS_CountSemDelete (uint32 sem_id); -int32 OS_CountSemGetIdByName (uint32 *sem_id, const char *sem_name); -int32 OS_CountSemGetInfo (uint32 sem_id, OS_count_sem_prop_t *count_prop); - -/* -** Mutex API -*/ - -int32 OS_MutSemCreate (uint32 *sem_id, const char *sem_name, uint32 options); -int32 OS_MutSemGive (uint32 sem_id); -int32 OS_MutSemTake (uint32 sem_id); -int32 OS_MutSemDelete (uint32 sem_id); -int32 OS_MutSemGetIdByName (uint32 *sem_id, const char *sem_name); -int32 OS_MutSemGetInfo (uint32 sem_id, OS_mut_sem_prop_t *mut_prop); - -/* -** OS Time/Tick related API -*/ - -int32 OS_Milli2Ticks (uint32 milli_seconds); -int32 OS_Tick2Micros (void); -int32 OS_GetLocalTime (OS_time_t *time_struct); -int32 OS_SetLocalTime (OS_time_t *time_struct); - -/* -** Exception API -*/ - -int32 OS_ExcAttachHandler (uint32 ExceptionNumber, - void (*ExceptionHandler)(uint32, uint32 *,uint32), - int32 parameter); -int32 OS_ExcEnable (int32 ExceptionNumber); -int32 OS_ExcDisable (int32 ExceptionNumber); - -/* -** Floating Point Unit API -*/ - -int32 OS_FPUExcAttachHandler (uint32 ExceptionNumber, void * ExceptionHandler , - int32 parameter); -int32 OS_FPUExcEnable (int32 ExceptionNumber); -int32 OS_FPUExcDisable (int32 ExceptionNumber); -int32 OS_FPUExcSetMask (uint32 mask); -int32 OS_FPUExcGetMask (uint32 *mask); - -/* -** Interrupt API -*/ -int32 OS_IntAttachHandler (uint32 InterruptNumber, osal_task_entry InterruptHandler, int32 parameter); -int32 OS_IntUnlock (int32 IntLevel); -int32 OS_IntLock (void); - -int32 OS_IntEnable (int32 Level); -int32 OS_IntDisable (int32 Level); - -int32 OS_IntSetMask (uint32 mask); -int32 OS_IntGetMask (uint32 *mask); -int32 OS_IntAck (int32 InterruptNumber); - -/* -** Shared memory API -*/ -int32 OS_ShMemInit (void); -int32 OS_ShMemCreate (uint32 *Id, uint32 NBytes, char* SegName); -int32 OS_ShMemSemTake (uint32 Id); -int32 OS_ShMemSemGive (uint32 Id); -int32 OS_ShMemAttach (uint32 * Address, uint32 Id); -int32 OS_ShMemGetIdByName (uint32 *ShMemId, const char *SegName ); - -/* -** Heap API -*/ -int32 OS_HeapGetInfo (OS_heap_prop_t *heap_prop); - -/* -** API for useful debugging function -*/ -int32 OS_GetErrorName (int32 error_num, os_err_name_t* err_name); - - -/* -** Abstraction for printf statements -*/ -void OS_printf( const char *string, ...); -void OS_printf_disable(void); -void OS_printf_enable(void); - -#endif diff --git a/os/common/ext/nasa-osal/include/osapi-os-filesys.h b/os/common/ext/nasa-osal/include/osapi-os-filesys.h deleted file mode 100644 index c46800341..000000000 --- a/os/common/ext/nasa-osal/include/osapi-os-filesys.h +++ /dev/null @@ -1,419 +0,0 @@ -/* -** File: osapi-os-filesys.h -** -** Copyright (c) 2004-2006, United States government as represented by the -** administrator of the National Aeronautics Space Administration. -** All rights reserved. This software was created at NASAs Goddard -** Space Flight Center pursuant to government contracts. -** -** This is governed by the NASA Open Source Agreement and may be used, -** distributed and modified only pursuant to the terms of that agreement. -** -** Author: Alan Cudmore Code 582 -** -** Purpose: Contains functions prototype definitions and variables declarations -** for the OS Abstraction Layer, File System module -** -** $Revision: 1.11 $ -** -** $Date: 2013/12/16 12:57:41GMT-05:00 $ -** -** $Log: osapi-os-filesys.h $ -** Revision 1.11 2013/12/16 12:57:41GMT-05:00 acudmore -** Added macros for Volume name length and physical device name length -** Revision 1.10 2013/07/29 12:05:48GMT-05:00 acudmore -** Added define for device and volume name length -** Revision 1.9 2013/07/25 14:31:21GMT-05:00 acudmore -** Added prototype and datatype for OS_GetFsInfo -** Revision 1.8 2011/12/05 12:04:21GMT-05:00 acudmore -** Added OS_rewinddir API -** Revision 1.7 2011/04/05 16:01:12EDT acudmore -** Added OS_CloseFileByName and OS_CloseAllFiles -** Revision 1.6 2010/11/15 11:04:38EST acudmore -** Added OS_FileOpenCheck function. -** Revision 1.5 2010/11/12 12:00:18EST acudmore -** replaced copyright character with (c) and added open source notice where needed. -** Revision 1.4 2010/02/01 12:28:57EST acudmore -** Added OS_fsBytesFree API -** Revision 1.3 2010/01/25 14:44:26EST acudmore -** renamed "new" variable to avoid C++ reserved name conflict. -** Revision 1.2 2009/07/14 15:16:05EDT acudmore -** Added OS_TranslatePath to the API -** Revision 1.1 2008/04/20 22:36:01EDT ruperera -** Initial revision -** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj -** Revision 1.1 2007/10/16 16:14:52EDT apcudmore -** Initial revision -** Member added to project d:/mksdata/MKS-OSAL-REPOSITORY/src/os/inc/project.pj -** Revision 1.1 2007/08/24 13:43:24EDT apcudmore -** Initial revision -** Member added to project d:/mksdata/MKS-CFE-PROJECT/fsw/cfe-core/os/inc/project.pj -** Revision 1.17 2007/06/07 09:59:14EDT njyanchik -** I replaced the second OS_cp definition with OS_mv -** Revision 1.16 2007/06/05 16:25:33EDT apcudmore -** Increased Number of volume table entries from 10 to 14. -** Added 2 extra EEPROM disk mappings to RAD750 Volume table + 2 spares -** Added 4 spares to every other volume table. -** Revision 1.15 2007/05/25 09:17:56EDT njyanchik -** I added the rmfs call to the OSAL and updated the unit test stubs to match -** Revision 1.14 2007/03/21 10:15:29EST njyanchik -** I mistakenly put the wrong length in for the path in the OS_FDTableEntry structure, and I added -** some code that will set and out of range file descriptors .IsValid flag to false in OS_FDGetInfo -** Revision 1.13 2007/03/06 11:52:46EST njyanchik -** This change goes with the previous CP, I forgot to include it -** Revision 1.12 2007/02/28 14:57:45EST njyanchik -** The updates for supporting copying and moving files are now supported -** Revision 1.11 2007/02/27 15:22:11EST njyanchik -** This CP has the initial import of the new file descripor table mechanism -** Revision 1.10 2006/12/20 10:27:09EST njyanchik -** This change package incorporates all the changes necessary for the addition -** of a new API to get the real physical drive undernieth a mount point -** Revision 1.9 2006/11/14 14:44:28GMT-05:00 njyanchik -** Checks were added to the OS fs calls that look at the return of a function that -** changes the name of paths from abstracted to local path names. -** Revision 1.8 2006/10/30 16:12:19GMT-05:00 apcudmore -** Updated Compact flash and RAM device names for vxWorks 6.2 changes. -** Revision 1.7 2006/10/25 11:31:18EDT njyanchik -** This CP incorporates changes to every bsp_voltab.c file. I increased the number -** entries in the volume table to 10. I also changed the #define in the os_filesys.h -** file for the number of entries to match. -** -** This update also includes adding the prototype for OS_initfs in os_filesys.h -** Revision 1.6 2006/09/26 09:03:46GMT-05:00 njyanchik -** Contains the initial import of the ES Shell commands interface -** Revision 1.5 2006/07/25 15:37:52EDT njyanchik -** It turns out the both the FS app and the OSAL were incorrect where file descriptors are -** concerned. the file descriptors should be int32 across the board. -** Revision 1.4 2006/01/20 11:56:18EST njyanchik -** Fixed header file information to match api document -** Revision 1.26 2005/07/12 17:13:56 nyanchik -** Moved the Volume table to a bsp table in the arch directories. -** -** Revision 1.2 2005/07/11 16:26:57EDT apcudmore -** OSAPI 2.0 integration -** Revision 1.25 2005/07/06 16:11:17 nyanchik -** *** empty log message *** -** -** Revision 1.24 2005/07/05 18:34:55 nyanchik -** fixed issues found in code walkthrogh. Also removed the OS_Info* functions that are going in the BSP -** -** Revision 1.23 2005/06/17 19:46:34 nyanchik -** added new file system style to linux and rtems. -** -** Revision 1.22 2005/06/15 16:43:48 nyanchik -** added extra parenthesis for the .h file # defines -** -** Revision 1.21 2005/06/06 14:17:42 nyanchik -** added headers to osapi-os-core.h and osapi-os-filesys.h -** -** Revision 1.20 2005/06/02 18:04:24 nyanchik -** *** empty log message *** -** -** Revision 1.1 2005/03/15 18:26:32 nyanchik -** *** empty log message *** -** -** -** Date Written: -** -** -*/ - -#ifndef _osapi_filesys_ -#define _osapi_filesys_ -#include -#include -#include -#include - -#define OS_READ_ONLY 0 -#define OS_WRITE_ONLY 1 -#define OS_READ_WRITE 2 - -#define OS_SEEK_SET 0 -#define OS_SEEK_CUR 1 -#define OS_SEEK_END 2 - -#define OS_CHK_ONLY 0 -#define OS_REPAIR 1 - -#define FS_BASED 0 -#define RAM_DISK 1 -#define EEPROM_DISK 2 -#define ATA_DISK 3 - - -/* -** Number of entries in the internal volume table -*/ -#define NUM_TABLE_ENTRIES 14 - -/* -** Length of a Device and Volume name -*/ -#define OS_FS_DEV_NAME_LEN 32 -#define OS_FS_PHYS_NAME_LEN 64 -#define OS_FS_VOL_NAME_LEN 32 - - -/* -** Defines for File System Calls -*/ -#define OS_FS_SUCCESS 0 -#define OS_FS_ERROR (-1) -#define OS_FS_ERR_INVALID_POINTER (-2) -#define OS_FS_ERR_PATH_TOO_LONG (-3) -#define OS_FS_ERR_NAME_TOO_LONG (-4) -#define OS_FS_UNIMPLEMENTED (-5) -#define OS_FS_ERR_DRIVE_NOT_CREATED (-6) -#define OS_FS_ERR_DEVICE_NOT_FREE (-7) -#define OS_FS_ERR_PATH_INVALID (-8) -#define OS_FS_ERR_NO_FREE_FDS (-9) -#define OS_FS_ERR_INVALID_FD (-10) - -/* This typedef is for the OS_FS_GetErrorName function, to ensure - * everyone is making an array of the same length */ - -typedef char os_fs_err_name_t[35]; - - -/* -** Internal structure of the OS volume table for -** mounted file systems and path translation -*/ -typedef struct -{ - char DeviceName [OS_FS_DEV_NAME_LEN]; - char PhysDevName [OS_FS_PHYS_NAME_LEN]; - uint32 VolumeType; - uint8 VolatileFlag; - uint8 FreeFlag; - uint8 IsMounted; - char VolumeName [OS_FS_VOL_NAME_LEN]; - char MountPoint [OS_MAX_PATH_LEN]; - uint32 BlockSize; - -}OS_VolumeInfo_t; - -typedef struct -{ - int32 OSfd; /* The underlying OS's file descriptor */ - char Path[OS_MAX_PATH_LEN]; /* The path of the file opened */ - uint32 User; /* The task id of the task who opened the file*/ - uint8 IsValid; /* Whether or not this entry is valid */ -}OS_FDTableEntry; - -typedef struct -{ - uint32 MaxFds; /* Total number of file descriptors */ - uint32 FreeFds; /* Total number that are free */ - uint32 MaxVolumes; /* Maximum number of volumes */ - uint32 FreeVolumes; /* Total number of volumes free */ -} os_fsinfo_t; - -/* modified to posix calls, since all of the - * applicable OSes use the posix calls */ - -typedef struct stat os_fstat_t; -typedef DIR* os_dirp_t; -typedef struct dirent os_dirent_t; -/* still don't know what this should be*/ -typedef unsigned long int os_fshealth_t; - -/* - * Exported Functions -*/ - - -/****************************************************************************** -** Standard File system API -******************************************************************************/ -/* - * Initializes the File System functions -*/ - -int32 OS_FS_Init(void); - -/* - * Creates a file specified by path -*/ -int32 OS_creat (const char *path, int32 access); - -/* - * Opend a file for reading/writing. Returns file descriptor -*/ -int32 OS_open (const char *path, int32 access, uint32 mode); - -/* - * Closes an open file. -*/ -int32 OS_close (int32 filedes); - -/* - * Reads nbytes bytes from file into buffer -*/ -int32 OS_read (int32 filedes, void *buffer, uint32 nbytes); - -/* - * Write nybytes bytes of buffer into the file -*/ -int32 OS_write (int32 filedes, void *buffer, uint32 nbytes); - -/* - * Changes the permissions of a file -*/ -int32 OS_chmod (const char *path, uint32 access); - -/* - * Returns file status information in filestats -*/ -int32 OS_stat (const char *path, os_fstat_t *filestats); - -/* - * Seeks to the specified position of an open file -*/ -int32 OS_lseek (int32 filedes, int32 offset, uint32 whence); - -/* - * Removes a file from the file system -*/ -int32 OS_remove (const char *path); - -/* - * Renames a file in the file system -*/ -int32 OS_rename (const char *old_filename, const char *new_filename); - -/* - * copies a single file from src to dest -*/ -int32 OS_cp (const char *src, const char *dest); - -/* - * moves a single file from src to dest -*/ -int32 OS_mv (const char *src, const char *dest); - -/* - * Copies the info of an open file to the structure -*/ -int32 OS_FDGetInfo (int32 filedes, OS_FDTableEntry *fd_prop); - -/* -** Check to see if a file is open -*/ -int32 OS_FileOpenCheck(char *Filename); - -/* -** Close all open files -*/ -int32 OS_CloseAllFiles(void); - -/* -** Close a file by filename -*/ -int32 OS_CloseFileByName(char *Filename); - - -/****************************************************************************** -** Directory API -******************************************************************************/ - -/* - * Makes a new directory -*/ -int32 OS_mkdir (const char *path, uint32 access); - -/* - * Opens a directory for searching -*/ -os_dirp_t OS_opendir (const char *path); - -/* - * Closes an open directory -*/ -int32 OS_closedir(os_dirp_t directory); - -/* - * Rewinds an open directory -*/ -void OS_rewinddir(os_dirp_t directory); - -/* - * Reads the next object in the directory -*/ -os_dirent_t * OS_readdir (os_dirp_t directory); - -/* - * Removes an empty directory from the file system. -*/ -int32 OS_rmdir (const char *path); - -/****************************************************************************** -** System Level API -******************************************************************************/ -/* - * Makes a file system -*/ -int32 OS_mkfs (char *address,char *devname, char *volname, - uint32 blocksize, uint32 numblocks); -/* - * Mounts a file system -*/ -int32 OS_mount (const char *devname, char *mountpoint); - -/* - * Initializes an existing file system -*/ -int32 OS_initfs (char *address,char *devname, char *volname, - uint32 blocksize, uint32 numblocks); - -/* - * removes a file system -*/ -int32 OS_rmfs (char *devname); - -/* - * Unmounts a mounted file system -*/ -int32 OS_unmount (const char *mountpoint); - -/* - * Returns the number of free blocks in a file system -*/ -int32 OS_fsBlocksFree (const char *name); - -/* -** Returns the number of free bytes in a file system -** Note the 64 bit data type to support filesystems that -** are greater than 4 Gigabytes -*/ -int32 OS_fsBytesFree (const char *name, uint64 *bytes_free); - -/* - * Checks the health of a file system and repairs it if neccesary -*/ -os_fshealth_t OS_chkfs (const char *name, boolean repair); - -/* - * Returns in the parameter the physical drive underneith the mount point -*/ -int32 OS_FS_GetPhysDriveName (char * PhysDriveName, char * MountPoint); - -/* -** Translates a OSAL Virtual file system path to a host Local path -*/ -int32 OS_TranslatePath ( const char *VirtualPath, char *LocalPath); - -/* -** Returns information about the file system in an os_fsinfo_t -*/ -int32 OS_GetFsInfo(os_fsinfo_t *filesys_info); - -/****************************************************************************** -** Shell API -******************************************************************************/ - -/* executes the shell command passed into is and writes the output of that - * command to the file specified by the given OSAPI file descriptor */ -int32 OS_ShellOutputToFile(char* Cmd, int32 OS_fd); -#endif diff --git a/os/common/ext/nasa-osal/include/osapi-os-loader.h b/os/common/ext/nasa-osal/include/osapi-os-loader.h deleted file mode 100644 index 4f0b21b62..000000000 --- a/os/common/ext/nasa-osal/include/osapi-os-loader.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -** File: osapi-os-loader.h -** -** Copyright (c) 2004-2006, United States government as represented by the -** administrator of the National Aeronautics Space Administration. -** All rights reserved. This software was created at NASAs Goddard -** Space Flight Center pursuant to government contracts. -** -** This is governed by the NASA Open Source Agreement and may be used, -** distributed and modified only pursuant to the terms of that agreement. -** -** Author: Alan Cudmore - Code 582 -** -** Purpose: Contains functions prototype definitions and variables declarations -** for the OS Abstraction Layer, Object file loader API -** -** $Revision: 1.5 $ -** -** $Date: 2013/07/25 10:02:08GMT-05:00 $ -** -** $Log: osapi-os-loader.h $ -** Revision 1.5 2013/07/25 10:02:08GMT-05:00 acudmore -** removed circular include "osapi.h" -** Revision 1.4 2010/11/12 12:00:18GMT-05:00 acudmore -** replaced copyright character with (c) and added open source notice where needed. -** Revision 1.3 2010/02/01 12:38:06EST acudmore -** added return code to OS_ModuleTableInit -** Revision 1.2 2008/06/20 15:13:43EDT apcudmore -** Checked in new Module loader/symbol table functionality -** Revision 1.1 2008/04/20 22:36:02EDT ruperera -** Initial revision -** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj -** Revision 1.1 2008/02/07 11:08:24EST apcudmore -** Initial revision -** Member added to project d:/mksdata/MKS-OSAL-REPOSITORY/src/os/inc/project.pj -** -** -*/ - -#ifndef _osapi_loader_ -#define _osapi_loader_ - -/* -** Defines -*/ - - -/* -** Typedefs -*/ - -typedef struct -{ - uint32 valid; - uint32 code_address; - uint32 code_size; - uint32 data_address; - uint32 data_size; - uint32 bss_address; - uint32 bss_size; - uint32 flags; -} OS_module_address_t; - -typedef struct -{ - int free; - uint32 entry_point; - uint32 host_module_id; - char filename[OS_MAX_PATH_LEN]; - char name[OS_MAX_API_NAME]; - OS_module_address_t addr; - -} OS_module_record_t; - -/* -** Loader API -*/ -int32 OS_ModuleTableInit ( void ); - -int32 OS_SymbolLookup (uint32 *symbol_address, char *symbol_name ); - -int32 OS_SymbolTableDump ( char *filename, uint32 size_limit ); - -int32 OS_ModuleLoad ( uint32 *module_id, char *module_name, char *filename ); - -int32 OS_ModuleUnload ( uint32 module_id ); - -int32 OS_ModuleInfo ( uint32 module_id, OS_module_record_t *module_info ); - - -#endif diff --git a/os/common/ext/nasa-osal/include/osapi-os-net.h b/os/common/ext/nasa-osal/include/osapi-os-net.h deleted file mode 100644 index b8cc67d69..000000000 --- a/os/common/ext/nasa-osal/include/osapi-os-net.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -** File: osapi-os-net.h -** -** Copyright (c) 2004-2006, United States government as represented by the -** administrator of the National Aeronautics Space Administration. -** All rights reserved. This software was created at NASAs Goddard -** Space Flight Center pursuant to government contracts. -** -** This is governed by the NASA Open Source Agreement and may be used, -** distributed and modified only pursuant to the terms of that agreement. -** -** Author: Alan Cudmore Code 582 -** -** Purpose: Contains functions prototype definitions and variables declarations -** for the OS Abstraction Layer, Network Module -** -** $Revision: 1.2 $ -** -** $Date: 2010/11/12 12:00:19GMT-05:00 $ -** -** $Log: osapi-os-net.h $ -** Revision 1.2 2010/11/12 12:00:19GMT-05:00 acudmore -** replaced copyright character with (c) and added open source notice where needed. -** Revision 1.1 2008/04/20 22:36:02EDT ruperera -** Initial revision -** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj -** Revision 1.1 2007/10/16 16:14:52EDT apcudmore -** Initial revision -** Member added to project d:/mksdata/MKS-OSAL-REPOSITORY/src/os/inc/project.pj -** Revision 1.1 2007/08/24 13:43:25EDT apcudmore -** Initial revision -** Member added to project d:/mksdata/MKS-CFE-PROJECT/fsw/cfe-core/os/inc/project.pj -** Revision 1.3 2006/01/20 11:56:18EST njyanchik -** Fixed header file information to match api document -** Revision 1.4 2005/06/07 16:49:31 nyanchik -** changed returns code for osapi.c to all int32 from uint32 -** -** Revision 1.3 2005/03/22 19:04:54 acudmore -** fixed uint type -** -** Revision 1.2 2005/03/22 18:59:33 acudmore -** updated prototype -** -** Revision 1.1 2005/03/22 18:58:51 acudmore -** added osapi network interface -** -** Revision 1.1 2005/03/15 18:26:32 nyanchik -** *** empty log message *** -** -** -** Date Written: -** -** -*/ -#ifndef _osapi_network_ -#define _osapi_network_ - -int32 OS_NetworkGetID (void); -int32 OS_NetworkGetHostName (char *host_name, uint32 name_len); - -#endif diff --git a/os/common/ext/nasa-osal/include/osapi-os-timer.h b/os/common/ext/nasa-osal/include/osapi-os-timer.h deleted file mode 100644 index 8082c6227..000000000 --- a/os/common/ext/nasa-osal/include/osapi-os-timer.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -** File: osapi-os-timer.h -** -** Copyright (c) 2004-2006, United States government as represented by the -** administrator of the National Aeronautics Space Administration. -** All rights reserved. This software was created at NASAs Goddard -** Space Flight Center pursuant to government contracts. -** -** This is governed by the NASA Open Source Agreement and may be used, -** distributed and modified only pursuant to the terms of that agreement. -** -** Author: Alan Cudmore - Code 582 -** -** Purpose: Contains functions prototype definitions and variable declarations -** for the OS Abstraction Layer, Timer API -** -** $Revision: 1.5 $ -** -** $Date: 2013/07/25 10:02:20GMT-05:00 $ -** -** $Log: osapi-os-timer.h $ -** Revision 1.5 2013/07/25 10:02:20GMT-05:00 acudmore -** removed circular include "osapi.h" -** Revision 1.4 2010/11/12 12:00:19GMT-05:00 acudmore -** replaced copyright character with (c) and added open source notice where needed. -** Revision 1.3 2010/02/01 12:38:34EST acudmore -** Added return code to OS_TimerAPIInit -** Revision 1.2 2008/08/26 13:52:52EDT apcudmore -** removed linux specific define -** Revision 1.1 2008/08/20 16:12:07EDT apcudmore -** Initial revision -** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj -** -** -*/ - -#ifndef _osapi_timer_ -#define _osapi_timer_ - -/* -** Typedefs -*/ -typedef void (*OS_TimerCallback_t)(uint32 timer_id); - -typedef struct -{ - char name[OS_MAX_API_NAME]; - uint32 creator; - uint32 start_time; - uint32 interval_time; - uint32 accuracy; - -} OS_timer_prop_t; - - -/* -** Timer API -*/ -int32 OS_TimerAPIInit (void); - -int32 OS_TimerCreate (uint32 *timer_id, const char *timer_name, uint32 *clock_accuracy, OS_TimerCallback_t callback_ptr); -int32 OS_TimerSet (uint32 timer_id, uint32 start_msec, uint32 interval_msec); -int32 OS_TimerDelete (uint32 timer_id); - -int32 OS_TimerGetIdByName (uint32 *timer_id, const char *timer_name); -int32 OS_TimerGetInfo (uint32 timer_id, OS_timer_prop_t *timer_prop); - -#endif diff --git a/os/common/ext/nasa-osal/include/osapi-version.h b/os/common/ext/nasa-osal/include/osapi-version.h deleted file mode 100644 index 331e96c94..000000000 --- a/os/common/ext/nasa-osal/include/osapi-version.h +++ /dev/null @@ -1,48 +0,0 @@ -/************************************************************************ -** File: -** $Id: osapi-version.h 1.11 2014/05/02 13:53:14GMT-05:00 acudmore Exp $ -** -** Copyright (c) 2004-2006, United States government as represented by the -** administrator of the National Aeronautics Space Administration. -** All rights reserved. This software was created at NASAs Goddard -** Space Flight Center pursuant to government contracts. -** -** This is governed by the NASA Open Source Agreement and may be used, -** distributed and modified only pursuant to the terms of that agreement. -** -** Purpose: -** The OSAL version numbers -** -** Notes: -** -** $Log: osapi-version.h $ -** Revision 1.11 2014/05/02 13:53:14GMT-05:00 acudmore -** Updated version to 4.1.1 -** Revision 1.10 2014/01/23 16:33:31GMT-05:00 acudmore -** Update for 4.1 release -** Revision 1.9 2013/01/16 14:35:18GMT-05:00 acudmore -** updated version label -** Revision 1.8 2012/04/16 14:57:04GMT-05:00 acudmore -** Updated version label to 3.5.0.0 -** Revision 1.7 2012/01/17 16:04:29EST acudmore -** Updated version to 3.4.1 -** Revision 1.6 2011/12/05 15:45:16EST acudmore -** Updated version label to 3.4.0 -** Initial revision -** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj -** -*************************************************************************/ -#ifndef _osapi_version_h_ -#define _osapi_version_h_ - -#define OS_MAJOR_VERSION (4) -#define OS_MINOR_VERSION (1) -#define OS_REVISION (1) -#define OS_MISSION_REV (0) - - -#endif /* _osapi_version_h_ */ - -/************************/ -/* End of File Comment */ -/************************/ diff --git a/os/common/ext/nasa-osal/include/osapi.h b/os/common/ext/nasa-osal/include/osapi.h deleted file mode 100644 index 46f6dc031..000000000 --- a/os/common/ext/nasa-osal/include/osapi.h +++ /dev/null @@ -1,142 +0,0 @@ -/* -** File: osapi.h -** -** Copyright (c) 2004-2006, United States government as represented by the -** administrator of the National Aeronautics Space Administration. -** All rights reserved. This software was created at NASAs Goddard -** Space Flight Center pursuant to government contracts. -** -** This is governed by the NASA Open Source Agreement and may be used, -** distributed and modified only pursuant to the terms of that agreement. -** -** Author: Alan Cudmore - Code 582 -** -** Purpose: Contains functions prototype definitions and variables declarations -** for the OS Abstraction Layer, Core OS module -** -** $Revision: 1.10 $ -** -** $Date: 2013/07/25 10:01:32GMT-05:00 $ -** -** $Log: osapi.h $ -** Revision 1.10 2013/07/25 10:01:32GMT-05:00 acudmore -** Added C++ support -** Revision 1.9 2010/11/12 12:00:17GMT-05:00 acudmore -** replaced copyright character with (c) and added open source notice where needed. -** Revision 1.8 2010/03/08 15:57:20EST acudmore -** include new OSAL version header file -** Revision 1.7 2009/08/10 14:01:10EDT acudmore -** Reset OSAL version for trunk -** Revision 1.6 2009/08/10 13:55:49EDT acudmore -** Updated OSAL version defines to 3.0 -** Revision 1.5 2009/06/10 14:15:55EDT acudmore -** Removed HAL include files. HAL code was removed from OSAL. -** Revision 1.4 2008/08/20 16:12:51EDT apcudmore -** Updated timer error codes -** Revision 1.3 2008/08/20 15:46:27EDT apcudmore -** Add support for timer API -** Revision 1.2 2008/06/20 15:13:43EDT apcudmore -** Checked in new Module loader/symbol table functionality -** Revision 1.1 2008/04/20 22:36:02EDT ruperera -** Initial revision -** Member added to project c:/MKSDATA/MKS-REPOSITORY/MKS-OSAL-REPOSITORY/src/os/inc/project.pj -** Revision 1.6 2008/02/14 11:29:10EST apcudmore -** Updated version define ( 2.11 ) -** Revision 1.5 2008/02/07 11:31:58EST apcudmore -** Fixed merge problem -** Revision 1.4 2008/02/07 11:07:29EST apcudmore -** Added dynamic loader / Symbol lookup API -** -- API only, next release will have functionality -** Revision 1.2 2008/01/29 14:30:49EST njyanchik -** I added code to all the ports that allow the values of both binary and counting semaphores to be -** gotten through the OS_*SemGetInfo API. -** Revision 1.1 2007/10/16 16:14:52EDT apcudmore -** Initial revision -** Member added to project d:/mksdata/MKS-OSAL-REPOSITORY/src/os/inc/project.pj -** Revision 1.2 2007/09/28 15:46:49EDT rjmcgraw -** Updated version numbers to 5.0 -** Revision 1.1 2007/08/24 13:43:25EDT apcudmore -** Initial revision -** Member added to project d:/mksdata/MKS-CFE-PROJECT/fsw/cfe-core/os/inc/project.pj -** Revision 1.9.1.1 2007/05/21 08:58:51EDT njyanchik -** The trunk version number has been updated to version 0.0 -** Revision 1.9 2006/06/12 10:20:07EDT rjmcgraw -** Updated OS_MINOR_VERSION from 3 to 4 -** Revision 1.8 2006/02/03 09:30:45EST njyanchik -** Changed version number to 2.3 -** Revision 1.7 2006/01/20 11:56:16EST njyanchik -** Fixed header file information to match api document -** Revision 1.15 2005/11/09 13:35:49 nyanchik -** Revisions for 2.2 include: -** a new scheduler mapper for Linux and OS X -** addition of OS_printf function -** fixed issues that would cause warnings at compile time -** -** -*/ - -#ifndef _osapi_ -#define _osapi_ - -#include "common_types.h" - -#ifdef __cplusplus - extern "C" { -#endif - -#define OS_SUCCESS (0) -#define OS_ERROR (-1) -#define OS_INVALID_POINTER (-2) -#define OS_ERROR_ADDRESS_MISALIGNED (-3) -#define OS_ERROR_TIMEOUT (-4) -#define OS_INVALID_INT_NUM (-5) -#define OS_SEM_FAILURE (-6) -#define OS_SEM_TIMEOUT (-7) -#define OS_QUEUE_EMPTY (-8) -#define OS_QUEUE_FULL (-9) -#define OS_QUEUE_TIMEOUT (-10) -#define OS_QUEUE_INVALID_SIZE (-11) -#define OS_QUEUE_ID_ERROR (-12) -#define OS_ERR_NAME_TOO_LONG (-13) -#define OS_ERR_NO_FREE_IDS (-14) -#define OS_ERR_NAME_TAKEN (-15) -#define OS_ERR_INVALID_ID (-16) -#define OS_ERR_NAME_NOT_FOUND (-17) -#define OS_ERR_SEM_NOT_FULL (-18) -#define OS_ERR_INVALID_PRIORITY (-19) -#define OS_INVALID_SEM_VALUE (-20) -#define OS_ERR_FILE (-27) -#define OS_ERR_NOT_IMPLEMENTED (-28) -#define OS_TIMER_ERR_INVALID_ARGS (-29) -#define OS_TIMER_ERR_TIMER_ID (-30) -#define OS_TIMER_ERR_UNAVAILABLE (-31) -#define OS_TIMER_ERR_INTERNAL (-32) - -/* -** Defines for Queue Timeout parameters -*/ -#define OS_PEND (0) -#define OS_CHECK (-1) - -#include "osapi-version.h" - -/* -** Include the configuration file -*/ -#include "osconfig.h" - -/* -** Include the OS API modules -*/ -#include "osapi-os-core.h" -//#include "osapi-os-filesys.h" -//#include "osapi-os-net.h" -//#include "osapi-os-loader.h" -#include "osapi-os-timer.h" - -#ifdef __cplusplus - } -#endif - -#endif - diff --git a/os/common/ext/nasa-osal/nasa-osal.mk b/os/common/ext/nasa-osal/nasa-osal.mk deleted file mode 100644 index 23b994f87..000000000 --- a/os/common/ext/nasa-osal/nasa-osal.mk +++ /dev/null @@ -1,4 +0,0 @@ -# NASAOSAL files. -NASAOSALSRC = $(CHIBIOS)/os/common/ext/nasa-osal/src/osapi.c - -NASAOSALINC = $(CHIBIOS)/os/common/ext/nasa-osal/include diff --git a/os/common/ext/nasa-osal/src/osapi.c b/os/common/ext/nasa-osal/src/osapi.c deleted file mode 100644 index b69caea62..000000000 --- a/os/common/ext/nasa-osal/src/osapi.c +++ /dev/null @@ -1,1227 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2016 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 osapi.c - * @brief OS API module code. - * - * @addtogroup nasa_osapi - * @{ - */ - -#include - -#include "ch.h" - -#include "common_types.h" -#include "osapi.h" - -#if CH_CFG_USE_MUTEXES == FALSE -#error "NASA OSAL requires CH_CFG_USE_MUTEXES" -#endif - -#if CH_CFG_USE_SEMAPHORES == FALSE -#error "NASA OSAL requires CH_CFG_USE_SEMAPHORES" -#endif - -#if CH_CFG_USE_REGISTRY == FALSE -#error "NASA OSAL requires CH_CFG_USE_REGISTRY" -#endif - -#if CH_CFG_USE_MEMCORE == FALSE -#error "NASA OSAL requires CH_CFG_USE_MEMCORE" -#endif - -#if CH_CFG_USE_MEMPOOLS == FALSE -#error "NASA OSAL requires CH_CFG_USE_MEMPOOLS" -#endif - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -#define MIN_PRIORITY 1 -#define MAX_PRIORITY 255 - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local types. */ -/*===========================================================================*/ - -/** - * @brief Type of OSAL main structure. - */ -typedef struct { - bool printf_enabled; - memory_pool_t binary_semaphores_pool; - memory_pool_t count_semaphores_pool; - memory_pool_t mutexes_pool; - binary_semaphore_t binary_semaphores[OS_MAX_BIN_SEMAPHORES]; - semaphore_t count_semaphores[OS_MAX_COUNT_SEMAPHORES]; - mutex_t mutexes[OS_MAX_MUTEXES]; -} osal_t; - -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -static osal_t osal; - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ - -/*-- Initialization API -----------------------------------------------------*/ - -/** - * @brief OS initialization. - * @details This function returns initializes the internal data structures - * of the OS Abstraction Layer. It must be called in the application - * startup code before calling any other OS routines. - * - * @return kAn error code. - * - * @api - */ -int32 OS_API_Init(void) { - - chSysInit(); - - /* OS_printf() initially disabled.*/ - osal.printf_enabled = false; - - /* 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)); - - /* Counter Semaphores pool initialization.*/ - chPoolObjectInit(&osal.count_semaphores_pool, - sizeof (semaphore_t), - NULL); - chPoolLoadArray(&osal.count_semaphores_pool, - &osal.count_semaphores, - sizeof (semaphore_t)); - - /* Mutexes pool initialization.*/ - chPoolObjectInit(&osal.mutexes_pool, - sizeof (mutex_t), - NULL); - chPoolLoadArray(&osal.mutexes_pool, - &osal.mutexes, - sizeof (mutex_t)); - - return OS_SUCCESS; -} - -/*-- Various API -----------------------------------------------------------*/ - -/** - * @brief OS printf-like function. - * @note It is initially disabled. - * @note It is not currently implemented. - * - * @param[in] string formatter string - * - * @api - */ -void OS_printf(const char *string, ...) { - - (void)string; - - if (osal.printf_enabled) { - - } -} - -/** - * @brief Disables @p OS_printf(). - * - * @api - */ -void OS_printf_disable(void) { - - osal.printf_enabled = false; -} - -/** - * @brief Enables @p OS_printf(). - * - * @api - */ -void OS_printf_enable(void) { - - osal.printf_enabled = true; -} - -/** - * @brief System tick period in microseconds. - * - * @return The system tick period. - */ -int32 OS_Tick2Micros(void) { - - return 1000000 / CH_CFG_ST_FREQUENCY; -} - -/** - * @brief Returns the local time. - * @note It is not currently implemented. - * - * @param[out] time_struct the system time - * @return An error code. - * - * @api - */ -int32 OS_GetLocalTime(OS_time_t *time_struct) { - - if (time_struct == NULL) { - return OS_INVALID_POINTER; - } - - time_struct->seconds = 0; - time_struct->microsecs = 0; - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** - * @brief Changes the local time. - * @note It is not currently implemented. - * - * @param[in] time_struct the system time - * @return An error code. - * - * @api - */ -int32 OS_SetLocalTime(OS_time_t *time_struct) { - - if (time_struct == NULL) { - return OS_INVALID_POINTER; - } - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** - * @brief Conversion from milliseconds to ticks. - * - * @param[in] milli_seconds the time in milliseconds - * @return The system ticks. - * - * @api - */ -int32 OS_Milli2Ticks(uint32 milli_seconds) { - - return (int32)MS2ST(milli_seconds); -} - -/*-- Queues API -------------------------------------------------------------*/ - -/*-- Binary Semaphore API ---------------------------------------------------*/ - -/** - * @brief Binary semaphore creation. - * - * @param[out] sem_id pointer to a binary semaphore id variable - * @param[in] sem_name the binary semaphore name - * @param[in] sem_initial_value semaphore initial value - * @param[in] options semaphore options - * @return An error code. - * - * @api - */ -int32 OS_BinSemCreate (uint32 *sem_id, const char *sem_name, - uint32 sem_initial_value, uint32 options) { - binary_semaphore_t *bsp; - - (void)options; - - /* NULL pointer checks.*/ - if ((sem_id == NULL) || (sem_name == NULL)) { - return OS_INVALID_POINTER; - } - - /* Checking semaphore name length.*/ - if (strlen(sem_name) >= OS_MAX_API_NAME) { - return OS_ERR_NAME_TOO_LONG; - } - - /* Semaphore counter check, it is binary so only 0 and 1.*/ - if (sem_initial_value > 1) { - return OS_INVALID_INT_NUM; - } - - bsp = chPoolAlloc(&osal.binary_semaphores_pool); - - if (bsp == 0) { - return OS_SEM_FAILURE; - } - - /* Semaphore is initialized.*/ - chBSemObjectInit(bsp, sem_initial_value == 0 ? false : true); - - *sem_id = (uint32)bsp; - - return OS_SUCCESS; -} - -/** - * @brief Binary semaphore deletion. - * - * @param[in] sem_id binary semaphore id variable - * @return An error code. - * - * @api - */ -int32 OS_BinSemDelete(uint32 sem_id) { - binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; - - if ((bsp < &osal.binary_semaphores[0]) || - (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* Resetting the semaphore, no threads in queue.*/ - chBSemResetI(bsp, true); - - /* Flagging it as unused and returning it to the pool.*/ - bsp->sem.queue.prev = NULL; - chPoolFreeI(&osal.binary_semaphores_pool, (void *)bsp); - - /* Required because some thread could have been made ready.*/ - chSchRescheduleS(); - - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Binary semaphore flush. - * @note The state of the binary semaphore is not changed. - * - * @param[in] sem_id binary semaphore id variable - * @return An error code. - * - * @api - */ -int32 OS_BinSemFlush(uint32 sem_id) { - binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; - - if ((bsp < &osal.binary_semaphores[0]) || - (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* If the semaphore is not in use then error.*/ - if (bsp->sem.queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - if (bsp->sem.cnt < 0) { - chBSemResetI(bsp, true); - chSchRescheduleS(); - } - - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Binary semaphore give. - * - * @param[in] sem_id binary semaphore id variable - * @return An error code. - * - * @api - */ -int32 OS_BinSemGive(uint32 sem_id) { - binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; - - if ((bsp < &osal.binary_semaphores[0]) || - (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* If the semaphore is not in use then error.*/ - if (bsp->sem.queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - chBSemSignalI(bsp); - chSchRescheduleS(); - - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Binary semaphore take. - * - * @param[in] sem_id binary semaphore id variable - * @return An error code. - * - * @api - */ -int32 OS_BinSemTake(uint32 sem_id) { - binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; - - if ((bsp < &osal.binary_semaphores[0]) || - (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* If the semaphore is not in use then error.*/ - if (bsp->sem.queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - (void) chBSemWaitS(bsp); - - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Binary semaphore take with timeout. - * - * @param[in] sem_id binary semaphore id variable - * @param[in] msecs timeout in milliseconds - * @return An error code. - * - * @api - */ -int32 OS_BinSemTimedWait(uint32 sem_id, uint32 msecs) { - binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; - msg_t msg; - - if ((bsp < &osal.binary_semaphores[0]) || - (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - /* Timeouts of zero not allowed.*/ - if (msecs == 0) { - return OS_INVALID_INT_NUM; - } - - chSysLock(); - - /* If the semaphore is not in use then error.*/ - if (bsp->sem.queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - msg = chBSemWaitTimeoutS(bsp, MS2ST(msecs)); - - chSysUnlock(); - - return msg == MSG_TIMEOUT ? OS_SEM_TIMEOUT : OS_SUCCESS; -} - -/** - * @brief Retrieves a binary semaphore id by name. - * @note It is not currently implemented. - * - * @param[out] sem_id pointer to a binary semaphore id variable - * @param[in] sem_name the binary semaphore name - * @return An error code. - * - * @api - */ -int32 OS_BinSemGetIdByName(uint32 *sem_id, const char *sem_name) { - - /* NULL pointer checks.*/ - if ((sem_id == NULL) || (sem_name == NULL)) { - return OS_INVALID_POINTER; - } - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** - * @brief Returns binary semaphore information. - * - * @param[in] sem_id binary semaphore id variable - * @param[in] bin_prop binary semaphore properties - * @return An error code. - * - * @api - */ -int32 OS_BinSemGetInfo(uint32 sem_id, OS_bin_sem_prop_t *bin_prop) { - binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; - - /* NULL pointer checks.*/ - if (bin_prop == NULL) { - return OS_INVALID_POINTER; - } - - if ((bsp < &osal.binary_semaphores[0]) || - (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* If the semaphore is not in use then error.*/ - if (bsp->sem.queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - chSysUnlock(); - - return OS_ERR_NOT_IMPLEMENTED; -} - -/*-- Counter Semaphore API --------------------------------------------------*/ - -/** - * @brief Counter semaphore creation. - * - * @param[out] sem_id pointer to a counter semaphore id variable - * @param[in] sem_name the counter semaphore name - * @param[in] sem_initial_value semaphore initial value - * @param[in] options semaphore options - * @return An error code. - * - * @api - */ -int32 OS_CountSemCreate (uint32 *sem_id, const char *sem_name, - uint32 sem_initial_value, uint32 options) { - semaphore_t *sp; - - (void)options; - - /* NULL pointer checks.*/ - if ((sem_id == NULL) || (sem_name == NULL)) { - return OS_INVALID_POINTER; - } - - /* Checking semaphore name length.*/ - if (strlen(sem_name) >= OS_MAX_API_NAME) { - return OS_ERR_NAME_TOO_LONG; - } - - /* Semaphore counter check, it must be non-negative.*/ - if ((int32)sem_initial_value < 0) { - return OS_INVALID_INT_NUM; - } - - sp = chPoolAlloc(&osal.count_semaphores_pool); - - if (sp == 0) { - return OS_SEM_FAILURE; - } - - /* Semaphore is initialized.*/ - chSemObjectInit(sp, (cnt_t)sem_initial_value); - - *sem_id = (uint32)sp; - - return OS_SUCCESS; -} - -/** - * @brief Counter semaphore deletion. - * - * @param[in] sem_id counter semaphore id variable - * @return An error code. - * - * @api - */ -int32 OS_CountSemDelete(uint32 sem_id) { - semaphore_t *sp = (semaphore_t *)sem_id; - - if ((sp < &osal.count_semaphores[0]) || - (sp >= &osal.count_semaphores[OS_MAX_COUNT_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* Resetting the semaphore, no threads in queue.*/ - chSemResetI(sp, 0); - - /* Flagging it as unused and returning it to the pool.*/ - sp->queue.prev = NULL; - chPoolFreeI(&osal.count_semaphores_pool, (void *)sp); - - /* Required because some thread could have been made ready.*/ - chSchRescheduleS(); - - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Counter semaphore give. - * - * @param[in] sem_id counter semaphore id variable - * @return An error code. - * - * @api - */ -int32 OS_CountSemGive(uint32 sem_id) { - semaphore_t *sp = (semaphore_t *)sem_id; - - if ((sp < &osal.count_semaphores[0]) || - (sp >= &osal.count_semaphores[OS_MAX_COUNT_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* If the semaphore is not in use then error.*/ - if (sp->queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - chSemSignalI(sp); - chSchRescheduleS(); - - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Counter semaphore take. - * - * @param[in] sem_id counter semaphore id variable - * @return An error code. - * - * @api - */ -int32 OS_CountSemTake(uint32 sem_id) { - semaphore_t *sp = (semaphore_t *)sem_id; - - if ((sp < &osal.count_semaphores[0]) || - (sp >= &osal.count_semaphores[OS_MAX_COUNT_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* If the semaphore is not in use then error.*/ - if (sp->queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - (void) chSemWaitS(sp); - - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Counter semaphore take with timeout. - * - * @param[in] sem_id counter semaphore id variable - * @param[in] msecs timeout in milliseconds - * @return An error code. - * - * @api - */ -int32 OS_CountSemTimedWait(uint32 sem_id, uint32 msecs) { - semaphore_t *sp = (semaphore_t *)sem_id; - msg_t msg; - - if ((sp < &osal.count_semaphores[0]) || - (sp >= &osal.count_semaphores[OS_MAX_COUNT_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - /* Timeouts of zero not allowed.*/ - if (msecs == 0) { - return OS_INVALID_INT_NUM; - } - - chSysLock(); - - /* If the semaphore is not in use then error.*/ - if (sp->queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - msg = chSemWaitTimeoutS(sp, MS2ST(msecs)); - - chSysUnlock(); - - return msg == MSG_TIMEOUT ? OS_SEM_TIMEOUT : OS_SUCCESS; -} - -/** - * @brief Retrieves a counter semaphore id by name. - * @note It is not currently implemented. - * - * @param[out] sem_id pointer to a counter semaphore id variable - * @param[in] sem_name the counter semaphore name - * @return An error code. - * - * @api - */ -int32 OS_CountSemGetIdByName(uint32 *sem_id, const char *sem_name) { - - /* NULL pointer checks.*/ - if ((sem_id == NULL) || (sem_name == NULL)) { - return OS_INVALID_POINTER; - } - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** - * @brief Returns counter semaphore information. - * - * @param[in] sem_id counter semaphore id variable - * @param[in] sem_prop counter semaphore properties - * @return An error code. - * - * @api - */ -int32 OS_CountSemGetInfo(uint32 sem_id, OS_count_sem_prop_t *sem_prop) { - semaphore_t *sp = (semaphore_t *)sem_id; - - /* NULL pointer checks.*/ - if (sem_prop == NULL) { - return OS_INVALID_POINTER; - } - - if ((sp < &osal.count_semaphores[0]) || - (sp >= &osal.count_semaphores[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* If the semaphore is not in use then error.*/ - if (sp->queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - chSysUnlock(); - - return OS_ERR_NOT_IMPLEMENTED; -} - -/*-- Mutex API --------------------------------------------------------------*/ - -/** - * @brief Mutex creation. - * - * @param[out] sem_id pointer to a mutex id variable - * @param[in] sem_name the mutex name - * @param[in] options mutex options - * @return An error code. - * - * @api - */ -int32 OS_MutSemCreate (uint32 *sem_id, const char *sem_name, uint32 options) { - mutex_t *mp; - - (void)options; - - /* NULL pointer checks.*/ - if ((sem_id == NULL) || (sem_name == NULL)) { - return OS_INVALID_POINTER; - } - - /* Checking semaphore name length.*/ - if (strlen(sem_name) >= OS_MAX_API_NAME) { - return OS_ERR_NAME_TOO_LONG; - } - - mp = chPoolAlloc(&osal.mutexes_pool); - - if (mp == 0) { - return OS_SEM_FAILURE; - } - - /* Semaphore is initialized.*/ - chMtxObjectInit(mp); - - *sem_id = (uint32)mp; - - return OS_SUCCESS; -} - -/** - * @brief Mutex deletion. - * - * @param[in] sem_id mutex id variable - * @return An error code. - * - * @api - */ -int32 OS_MutSemDelete(uint32 sem_id) { - mutex_t *mp = (mutex_t *)sem_id; - - if ((mp < &osal.mutexes[0]) || - (mp >= &osal.mutexes[OS_MAX_MUTEXES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* Resetting the mutex, no threads in queue.*/ - chMtxUnlockAllS(); - - /* Flagging it as unused and returning it to the pool.*/ - mp->queue.prev = NULL; - chPoolFreeI(&osal.mutexes_pool, (void *)mp); - - /* Required because some thread could have been made ready.*/ - chSchRescheduleS(); - - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Mutex give. - * - * @param[in] sem_id mutex id variable - * @return An error code. - * - * @api - */ -int32 OS_MutSemGive(uint32 sem_id) { - mutex_t *mp = (mutex_t *)sem_id; - - if ((mp < &osal.mutexes[0]) || - (mp >= &osal.mutexes[OS_MAX_COUNT_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* If the mutex is not in use then error.*/ - if (mp->queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - chMtxUnlockS(mp); - chSchRescheduleS(); - - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Mutex take. - * - * @param[in] sem_id mutex id variable - * @return An error code. - * - * @api - */ -int32 OS_MutSemTake(uint32 sem_id) { - mutex_t *mp = (mutex_t *)sem_id; - - if ((mp < &osal.mutexes[0]) || - (mp >= &osal.mutexes[OS_MAX_COUNT_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* If the mutex is not in use then error.*/ - if (mp->queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - chMtxLockS(mp); - - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Retrieves a mutex id by name. - * @note It is not currently implemented. - * - * @param[out] sem_id pointer to a mutex id variable - * @param[in] sem_name the mutex name - * @return An error code. - * - * @api - */ -int32 OS_MutSemGetIdByName(uint32 *sem_id, const char *sem_name) { - - /* NULL pointer checks.*/ - if ((sem_id == NULL) || (sem_name == NULL)) { - return OS_INVALID_POINTER; - } - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** - * @brief Returns mutex information. - * - * @param[in] sem_id mutex id variable - * @param[in] sem_prop mutex properties - * @return An error code. - * - * @api - */ -int32 OS_MutSemGetInfo(uint32 sem_id, OS_mut_sem_prop_t *sem_prop) { - mutex_t *mp = (mutex_t *)sem_id; - - /* NULL pointer checks.*/ - if (sem_prop == NULL) { - return OS_INVALID_POINTER; - } - - if ((mp < &osal.mutexes[0]) || - (mp >= &osal.mutexes[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* If the mutex is not in use then error.*/ - if (mp->queue.prev == NULL) { - chSysUnlock(); - return OS_SEM_FAILURE; - } - - chSysUnlock(); - - return OS_ERR_NOT_IMPLEMENTED; -} - -/*-- Task Control API -------------------------------------------------------*/ - -/** - * @brief Task creation. - * - * @param[out] task_id pointer to a task id variable - * @param[in] task_name the task name - * @param[in] function_pointer the task function - * @param[in] stack_pointer base of stack area - * @param[in] stack_size size of stack area - * @param[in] priority the task priority - * @param[in] flags task attributes - * @return An error code. - * - * @api - */ -int32 OS_TaskCreate(uint32 *task_id, - const char *task_name, - osal_task_entry function_pointer, - const uint32 *stack_pointer, - uint32 stack_size, - uint32 priority, - uint32 flags) { - tprio_t rt_prio; - thread_t *tp; - - (void)flags; - - /* NULL pointer checks.*/ - if ((task_id == NULL) || (task_name == NULL) || - (function_pointer == NULL) || (stack_pointer == NULL)) { - return OS_INVALID_POINTER; - } - - /* Checking alignment of stack base and size, it is application - responsibility to pass correct values.*/ - if (!MEM_IS_ALIGNED(stack_pointer, PORT_WORKING_AREA_ALIGN) || - !MEM_IS_ALIGNED(stack_size, sizeof (stkalign_t))) { - return OS_ERROR_ADDRESS_MISALIGNED; - } - - /* Checking task name length.*/ - if (strlen(task_name) >= OS_MAX_API_NAME) { - return OS_ERR_NAME_TOO_LONG; - } - - /* Checking priority range.*/ - if ((priority < MIN_PRIORITY) || (priority > MAX_PRIORITY)) { - return OS_ERR_INVALID_PRIORITY; - } - - /* Checking if the specified stack size is below the bare minimum.*/ - if (stack_size < (uint32)THD_WORKING_AREA_SIZE(0)) { - return OS_INVALID_INT_NUM; - } - - /* Converting priority to RT type.*/ - rt_prio = (tprio_t)256 - (tprio_t)priority; - - tp = chThdCreateFromHeap(NULL, (size_t)stack_size, task_name, - rt_prio, (tfunc_t)function_pointer, NULL); - - /* Out-of-memory condition.*/ - if (tp == NULL) { - return OS_ERROR; - } - - /* Storing the task id.*/ - *task_id = (uint32)tp; - - return OS_SUCCESS; -} - -/** - * @brief Installs a deletion handler. - * @note It is not currently implemented. - * - * @param[in] function_pointer the handler function - * @return An error code. - * - * @api - */ -int32 OS_TaskInstallDeleteHandler(void *function_pointer) { - - (void)function_pointer; - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** - * @brief Task delete. - * @note It is not currently implemented. - * - * @param[in] task_id the task id - * @return An error code. - * - * @api - */ -int32 OS_TaskDelete(uint32 task_id) { - - (void)task_id; - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** - * @brief Task exit. - * - * @api - */ -void OS_TaskExit(void) { - - chThdExit(MSG_OK); -} - -/** - * @brief Task delay. - * - * @param[in] milli_second the period in miliseconds - * @return An error code. - * - * @api - */ -int32 OS_TaskDelay(uint32 milli_second) { - - chThdSleepMilliseconds(milli_second); - return OS_SUCCESS; -} - -/** - * @brief Change task priority. - * - * @param[in] task_id the task id - * @param[in] new_priority the task new priority - * @return An error code. - * - * @api - */ -int32 OS_TaskSetPriority (uint32 task_id, uint32 new_priority) { - tprio_t rt_newprio; - thread_t *tp = (thread_t *)task_id; - - /* Checking priority range.*/ - if ((new_priority < MIN_PRIORITY) || (new_priority > MAX_PRIORITY)) { - return OS_ERR_INVALID_PRIORITY; - } - - /* Converting priority to RT type.*/ - rt_newprio = (tprio_t)256 - (tprio_t)new_priority; - - if (chThdGetPriorityX() == rt_newprio) { - return OS_SUCCESS; - } - - chSysLock(); - - /* Changing priority.*/ - if ((tp->prio == tp->realprio) || (rt_newprio > tp->prio)) { - tp->prio = rt_newprio; - } - tp->realprio = rt_newprio; - - /* The following states need priority queues reordering.*/ - switch (tp->state) { - case CH_STATE_WTMTX: -#if CH_CFG_USE_CONDVARS - case CH_STATE_WTCOND: -#endif -#if CH_CFG_USE_SEMAPHORES_PRIORITY - case CH_STATE_WTSEM: -#endif -#if CH_CFG_USE_MESSAGES && CH_CFG_USE_MESSAGES_PRIORITY - case CH_STATE_SNDMSGQ: -#endif - /* Re-enqueues tp with its new priority on the queue.*/ - queue_prio_insert(queue_dequeue(tp), - (threads_queue_t *)tp->u.wtobjp); - break; - case CH_STATE_READY: -#if CH_DBG_ENABLE_ASSERTS - /* Prevents an assertion in chSchReadyI().*/ - tp->state = CH_STATE_CURRENT; -#endif - /* Re-enqueues tp with its new priority on the ready list.*/ - chSchReadyI(queue_dequeue(tp)); - break; - } - - /* Rescheduling.*/ - chSchRescheduleS(); - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Task registration. - * @note In ChibiOS/RT it does nothing. - * - * @return An error code. - * - * @api - */ -int32 OS_TaskRegister(void) { - - return OS_SUCCESS; -} - -/** - * @brief Current task id. - * - * @return The current task id. - * - * @api - */ -uint32 OS_TaskGetId(void) { - - return (uint32)chThdGetSelfX(); -} - -/** - * @brief Retrieves a task id by name. - * - * @param[out] task_id pointer to a task id variable - * @param[in] task_name the task name - * @return An error code. - * - * @api - */ -int32 OS_TaskGetIdByName (uint32 *task_id, const char *task_name) { - thread_t *tp; - - /* NULL pointer checks.*/ - if ((task_id == NULL) || (task_name == NULL)) { - return OS_INVALID_POINTER; - } - - /* Checking task name length.*/ - if (strlen(task_name) >= OS_MAX_API_NAME) { - return OS_ERR_NAME_TOO_LONG; - } - - /* Scanning registry.*/ - tp = chRegFirstThread(); - do { - if (strcmp(chRegGetThreadNameX(tp), task_name) == 0) { - *task_id = (uint32)tp; - return OS_SUCCESS; - } - tp = chRegNextThread(tp); - } while (tp != NULL); - - return OS_ERR_NAME_NOT_FOUND; -} - -/** - * @brief Returns task information. - * - * @param[in] task_id the task id - * @param[in] task_prop task properties - * @return An error code. - * - * @api - */ -int32 OS_TaskGetInfo(uint32 task_id, OS_task_prop_t *task_prop) { - thread_t *tp = (thread_t *)task_id; - size_t wasize = (size_t)tp - (size_t)tp->stklimit + sizeof (thread_t); - - /* NULL pointer checks.*/ - if (task_prop == NULL) { - return OS_INVALID_POINTER; - } - - strncpy(task_prop->name, tp->name, OS_MAX_API_NAME - 1); - task_prop->creator = (uint32)chSysGetIdleThreadX(); - task_prop->stack_size = (uint32)MEM_ALIGN_NEXT(wasize, PORT_STACK_ALIGN); - task_prop->priority = (uint32)256U - (uint32)tp->realprio; - task_prop->OStask_id = task_id; - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** @} */ diff --git a/os/common/ports/ARMCMx/cmsis_os/cmsis_os.c b/os/common/ports/ARMCMx/cmsis_os/cmsis_os.c deleted file mode 100644 index 04bebeb1d..000000000 --- a/os/common/ports/ARMCMx/cmsis_os/cmsis_os.c +++ /dev/null @@ -1,555 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* - Concepts and parts of this file have been contributed by Andre R. - */ - -/** - * @file cmsis_os.c - * @brief CMSIS RTOS module code. - * - * @addtogroup CMSIS_OS - * @{ - */ - -#include "cmsis_os.h" -#include - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -int32_t cmsis_os_started; - -/*===========================================================================*/ -/* Module local types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -static memory_pool_t sempool; -static semaphore_t semaphores[CMSIS_CFG_NUM_SEMAPHORES]; - -static memory_pool_t timpool; -static struct os_timer_cb timers[CMSIS_CFG_NUM_TIMERS]; - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -/** - * @brief Virtual timers common callback. - */ -static void timer_cb(void const *arg) { - - osTimerId timer_id = (osTimerId)arg; - timer_id->ptimer(timer_id->argument); - if (timer_id->type == osTimerPeriodic) { - chSysLockFromISR(); - chVTDoSetI(&timer_id->vt, MS2ST(timer_id->millisec), - (vtfunc_t)timer_cb, timer_id); - chSysUnlockFromISR(); - } -} - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ - -/** - * @brief Kernel initialization. - */ -osStatus osKernelInitialize(void) { - - cmsis_os_started = 0; - - chSysInit(); - chThdSetPriority(HIGHPRIO); - - chPoolObjectInit(&sempool, sizeof(semaphore_t), chCoreAllocAligned); - chPoolLoadArray(&sempool, semaphores, CMSIS_CFG_NUM_SEMAPHORES); - - chPoolObjectInit(&timpool, sizeof(virtual_timer_t), chCoreAllocAligned); - chPoolLoadArray(&timpool, timers, CMSIS_CFG_NUM_TIMERS); - - return osOK; -} - -/** - * @brief Kernel start. - */ -osStatus osKernelStart(void) { - - cmsis_os_started = 1; - - chThdSetPriority(NORMALPRIO); - - return osOK; -} - -/** - * @brief Creates a thread. - */ -osThreadId osThreadCreate(const osThreadDef_t *thread_def, void *argument) { - size_t size; - - size = thread_def->stacksize == 0 ? CMSIS_CFG_DEFAULT_STACK : - thread_def->stacksize; - return (osThreadId)chThdCreateFromHeap(0, - THD_WORKING_AREA_SIZE(size), - thread_def->name, - NORMALPRIO+thread_def->tpriority, - (tfunc_t)thread_def->pthread, - argument); -} - -/** - * @brief Thread termination. - * @note The thread is not really terminated but asked to terminate which - * is not compliant. - */ -osStatus osThreadTerminate(osThreadId thread_id) { - - if (thread_id == osThreadGetId()) { - /* Note, no memory will be recovered unless a cleaner thread is - implemented using the registry.*/ - chThdExit(0); - } - chEvtSignal((thread_t *)thread_id, CH_EVENT_TERMINATE); - chThdWait((thread_t *)thread_id); - - return osOK; -} - -/** - * @brief Change thread priority. - * @note This can interfere with the priority inheritance mechanism. - */ -osStatus osThreadSetPriority(osThreadId thread_id, osPriority newprio) { - osPriority oldprio; - thread_t * tp = (thread_t *)thread_id; - - chSysLock(); - - /* Changing priority.*/ -#if CH_CFG_USE_MUTEXES - oldprio = (osPriority)tp->realprio; - if ((tp->prio == tp->realprio) || ((tprio_t)newprio > tp->prio)) - tp->prio = (tprio_t)newprio; - tp->realprio = (tprio_t)newprio; -#else - oldprio = tp->prio; - tp->prio = (tprio_t)newprio; -#endif - - /* The following states need priority queues reordering.*/ - switch (tp->state) { -#if CH_CFG_USE_MUTEXES | \ - CH_CFG_USE_CONDVARS | \ - (CH_CFG_USE_SEMAPHORES && CH_CFG_USE_SEMAPHORES_PRIORITY) | \ - (CH_CFG_USE_MESSAGES && CH_CFG_USE_MESSAGES_PRIORITY) -#if CH_CFG_USE_MUTEXES - case CH_STATE_WTMTX: -#endif -#if CH_CFG_USE_CONDVARS - case CH_STATE_WTCOND: -#endif -#if CH_CFG_USE_SEMAPHORES && CH_CFG_USE_SEMAPHORES_PRIORITY - case CH_STATE_WTSEM: -#endif -#if CH_CFG_USE_MESSAGES && CH_CFG_USE_MESSAGES_PRIORITY - case CH_STATE_SNDMSGQ: -#endif - /* Re-enqueues tp with its new priority on the queue.*/ - queue_prio_insert(queue_dequeue(tp), - (threads_queue_t *)tp->u.wtobjp); - break; -#endif - case CH_STATE_READY: -#if CH_DBG_ENABLE_ASSERTS - /* Prevents an assertion in chSchReadyI().*/ - tp->state = CH_STATE_CURRENT; -#endif - /* Re-enqueues tp with its new priority on the ready list.*/ - chSchReadyI(queue_dequeue(tp)); - break; - } - - /* Rescheduling.*/ - chSchRescheduleS(); - - chSysUnlock(); - - return oldprio; -} - -/** - * @brief Create a timer. - */ -osTimerId osTimerCreate(const osTimerDef_t *timer_def, - os_timer_type type, - void *argument) { - - osTimerId timer = chPoolAlloc(&timpool); - chVTObjectInit(&timer->vt); - timer->ptimer = timer_def->ptimer; - timer->type = type; - timer->argument = argument; - return timer; -} - -/** - * @brief Start a timer. - */ -osStatus osTimerStart(osTimerId timer_id, uint32_t millisec) { - - if ((millisec == 0) || (millisec == osWaitForever)) - return osErrorValue; - - timer_id->millisec = millisec; - chVTSet(&timer_id->vt, MS2ST(millisec), (vtfunc_t)timer_cb, timer_id); - - return osOK; -} - -/** - * @brief Stop a timer. - */ -osStatus osTimerStop(osTimerId timer_id) { - - chVTReset(&timer_id->vt); - - return osOK; -} - -/** - * @brief Delete a timer. - */ -osStatus osTimerDelete(osTimerId timer_id) { - - chVTReset(&timer_id->vt); - chPoolFree(&timpool, (void *)timer_id); - - return osOK; -} - -/** - * @brief Send signals. - */ -int32_t osSignalSet(osThreadId thread_id, int32_t signals) { - int32_t oldsignals; - - syssts_t sts = chSysGetStatusAndLockX(); - oldsignals = (int32_t)thread_id->epending; - chEvtSignalI((thread_t *)thread_id, (eventmask_t)signals); - chSysRestoreStatusX(sts); - - return oldsignals; -} - -/** - * @brief Clear signals. - */ -int32_t osSignalClear(osThreadId thread_id, int32_t signals) { - eventmask_t m; - - chSysLock(); - - m = thread_id->epending & (eventmask_t)signals; - thread_id->epending &= ~(eventmask_t)signals; - - chSysUnlock(); - - return (int32_t)m; -} - -/** - * @brief Wait for signals. - */ -osEvent osSignalWait(int32_t signals, uint32_t millisec) { - osEvent event; - systime_t timeout = ((millisec == 0) || (millisec == osWaitForever)) ? - TIME_INFINITE : MS2ST(millisec); - - if (signals == 0) - event.value.signals = (uint32_t)chEvtWaitAnyTimeout(ALL_EVENTS, timeout); - else - event.value.signals = (uint32_t)chEvtWaitAllTimeout((eventmask_t)signals, - timeout); - - /* Type of event.*/ - if (event.value.signals == 0) - event.status = osEventTimeout; - else - event.status = osEventSignal; - - return event; -} - -/** - * @brief Create a semaphore. - * @note @p semaphore_def is not used. - * @note Can involve memory allocation. - */ -osSemaphoreId osSemaphoreCreate(const osSemaphoreDef_t *semaphore_def, - int32_t count) { - - (void)semaphore_def; - - semaphore_t *sem = chPoolAlloc(&sempool); - chSemObjectInit(sem, (cnt_t)count); - return sem; -} - -/** - * @brief Wait on a semaphore. - */ -int32_t osSemaphoreWait(osSemaphoreId semaphore_id, uint32_t millisec) { - systime_t timeout = ((millisec == 0) || (millisec == osWaitForever)) ? - TIME_INFINITE : MS2ST(millisec); - - msg_t msg = chSemWaitTimeout((semaphore_t *)semaphore_id, timeout); - switch (msg) { - case MSG_OK: - return osOK; - case MSG_TIMEOUT: - return osErrorTimeoutResource; - } - return osErrorResource; -} - -/** - * @brief Release a semaphore. - */ -osStatus osSemaphoreRelease(osSemaphoreId semaphore_id) { - - syssts_t sts = chSysGetStatusAndLockX(); - chSemSignalI((semaphore_t *)semaphore_id); - chSysRestoreStatusX(sts); - - return osOK; -} - -/** - * @brief Deletes a semaphore. - * @note After deletion there could be references in the system to a - * non-existent semaphore. - */ -osStatus osSemaphoreDelete(osSemaphoreId semaphore_id) { - - chSemReset((semaphore_t *)semaphore_id, 0); - chPoolFree(&sempool, (void *)semaphore_id); - - return osOK; -} - -/** - * @brief Create a mutex. - * @note @p mutex_def is not used. - * @note Can involve memory allocation. - */ -osMutexId osMutexCreate(const osMutexDef_t *mutex_def) { - - (void)mutex_def; - - binary_semaphore_t *mtx = chPoolAlloc(&sempool); - chBSemObjectInit(mtx, false); - return mtx; -} - -/** - * @brief Wait on a mutex. - */ -osStatus osMutexWait(osMutexId mutex_id, uint32_t millisec) { - systime_t timeout = ((millisec == 0) || (millisec == osWaitForever)) ? - TIME_INFINITE : MS2ST(millisec); - - msg_t msg = chBSemWaitTimeout((binary_semaphore_t *)mutex_id, timeout); - switch (msg) { - case MSG_OK: - return osOK; - case MSG_TIMEOUT: - return osErrorTimeoutResource; - } - return osErrorResource; -} - -/** - * @brief Release a mutex. - */ -osStatus osMutexRelease(osMutexId mutex_id) { - - syssts_t sts = chSysGetStatusAndLockX(); - chBSemSignalI((binary_semaphore_t *)mutex_id); - chSysRestoreStatusX(sts); - - return osOK; -} - -/** - * @brief Deletes a mutex. - * @note After deletion there could be references in the system to a - * non-existent semaphore. - */ -osStatus osMutexDelete(osMutexId mutex_id) { - - chSemReset((semaphore_t *)mutex_id, 0); - chPoolFree(&sempool, (void *)mutex_id); - - return osOK; -} - -/** - * @brief Create a memory pool. - * @note The pool is not really created because it is allocated statically, - * this function just re-initializes it. - */ -osPoolId osPoolCreate(const osPoolDef_t *pool_def) { - - chPoolObjectInit(pool_def->pool, (size_t)pool_def->item_sz, NULL); - chPoolLoadArray(pool_def->pool, pool_def->items, (size_t)pool_def->pool_sz); - - return (osPoolId)pool_def->pool; -} - -/** - * @brief Allocate an object. - */ -void *osPoolAlloc(osPoolId pool_id) { - void *object; - - syssts_t sts = chSysGetStatusAndLockX(); - object = chPoolAllocI((memory_pool_t *)pool_id); - chSysRestoreStatusX(sts); - - return object; -} - -/** - * @brief Allocate an object clearing it. - */ -void *osPoolCAlloc(osPoolId pool_id) { - void *object; - - object = chPoolAllocI((memory_pool_t *)pool_id); - memset(object, 0, pool_id->object_size); - return object; -} - -/** - * @brief Free an object. - */ -osStatus osPoolFree(osPoolId pool_id, void *block) { - - syssts_t sts = chSysGetStatusAndLockX(); - chPoolFreeI((memory_pool_t *)pool_id, block); - chSysRestoreStatusX(sts); - - return osOK; -} - -/** - * @brief Create a message queue. - * @note The queue is not really created because it is allocated statically, - * this function just re-initializes it. - */ -osMessageQId osMessageCreate(const osMessageQDef_t *queue_def, - osThreadId thread_id) { - - /* Ignoring this parameter for now.*/ - (void)thread_id; - - if (queue_def->item_sz > sizeof (msg_t)) - return NULL; - - chMBObjectInit(queue_def->mailbox, - queue_def->items, - (size_t)queue_def->queue_sz); - - return (osMessageQId) queue_def->mailbox; -} - -/** - * @brief Put a message in the queue. - */ -osStatus osMessagePut(osMessageQId queue_id, - uint32_t info, - uint32_t millisec) { - msg_t msg; - systime_t timeout = ((millisec == 0) || (millisec == osWaitForever)) ? - TIME_INFINITE : MS2ST(millisec); - - if (port_is_isr_context()) { - - /* Waiting makes no sense in ISRs so any value except "immediate" - makes no sense.*/ - if (millisec != 0) - return osErrorValue; - - chSysLockFromISR(); - msg = chMBPostI((mailbox_t *)queue_id, (msg_t)info); - chSysUnlockFromISR(); - } - else - msg = chMBPost((mailbox_t *)queue_id, (msg_t)info, timeout); - - return msg == MSG_OK ? osOK : osEventTimeout; -} - -/** - * @brief Get a message from the queue. - */ -osEvent osMessageGet(osMessageQId queue_id, - uint32_t millisec) { - msg_t msg; - osEvent event; - systime_t timeout = ((millisec == 0) || (millisec == osWaitForever)) ? - TIME_INFINITE : MS2ST(millisec); - - event.def.message_id = queue_id; - - if (port_is_isr_context()) { - - /* Waiting makes no sense in ISRs so any value except "immediate" - makes no sense.*/ - if (millisec != 0) { - event.status = osErrorValue; - return event; - } - - chSysLockFromISR(); - msg = chMBFetchI((mailbox_t *)queue_id, (msg_t*)&event.value.v); - chSysUnlockFromISR(); - } - else { - msg = chMBFetch((mailbox_t *)queue_id, (msg_t*)&event.value.v, timeout); - } - - /* Returned event type.*/ - event.status = msg == MSG_OK ? osEventMessage : osEventTimeout; - return event; -} - -/** @} */ diff --git a/os/common/ports/ARMCMx/cmsis_os/cmsis_os.h b/os/common/ports/ARMCMx/cmsis_os/cmsis_os.h deleted file mode 100644 index 1c0998baf..000000000 --- a/os/common/ports/ARMCMx/cmsis_os/cmsis_os.h +++ /dev/null @@ -1,522 +0,0 @@ -/* - ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio. - - This file is part of ChibiOS. - - ChibiOS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - ChibiOS is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* - Concepts and parts of this file have been contributed by Andre R. - */ - -/** - * @file cmsis_os.h - * @brief CMSIS RTOS module macros and structures. - * - * @addtogroup CMSIS_OS - * @{ - */ - -#ifndef _CMSIS_OS_H_ -#define _CMSIS_OS_H_ - -#include "ch.h" - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/** - * @brief API version. - */ -#define osCMSIS 0x10002 - -/** - * @brief Kernel version. - */ -#define osKernelSystemId "KERNEL V1.00" - -/** - * @brief ChibiOS/RT version encoded for CMSIS. - */ -#define osCMSIS_KERNEL ((CH_KERNEL_MAJOR << 16) | \ - (CH_KERNEL_MINOR << 8) | \ - (CH_KERNEL_PATCH)) - -/** - * @name CMSIS Capabilities - * @{ - */ -#define osFeature_MainThread 1 -#define osFeature_Pool 1 -#define osFeature_MailQ 0 -#define osFeature_MessageQ 1 -#define osFeature_Signals 24 -#define osFeature_Semaphore ((1U << 31) - 1U) -#define osFeature_Wait 0 -#define osFeature_SysTick 1 -/**< @} */ - -/** - * @brief Wait forever specification for timeouts. - */ -#define osWaitForever TIME_INFINITE - -/** - * @brief System tick frequency. - */ -#define osKernelSysTickFrequency CH_CFG_FREQUENCY - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @brief Number of pre-allocated static semaphores/mutexes. - */ -#if !defined(CMSIS_CFG_DEFAULT_STACK) -#define CMSIS_CFG_DEFAULT_STACK 256 -#endif - -/** - * @brief Number of pre-allocated static semaphores/mutexes. - */ -#if !defined(CMSIS_CFG_NUM_SEMAPHORES) -#define CMSIS_CFG_NUM_SEMAPHORES 4 -#endif - -/** - * @brief Number of pre-allocated static timers. - */ -#if !defined(CMSIS_CFG_NUM_TIMERS) -#define CMSIS_CFG_NUM_TIMERS 4 -#endif - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -#if !CH_CFG_USE_MEMPOOLS -#error "CMSIS RTOS requires CH_CFG_USE_MEMPOOLS" -#endif - -#if !CH_CFG_USE_EVENTS -#error "CMSIS RTOS requires CH_CFG_USE_EVENTS" -#endif - -#if !CH_CFG_USE_EVENTS_TIMEOUT -#error "CMSIS RTOS requires CH_CFG_USE_EVENTS_TIMEOUT" -#endif - -#if !CH_CFG_USE_SEMAPHORES -#error "CMSIS RTOS requires CH_CFG_USE_SEMAPHORES" -#endif - -#if !CH_CFG_USE_DYNAMIC -#error "CMSIS RTOS requires CH_CFG_USE_DYNAMIC" -#endif - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Type of priority levels. - */ -typedef enum { - osPriorityIdle = -3, - osPriorityLow = -2, - osPriorityBelowNormal = -1, - osPriorityNormal = 0, - osPriorityAboveNormal = +1, - osPriorityHigh = +2, - osPriorityRealtime = +3, - osPriorityError = 0x84 -} osPriority; - -/** - * @brief Type of error codes. - */ -typedef enum { - osOK = 0, - osEventSignal = 0x08, - osEventMessage = 0x10, - osEventMail = 0x20, - osEventTimeout = 0x40, - osErrorParameter = 0x80, - osErrorResource = 0x81, - osErrorTimeoutResource = 0xC1, - osErrorISR = 0x82, - osErrorISRRecursive = 0x83, - osErrorPriority = 0x84, - osErrorNoMemory = 0x85, - osErrorValue = 0x86, - osErrorOS = 0xFF, - os_status_reserved = 0x7FFFFFFF -} osStatus; - -/** - * @brief Type of a timer mode. - */ -typedef enum { - osTimerOnce = 0, - osTimerPeriodic = 1 -} os_timer_type; - -/** - * @brief Type of thread functions. - */ -typedef void (*os_pthread) (void const *argument); - -/** - * @brief Type of timer callback. - */ -typedef void (*os_ptimer) (void const *argument); - -/** - * @brief Type of pointer to thread control block. - */ -typedef thread_t *osThreadId; - -/** - * @brief Type of pointer to timer control block. - */ -typedef struct os_timer_cb { - virtual_timer_t vt; - os_timer_type type; - os_ptimer ptimer; - void *argument; - uint32_t millisec; -} *osTimerId; - -/** - * @brief Type of pointer to mutex control block. - */ -typedef binary_semaphore_t *osMutexId; - -/** - * @brief Type of pointer to semaphore control block. - */ -typedef semaphore_t *osSemaphoreId; - -/** - * @brief Type of pointer to memory pool control block. - */ -typedef memory_pool_t *osPoolId; - -/** - * @brief Type of pointer to message queue control block. - */ -typedef struct mailbox *osMessageQId; - -/** - * @brief Type of an event. - */ -typedef struct { - osStatus status; - union { - uint32_t v; - void *p; - int32_t signals; - } value; - union { -/* osMailQId mail_id;*/ - osMessageQId message_id; - } def; -} osEvent; - -/** - * @brief Type of a thread definition block. - */ -typedef struct os_thread_def { - os_pthread pthread; - osPriority tpriority; - uint32_t stacksize; - const char *name; -} osThreadDef_t; - -/** - * @brief Type of a timer definition block. - */ -typedef struct os_timer_def { - os_ptimer ptimer; -} osTimerDef_t; - -/** - * @brief Type of a mutex definition block. - */ -typedef struct os_mutex_def { - uint32_t dummy; -} osMutexDef_t; - -/** - * @brief Type of a semaphore definition block. - */ -typedef struct os_semaphore_def { - uint32_t dummy; -} osSemaphoreDef_t; - -/** - * @brief Type of a memory pool definition block. - */ -typedef struct os_pool_def { - uint32_t pool_sz; - uint32_t item_sz; - memory_pool_t *pool; - void *items; -} osPoolDef_t; - -/** - * @brief Type of a message queue definition block. - */ -typedef struct os_messageQ_def { - uint32_t queue_sz; - uint32_t item_sz; - mailbox_t *mailbox; - void *items; -} osMessageQDef_t; - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/** - * @brief Convert a microseconds value to a RTOS kernel system timer value. - */ -#define osKernelSysTickMicroSec(microsec) (((uint64_t)microsec * \ - (osKernelSysTickFrequency)) / \ - 1000000) - -/** - * @brief Create a Thread definition. - */ -#if defined(osObjectsExternal) -#define osThreadDef(thd, priority, stacksz, name) \ - extern const osThreadDef_t os_thread_def_##thd -#else -#define osThreadDef(thd, priority, stacksz, name) \ -const osThreadDef_t os_thread_def_##thd = { \ - (thd), \ - (priority), \ - (stacksz), \ - (name) \ -} -#endif - -/** - * @brief Access a Thread definition. - */ -#define osThread(name) &os_thread_def_##name - -/** - * @brief Define a Timer object. - */ -#if defined(osObjectsExternal) -#define osTimerDef(name, function) \ - extern const osTimerDef_t os_timer_def_##name -#else -#define osTimerDef(name, function) \ -const osTimerDef_t os_timer_def_##name = { \ - (function) \ -} -#endif - -/** - * @brief Access a Timer definition. - */ -#define osTimer(name) &os_timer_def_##name - -/** - * @brief Define a Mutex. - */ -#if defined(osObjectsExternal) -#define osMutexDef(name) extern const osMutexDef_t os_mutex_def_##name -#else -#define osMutexDef(name) const osMutexDef_t os_mutex_def_##name = {0} -#endif - -/** - * @brief Access a Mutex definition. - */ -#define osMutex(name) &os_mutex_def_##name - -/** - * @brief Define a Semaphore. - */ -#if defined(osObjectsExternal) -#define osSemaphoreDef(name) \ - extern const osSemaphoreDef_t os_semaphore_def_##name -#else // define the object -#define osSemaphoreDef(name) \ - const osSemaphoreDef_t os_semaphore_def_##name = {0} -#endif - -/** - * @brief Access a Semaphore definition. - */ -#define osSemaphore(name) &os_semaphore_def_##name - -/** - * @brief Define a Memory Pool. - */ -#if defined(osObjectsExternal) -#define osPoolDef(name, no, type) \ - extern const osPoolDef_t os_pool_def_##name -#else -#define osPoolDef(name, no, type) \ -static const type os_pool_buf_##name[no]; \ -static memory_pool_t os_pool_obj_##name; \ -const osPoolDef_t os_pool_def_##name = { \ - (no), \ - sizeof (type), \ - (void *)&os_pool_obj_##name, \ - (void *)&os_pool_buf_##name[0] \ -} -#endif - -/** - * @brief Access a Memory Pool definition. - */ -#define osPool(name) &os_pool_def_##name - -/** - * @brief Define a Message Queue. - */ -#if defined(osObjectsExternal) -#define osMessageQDef(name, queue_sz, type) \ - extern const osMessageQDef_t os_messageQ_def_##name -#else -#define osMessageQDef(name, queue_sz, type) \ -static const msg_t os_messageQ_buf_##name[queue_sz]; \ -static mailbox_t os_messageQ_obj_##name; \ -const osMessageQDef_t os_messageQ_def_##name = { \ - (queue_sz), \ - sizeof (type) \ - (void *)&os_messageQ_obj_##name, \ - (void *)&os_messageQ_buf_##name[0] \ -} -#endif - -/** - * @brief Access a Message Queue definition. - */ -#define osMessageQ(name) &os_messageQ_def_##name - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -extern int32_t cmsis_os_started; - -#ifdef __cplusplus -extern "C" { -#endif - osStatus osKernelInitialize(void); - osStatus osKernelStart(void); - osThreadId osThreadCreate(const osThreadDef_t *thread_def, void *argument); - osStatus osThreadTerminate(osThreadId thread_id); - osStatus osThreadSetPriority(osThreadId thread_id, osPriority newprio); - /*osEvent osWait(uint32_t millisec);*/ - osTimerId osTimerCreate(const osTimerDef_t *timer_def, - os_timer_type type, - void *argument); - osStatus osTimerStart(osTimerId timer_id, uint32_t millisec); - osStatus osTimerStop(osTimerId timer_id); - osStatus osTimerDelete(osTimerId timer_id); - int32_t osSignalSet(osThreadId thread_id, int32_t signals); - int32_t osSignalClear(osThreadId thread_id, int32_t signals); - osEvent osSignalWait(int32_t signals, uint32_t millisec); - osSemaphoreId osSemaphoreCreate(const osSemaphoreDef_t *semaphore_def, - int32_t count); - int32_t osSemaphoreWait(osSemaphoreId semaphore_id, uint32_t millisec); - osStatus osSemaphoreRelease(osSemaphoreId semaphore_id); - osStatus osSemaphoreDelete(osSemaphoreId semaphore_id); - osMutexId osMutexCreate(const osMutexDef_t *mutex_def); - osStatus osMutexWait(osMutexId mutex_id, uint32_t millisec); - osStatus osMutexRelease(osMutexId mutex_id); - osStatus osMutexDelete(osMutexId mutex_id); - osPoolId osPoolCreate(const osPoolDef_t *pool_def); - void *osPoolAlloc(osPoolId pool_id); - void *osPoolCAlloc(osPoolId pool_id); - osStatus osPoolFree(osPoolId pool_id, void *block); - osMessageQId osMessageCreate(const osMessageQDef_t *queue_def, - osThreadId thread_id); - osStatus osMessagePut(osMessageQId queue_id, - uint32_t info, - uint32_t millisec); - osEvent osMessageGet(osMessageQId queue_id, - uint32_t millisec); -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -/** - * @brief To be or not to be. - */ -static inline int32_t osKernelRunning(void) { - - return cmsis_os_started; -} - -/** - * @brief System ticks since start. - */ -static inline uint32_t osKernelSysTick(void) { - - return (uint32_t)chVTGetSystemTimeX(); -} - -/** - * @brief Returns the current thread. - */ -static inline osThreadId osThreadGetId(void) { - - return (osThreadId)chThdGetSelfX(); -} - -/** - * @brief Thread time slice yield. - */ -static inline osStatus osThreadYield(void) { - - chThdYield(); - - return osOK; -} - -/** - * @brief Returns priority of a thread. - */ -static inline osPriority osThreadGetPriority(osThreadId thread_id) { - - return thread_id->prio; -} - -/** - * @brief Thread delay in milliseconds. - */ -static inline osStatus osDelay(uint32_t millisec) { - - chThdSleepMilliseconds(millisec); - - return osOK; -} - -#endif /* _CMSIS_OS_H_ */ - -/** @} */ diff --git a/os/common/ports/ARMCMx/cmsis_os/cmsis_os.mk b/os/common/ports/ARMCMx/cmsis_os/cmsis_os.mk deleted file mode 100644 index f31566b76..000000000 --- a/os/common/ports/ARMCMx/cmsis_os/cmsis_os.mk +++ /dev/null @@ -1,4 +0,0 @@ -# List of the ChibiOS/RT CMSIS RTOS wrapper. -CMSISRTOSSRC = ${CHIBIOS}/os/common/ports/ARMCMx/cmsis_os/cmsis_os.c - -CMSISRTOSINC = ${CHIBIOS}/os/common/ports/ARMCMx/cmsis_os diff --git a/readme.txt b/readme.txt index 81b0f1ec4..fffcd622e 100644 --- a/readme.txt +++ b/readme.txt @@ -34,6 +34,9 @@ | | +--index.html - Local documentation access (after rebuild). +--ext/ - External libraries, not part of ChibiOS/RT. +--os/ - ChibiOS components. + | +--abstractions/ - API emulator wrappers. + | | +--cmsis-os - CMSIS OS emulation layer for RT (ARMCMx port only). + | | +--nasa-osal - NASA Operating System Abstraction Layer for RT. | +--common/ - Shared OS modules. | +--common/ext/ - Vendor files used by the OS. | +--common/oslib/ - RTOS modules usable by both RT and NIL. -- cgit v1.2.3