git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@8924 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
Giovanni Di Sirio 2016-02-22 16:15:28 +00:00
parent 83c0010d8f
commit 39fa482f9d
2 changed files with 340 additions and 4 deletions

View File

@ -52,7 +52,7 @@
** Platform Configuration Parameters for the OS API
*/
#define OS_MAX_TASKS 64
#define OS_MAX_TASKS 64 /* Not used.*/
#define OS_MAX_QUEUES 64
#define OS_MAX_COUNT_SEMAPHORES 20
#define OS_MAX_BIN_SEMAPHORES 20

View File

@ -41,6 +41,14 @@
#error "NASA OSAL requires CH_CFG_USE_REGISTRY"
#endif
#if CH_CFG_USE_MEMCORE == FALSE
#error "NASA OSAL requires CH_CFG_USE_MEMCORE"
#endif
#if CH_CFG_USE_MEMPOOLS == FALSE
#error "NASA OSAL requires CH_CFG_USE_MEMPOOLS"
#endif
/*===========================================================================*/
/* Module local definitions. */
/*===========================================================================*/
@ -61,6 +69,12 @@
*/
typedef struct {
bool printf_enabled;
memory_pool_t binary_semaphores_pool;
memory_pool_t count_semaphores_pool;
memory_pool_t mutexes_pool;
binary_semaphore_t binary_semaphores[OS_MAX_BIN_SEMAPHORES];
semaphore_t count_semaphores[OS_MAX_COUNT_SEMAPHORES];
mutex_t mutexes[OS_MAX_MUTEXES];
} osal_t;
/*===========================================================================*/
@ -93,8 +107,33 @@ int32 OS_API_Init(void) {
chSysInit();
/* OS_printf() initially disabled.*/
osal.printf_enabled = false;
/* Binary Semaphores pool initialization.*/
chPoolObjectInit(&osal.binary_semaphores_pool,
sizeof (binary_semaphore_t),
NULL);
chPoolLoadArray(&osal.binary_semaphores_pool,
&osal.binary_semaphores,
sizeof (binary_semaphore_t));
/* Counter Semaphores pool initialization.*/
chPoolObjectInit(&osal.count_semaphores_pool,
sizeof (semaphore_t),
NULL);
chPoolLoadArray(&osal.count_semaphores_pool,
&osal.count_semaphores,
sizeof (semaphore_t));
/* Mutexes pool initialization.*/
chPoolObjectInit(&osal.mutexes_pool,
sizeof (mutex_t),
NULL);
chPoolLoadArray(&osal.mutexes_pool,
&osal.mutexes,
sizeof (mutex_t));
return OS_SUCCESS;
}
@ -204,6 +243,276 @@ int32 OS_Milli2Ticks(uint32 milli_seconds) {
/*-- Semaphore and Mutex 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 intial value
* @param[in] options semaphore options
* @return An error code.
*
* @api
*/
int32 OS_BinSemCreate (uint32 *sem_id, const char *sem_name,
uint32 sem_initial_value, uint32 options) {
binary_semaphore_t *bsp;
(void)options;
/* NULL pointer checks.*/
if ((sem_id == NULL) || (sem_name == NULL)) {
return OS_INVALID_POINTER;
}
/* Checking semaphore name length.*/
if (strlen(sem_name) >= OS_MAX_API_NAME) {
return OS_ERR_NAME_TOO_LONG;
}
/* Semaphore counter check, it is binary so only 0 and 1.*/
if (sem_initial_value > 1) {
return OS_INVALID_INT_NUM;
}
bsp = chPoolAlloc(&osal.binary_semaphores_pool);
if (bsp == 0) {
return OS_SEM_FAILURE;
}
/* Semaphore is initialized.*/
chBSemObjectInit(bsp, sem_initial_value == 0 ? false : true);
*sem_id = (uint32)bsp;
return OS_SUCCESS;
}
/**
* @brief Binary semaphore deletion.
*
* @param[in] sem_id binary semaphore id variable
* @return An error code.
*
* @api
*/
int32 OS_BinSemDelete(uint32 sem_id) {
binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id;
if ((bsp < &osal.binary_semaphores[0]) ||
(bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) {
return OS_ERR_INVALID_ID;
}
chSysLock();
/* Resetting the semaphore, no threads in queue.*/
chBSemResetI(bsp, true);
/* Flagging it as unused and returning it to the pool.*/
bsp->sem.queue.prev = NULL;
chPoolFreeI(&osal.binary_semaphores_pool, (void *)bsp);
/* Required because some thready could have been made ready.*/
chSchRescheduleS();
chSysUnlock();
return OS_SUCCESS;
}
/**
* @brief Binary semaphore flush.
* @note The state of the binary semaphore is not changed.
*
* @param[in] sem_id binary semaphore id variable
* @return An error code.
*
* @api
*/
int32 OS_BinSemFlush(uint32 sem_id) {
binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id;
if ((bsp < &osal.binary_semaphores[0]) ||
(bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) {
return OS_ERR_INVALID_ID;
}
chSysLock();
/* If the semaphore is not in use then error.*/
if (bsp->sem.queue.prev == NULL) {
chSysUnlock();
return OS_SEM_FAILURE;
}
if (bsp->sem.cnt < 0) {
chBSemResetI(bsp, true);
chSchRescheduleS();
}
chSysUnlock();
return OS_SUCCESS;
}
/**
* @brief Binary semaphore give.
*
* @param[in] sem_id binary semaphore id variable
* @return An error code.
*
* @api
*/
int32 OS_BinSemGive(uint32 sem_id) {
binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id;
if ((bsp < &osal.binary_semaphores[0]) ||
(bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) {
return OS_ERR_INVALID_ID;
}
chSysLock();
/* If the semaphore is not in use then error.*/
if (bsp->sem.queue.prev == NULL) {
chSysUnlock();
return OS_SEM_FAILURE;
}
chBSemSignalI(bsp);
chSchRescheduleS();
chSysUnlock();
return OS_SUCCESS;
}
/**
* @brief Binary semaphore take.
*
* @param[in] sem_id binary semaphore id variable
* @return An error code.
*
* @api
*/
int32 OS_BinSemTake(uint32 sem_id) {
binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id;
if ((bsp < &osal.binary_semaphores[0]) ||
(bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) {
return OS_ERR_INVALID_ID;
}
chSysLock();
/* If the semaphore is not in use then error.*/
if (bsp->sem.queue.prev == NULL) {
chSysUnlock();
return OS_SEM_FAILURE;
}
(void) chBSemWaitS(bsp);
chSysUnlock();
return OS_SUCCESS;
}
/**
* @brief Binary semaphore take with timeout.
*
* @param[in] sem_id binary semaphore id variable
* @param[in] msecs timeout in milliseconds
* @return An error code.
*
* @api
*/
int32 OS_BinSemTimedWait(uint32 sem_id, uint32 msecs) {
binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id;
msg_t msg;
if ((bsp < &osal.binary_semaphores[0]) ||
(bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) {
return OS_ERR_INVALID_ID;
}
/* Timeouts of zero not allowed.*/
if (msecs == 0) {
return OS_INVALID_INT_NUM;
}
chSysLock();
/* If the semaphore is not in use then error.*/
if (bsp->sem.queue.prev == NULL) {
chSysUnlock();
return OS_SEM_FAILURE;
}
msg = chBSemWaitTimeoutS(bsp, MS2ST(msecs));
chSysUnlock();
return msg == MSG_TIMEOUT ? OS_SEM_TIMEOUT : OS_SUCCESS;
}
/**
* @brief Retrieves a binary semaphore id by name.
* @note It is not currently implemented.
*
* @param[out] sem_id pointer to a binary semaphore id variable
* @param[in] sem_name the binary semaphore name
* @return An error code.
*
* @api
*/
int32 OS_BinSemGetIdByName(uint32 *sem_id, const char *sem_name) {
/* NULL pointer checks.*/
if ((sem_id == NULL) || (sem_name == NULL)) {
return OS_INVALID_POINTER;
}
return OS_ERR_NOT_IMPLEMENTED;
}
/**
* @brief Returns binary semaphore information.
*
* @param[in] sem_id binary semaphore id variable
* @param[in] bin_prop binary semaphore properties
* @return An error code.
*
* @api
*/
int32 OS_BinSemGetInfo(uint32 sem_id, OS_bin_sem_prop_t *bin_prop) {
binary_semaphore_t *bsp = (binary_semaphore_t *)sem_id;
/* NULL pointer checks.*/
if (bin_prop == NULL) {
return OS_INVALID_POINTER;
}
if ((bsp < &osal.binary_semaphores[0]) ||
(bsp >= &osal.binary_semaphores[OS_MAX_BIN_SEMAPHORES])) {
return OS_ERR_INVALID_ID;
}
chSysLock();
/* If the semaphore is not in use then error.*/
if (bsp->sem.queue.prev == NULL) {
chSysUnlock();
return OS_SEM_FAILURE;
}
chSysUnlock();
return OS_ERR_NOT_IMPLEMENTED;
}
/*-- Task Control API -------------------------------------------------------*/
/**
@ -279,6 +588,7 @@ int32 OS_TaskCreate(uint32 *task_id,
/**
* @brief Installs a deletion handler.
* @note It is not currently implemented.
*
* @param[in] function_pointer the handler function
* @return An error code.
@ -425,6 +735,12 @@ uint32 OS_TaskGetId(void) {
/**
* @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;
@ -452,11 +768,31 @@ int32 OS_TaskGetIdByName (uint32 *task_id, const char *task_name) {
return OS_ERR_NAME_NOT_FOUND;
}
int32 OS_TaskGetInfo (uint32 task_id, OS_task_prop_t *task_prop) {
/**
* @brief Returns task information.
*
* @param[in] sem_id binary semaphore id variable
* @param[in] task_prop task properties
* @return An error code.
*
* @api
*/
int32 OS_TaskGetInfo(uint32 task_id, OS_task_prop_t *task_prop) {
thread_t *tp = (thread_t *)task_id;
size_t wasize = (size_t)tp - (size_t)tp->stklimit + sizeof (thread_t);
(void)task_id;
(void)task_prop;
/* NULL pointer checks.*/
if (task_prop == NULL) {
return OS_INVALID_POINTER;
}
strncpy(task_prop->name, tp->name, OS_MAX_API_NAME - 1);
task_prop->creator = (uint32)chSysGetIdleThreadX();
task_prop->stack_size = (uint32)MEM_ALIGN_NEXT(wasize, PORT_STACK_ALIGN);
task_prop->priority = (uint32)256U - (uint32)tp->realprio;
task_prop->OStask_id = task_id;
return OS_ERR_NOT_IMPLEMENTED;
}
/** @} */