diff --git a/os/common/abstractions/nasa_osal/include/osapi-os-custom.h b/os/common/abstractions/nasa_osal/include/osapi-os-custom.h index f14c4fd33..dffe97c6d 100644 --- a/os/common/abstractions/nasa_osal/include/osapi-os-custom.h +++ b/os/common/abstractions/nasa_osal/include/osapi-os-custom.h @@ -52,6 +52,7 @@ #ifdef __cplusplus extern "C" { #endif + void OS_set_printf(int (*printf)(const char *fmt, ...)); boolean OS_TaskDeleteCheck(void); #ifdef __cplusplus } diff --git a/os/common/abstractions/nasa_osal/src/osapi.c b/os/common/abstractions/nasa_osal/src/osapi.c index aac0cf4bd..7033716e6 100644 --- a/os/common/abstractions/nasa_osal/src/osapi.c +++ b/os/common/abstractions/nasa_osal/src/osapi.c @@ -22,6 +22,7 @@ * @{ */ +#include #include #include "ch.h" @@ -131,6 +132,9 @@ typedef struct { */ 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; @@ -153,6 +157,22 @@ 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. */ @@ -182,7 +202,7 @@ static void timer_handler(void *p) { * of the OS Abstraction Layer. It must be called in the application * startup code before calling any other OS routines. * - * @return kAn error code. + * @return An error code. * * @api */ @@ -192,6 +212,13 @@ int32 OS_API_Init(void) { /* 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, @@ -248,11 +275,12 @@ int32 OS_API_Init(void) { * @api */ void OS_printf(const char *string, ...) { + va_list ap; - (void)string; - - if (osal.printf_enabled) { - + if (osal.printf_enabled && (osal.printf != NULL)) { + va_start(ap, string); + (void) osal.printf(string); + va_end(ap); } } @@ -276,6 +304,20 @@ 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. * @@ -301,10 +343,11 @@ int32 OS_GetLocalTime(OS_time_t *time_struct) { return OS_INVALID_POINTER; } - time_struct->seconds = 0; - time_struct->microsecs = 0; + chSysLock(); + *time_struct = osal.localtime; + chSysUnlock(); - return OS_ERR_NOT_IMPLEMENTED; + return OS_SUCCESS; } /** @@ -322,7 +365,11 @@ int32 OS_SetLocalTime(OS_time_t *time_struct) { return OS_INVALID_POINTER; } - return OS_ERR_NOT_IMPLEMENTED; + chSysLock(); + osal.localtime = *time_struct; + chSysUnlock(); + + return OS_SUCCESS; } /** @@ -2034,4 +2081,137 @@ int32 OS_TaskGetInfo(uint32 task_id, OS_task_prop_t *task_prop) { 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; +} + /** @} */