From 44409cf305fb4a1ce770edc0d8792c88fcd28df4 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Sat, 9 Apr 2016 11:22:39 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9260 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- .../nasa_cfe/cfe_osal/include/common_types.h | 267 +++ .../nasa_cfe/cfe_osal/include/osapi-os-core.h | 274 +++ .../nasa_cfe/cfe_osal/include/osapi-os-custom.h | 68 + .../nasa_cfe/cfe_osal/include/osapi-os-filesys.h | 419 ++++ .../nasa_cfe/cfe_osal/include/osapi-os-loader.h | 91 + .../nasa_cfe/cfe_osal/include/osapi-os-net.h | 61 + .../nasa_cfe/cfe_osal/include/osapi-os-timer.h | 68 + .../nasa_cfe/cfe_osal/include/osapi-version.h | 48 + .../abstractions/nasa_cfe/cfe_osal/include/osapi.h | 143 ++ .../abstractions/nasa_cfe/cfe_osal/nasa_osal.mk | 4 + .../abstractions/nasa_cfe/cfe_osal/src/osapi.c | 2280 ++++++++++++++++++++ os/common/abstractions/nasa_cfe/cfe_psp/cfe_psp.mk | 4 + .../nasa_cfe/cfe_psp/src/cfe_psp_support.c | 71 + .../nasa_osal/cfe_osal/include/common_types.h | 267 --- .../nasa_osal/cfe_osal/include/osapi-os-core.h | 274 --- .../nasa_osal/cfe_osal/include/osapi-os-custom.h | 68 - .../nasa_osal/cfe_osal/include/osapi-os-filesys.h | 419 ---- .../nasa_osal/cfe_osal/include/osapi-os-loader.h | 91 - .../nasa_osal/cfe_osal/include/osapi-os-net.h | 61 - .../nasa_osal/cfe_osal/include/osapi-os-timer.h | 68 - .../nasa_osal/cfe_osal/include/osapi-version.h | 48 - .../nasa_osal/cfe_osal/include/osapi.h | 143 -- .../abstractions/nasa_osal/cfe_osal/nasa_osal.mk | 4 - .../abstractions/nasa_osal/cfe_osal/src/osapi.c | 2280 -------------------- .../abstractions/nasa_osal/cfe_psp/cfe_psp.mk | 4 - .../nasa_osal/cfe_psp/src/cfe_psp_support.c | 71 - 26 files changed, 3798 insertions(+), 3798 deletions(-) create mode 100644 os/common/abstractions/nasa_cfe/cfe_osal/include/common_types.h create mode 100644 os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-core.h create mode 100644 os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-custom.h create mode 100644 os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-filesys.h create mode 100644 os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-loader.h create mode 100644 os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-net.h create mode 100644 os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-timer.h create mode 100644 os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-version.h create mode 100644 os/common/abstractions/nasa_cfe/cfe_osal/include/osapi.h create mode 100644 os/common/abstractions/nasa_cfe/cfe_osal/nasa_osal.mk create mode 100644 os/common/abstractions/nasa_cfe/cfe_osal/src/osapi.c create mode 100644 os/common/abstractions/nasa_cfe/cfe_psp/cfe_psp.mk create mode 100644 os/common/abstractions/nasa_cfe/cfe_psp/src/cfe_psp_support.c delete mode 100644 os/common/abstractions/nasa_osal/cfe_osal/include/common_types.h delete mode 100644 os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-core.h delete mode 100644 os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-custom.h delete mode 100644 os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-filesys.h delete mode 100644 os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-loader.h delete mode 100644 os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-net.h delete mode 100644 os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-timer.h delete mode 100644 os/common/abstractions/nasa_osal/cfe_osal/include/osapi-version.h delete mode 100644 os/common/abstractions/nasa_osal/cfe_osal/include/osapi.h delete mode 100644 os/common/abstractions/nasa_osal/cfe_osal/nasa_osal.mk delete mode 100644 os/common/abstractions/nasa_osal/cfe_osal/src/osapi.c delete mode 100644 os/common/abstractions/nasa_osal/cfe_psp/cfe_psp.mk delete mode 100644 os/common/abstractions/nasa_osal/cfe_psp/src/cfe_psp_support.c (limited to 'os/common') diff --git a/os/common/abstractions/nasa_cfe/cfe_osal/include/common_types.h b/os/common/abstractions/nasa_cfe/cfe_osal/include/common_types.h new file mode 100644 index 000000000..100a9c72e --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_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_cfe/cfe_osal/include/osapi-os-core.h b/os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-core.h new file mode 100644 index 000000000..8c9b13a78 --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_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_cfe/cfe_osal/include/osapi-os-custom.h b/os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-custom.h new file mode 100644 index 000000000..4b9213118 --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-custom.h @@ -0,0 +1,68 @@ +/* + 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-os-custom.h + * @brief Custom OSAPI extensions header. + * + * @addtogroup osapi-custom + * @{ + */ + +#ifndef OSAPI_CUSTOM_H +#define OSAPI_CUSTOM_H + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + void OS_set_printf(int (*printf)(const char *fmt, ...)); + boolean OS_TaskDeleteCheck(void); + int32 OS_TaskWait(uint32 task_id); +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +#endif /* OSAPI_CUSTOM_H */ + +/** @} */ diff --git a/os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-filesys.h b/os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-filesys.h new file mode 100644 index 000000000..c46800341 --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_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_cfe/cfe_osal/include/osapi-os-loader.h b/os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-loader.h new file mode 100644 index 000000000..4f0b21b62 --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_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_cfe/cfe_osal/include/osapi-os-net.h b/os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-net.h new file mode 100644 index 000000000..b8cc67d69 --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_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_cfe/cfe_osal/include/osapi-os-timer.h b/os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-os-timer.h new file mode 100644 index 000000000..8082c6227 --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_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_cfe/cfe_osal/include/osapi-version.h b/os/common/abstractions/nasa_cfe/cfe_osal/include/osapi-version.h new file mode 100644 index 000000000..331e96c94 --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_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_cfe/cfe_osal/include/osapi.h b/os/common/abstractions/nasa_cfe/cfe_osal/include/osapi.h new file mode 100644 index 000000000..72a7c340a --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_osal/include/osapi.h @@ -0,0 +1,143 @@ +/* +** 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" +#include "osapi-os-custom.h" + +#ifdef __cplusplus + } +#endif + +#endif + diff --git a/os/common/abstractions/nasa_cfe/cfe_osal/nasa_osal.mk b/os/common/abstractions/nasa_cfe/cfe_osal/nasa_osal.mk new file mode 100644 index 000000000..a9eb9ee68 --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_osal/nasa_osal.mk @@ -0,0 +1,4 @@ +# NASA CFE OSAL files. +CFEOSALSRC = $(CHIBIOS)/os/common/abstractions/nasa_cfe/cfe_osal/src/osapi.c + +CFEOSALINC = $(CHIBIOS)/os/common/abstractions/nasa_cfe/cfe_osal/include diff --git a/os/common/abstractions/nasa_cfe/cfe_osal/src/osapi.c b/os/common/abstractions/nasa_cfe/cfe_osal/src/osapi.c new file mode 100644 index 000000000..28088165e --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_osal/src/osapi.c @@ -0,0 +1,2280 @@ +/* + 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 + +#include "ch.h" + +#include "common_types.h" +#include "osapi.h" + +#if CH_CFG_ST_FREQUENCY > 1000000 +#error "CH_CFG_ST_FREQUENCY limit is 1000000" +#endif + +#if (CH_CFG_ST_FREQUENCY % 1000) != 0 +#error "CH_CFG_ST_FREQUENCY is not a multiple of 1000" +#endif + +#if CH_CFG_USE_REGISTRY == FALSE +#error "NASA OSAL requires CH_CFG_USE_REGISTRY" +#endif + +#if CH_CFG_USE_EVENTS == FALSE +#error "NASA OSAL requires CH_CFG_USE_EVENTS" +#endif + +#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_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 + +#if CH_CFG_USE_HEAP == FALSE +#error "NASA OSAL requires CH_CFG_USE_HEAP" +#endif + +/*===========================================================================*/ +/* Module local definitions. */ +/*===========================================================================*/ + +#define MIN_PRIORITY 1 +#define MAX_PRIORITY 255 + +#define MIN_MESSAGE_SIZE 4 +#define MAX_MESSAGE_SIZE 16384 + +#define MIN_QUEUE_DEPTH 1 +#define MAX_QUEUE_DEPTH 16384 + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local types. */ +/*===========================================================================*/ + +/** + * @brief Generic function pointer type. + */ +typedef void (*funcptr_t)(void); + +/** + * @brief Type of OSAL timer. + */ +typedef struct { + uint32 is_free; + char name[OS_MAX_API_NAME]; + OS_TimerCallback_t callback_ptr; + uint32 start_time; + uint32 interval_time; + virtual_timer_t vt; +} osal_timer_t; + +/** + * @brief Type of an OSAL queue. + */ +typedef struct { + uint32 is_free; + char name[OS_MAX_API_NAME]; + semaphore_t free_msgs; + memory_pool_t messages; + mailbox_t mb; + msg_t *mb_buffer; + void *q_buffer; + uint32 depth; + uint32 size; +} osal_queue_t; + +/** + * @brief Type of an osal message with minimum size. + */ +typedef struct { + size_t size; + char buf[4]; +} osal_message_t; + +/** + * @brief Type of OSAL main structure. + */ +typedef struct { + bool printf_enabled; + int (*printf)(const char *fmt, ...); + virtual_timer_t vt; + OS_time_t localtime; + memory_pool_t timers_pool; + memory_pool_t queues_pool; + memory_pool_t binary_semaphores_pool; + memory_pool_t count_semaphores_pool; + memory_pool_t mutexes_pool; + osal_timer_t timers[OS_MAX_TIMERS]; + osal_queue_t queues[OS_MAX_QUEUES]; + 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. */ +/*===========================================================================*/ + +/** + * @brief System time callback. + */ +static void systime_update(void *p) { + systime_t delay = (systime_t)p; + + chSysLockFromISR(); + osal.localtime.microsecs += 1000; + if (osal.localtime.microsecs >= 1000000) { + osal.localtime.microsecs = 0; + osal.localtime.seconds++; + } + chVTDoSetI(&osal.vt, delay, systime_update, p); + chSysUnlockFromISR(); +} + +/** + * @brief Virtual timers callback. + */ +static void timer_handler(void *p) { + osal_timer_t *otp = (osal_timer_t *)p; + + /* Real callback.*/ + otp->callback_ptr((uint32)p); + + /* Timer restart if an interval is defined.*/ + if (otp->interval_time != 0) { + chSysLockFromISR(); + chVTSetI(&otp->vt, US2ST(otp->interval_time), timer_handler, p); + chSysUnlockFromISR(); + } +} + +/** + * @brief Finds a queue by name. + */ +uint32 queue_find(const char *queue_name) { + osal_queue_t *oqp; + + /* Searching the queue in the table.*/ + for (oqp = &osal.queues[0]; oqp < &osal.queues[OS_MAX_QUEUES]; oqp++) { + /* Entering a reentrant critical zone.*/ + syssts_t sts = chSysGetStatusAndLockX(); + + if (!oqp->is_free && + (strncmp(oqp->name, queue_name, OS_MAX_API_NAME - 1) == 0)) { + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + return (uint32)oqp; + } + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + } + + return 0; +} + +/** + * @brief Finds a timer by name. + */ +uint32 timer_find(const char *timer_name) { + osal_timer_t *otp; + + /* Searching the queue in the table.*/ + for (otp = &osal.timers[0]; otp < &osal.timers[OS_MAX_TIMERS]; otp++) { + /* Entering a reentrant critical zone.*/ + syssts_t sts = chSysGetStatusAndLockX(); + + if (!otp->is_free && + (strncmp(otp->name, timer_name, OS_MAX_API_NAME - 1) == 0)) { + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + return (uint32)otp; + } + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + } + + return 0; +} + +/*===========================================================================*/ +/* 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 An error code. + * + * @api + */ +int32 OS_API_Init(void) { + + chSysInit(); + + /* OS_printf() initially disabled.*/ + osal.printf_enabled = false; + osal.printf = NULL; + + /* System time handling.*/ + osal.localtime.microsecs = 0; + osal.localtime.seconds = 0; + chVTObjectInit(&osal.vt); + chVTSet(&osal.vt, MS2ST(1), systime_update, (void *)MS2ST(1)); + + /* Timers pool initialization.*/ + chPoolObjectInit(&osal.timers_pool, + sizeof (osal_timer_t), + NULL); + chPoolLoadArray(&osal.timers_pool, + &osal.timers[0], + OS_MAX_TIMERS); + + /* Queues pool initialization.*/ + chPoolObjectInit(&osal.queues_pool, + sizeof (osal_queue_t), + NULL); + chPoolLoadArray(&osal.queues_pool, + &osal.queues[0], + OS_MAX_QUEUES); + + /* Binary Semaphores pool initialization.*/ + chPoolObjectInit(&osal.binary_semaphores_pool, + sizeof (binary_semaphore_t), + NULL); + chPoolLoadArray(&osal.binary_semaphores_pool, + &osal.binary_semaphores[0], + OS_MAX_BIN_SEMAPHORES); + + /* Counter Semaphores pool initialization.*/ + chPoolObjectInit(&osal.count_semaphores_pool, + sizeof (semaphore_t), + NULL); + chPoolLoadArray(&osal.count_semaphores_pool, + &osal.count_semaphores[0], + OS_MAX_COUNT_SEMAPHORES); + + /* Mutexes pool initialization.*/ + chPoolObjectInit(&osal.mutexes_pool, + sizeof (mutex_t), + NULL); + chPoolLoadArray(&osal.mutexes_pool, + &osal.mutexes[0], + OS_MAX_MUTEXES); + + return OS_SUCCESS; +} + +/*-- Various API -----------------------------------------------------------*/ + +/** + * @brief OS printf-like function. + * @note It is initially disabled. + * + * @param[in] string formatter string + * + * @api + */ +void OS_printf(const char *string, ...) { + va_list ap; + + if (osal.printf_enabled && (osal.printf != NULL)) { + va_start(ap, string); + (void) osal.printf(string); + va_end(ap); + } +} + +/** + * @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 Sets the system printf function. + * @note By default the printf function is not defined. + * @note This is a ChibiOS/RT extension. + * + * @param[in] printf pointer to a @p printf() like function + * + * @api + */ +void OS_set_printf(int (*printf)(const char *fmt, ...)) { + + osal.printf = printf; +} + +/** + * @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. + * + * @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; + } + + chSysLock(); + *time_struct = osal.localtime; + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Changes the local time. + * + * @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; + } + + chSysLock(); + osal.localtime = *time_struct; + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @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); +} + +/*-- timers API -------------------------------------------------------------*/ + +/** + * @brief Timer creation. + * + * @param[out] timer_id pointer to a timer id variable + * @param[in] timer_name the timer name + * @param[out] clock_accuracy timer accuracy in microseconds + * @param[in] callback_ptr timer callback + * @return An error code. + * + * @api + */ +int32 OS_TimerCreate(uint32 *timer_id, const char *timer_name, + uint32 *clock_accuracy, OS_TimerCallback_t callback_ptr) { + osal_timer_t *otp; + + /* NULL pointer checks.*/ + if ((timer_id == NULL) || (timer_name == NULL) || + (clock_accuracy == NULL)) { + return OS_INVALID_POINTER; + } + + /* NULL callback check.*/ + if (callback_ptr == NULL) { + *timer_id = 0; + return OS_TIMER_ERR_INVALID_ARGS; + } + + /* Checking timer name length.*/ + if (strlen(timer_name) >= OS_MAX_API_NAME) { + *timer_id = 0; + return OS_ERR_NAME_TOO_LONG; + } + + /* Checking if the name is already taken.*/ + if (timer_find(timer_name) > 0) { + *timer_id = 0; + return OS_ERR_NAME_TAKEN; + } + + /* Getting object.*/ + otp = chPoolAlloc(&osal.timers_pool); + if (otp == NULL) { + *timer_id = 0; + return OS_ERR_NO_FREE_IDS; + } + + strncpy(otp->name, timer_name, OS_MAX_API_NAME - 1); + chVTObjectInit(&otp->vt); + otp->start_time = 0; + otp->interval_time = 0; + otp->callback_ptr = callback_ptr; + otp->is_free = 0; /* Note, last.*/ + + *timer_id = (uint32)otp; + *clock_accuracy = (uint32)(1000000 / CH_CFG_ST_FREQUENCY); + + return OS_SUCCESS; +} + +/** + * @brief Timer deletion. + * + * @param[in] timer_id timer id variable + * @return An error code. + * + * @api + */ +int32 OS_TimerDelete(uint32 timer_id) { + osal_timer_t *otp = (osal_timer_t *)timer_id; + + /* Range check.*/ + if ((otp < &osal.timers[0]) || + (otp >= &osal.timers[OS_MAX_TIMERS]) || + (otp->is_free)) { + return OS_ERR_INVALID_ID; + } + + chSysLock(); + + /* Marking as no more free, will be overwritten by the pool pointer.*/ + otp->is_free = 1; + + /* Resetting the timer.*/ + chVTResetI(&otp->vt); + otp->start_time = 0; + otp->interval_time = 0; + + /* Flagging it as unused and returning it to the pool.*/ + chPoolFreeI(&osal.timers_pool, (void *)otp); + + chSysUnlock(); + + return OS_SUCCESS; +} + +/** + * @brief Timer deletion. + * @note This function can be safely called from timer callbacks or ISRs. + * + * @param[in] timer_id timer id variable + * @param[in] start_time start time in microseconds or zero + * @param[in] interval_time interval time in microseconds or zero + * @return An error code. + * + * @api + */ +int32 OS_TimerSet(uint32 timer_id, uint32 start_time, uint32 interval_time) { + syssts_t sts; + osal_timer_t *otp = (osal_timer_t *)timer_id; + + /* Range check.*/ + if ((otp < &osal.timers[0]) || + (otp >= &osal.timers[OS_MAX_TIMERS]) || + (otp->is_free)) { + return OS_ERR_INVALID_ID; + } + + /* Entering a reentrant critical zone.*/ + sts = chSysGetStatusAndLockX(); + + if (start_time == 0) { + chVTResetI(&otp->vt); + } + else { + otp->start_time = start_time; + otp->interval_time = interval_time; + chVTSetI(&otp->vt, US2ST(start_time), timer_handler, (void *)timer_id); + } + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + + return OS_SUCCESS; +} + +/** + * @brief Retrieves a timer id by name. + * + * @param[out] timer_id pointer to a timer id variable + * @param[in] sem_name the timer name + * @return An error code. + * + * @api + */ +int32 OS_TimerGetIdByName(uint32 *timer_id, const char *timer_name) { + + /* NULL pointer checks.*/ + if ((timer_id == NULL) || (timer_name == NULL)) { + return OS_INVALID_POINTER; + } + + /* Checking name length.*/ + if (strlen(timer_name) >= OS_MAX_API_NAME) { + return OS_ERR_NAME_TOO_LONG; + } + + /* Searching the queue.*/ + *timer_id = timer_find(timer_name); + if (*timer_id > 0) { + return OS_SUCCESS; + } + + return OS_ERR_NAME_NOT_FOUND; +} + +/** + * @brief Returns timer information. + * @note This function can be safely called from timer callbacks or ISRs. + * + * @param[in] timer_id timer id variable + * @param[in] timer_prop timer properties + * @return An error code. + * + * @api + */ +int32 OS_TimerGetInfo(uint32 timer_id, OS_timer_prop_t *timer_prop) { + syssts_t sts; + osal_timer_t *otp = (osal_timer_t *)timer_id; + + /* NULL pointer checks.*/ + if (timer_prop == NULL) { + return OS_INVALID_POINTER; + } + + /* Range check.*/ + if ((otp < &osal.timers[0]) || + (otp >= &osal.timers[OS_MAX_TIMERS]) || + (otp->is_free)) { + return OS_ERR_INVALID_ID; + } + + /* Entering a reentrant critical zone.*/ + sts = chSysGetStatusAndLockX(); + + /* If the timer is not in use then error.*/ + if (otp->is_free) { + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + return OS_ERR_INVALID_ID; + } + + strncpy(timer_prop->name, otp->name, OS_MAX_API_NAME - 1); + timer_prop->creator = (uint32)0; + timer_prop->start_time = otp->start_time; + timer_prop->interval_time = otp->interval_time; + timer_prop->accuracy = (uint32)(1000000 / CH_CFG_ST_FREQUENCY); + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + + return OS_SUCCESS; +} + +/*-- Queues API -------------------------------------------------------------*/ + +/** + * @brief Queue creation. + * + * @param[out] queue_id pointer to a queue id variable + * @param[in] queue_name the queue name + * @param[in] queue_depth desired queue depth + * @param[in] data_size maximum message size + * @param[in] flags queue option flags + * @return An error code. + * + * @api + */ +int32 OS_QueueCreate(uint32 *queue_id, const char *queue_name, + uint32 queue_depth, uint32 data_size, uint32 flags) { + osal_queue_t *oqp; + size_t msgsize; + + (void)flags; + + /* NULL pointer checks.*/ + if ((queue_id == NULL) || (queue_name == NULL)) { + return OS_INVALID_POINTER; + } + + /* Checking queue name length.*/ + if (strlen(queue_name) >= OS_MAX_API_NAME) { + *queue_id = 0; + return OS_ERR_NAME_TOO_LONG; + } + + /* Checking if the name is already taken.*/ + if (queue_find(queue_name) > 0) { + *queue_id = 0; + return OS_ERR_NAME_TAKEN; + } + + /* Checks on queue limits. There is no dedicated error code.*/ + if ((data_size < MIN_MESSAGE_SIZE) || (data_size > MAX_MESSAGE_SIZE) || + (queue_depth < MIN_QUEUE_DEPTH) || (queue_depth > MAX_QUEUE_DEPTH)) { + *queue_id = 0; + return OS_ERROR; + } + + /* Getting object.*/ + oqp = chPoolAlloc(&osal.queues_pool); + if (oqp == NULL) { + *queue_id = 0; + return OS_ERR_NO_FREE_IDS; + } + + /* Attempting messages buffer allocation.*/ + msgsize = MEM_ALIGN_NEXT(data_size + sizeof (size_t), PORT_NATURAL_ALIGN); + oqp->mb_buffer = chHeapAllocAligned(NULL, + msgsize * (size_t)queue_depth, + PORT_NATURAL_ALIGN); + if (oqp->mb_buffer == NULL) { + *queue_id = 0; + return OS_ERROR; + } + + /* Attempting queue buffer allocation.*/ + oqp->q_buffer = chHeapAllocAligned(NULL, + sizeof (msg_t) * (size_t)queue_depth, + PORT_NATURAL_ALIGN); + if (oqp->q_buffer == NULL) { + *queue_id = 0; + chHeapFree(oqp->mb_buffer); + return OS_ERROR; + } + + /* Initializing object static parts.*/ + strncpy(oqp->name, queue_name, OS_MAX_API_NAME - 1); + chMBObjectInit(&oqp->mb, oqp->q_buffer, (size_t)queue_depth); + chSemObjectInit(&oqp->free_msgs, (cnt_t)queue_depth); + chPoolObjectInit(&oqp->messages, msgsize, NULL); + chPoolLoadArray(&oqp->messages, oqp->mb_buffer, (size_t)queue_depth); + oqp->depth = queue_depth; + oqp->size = data_size; + oqp->is_free = 0; /* Note, last.*/ + *queue_id = (uint32)oqp; + + return OS_SUCCESS; +} + +/** + * @brief Queue deletion. + * + * @param[in] queue_id queue id variable + * @return An error code. + * + * @api + */ +int32 OS_QueueDelete(uint32 queue_id) { + osal_queue_t *oqp = (osal_queue_t *)queue_id; + void *q_buffer, *mb_buffer; + + /* Range check.*/ + if ((oqp < &osal.queues[0]) || + (oqp >= &osal.queues[OS_MAX_QUEUES]) || + (oqp->is_free)) { + return OS_ERR_INVALID_ID; + } + + /* Critical zone.*/ + chSysLock(); + + /* Marking as no more free, will be overwritten by the pool pointer.*/ + oqp->is_free = 1; + + /* Pointers to areas to be freed.*/ + q_buffer = oqp->q_buffer; + mb_buffer = oqp->mb_buffer; + + /* Resetting the queue.*/ + chMBResetI(&oqp->mb); + chSemResetI(&oqp->free_msgs, 0); + + /* Flagging it as unused and returning it to the pool.*/ + chPoolFreeI(&osal.queues_pool, (void *)oqp); + + chSchRescheduleS(); + + /* Leaving critical zone.*/ + chSysUnlock(); + + /* Freeing buffers, outside critical zone, slow heap operation.*/ + chHeapFree(q_buffer); + chHeapFree(mb_buffer); + + return OS_SUCCESS; +} + +/** + * @brief Retrieves a message from the queue. + * + * @param[in] queue_id queue id variable + * @param[out] data message buffer pointer + * @param[in] size size of the buffer + * @param[out] size_copied size of the received message + * @param[in] timeout timeout in ticks, the special values @p OS_PEND + * and @p OS_CHECK can be specified + * @return An error code. + * + * @api + */ +int32 OS_QueueGet(uint32 queue_id, void *data, uint32 size, + uint32 *size_copied, int32 timeout) { + osal_queue_t *oqp = (osal_queue_t *)queue_id; + msg_t msg, msgsts; + void *body; + + /* NULL pointer checks.*/ + if ((data == NULL) || (size_copied == NULL)) { + return OS_INVALID_POINTER; + } + + /* Range check.*/ + if ((oqp < &osal.queues[0]) || + (oqp >= &osal.queues[OS_MAX_QUEUES]) || + (oqp->is_free)) { + return OS_ERR_INVALID_ID; + } + + /* Check on minimum size.*/ + if (size < oqp->size) { + return OS_QUEUE_INVALID_SIZE; + } + + /* Special time handling.*/ + if (timeout == OS_PEND) { + msgsts = chMBFetch(&oqp->mb, &msg, TIME_INFINITE); + if (msgsts < MSG_OK) { + *size_copied = 0; + return OS_ERROR; + } + } + else if (timeout == OS_CHECK) { + msgsts = chMBFetch(&oqp->mb, &msg, TIME_IMMEDIATE); + if (msgsts < MSG_OK) { + *size_copied = 0; + return OS_QUEUE_EMPTY; + } + } + else { + msgsts = chMBFetch(&oqp->mb, &msg, (systime_t)timeout); + if (msgsts < MSG_OK) { + *size_copied = 0; + return OS_QUEUE_TIMEOUT; + } + } + + /* Message body and size.*/ + *size_copied = ((osal_message_t *)msg)->size; + body = (void *)((osal_message_t *)msg)->buf; + + /* Copying the message body.*/ + memcpy(data, body, *size_copied); + + /* Freeing the message buffer.*/ + chPoolFree(&oqp->messages, (void *)msg); + chSemSignal(&oqp->free_msgs); + + return OS_SUCCESS; +} + +/** + * @brief Puts a message in the queue. + * + * @param[in] queue_id queue id variable + * @param[in] data message buffer pointer + * @param[in] size size of the message + * @param[in] flags operation flags + * @return An error code. + * + * @api + */ +int32 OS_QueuePut(uint32 queue_id, void *data, uint32 size, uint32 flags) { + osal_queue_t *oqp = (osal_queue_t *)queue_id; + msg_t msgsts; + osal_message_t *omsg; + + (void)flags; + + /* NULL pointer checks.*/ + if (data == NULL) { + return OS_INVALID_POINTER; + } + + /* Range check.*/ + if ((oqp < &osal.queues[0]) || + (oqp >= &osal.queues[OS_MAX_QUEUES]) || + (oqp->is_free)) { + return OS_ERR_INVALID_ID; + } + + /* Check on maximum size.*/ + if (size > oqp->size) { + return OS_QUEUE_INVALID_SIZE; + } + + /* Getting a message buffer from the pool.*/ + msgsts = chSemWait(&oqp->free_msgs); + if (msgsts < MSG_OK) { + return OS_ERROR; + } + omsg = chPoolAlloc(&oqp->messages); + + /* Filling message size and data.*/ + omsg->size = (size_t)size; + memcpy(omsg->buf, data, size); + + /* Posting the message.*/ + msgsts = chMBPost(&oqp->mb, (msg_t)omsg, TIME_INFINITE); + if (msgsts < MSG_OK) { + return OS_ERROR; + } + + return OS_SUCCESS; +} + +/** + * @brief Retrieves a queue id by name. + * + * @param[out] queue_id pointer to a queue id variable + * @param[in] sem_name the queue name + * @return An error code. + * + * @api + */ +int32 OS_QueueGetIdByName(uint32 *queue_id, const char *queue_name) { + + /* NULL pointer checks.*/ + if ((queue_id == NULL) || (queue_name == NULL)) { + return OS_INVALID_POINTER; + } + + /* Checking name length.*/ + if (strlen(queue_name) >= OS_MAX_API_NAME) { + return OS_ERR_NAME_TOO_LONG; + } + + /* Searching the queue.*/ + *queue_id = queue_find(queue_name); + if (*queue_id > 0) { + return OS_SUCCESS; + } + + return OS_ERR_NAME_NOT_FOUND; +} + +/** + * @brief Returns queue information. + * @note This function can be safely called from timer callbacks or ISRs. + * + * @param[in] queue_id queue id variable + * @param[in] queue_prop queue properties + * @return An error code. + * + * @api + */ +int32 OS_QueueGetInfo (uint32 queue_id, OS_queue_prop_t *queue_prop) { + osal_queue_t *oqp = (osal_queue_t *)queue_id; + syssts_t sts; + + /* NULL pointer checks.*/ + if (queue_prop == NULL) { + return OS_INVALID_POINTER; + } + + /* Range check.*/ + if ((oqp < &osal.queues[0]) || + (oqp >= &osal.queues[OS_MAX_QUEUES]) || + (oqp->is_free)) { + return OS_ERR_INVALID_ID; + } + + /* Entering a reentrant critical zone.*/ + sts = chSysGetStatusAndLockX(); + + /* If the queue is not in use then error.*/ + if (oqp->is_free) { + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + return OS_ERR_INVALID_ID; + } + + strncpy(queue_prop->name, oqp->name, OS_MAX_API_NAME - 1); + queue_prop->creator = (uint32)0; + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + + return OS_SUCCESS; + + return OS_ERR_NOT_IMPLEMENTED; +} + +/*-- 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; + } + + /* Getting object.*/ + bsp = chPoolAlloc(&osal.binary_semaphores_pool); + if (bsp == NULL) { + return OS_ERR_NO_FREE_IDS; + } + + /* Semaphore is initialized.*/ + chBSemObjectInit(bsp, sem_initial_value == 0 ? true : false); + + *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; + + /* Range check.*/ + 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. + * @note This function can be safely called from timer callbacks or ISRs. + * + * @param[in] sem_id binary semaphore id variable + * @return An error code. + * + * @api + */ +int32 OS_BinSemFlush(uint32 sem_id) { + syssts_t sts; + binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; + + /* Range check.*/ + if ((bsp < &osal.binary_semaphores[0]) || + (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + /* Entering a reentrant critical zone.*/ + sts = chSysGetStatusAndLockX(); + + /* If the semaphore is not in use then error.*/ + if (bsp->sem.queue.prev == NULL) { + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + return OS_SEM_FAILURE; + } + + /* If the semaphore state is "not taken" then it is not touched.*/ + if (bsp->sem.cnt < 0) { + chBSemResetI(bsp, true); + } + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + + return OS_SUCCESS; +} + +/** + * @brief Binary semaphore give. + * @note This function can be safely called from timer callbacks or ISRs. + * + * @param[in] sem_id binary semaphore id variable + * @return An error code. + * + * @api + */ +int32 OS_BinSemGive(uint32 sem_id) { + syssts_t sts; + binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; + + /* Range check.*/ + if ((bsp < &osal.binary_semaphores[0]) || + (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + /* Entering a reentrant critical zone.*/ + sts = chSysGetStatusAndLockX(); + + /* If the semaphore is not in use then error.*/ + if (bsp->sem.queue.prev == NULL) { + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + return OS_SEM_FAILURE; + } + + chBSemSignalI(bsp); + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + + 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; + + /* Range check.*/ + 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; + + /* Range check.*/ + 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; + } + + /* Checking name length.*/ + if (strlen(sem_name) >= OS_MAX_API_NAME) { + return OS_ERR_NAME_TOO_LONG; + } + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** + * @brief Returns binary semaphore information. + * @note This function can be safely called from timer callbacks or ISRs. + * @note It is not currently implemented. + * + * @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) { + syssts_t sts; + binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; + + /* NULL pointer checks.*/ + if (bin_prop == NULL) { + return OS_INVALID_POINTER; + } + + /* Range check.*/ + if ((bsp < &osal.binary_semaphores[0]) || + (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + /* Entering a reentrant critical zone.*/ + sts = chSysGetStatusAndLockX(); + + /* If the semaphore is not in use then error.*/ + if (bsp->sem.queue.prev == NULL) { + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + return OS_ERR_INVALID_ID; + } + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + + 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; + } + + /* Getting object.*/ + sp = chPoolAlloc(&osal.count_semaphores_pool); + if (sp == NULL) { + return OS_ERR_NO_FREE_IDS; + } + + /* 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; + + /* Range check.*/ + 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. + * @note This function can be safely called from timer callbacks or ISRs. + * + * @param[in] sem_id counter semaphore id variable + * @return An error code. + * + * @api + */ +int32 OS_CountSemGive(uint32 sem_id) { + syssts_t sts; + semaphore_t *sp = (semaphore_t *)sem_id; + + /* Range check.*/ + if ((sp < &osal.count_semaphores[0]) || + (sp >= &osal.count_semaphores[OS_MAX_COUNT_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + /* Entering a reentrant critical zone.*/ + sts = chSysGetStatusAndLockX(); + + /* If the semaphore is not in use then error.*/ + if (sp->queue.prev == NULL) { + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + return OS_SEM_FAILURE; + } + + chSemSignalI(sp); + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + + 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; + + /* Range check.*/ + 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; + + /* Range check.*/ + 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; + } + + /* Checking name length.*/ + if (strlen(sem_name) >= OS_MAX_API_NAME) { + return OS_ERR_NAME_TOO_LONG; + } + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** + * @brief Returns counter semaphore information. + * @note This function can be safely called from timer callbacks or ISRs. + * @note It is not currently implemented. + * + * @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) { + syssts_t sts; + semaphore_t *sp = (semaphore_t *)sem_id; + + /* NULL pointer checks.*/ + if (sem_prop == NULL) { + return OS_INVALID_POINTER; + } + + /* Range check.*/ + if ((sp < &osal.count_semaphores[0]) || + (sp >= &osal.count_semaphores[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + /* Entering a reentrant critical zone.*/ + sts = chSysGetStatusAndLockX(); + + /* If the semaphore is not in use then error.*/ + if (sp->queue.prev == NULL) { + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + return OS_ERR_INVALID_ID; + } + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + + 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; + } + + /* Getting object.*/ + mp = chPoolAlloc(&osal.mutexes_pool); + if (mp == NULL) { + return OS_ERR_NO_FREE_IDS; + } + + /* 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; + + /* Range check.*/ + 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; + + /* Range check.*/ + 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; + + /* Range check.*/ + 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; + } + + /* Checking name length.*/ + if (strlen(sem_name) >= OS_MAX_API_NAME) { + return OS_ERR_NAME_TOO_LONG; + } + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** + * @brief Returns mutex information. + * @note This function can be safely called from timer callbacks or ISRs. + * @note It is not currently implemented. + * + * @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) { + syssts_t sts; + mutex_t *mp = (mutex_t *)sem_id; + + /* NULL pointer checks.*/ + if (sem_prop == NULL) { + return OS_INVALID_POINTER; + } + + /* Range check.*/ + if ((mp < &osal.mutexes[0]) || + (mp >= &osal.mutexes[OS_MAX_BIN_SEMAPHORES])) { + return OS_ERR_INVALID_ID; + } + + /* Entering a reentrant critical zone.*/ + sts = chSysGetStatusAndLockX(); + + /* If the mutex is not in use then error.*/ + if (mp->queue.prev == NULL) { + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + return OS_ERR_INVALID_ID; + } + + /* Leaving the critical zone.*/ + chSysRestoreStatusX(sts); + + return OS_ERR_NOT_IMPLEMENTED; +} + +/*-- Task Control API -------------------------------------------------------*/ + +/** + * @brief Task creation. + * @note The task name is not copied inside the task but kept by reference, + * the name is supposed to be persistent, better if defined as a + * sting constant. + * + * @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; + } + + /* Checking if this working area is already in use by some thread, the + error code is not very appropriate but this case seems to not be + coveded by the specification.*/ + tp = chRegFindThreadByWorkingArea((stkalign_t *)stack_pointer); + if (tp != NULL) { + /* Releasing the thread reference.*/ + chThdRelease(tp); + return OS_ERR_NO_FREE_IDS; + } + + /* Checking if the name is already in use.*/ + if ((tp = chRegFindThreadByName(task_name)) != NULL) { + /* Releasing the thread reference.*/ + chThdRelease(tp); + return OS_ERR_NAME_TAKEN; + } + + /* Converting priority to RT type.*/ + rt_prio = (tprio_t)256 - (tprio_t)priority; + if (rt_prio == 1) { + rt_prio = 2; + } + + thread_descriptor_t td = { + task_name, + (stkalign_t *)stack_pointer, + (stkalign_t *)((uint8_t *)stack_pointer + stack_size), + rt_prio, + (tfunc_t)function_pointer, + NULL + }; + + /* Creating the task and detaching it, other APIs will have to gain a + reference using the registry API.*/ + tp = chThdCreate(&td); + chThdRelease(tp); + + /* Storing the task id.*/ + *task_id = (uint32)tp; + + return OS_SUCCESS; +} + +/** + * @brief Installs a deletion handler. + * @note It is implemented as hooks in chconf.h. + * + * @param[in] function_pointer the handler function + * @return An error code. + * + * @api + */ +int32 OS_TaskInstallDeleteHandler(void *function_pointer) { + + chThdGetSelfX()->osal_delete_handler = function_pointer; + + return OS_SUCCESS; +} + +/** + * @brief Check for task termination request. + * @note This is a ChibiOS/RT extension, direct task delete is not + * allowed in RT. + * + * @return The termination request flag. + * @retval false if termination has not been requested. + * @retval true if termination has been requested. + * + * @api + */ +boolean OS_TaskDeleteCheck(void) { + + return (boolean)chThdShouldTerminateX(); +} + +/** + * @brief Task delete. + * @note Limitation, it does not actually kill the thread, it just sets a + * flag in the thread that has then to terminate voluntarily. The + * flag can be checked using @p chThdShouldTerminateX(). + * + * @param[in] task_id the task id + * @return An error code. + * + * @api + */ +int32 OS_TaskDelete(uint32 task_id) { + thread_t *tp = (thread_t *)task_id; + funcptr_t fp; + + /* Check for thread validity, getting a reference.*/ + if (chRegFindThreadByPointer(tp) == NULL) { + return OS_ERR_INVALID_ID; + } + + /* Asking for thread termination.*/ + chThdTerminate(tp); + + /* Getting the delete handler while the thread is still referenced.*/ + fp = (funcptr_t)tp->osal_delete_handler; + + /* Waiting for termination, releasing the reference.*/ + chThdWait(tp); + + /* Calling the delete handler, if defined.*/ + if (fp != NULL) { + fp(); + } + + return OS_SUCCESS; +} + +/** + * @brief Task exit. + * + * @api + */ +void OS_TaskExit(void) { + + chThdExit(MSG_OK); +} + +/** + * @brief Wait for task termination. + * @note This is a ChibiOS/RT extension, added for improved testability. + * + * @param[in] task_id the task id + * @return An error code. + * + * @api + */ +int32 OS_TaskWait(uint32 task_id) { + thread_t *tp = (thread_t *)task_id; + + /* Check for thread validity, getting a reference.*/ + if (chRegFindThreadByPointer(tp) == NULL) { + return OS_ERR_INVALID_ID; + } + + (void) chThdWait(tp); + + return OS_SUCCESS; +} + +/** + * @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. + * @note Priority 255 is not available and it is transformed internally in + * 254. + * + * @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 (rt_newprio == 1) { + rt_newprio = 2; + } + + if (chThdGetPriorityX() == rt_newprio) { + return OS_SUCCESS; + } + + /* Check for thread validity.*/ + if (chRegFindThreadByPointer(tp) == NULL) { + return OS_ERR_INVALID_ID; + } + + 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(); + + /* Releasing the thread reference.*/ + chThdRelease(tp); + + 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. + * @note This function can be safely called from timer callbacks or ISRs. + * + * @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; + } + + /* Searching in the registry.*/ + tp = chRegFindThreadByName(task_name); + if (tp == NULL) { + return OS_ERR_NAME_NOT_FOUND; + } + + *task_id = (uint32)tp; + + /* Releasing the thread reference.*/ + chThdRelease(tp); + + return OS_SUCCESS; +} + +/** + * @brief Returns task information. + * @note This function can be safely called from timer callbacks or ISRs. + * @note Priority 255 is not available and it is transformed internally in + * 254. + * + * @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->wabase + sizeof (thread_t); + + /* NULL pointer checks.*/ + if (task_prop == NULL) { + return OS_INVALID_POINTER; + } + + /* Check for thread validity.*/ + if (chRegFindThreadByPointer(tp) == NULL) { + return OS_ERR_INVALID_ID; + } + + 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; + + /* Releasing the thread reference.*/ + chThdRelease(tp); + + return OS_SUCCESS; +} + +/*-- System Interrupt API ---------------------------------------------------*/ + +/* In ChibiOS interrupts are statically linked, the vectors table is in + flash.*/ +int32 OS_IntAttachHandler (uint32 InterruptNumber, + osal_task_entry InterruptHandler, + int32 parameter) { + (void)InterruptNumber; + (void)parameter; + + /* NULL pointer checks.*/ + if (InterruptHandler == NULL) { + return OS_INVALID_POINTER; + } + + return OS_ERR_NOT_IMPLEMENTED; +} + +int32 OS_IntLock(void) { + + return (int32)chSysGetStatusAndLockX(); +} + +int32 OS_IntUnlock(int32 IntLevel) { + + chSysRestoreStatusX((syssts_t) IntLevel); + + return OS_SUCCESS; +} + +int32 OS_IntEnable(int32 Level) { + + NVIC_EnableIRQ((IRQn_Type)Level); + + return OS_SUCCESS; +} + +int32 OS_IntDisable(int32 Level) { + + NVIC_DisableIRQ((IRQn_Type)Level); + + return OS_SUCCESS; +} + +int32 OS_IntAck(int32 InterruptNumber) { + + NVIC_ClearPendingIRQ((IRQn_Type)InterruptNumber); + + return OS_SUCCESS; +} + +/*-- System Exception API ---------------------------------------------------*/ + +/* In ChibiOS exceptions are statically linked, the vectors table is in + flash.*/ +int32 OS_ExcAttachHandler(uint32 ExceptionNumber, + void (*ExceptionHandler)(uint32, uint32 *,uint32), + int32 parameter) { + + (void)ExceptionNumber; + (void)parameter; + + /* NULL pointer checks.*/ + if (ExceptionHandler == NULL) { + return OS_INVALID_POINTER; + } + + return OS_ERR_NOT_IMPLEMENTED; +} + +/* No exceptions masking.*/ +int32 OS_ExcEnable(int32 ExceptionNumber) { + + (void)ExceptionNumber; + + return OS_ERR_NOT_IMPLEMENTED; +} + +/* No exceptions masking.*/ +int32 OS_ExcDisable(int32 ExceptionNumber) { + + (void)ExceptionNumber; + + return OS_ERR_NOT_IMPLEMENTED; +} + +/*-- Floating Point Unit API ------------------------------------------------*/ + +/* In ChibiOS exceptions are statically linked, the vectors table is in + flash.*/ +int32 OS_FPUExcAttachHandler(uint32 ExceptionNumber, + void * ExceptionHandler , + int32 parameter) { + + (void)ExceptionNumber; + (void)parameter; + + /* NULL pointer checks.*/ + if (ExceptionHandler == NULL) { + return OS_INVALID_POINTER; + } + + return OS_ERR_NOT_IMPLEMENTED; +} + +int32 OS_FPUExcEnable(int32 ExceptionNumber) { + + (void)ExceptionNumber; + + return OS_ERR_NOT_IMPLEMENTED; +} + +int32 OS_FPUExcDisable(int32 ExceptionNumber) { + + (void)ExceptionNumber; + + return OS_ERR_NOT_IMPLEMENTED; +} + +int32 OS_FPUExcSetMask(uint32 mask) { + + (void)mask; + + return OS_ERR_NOT_IMPLEMENTED; +} + +int32 OS_FPUExcGetMask(uint32 *mask) { + + (void)mask; + + return OS_ERR_NOT_IMPLEMENTED; +} + +/** @} */ diff --git a/os/common/abstractions/nasa_cfe/cfe_psp/cfe_psp.mk b/os/common/abstractions/nasa_cfe/cfe_psp/cfe_psp.mk new file mode 100644 index 000000000..510afcfcd --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_psp/cfe_psp.mk @@ -0,0 +1,4 @@ +# NASA CFE PSP files. +CFEOSALSRC = $(CHIBIOS)/os/common/abstractions/nasa_cfe/cfe_psp/src/cfe_psp_support.c + +CFEOSALINC = $(CHIBIOS)/os/common/abstractions/nasa_cfe/cfe_psp/include diff --git a/os/common/abstractions/nasa_cfe/cfe_psp/src/cfe_psp_support.c b/os/common/abstractions/nasa_cfe/cfe_psp/src/cfe_psp_support.c new file mode 100644 index 000000000..3eb5d5e6d --- /dev/null +++ b/os/common/abstractions/nasa_cfe/cfe_psp/src/cfe_psp_support.c @@ -0,0 +1,71 @@ +/* + 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 cfe_psp_support.c + * @brief CFE PSP support module code. + * + * @addtogroup nasa_cfe_psp_support + * @{ + */ + +#include "ch.h" + +#include "common_types.h" +#include "osapi.h" + +/*===========================================================================*/ +/* Module local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported functions. */ +/*===========================================================================*/ + +/** + * @brief Provides a common interface to the processor reset. + * @note Not currently implemented. + */ +void CFE_PSP_Restart(uint32 reset_type) { + + (void)reset_type; +} + +/** + * @brief Generic panic handler. + */ +void CFE_PSP_Panic(int32 ErrorCode) { + + chSysHalt((char *)ErrorCode); +} + +/** @} */ diff --git a/os/common/abstractions/nasa_osal/cfe_osal/include/common_types.h b/os/common/abstractions/nasa_osal/cfe_osal/include/common_types.h deleted file mode 100644 index 100a9c72e..000000000 --- a/os/common/abstractions/nasa_osal/cfe_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/abstractions/nasa_osal/cfe_osal/include/osapi-os-core.h b/os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-core.h deleted file mode 100644 index 8c9b13a78..000000000 --- a/os/common/abstractions/nasa_osal/cfe_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/abstractions/nasa_osal/cfe_osal/include/osapi-os-custom.h b/os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-custom.h deleted file mode 100644 index 4b9213118..000000000 --- a/os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-custom.h +++ /dev/null @@ -1,68 +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-os-custom.h - * @brief Custom OSAPI extensions header. - * - * @addtogroup osapi-custom - * @{ - */ - -#ifndef OSAPI_CUSTOM_H -#define OSAPI_CUSTOM_H - -/*===========================================================================*/ -/* Module constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module data structures and types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#ifdef __cplusplus -extern "C" { -#endif - void OS_set_printf(int (*printf)(const char *fmt, ...)); - boolean OS_TaskDeleteCheck(void); - int32 OS_TaskWait(uint32 task_id); -#ifdef __cplusplus -} -#endif - -/*===========================================================================*/ -/* Module inline functions. */ -/*===========================================================================*/ - -#endif /* OSAPI_CUSTOM_H */ - -/** @} */ diff --git a/os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-filesys.h b/os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-filesys.h deleted file mode 100644 index c46800341..000000000 --- a/os/common/abstractions/nasa_osal/cfe_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/abstractions/nasa_osal/cfe_osal/include/osapi-os-loader.h b/os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-loader.h deleted file mode 100644 index 4f0b21b62..000000000 --- a/os/common/abstractions/nasa_osal/cfe_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/abstractions/nasa_osal/cfe_osal/include/osapi-os-net.h b/os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-net.h deleted file mode 100644 index b8cc67d69..000000000 --- a/os/common/abstractions/nasa_osal/cfe_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/abstractions/nasa_osal/cfe_osal/include/osapi-os-timer.h b/os/common/abstractions/nasa_osal/cfe_osal/include/osapi-os-timer.h deleted file mode 100644 index 8082c6227..000000000 --- a/os/common/abstractions/nasa_osal/cfe_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/abstractions/nasa_osal/cfe_osal/include/osapi-version.h b/os/common/abstractions/nasa_osal/cfe_osal/include/osapi-version.h deleted file mode 100644 index 331e96c94..000000000 --- a/os/common/abstractions/nasa_osal/cfe_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/abstractions/nasa_osal/cfe_osal/include/osapi.h b/os/common/abstractions/nasa_osal/cfe_osal/include/osapi.h deleted file mode 100644 index 72a7c340a..000000000 --- a/os/common/abstractions/nasa_osal/cfe_osal/include/osapi.h +++ /dev/null @@ -1,143 +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" -#include "osapi-os-custom.h" - -#ifdef __cplusplus - } -#endif - -#endif - diff --git a/os/common/abstractions/nasa_osal/cfe_osal/nasa_osal.mk b/os/common/abstractions/nasa_osal/cfe_osal/nasa_osal.mk deleted file mode 100644 index a9eb9ee68..000000000 --- a/os/common/abstractions/nasa_osal/cfe_osal/nasa_osal.mk +++ /dev/null @@ -1,4 +0,0 @@ -# NASA CFE OSAL files. -CFEOSALSRC = $(CHIBIOS)/os/common/abstractions/nasa_cfe/cfe_osal/src/osapi.c - -CFEOSALINC = $(CHIBIOS)/os/common/abstractions/nasa_cfe/cfe_osal/include diff --git a/os/common/abstractions/nasa_osal/cfe_osal/src/osapi.c b/os/common/abstractions/nasa_osal/cfe_osal/src/osapi.c deleted file mode 100644 index 28088165e..000000000 --- a/os/common/abstractions/nasa_osal/cfe_osal/src/osapi.c +++ /dev/null @@ -1,2280 +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 - -#include "ch.h" - -#include "common_types.h" -#include "osapi.h" - -#if CH_CFG_ST_FREQUENCY > 1000000 -#error "CH_CFG_ST_FREQUENCY limit is 1000000" -#endif - -#if (CH_CFG_ST_FREQUENCY % 1000) != 0 -#error "CH_CFG_ST_FREQUENCY is not a multiple of 1000" -#endif - -#if CH_CFG_USE_REGISTRY == FALSE -#error "NASA OSAL requires CH_CFG_USE_REGISTRY" -#endif - -#if CH_CFG_USE_EVENTS == FALSE -#error "NASA OSAL requires CH_CFG_USE_EVENTS" -#endif - -#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_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 - -#if CH_CFG_USE_HEAP == FALSE -#error "NASA OSAL requires CH_CFG_USE_HEAP" -#endif - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -#define MIN_PRIORITY 1 -#define MAX_PRIORITY 255 - -#define MIN_MESSAGE_SIZE 4 -#define MAX_MESSAGE_SIZE 16384 - -#define MIN_QUEUE_DEPTH 1 -#define MAX_QUEUE_DEPTH 16384 - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local types. */ -/*===========================================================================*/ - -/** - * @brief Generic function pointer type. - */ -typedef void (*funcptr_t)(void); - -/** - * @brief Type of OSAL timer. - */ -typedef struct { - uint32 is_free; - char name[OS_MAX_API_NAME]; - OS_TimerCallback_t callback_ptr; - uint32 start_time; - uint32 interval_time; - virtual_timer_t vt; -} osal_timer_t; - -/** - * @brief Type of an OSAL queue. - */ -typedef struct { - uint32 is_free; - char name[OS_MAX_API_NAME]; - semaphore_t free_msgs; - memory_pool_t messages; - mailbox_t mb; - msg_t *mb_buffer; - void *q_buffer; - uint32 depth; - uint32 size; -} osal_queue_t; - -/** - * @brief Type of an osal message with minimum size. - */ -typedef struct { - size_t size; - char buf[4]; -} osal_message_t; - -/** - * @brief Type of OSAL main structure. - */ -typedef struct { - bool printf_enabled; - int (*printf)(const char *fmt, ...); - virtual_timer_t vt; - OS_time_t localtime; - memory_pool_t timers_pool; - memory_pool_t queues_pool; - memory_pool_t binary_semaphores_pool; - memory_pool_t count_semaphores_pool; - memory_pool_t mutexes_pool; - osal_timer_t timers[OS_MAX_TIMERS]; - osal_queue_t queues[OS_MAX_QUEUES]; - 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. */ -/*===========================================================================*/ - -/** - * @brief System time callback. - */ -static void systime_update(void *p) { - systime_t delay = (systime_t)p; - - chSysLockFromISR(); - osal.localtime.microsecs += 1000; - if (osal.localtime.microsecs >= 1000000) { - osal.localtime.microsecs = 0; - osal.localtime.seconds++; - } - chVTDoSetI(&osal.vt, delay, systime_update, p); - chSysUnlockFromISR(); -} - -/** - * @brief Virtual timers callback. - */ -static void timer_handler(void *p) { - osal_timer_t *otp = (osal_timer_t *)p; - - /* Real callback.*/ - otp->callback_ptr((uint32)p); - - /* Timer restart if an interval is defined.*/ - if (otp->interval_time != 0) { - chSysLockFromISR(); - chVTSetI(&otp->vt, US2ST(otp->interval_time), timer_handler, p); - chSysUnlockFromISR(); - } -} - -/** - * @brief Finds a queue by name. - */ -uint32 queue_find(const char *queue_name) { - osal_queue_t *oqp; - - /* Searching the queue in the table.*/ - for (oqp = &osal.queues[0]; oqp < &osal.queues[OS_MAX_QUEUES]; oqp++) { - /* Entering a reentrant critical zone.*/ - syssts_t sts = chSysGetStatusAndLockX(); - - if (!oqp->is_free && - (strncmp(oqp->name, queue_name, OS_MAX_API_NAME - 1) == 0)) { - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - return (uint32)oqp; - } - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - } - - return 0; -} - -/** - * @brief Finds a timer by name. - */ -uint32 timer_find(const char *timer_name) { - osal_timer_t *otp; - - /* Searching the queue in the table.*/ - for (otp = &osal.timers[0]; otp < &osal.timers[OS_MAX_TIMERS]; otp++) { - /* Entering a reentrant critical zone.*/ - syssts_t sts = chSysGetStatusAndLockX(); - - if (!otp->is_free && - (strncmp(otp->name, timer_name, OS_MAX_API_NAME - 1) == 0)) { - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - return (uint32)otp; - } - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - } - - return 0; -} - -/*===========================================================================*/ -/* 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 An error code. - * - * @api - */ -int32 OS_API_Init(void) { - - chSysInit(); - - /* OS_printf() initially disabled.*/ - osal.printf_enabled = false; - osal.printf = NULL; - - /* System time handling.*/ - osal.localtime.microsecs = 0; - osal.localtime.seconds = 0; - chVTObjectInit(&osal.vt); - chVTSet(&osal.vt, MS2ST(1), systime_update, (void *)MS2ST(1)); - - /* Timers pool initialization.*/ - chPoolObjectInit(&osal.timers_pool, - sizeof (osal_timer_t), - NULL); - chPoolLoadArray(&osal.timers_pool, - &osal.timers[0], - OS_MAX_TIMERS); - - /* Queues pool initialization.*/ - chPoolObjectInit(&osal.queues_pool, - sizeof (osal_queue_t), - NULL); - chPoolLoadArray(&osal.queues_pool, - &osal.queues[0], - OS_MAX_QUEUES); - - /* Binary Semaphores pool initialization.*/ - chPoolObjectInit(&osal.binary_semaphores_pool, - sizeof (binary_semaphore_t), - NULL); - chPoolLoadArray(&osal.binary_semaphores_pool, - &osal.binary_semaphores[0], - OS_MAX_BIN_SEMAPHORES); - - /* Counter Semaphores pool initialization.*/ - chPoolObjectInit(&osal.count_semaphores_pool, - sizeof (semaphore_t), - NULL); - chPoolLoadArray(&osal.count_semaphores_pool, - &osal.count_semaphores[0], - OS_MAX_COUNT_SEMAPHORES); - - /* Mutexes pool initialization.*/ - chPoolObjectInit(&osal.mutexes_pool, - sizeof (mutex_t), - NULL); - chPoolLoadArray(&osal.mutexes_pool, - &osal.mutexes[0], - OS_MAX_MUTEXES); - - return OS_SUCCESS; -} - -/*-- Various API -----------------------------------------------------------*/ - -/** - * @brief OS printf-like function. - * @note It is initially disabled. - * - * @param[in] string formatter string - * - * @api - */ -void OS_printf(const char *string, ...) { - va_list ap; - - if (osal.printf_enabled && (osal.printf != NULL)) { - va_start(ap, string); - (void) osal.printf(string); - va_end(ap); - } -} - -/** - * @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 Sets the system printf function. - * @note By default the printf function is not defined. - * @note This is a ChibiOS/RT extension. - * - * @param[in] printf pointer to a @p printf() like function - * - * @api - */ -void OS_set_printf(int (*printf)(const char *fmt, ...)) { - - osal.printf = printf; -} - -/** - * @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. - * - * @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; - } - - chSysLock(); - *time_struct = osal.localtime; - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Changes the local time. - * - * @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; - } - - chSysLock(); - osal.localtime = *time_struct; - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @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); -} - -/*-- timers API -------------------------------------------------------------*/ - -/** - * @brief Timer creation. - * - * @param[out] timer_id pointer to a timer id variable - * @param[in] timer_name the timer name - * @param[out] clock_accuracy timer accuracy in microseconds - * @param[in] callback_ptr timer callback - * @return An error code. - * - * @api - */ -int32 OS_TimerCreate(uint32 *timer_id, const char *timer_name, - uint32 *clock_accuracy, OS_TimerCallback_t callback_ptr) { - osal_timer_t *otp; - - /* NULL pointer checks.*/ - if ((timer_id == NULL) || (timer_name == NULL) || - (clock_accuracy == NULL)) { - return OS_INVALID_POINTER; - } - - /* NULL callback check.*/ - if (callback_ptr == NULL) { - *timer_id = 0; - return OS_TIMER_ERR_INVALID_ARGS; - } - - /* Checking timer name length.*/ - if (strlen(timer_name) >= OS_MAX_API_NAME) { - *timer_id = 0; - return OS_ERR_NAME_TOO_LONG; - } - - /* Checking if the name is already taken.*/ - if (timer_find(timer_name) > 0) { - *timer_id = 0; - return OS_ERR_NAME_TAKEN; - } - - /* Getting object.*/ - otp = chPoolAlloc(&osal.timers_pool); - if (otp == NULL) { - *timer_id = 0; - return OS_ERR_NO_FREE_IDS; - } - - strncpy(otp->name, timer_name, OS_MAX_API_NAME - 1); - chVTObjectInit(&otp->vt); - otp->start_time = 0; - otp->interval_time = 0; - otp->callback_ptr = callback_ptr; - otp->is_free = 0; /* Note, last.*/ - - *timer_id = (uint32)otp; - *clock_accuracy = (uint32)(1000000 / CH_CFG_ST_FREQUENCY); - - return OS_SUCCESS; -} - -/** - * @brief Timer deletion. - * - * @param[in] timer_id timer id variable - * @return An error code. - * - * @api - */ -int32 OS_TimerDelete(uint32 timer_id) { - osal_timer_t *otp = (osal_timer_t *)timer_id; - - /* Range check.*/ - if ((otp < &osal.timers[0]) || - (otp >= &osal.timers[OS_MAX_TIMERS]) || - (otp->is_free)) { - return OS_ERR_INVALID_ID; - } - - chSysLock(); - - /* Marking as no more free, will be overwritten by the pool pointer.*/ - otp->is_free = 1; - - /* Resetting the timer.*/ - chVTResetI(&otp->vt); - otp->start_time = 0; - otp->interval_time = 0; - - /* Flagging it as unused and returning it to the pool.*/ - chPoolFreeI(&osal.timers_pool, (void *)otp); - - chSysUnlock(); - - return OS_SUCCESS; -} - -/** - * @brief Timer deletion. - * @note This function can be safely called from timer callbacks or ISRs. - * - * @param[in] timer_id timer id variable - * @param[in] start_time start time in microseconds or zero - * @param[in] interval_time interval time in microseconds or zero - * @return An error code. - * - * @api - */ -int32 OS_TimerSet(uint32 timer_id, uint32 start_time, uint32 interval_time) { - syssts_t sts; - osal_timer_t *otp = (osal_timer_t *)timer_id; - - /* Range check.*/ - if ((otp < &osal.timers[0]) || - (otp >= &osal.timers[OS_MAX_TIMERS]) || - (otp->is_free)) { - return OS_ERR_INVALID_ID; - } - - /* Entering a reentrant critical zone.*/ - sts = chSysGetStatusAndLockX(); - - if (start_time == 0) { - chVTResetI(&otp->vt); - } - else { - otp->start_time = start_time; - otp->interval_time = interval_time; - chVTSetI(&otp->vt, US2ST(start_time), timer_handler, (void *)timer_id); - } - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - - return OS_SUCCESS; -} - -/** - * @brief Retrieves a timer id by name. - * - * @param[out] timer_id pointer to a timer id variable - * @param[in] sem_name the timer name - * @return An error code. - * - * @api - */ -int32 OS_TimerGetIdByName(uint32 *timer_id, const char *timer_name) { - - /* NULL pointer checks.*/ - if ((timer_id == NULL) || (timer_name == NULL)) { - return OS_INVALID_POINTER; - } - - /* Checking name length.*/ - if (strlen(timer_name) >= OS_MAX_API_NAME) { - return OS_ERR_NAME_TOO_LONG; - } - - /* Searching the queue.*/ - *timer_id = timer_find(timer_name); - if (*timer_id > 0) { - return OS_SUCCESS; - } - - return OS_ERR_NAME_NOT_FOUND; -} - -/** - * @brief Returns timer information. - * @note This function can be safely called from timer callbacks or ISRs. - * - * @param[in] timer_id timer id variable - * @param[in] timer_prop timer properties - * @return An error code. - * - * @api - */ -int32 OS_TimerGetInfo(uint32 timer_id, OS_timer_prop_t *timer_prop) { - syssts_t sts; - osal_timer_t *otp = (osal_timer_t *)timer_id; - - /* NULL pointer checks.*/ - if (timer_prop == NULL) { - return OS_INVALID_POINTER; - } - - /* Range check.*/ - if ((otp < &osal.timers[0]) || - (otp >= &osal.timers[OS_MAX_TIMERS]) || - (otp->is_free)) { - return OS_ERR_INVALID_ID; - } - - /* Entering a reentrant critical zone.*/ - sts = chSysGetStatusAndLockX(); - - /* If the timer is not in use then error.*/ - if (otp->is_free) { - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - return OS_ERR_INVALID_ID; - } - - strncpy(timer_prop->name, otp->name, OS_MAX_API_NAME - 1); - timer_prop->creator = (uint32)0; - timer_prop->start_time = otp->start_time; - timer_prop->interval_time = otp->interval_time; - timer_prop->accuracy = (uint32)(1000000 / CH_CFG_ST_FREQUENCY); - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - - return OS_SUCCESS; -} - -/*-- Queues API -------------------------------------------------------------*/ - -/** - * @brief Queue creation. - * - * @param[out] queue_id pointer to a queue id variable - * @param[in] queue_name the queue name - * @param[in] queue_depth desired queue depth - * @param[in] data_size maximum message size - * @param[in] flags queue option flags - * @return An error code. - * - * @api - */ -int32 OS_QueueCreate(uint32 *queue_id, const char *queue_name, - uint32 queue_depth, uint32 data_size, uint32 flags) { - osal_queue_t *oqp; - size_t msgsize; - - (void)flags; - - /* NULL pointer checks.*/ - if ((queue_id == NULL) || (queue_name == NULL)) { - return OS_INVALID_POINTER; - } - - /* Checking queue name length.*/ - if (strlen(queue_name) >= OS_MAX_API_NAME) { - *queue_id = 0; - return OS_ERR_NAME_TOO_LONG; - } - - /* Checking if the name is already taken.*/ - if (queue_find(queue_name) > 0) { - *queue_id = 0; - return OS_ERR_NAME_TAKEN; - } - - /* Checks on queue limits. There is no dedicated error code.*/ - if ((data_size < MIN_MESSAGE_SIZE) || (data_size > MAX_MESSAGE_SIZE) || - (queue_depth < MIN_QUEUE_DEPTH) || (queue_depth > MAX_QUEUE_DEPTH)) { - *queue_id = 0; - return OS_ERROR; - } - - /* Getting object.*/ - oqp = chPoolAlloc(&osal.queues_pool); - if (oqp == NULL) { - *queue_id = 0; - return OS_ERR_NO_FREE_IDS; - } - - /* Attempting messages buffer allocation.*/ - msgsize = MEM_ALIGN_NEXT(data_size + sizeof (size_t), PORT_NATURAL_ALIGN); - oqp->mb_buffer = chHeapAllocAligned(NULL, - msgsize * (size_t)queue_depth, - PORT_NATURAL_ALIGN); - if (oqp->mb_buffer == NULL) { - *queue_id = 0; - return OS_ERROR; - } - - /* Attempting queue buffer allocation.*/ - oqp->q_buffer = chHeapAllocAligned(NULL, - sizeof (msg_t) * (size_t)queue_depth, - PORT_NATURAL_ALIGN); - if (oqp->q_buffer == NULL) { - *queue_id = 0; - chHeapFree(oqp->mb_buffer); - return OS_ERROR; - } - - /* Initializing object static parts.*/ - strncpy(oqp->name, queue_name, OS_MAX_API_NAME - 1); - chMBObjectInit(&oqp->mb, oqp->q_buffer, (size_t)queue_depth); - chSemObjectInit(&oqp->free_msgs, (cnt_t)queue_depth); - chPoolObjectInit(&oqp->messages, msgsize, NULL); - chPoolLoadArray(&oqp->messages, oqp->mb_buffer, (size_t)queue_depth); - oqp->depth = queue_depth; - oqp->size = data_size; - oqp->is_free = 0; /* Note, last.*/ - *queue_id = (uint32)oqp; - - return OS_SUCCESS; -} - -/** - * @brief Queue deletion. - * - * @param[in] queue_id queue id variable - * @return An error code. - * - * @api - */ -int32 OS_QueueDelete(uint32 queue_id) { - osal_queue_t *oqp = (osal_queue_t *)queue_id; - void *q_buffer, *mb_buffer; - - /* Range check.*/ - if ((oqp < &osal.queues[0]) || - (oqp >= &osal.queues[OS_MAX_QUEUES]) || - (oqp->is_free)) { - return OS_ERR_INVALID_ID; - } - - /* Critical zone.*/ - chSysLock(); - - /* Marking as no more free, will be overwritten by the pool pointer.*/ - oqp->is_free = 1; - - /* Pointers to areas to be freed.*/ - q_buffer = oqp->q_buffer; - mb_buffer = oqp->mb_buffer; - - /* Resetting the queue.*/ - chMBResetI(&oqp->mb); - chSemResetI(&oqp->free_msgs, 0); - - /* Flagging it as unused and returning it to the pool.*/ - chPoolFreeI(&osal.queues_pool, (void *)oqp); - - chSchRescheduleS(); - - /* Leaving critical zone.*/ - chSysUnlock(); - - /* Freeing buffers, outside critical zone, slow heap operation.*/ - chHeapFree(q_buffer); - chHeapFree(mb_buffer); - - return OS_SUCCESS; -} - -/** - * @brief Retrieves a message from the queue. - * - * @param[in] queue_id queue id variable - * @param[out] data message buffer pointer - * @param[in] size size of the buffer - * @param[out] size_copied size of the received message - * @param[in] timeout timeout in ticks, the special values @p OS_PEND - * and @p OS_CHECK can be specified - * @return An error code. - * - * @api - */ -int32 OS_QueueGet(uint32 queue_id, void *data, uint32 size, - uint32 *size_copied, int32 timeout) { - osal_queue_t *oqp = (osal_queue_t *)queue_id; - msg_t msg, msgsts; - void *body; - - /* NULL pointer checks.*/ - if ((data == NULL) || (size_copied == NULL)) { - return OS_INVALID_POINTER; - } - - /* Range check.*/ - if ((oqp < &osal.queues[0]) || - (oqp >= &osal.queues[OS_MAX_QUEUES]) || - (oqp->is_free)) { - return OS_ERR_INVALID_ID; - } - - /* Check on minimum size.*/ - if (size < oqp->size) { - return OS_QUEUE_INVALID_SIZE; - } - - /* Special time handling.*/ - if (timeout == OS_PEND) { - msgsts = chMBFetch(&oqp->mb, &msg, TIME_INFINITE); - if (msgsts < MSG_OK) { - *size_copied = 0; - return OS_ERROR; - } - } - else if (timeout == OS_CHECK) { - msgsts = chMBFetch(&oqp->mb, &msg, TIME_IMMEDIATE); - if (msgsts < MSG_OK) { - *size_copied = 0; - return OS_QUEUE_EMPTY; - } - } - else { - msgsts = chMBFetch(&oqp->mb, &msg, (systime_t)timeout); - if (msgsts < MSG_OK) { - *size_copied = 0; - return OS_QUEUE_TIMEOUT; - } - } - - /* Message body and size.*/ - *size_copied = ((osal_message_t *)msg)->size; - body = (void *)((osal_message_t *)msg)->buf; - - /* Copying the message body.*/ - memcpy(data, body, *size_copied); - - /* Freeing the message buffer.*/ - chPoolFree(&oqp->messages, (void *)msg); - chSemSignal(&oqp->free_msgs); - - return OS_SUCCESS; -} - -/** - * @brief Puts a message in the queue. - * - * @param[in] queue_id queue id variable - * @param[in] data message buffer pointer - * @param[in] size size of the message - * @param[in] flags operation flags - * @return An error code. - * - * @api - */ -int32 OS_QueuePut(uint32 queue_id, void *data, uint32 size, uint32 flags) { - osal_queue_t *oqp = (osal_queue_t *)queue_id; - msg_t msgsts; - osal_message_t *omsg; - - (void)flags; - - /* NULL pointer checks.*/ - if (data == NULL) { - return OS_INVALID_POINTER; - } - - /* Range check.*/ - if ((oqp < &osal.queues[0]) || - (oqp >= &osal.queues[OS_MAX_QUEUES]) || - (oqp->is_free)) { - return OS_ERR_INVALID_ID; - } - - /* Check on maximum size.*/ - if (size > oqp->size) { - return OS_QUEUE_INVALID_SIZE; - } - - /* Getting a message buffer from the pool.*/ - msgsts = chSemWait(&oqp->free_msgs); - if (msgsts < MSG_OK) { - return OS_ERROR; - } - omsg = chPoolAlloc(&oqp->messages); - - /* Filling message size and data.*/ - omsg->size = (size_t)size; - memcpy(omsg->buf, data, size); - - /* Posting the message.*/ - msgsts = chMBPost(&oqp->mb, (msg_t)omsg, TIME_INFINITE); - if (msgsts < MSG_OK) { - return OS_ERROR; - } - - return OS_SUCCESS; -} - -/** - * @brief Retrieves a queue id by name. - * - * @param[out] queue_id pointer to a queue id variable - * @param[in] sem_name the queue name - * @return An error code. - * - * @api - */ -int32 OS_QueueGetIdByName(uint32 *queue_id, const char *queue_name) { - - /* NULL pointer checks.*/ - if ((queue_id == NULL) || (queue_name == NULL)) { - return OS_INVALID_POINTER; - } - - /* Checking name length.*/ - if (strlen(queue_name) >= OS_MAX_API_NAME) { - return OS_ERR_NAME_TOO_LONG; - } - - /* Searching the queue.*/ - *queue_id = queue_find(queue_name); - if (*queue_id > 0) { - return OS_SUCCESS; - } - - return OS_ERR_NAME_NOT_FOUND; -} - -/** - * @brief Returns queue information. - * @note This function can be safely called from timer callbacks or ISRs. - * - * @param[in] queue_id queue id variable - * @param[in] queue_prop queue properties - * @return An error code. - * - * @api - */ -int32 OS_QueueGetInfo (uint32 queue_id, OS_queue_prop_t *queue_prop) { - osal_queue_t *oqp = (osal_queue_t *)queue_id; - syssts_t sts; - - /* NULL pointer checks.*/ - if (queue_prop == NULL) { - return OS_INVALID_POINTER; - } - - /* Range check.*/ - if ((oqp < &osal.queues[0]) || - (oqp >= &osal.queues[OS_MAX_QUEUES]) || - (oqp->is_free)) { - return OS_ERR_INVALID_ID; - } - - /* Entering a reentrant critical zone.*/ - sts = chSysGetStatusAndLockX(); - - /* If the queue is not in use then error.*/ - if (oqp->is_free) { - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - return OS_ERR_INVALID_ID; - } - - strncpy(queue_prop->name, oqp->name, OS_MAX_API_NAME - 1); - queue_prop->creator = (uint32)0; - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - - return OS_SUCCESS; - - return OS_ERR_NOT_IMPLEMENTED; -} - -/*-- 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; - } - - /* Getting object.*/ - bsp = chPoolAlloc(&osal.binary_semaphores_pool); - if (bsp == NULL) { - return OS_ERR_NO_FREE_IDS; - } - - /* Semaphore is initialized.*/ - chBSemObjectInit(bsp, sem_initial_value == 0 ? true : false); - - *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; - - /* Range check.*/ - 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. - * @note This function can be safely called from timer callbacks or ISRs. - * - * @param[in] sem_id binary semaphore id variable - * @return An error code. - * - * @api - */ -int32 OS_BinSemFlush(uint32 sem_id) { - syssts_t sts; - binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; - - /* Range check.*/ - if ((bsp < &osal.binary_semaphores[0]) || - (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - /* Entering a reentrant critical zone.*/ - sts = chSysGetStatusAndLockX(); - - /* If the semaphore is not in use then error.*/ - if (bsp->sem.queue.prev == NULL) { - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - return OS_SEM_FAILURE; - } - - /* If the semaphore state is "not taken" then it is not touched.*/ - if (bsp->sem.cnt < 0) { - chBSemResetI(bsp, true); - } - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - - return OS_SUCCESS; -} - -/** - * @brief Binary semaphore give. - * @note This function can be safely called from timer callbacks or ISRs. - * - * @param[in] sem_id binary semaphore id variable - * @return An error code. - * - * @api - */ -int32 OS_BinSemGive(uint32 sem_id) { - syssts_t sts; - binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; - - /* Range check.*/ - if ((bsp < &osal.binary_semaphores[0]) || - (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - /* Entering a reentrant critical zone.*/ - sts = chSysGetStatusAndLockX(); - - /* If the semaphore is not in use then error.*/ - if (bsp->sem.queue.prev == NULL) { - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - return OS_SEM_FAILURE; - } - - chBSemSignalI(bsp); - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - - 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; - - /* Range check.*/ - 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; - - /* Range check.*/ - 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; - } - - /* Checking name length.*/ - if (strlen(sem_name) >= OS_MAX_API_NAME) { - return OS_ERR_NAME_TOO_LONG; - } - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** - * @brief Returns binary semaphore information. - * @note This function can be safely called from timer callbacks or ISRs. - * @note It is not currently implemented. - * - * @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) { - syssts_t sts; - binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id; - - /* NULL pointer checks.*/ - if (bin_prop == NULL) { - return OS_INVALID_POINTER; - } - - /* Range check.*/ - if ((bsp < &osal.binary_semaphores[0]) || - (bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - /* Entering a reentrant critical zone.*/ - sts = chSysGetStatusAndLockX(); - - /* If the semaphore is not in use then error.*/ - if (bsp->sem.queue.prev == NULL) { - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - return OS_ERR_INVALID_ID; - } - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - - 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; - } - - /* Getting object.*/ - sp = chPoolAlloc(&osal.count_semaphores_pool); - if (sp == NULL) { - return OS_ERR_NO_FREE_IDS; - } - - /* 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; - - /* Range check.*/ - 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. - * @note This function can be safely called from timer callbacks or ISRs. - * - * @param[in] sem_id counter semaphore id variable - * @return An error code. - * - * @api - */ -int32 OS_CountSemGive(uint32 sem_id) { - syssts_t sts; - semaphore_t *sp = (semaphore_t *)sem_id; - - /* Range check.*/ - if ((sp < &osal.count_semaphores[0]) || - (sp >= &osal.count_semaphores[OS_MAX_COUNT_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - /* Entering a reentrant critical zone.*/ - sts = chSysGetStatusAndLockX(); - - /* If the semaphore is not in use then error.*/ - if (sp->queue.prev == NULL) { - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - return OS_SEM_FAILURE; - } - - chSemSignalI(sp); - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - - 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; - - /* Range check.*/ - 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; - - /* Range check.*/ - 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; - } - - /* Checking name length.*/ - if (strlen(sem_name) >= OS_MAX_API_NAME) { - return OS_ERR_NAME_TOO_LONG; - } - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** - * @brief Returns counter semaphore information. - * @note This function can be safely called from timer callbacks or ISRs. - * @note It is not currently implemented. - * - * @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) { - syssts_t sts; - semaphore_t *sp = (semaphore_t *)sem_id; - - /* NULL pointer checks.*/ - if (sem_prop == NULL) { - return OS_INVALID_POINTER; - } - - /* Range check.*/ - if ((sp < &osal.count_semaphores[0]) || - (sp >= &osal.count_semaphores[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - /* Entering a reentrant critical zone.*/ - sts = chSysGetStatusAndLockX(); - - /* If the semaphore is not in use then error.*/ - if (sp->queue.prev == NULL) { - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - return OS_ERR_INVALID_ID; - } - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - - 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; - } - - /* Getting object.*/ - mp = chPoolAlloc(&osal.mutexes_pool); - if (mp == NULL) { - return OS_ERR_NO_FREE_IDS; - } - - /* 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; - - /* Range check.*/ - 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; - - /* Range check.*/ - 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; - - /* Range check.*/ - 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; - } - - /* Checking name length.*/ - if (strlen(sem_name) >= OS_MAX_API_NAME) { - return OS_ERR_NAME_TOO_LONG; - } - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** - * @brief Returns mutex information. - * @note This function can be safely called from timer callbacks or ISRs. - * @note It is not currently implemented. - * - * @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) { - syssts_t sts; - mutex_t *mp = (mutex_t *)sem_id; - - /* NULL pointer checks.*/ - if (sem_prop == NULL) { - return OS_INVALID_POINTER; - } - - /* Range check.*/ - if ((mp < &osal.mutexes[0]) || - (mp >= &osal.mutexes[OS_MAX_BIN_SEMAPHORES])) { - return OS_ERR_INVALID_ID; - } - - /* Entering a reentrant critical zone.*/ - sts = chSysGetStatusAndLockX(); - - /* If the mutex is not in use then error.*/ - if (mp->queue.prev == NULL) { - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - return OS_ERR_INVALID_ID; - } - - /* Leaving the critical zone.*/ - chSysRestoreStatusX(sts); - - return OS_ERR_NOT_IMPLEMENTED; -} - -/*-- Task Control API -------------------------------------------------------*/ - -/** - * @brief Task creation. - * @note The task name is not copied inside the task but kept by reference, - * the name is supposed to be persistent, better if defined as a - * sting constant. - * - * @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; - } - - /* Checking if this working area is already in use by some thread, the - error code is not very appropriate but this case seems to not be - coveded by the specification.*/ - tp = chRegFindThreadByWorkingArea((stkalign_t *)stack_pointer); - if (tp != NULL) { - /* Releasing the thread reference.*/ - chThdRelease(tp); - return OS_ERR_NO_FREE_IDS; - } - - /* Checking if the name is already in use.*/ - if ((tp = chRegFindThreadByName(task_name)) != NULL) { - /* Releasing the thread reference.*/ - chThdRelease(tp); - return OS_ERR_NAME_TAKEN; - } - - /* Converting priority to RT type.*/ - rt_prio = (tprio_t)256 - (tprio_t)priority; - if (rt_prio == 1) { - rt_prio = 2; - } - - thread_descriptor_t td = { - task_name, - (stkalign_t *)stack_pointer, - (stkalign_t *)((uint8_t *)stack_pointer + stack_size), - rt_prio, - (tfunc_t)function_pointer, - NULL - }; - - /* Creating the task and detaching it, other APIs will have to gain a - reference using the registry API.*/ - tp = chThdCreate(&td); - chThdRelease(tp); - - /* Storing the task id.*/ - *task_id = (uint32)tp; - - return OS_SUCCESS; -} - -/** - * @brief Installs a deletion handler. - * @note It is implemented as hooks in chconf.h. - * - * @param[in] function_pointer the handler function - * @return An error code. - * - * @api - */ -int32 OS_TaskInstallDeleteHandler(void *function_pointer) { - - chThdGetSelfX()->osal_delete_handler = function_pointer; - - return OS_SUCCESS; -} - -/** - * @brief Check for task termination request. - * @note This is a ChibiOS/RT extension, direct task delete is not - * allowed in RT. - * - * @return The termination request flag. - * @retval false if termination has not been requested. - * @retval true if termination has been requested. - * - * @api - */ -boolean OS_TaskDeleteCheck(void) { - - return (boolean)chThdShouldTerminateX(); -} - -/** - * @brief Task delete. - * @note Limitation, it does not actually kill the thread, it just sets a - * flag in the thread that has then to terminate voluntarily. The - * flag can be checked using @p chThdShouldTerminateX(). - * - * @param[in] task_id the task id - * @return An error code. - * - * @api - */ -int32 OS_TaskDelete(uint32 task_id) { - thread_t *tp = (thread_t *)task_id; - funcptr_t fp; - - /* Check for thread validity, getting a reference.*/ - if (chRegFindThreadByPointer(tp) == NULL) { - return OS_ERR_INVALID_ID; - } - - /* Asking for thread termination.*/ - chThdTerminate(tp); - - /* Getting the delete handler while the thread is still referenced.*/ - fp = (funcptr_t)tp->osal_delete_handler; - - /* Waiting for termination, releasing the reference.*/ - chThdWait(tp); - - /* Calling the delete handler, if defined.*/ - if (fp != NULL) { - fp(); - } - - return OS_SUCCESS; -} - -/** - * @brief Task exit. - * - * @api - */ -void OS_TaskExit(void) { - - chThdExit(MSG_OK); -} - -/** - * @brief Wait for task termination. - * @note This is a ChibiOS/RT extension, added for improved testability. - * - * @param[in] task_id the task id - * @return An error code. - * - * @api - */ -int32 OS_TaskWait(uint32 task_id) { - thread_t *tp = (thread_t *)task_id; - - /* Check for thread validity, getting a reference.*/ - if (chRegFindThreadByPointer(tp) == NULL) { - return OS_ERR_INVALID_ID; - } - - (void) chThdWait(tp); - - return OS_SUCCESS; -} - -/** - * @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. - * @note Priority 255 is not available and it is transformed internally in - * 254. - * - * @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 (rt_newprio == 1) { - rt_newprio = 2; - } - - if (chThdGetPriorityX() == rt_newprio) { - return OS_SUCCESS; - } - - /* Check for thread validity.*/ - if (chRegFindThreadByPointer(tp) == NULL) { - return OS_ERR_INVALID_ID; - } - - 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(); - - /* Releasing the thread reference.*/ - chThdRelease(tp); - - 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. - * @note This function can be safely called from timer callbacks or ISRs. - * - * @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; - } - - /* Searching in the registry.*/ - tp = chRegFindThreadByName(task_name); - if (tp == NULL) { - return OS_ERR_NAME_NOT_FOUND; - } - - *task_id = (uint32)tp; - - /* Releasing the thread reference.*/ - chThdRelease(tp); - - return OS_SUCCESS; -} - -/** - * @brief Returns task information. - * @note This function can be safely called from timer callbacks or ISRs. - * @note Priority 255 is not available and it is transformed internally in - * 254. - * - * @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->wabase + sizeof (thread_t); - - /* NULL pointer checks.*/ - if (task_prop == NULL) { - return OS_INVALID_POINTER; - } - - /* Check for thread validity.*/ - if (chRegFindThreadByPointer(tp) == NULL) { - return OS_ERR_INVALID_ID; - } - - 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; - - /* Releasing the thread reference.*/ - chThdRelease(tp); - - return OS_SUCCESS; -} - -/*-- System Interrupt API ---------------------------------------------------*/ - -/* In ChibiOS interrupts are statically linked, the vectors table is in - flash.*/ -int32 OS_IntAttachHandler (uint32 InterruptNumber, - osal_task_entry InterruptHandler, - int32 parameter) { - (void)InterruptNumber; - (void)parameter; - - /* NULL pointer checks.*/ - if (InterruptHandler == NULL) { - return OS_INVALID_POINTER; - } - - return OS_ERR_NOT_IMPLEMENTED; -} - -int32 OS_IntLock(void) { - - return (int32)chSysGetStatusAndLockX(); -} - -int32 OS_IntUnlock(int32 IntLevel) { - - chSysRestoreStatusX((syssts_t) IntLevel); - - return OS_SUCCESS; -} - -int32 OS_IntEnable(int32 Level) { - - NVIC_EnableIRQ((IRQn_Type)Level); - - return OS_SUCCESS; -} - -int32 OS_IntDisable(int32 Level) { - - NVIC_DisableIRQ((IRQn_Type)Level); - - return OS_SUCCESS; -} - -int32 OS_IntAck(int32 InterruptNumber) { - - NVIC_ClearPendingIRQ((IRQn_Type)InterruptNumber); - - return OS_SUCCESS; -} - -/*-- System Exception API ---------------------------------------------------*/ - -/* In ChibiOS exceptions are statically linked, the vectors table is in - flash.*/ -int32 OS_ExcAttachHandler(uint32 ExceptionNumber, - void (*ExceptionHandler)(uint32, uint32 *,uint32), - int32 parameter) { - - (void)ExceptionNumber; - (void)parameter; - - /* NULL pointer checks.*/ - if (ExceptionHandler == NULL) { - return OS_INVALID_POINTER; - } - - return OS_ERR_NOT_IMPLEMENTED; -} - -/* No exceptions masking.*/ -int32 OS_ExcEnable(int32 ExceptionNumber) { - - (void)ExceptionNumber; - - return OS_ERR_NOT_IMPLEMENTED; -} - -/* No exceptions masking.*/ -int32 OS_ExcDisable(int32 ExceptionNumber) { - - (void)ExceptionNumber; - - return OS_ERR_NOT_IMPLEMENTED; -} - -/*-- Floating Point Unit API ------------------------------------------------*/ - -/* In ChibiOS exceptions are statically linked, the vectors table is in - flash.*/ -int32 OS_FPUExcAttachHandler(uint32 ExceptionNumber, - void * ExceptionHandler , - int32 parameter) { - - (void)ExceptionNumber; - (void)parameter; - - /* NULL pointer checks.*/ - if (ExceptionHandler == NULL) { - return OS_INVALID_POINTER; - } - - return OS_ERR_NOT_IMPLEMENTED; -} - -int32 OS_FPUExcEnable(int32 ExceptionNumber) { - - (void)ExceptionNumber; - - return OS_ERR_NOT_IMPLEMENTED; -} - -int32 OS_FPUExcDisable(int32 ExceptionNumber) { - - (void)ExceptionNumber; - - return OS_ERR_NOT_IMPLEMENTED; -} - -int32 OS_FPUExcSetMask(uint32 mask) { - - (void)mask; - - return OS_ERR_NOT_IMPLEMENTED; -} - -int32 OS_FPUExcGetMask(uint32 *mask) { - - (void)mask; - - return OS_ERR_NOT_IMPLEMENTED; -} - -/** @} */ diff --git a/os/common/abstractions/nasa_osal/cfe_psp/cfe_psp.mk b/os/common/abstractions/nasa_osal/cfe_psp/cfe_psp.mk deleted file mode 100644 index 510afcfcd..000000000 --- a/os/common/abstractions/nasa_osal/cfe_psp/cfe_psp.mk +++ /dev/null @@ -1,4 +0,0 @@ -# NASA CFE PSP files. -CFEOSALSRC = $(CHIBIOS)/os/common/abstractions/nasa_cfe/cfe_psp/src/cfe_psp_support.c - -CFEOSALINC = $(CHIBIOS)/os/common/abstractions/nasa_cfe/cfe_psp/include diff --git a/os/common/abstractions/nasa_osal/cfe_psp/src/cfe_psp_support.c b/os/common/abstractions/nasa_osal/cfe_psp/src/cfe_psp_support.c deleted file mode 100644 index 3eb5d5e6d..000000000 --- a/os/common/abstractions/nasa_osal/cfe_psp/src/cfe_psp_support.c +++ /dev/null @@ -1,71 +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 cfe_psp_support.c - * @brief CFE PSP support module code. - * - * @addtogroup nasa_cfe_psp_support - * @{ - */ - -#include "ch.h" - -#include "common_types.h" -#include "osapi.h" - -/*===========================================================================*/ -/* Module local definitions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local types. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local variables. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module local functions. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Module exported functions. */ -/*===========================================================================*/ - -/** - * @brief Provides a common interface to the processor reset. - * @note Not currently implemented. - */ -void CFE_PSP_Restart(uint32 reset_type) { - - (void)reset_type; -} - -/** - * @brief Generic panic handler. - */ -void CFE_PSP_Panic(int32 ErrorCode) { - - chSysHalt((char *)ErrorCode); -} - -/** @} */ -- cgit v1.2.3