Latest changes and documentation fixes.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@13639 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
228d232043
commit
bbece2d2d1
|
@ -87,6 +87,9 @@ static void timer_cb(void const *arg) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Kernel initialization.
|
* @brief Kernel initialization.
|
||||||
|
*
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
*/
|
*/
|
||||||
osStatus osKernelInitialize(void) {
|
osStatus osKernelInitialize(void) {
|
||||||
|
|
||||||
|
@ -106,6 +109,9 @@ osStatus osKernelInitialize(void) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Kernel start.
|
* @brief Kernel start.
|
||||||
|
*
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
*/
|
*/
|
||||||
osStatus osKernelStart(void) {
|
osStatus osKernelStart(void) {
|
||||||
|
|
||||||
|
@ -118,6 +124,10 @@ osStatus osKernelStart(void) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Creates a thread.
|
* @brief Creates a thread.
|
||||||
|
*
|
||||||
|
* @param[in] thread_def the thread object declared with @p osThread
|
||||||
|
* @return The thread identifier.
|
||||||
|
* @retval NULL if the function failed.
|
||||||
*/
|
*/
|
||||||
osThreadId osThreadCreate(const osThreadDef_t *thread_def, void *argument) {
|
osThreadId osThreadCreate(const osThreadDef_t *thread_def, void *argument) {
|
||||||
size_t size;
|
size_t size;
|
||||||
|
@ -136,6 +146,10 @@ osThreadId osThreadCreate(const osThreadDef_t *thread_def, void *argument) {
|
||||||
* @brief Thread termination.
|
* @brief Thread termination.
|
||||||
* @note The thread is not really terminated but asked to terminate which
|
* @note The thread is not really terminated but asked to terminate which
|
||||||
* is not compliant.
|
* is not compliant.
|
||||||
|
*
|
||||||
|
* @param[in] thread_id a thread identifier
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
*/
|
*/
|
||||||
osStatus osThreadTerminate(osThreadId thread_id) {
|
osStatus osThreadTerminate(osThreadId thread_id) {
|
||||||
|
|
||||||
|
@ -153,6 +167,10 @@ osStatus osThreadTerminate(osThreadId thread_id) {
|
||||||
/**
|
/**
|
||||||
* @brief Change thread priority.
|
* @brief Change thread priority.
|
||||||
* @note This can interfere with the priority inheritance mechanism.
|
* @note This can interfere with the priority inheritance mechanism.
|
||||||
|
*
|
||||||
|
* @param[in] thread_id a thread identifier
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
*/
|
*/
|
||||||
osStatus osThreadSetPriority(osThreadId thread_id, osPriority newprio) {
|
osStatus osThreadSetPriority(osThreadId thread_id, osPriority newprio) {
|
||||||
thread_t * tp = (thread_t *)thread_id;
|
thread_t * tp = (thread_t *)thread_id;
|
||||||
|
@ -210,27 +228,58 @@ osStatus osThreadSetPriority(osThreadId thread_id, osPriority newprio) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Create a timer.
|
* @brief Create a one-shot or periodic timer.
|
||||||
|
* @details The timer is in stopped state until it is started with
|
||||||
|
* @p osTimerStart.
|
||||||
|
*
|
||||||
|
* @param[in] timer_def the timer object declared with @p osTimer
|
||||||
|
* @param[in] type @p osTimerOnce or @p osTimerPeriodic
|
||||||
|
* @param[in] argument argument to the timer callback function
|
||||||
|
* @return The timer identifier.
|
||||||
|
* @retval NULL if the function failed.
|
||||||
*/
|
*/
|
||||||
osTimerId osTimerCreate(const osTimerDef_t *timer_def,
|
osTimerId osTimerCreate(const osTimerDef_t *timer_def,
|
||||||
os_timer_type type,
|
os_timer_type type,
|
||||||
void *argument) {
|
void *argument) {
|
||||||
|
|
||||||
|
if ((timer_def == NULL) || port_is_isr_context()) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
osTimerId timer = chPoolAlloc(&timpool);
|
osTimerId timer = chPoolAlloc(&timpool);
|
||||||
chVTObjectInit(&timer->vt);
|
chVTObjectInit(&timer->vt);
|
||||||
timer->ptimer = timer_def->ptimer;
|
timer->ptimer = timer_def->ptimer;
|
||||||
timer->type = type;
|
timer->type = type;
|
||||||
timer->argument = argument;
|
timer->argument = argument;
|
||||||
|
|
||||||
return timer;
|
return timer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Start a timer.
|
* @brief Start or restart the timer.
|
||||||
|
*
|
||||||
|
* @param[in] timer_id the timer ID returned by @p osTimerCreate()
|
||||||
|
* @param[in] millisec time delay value of the timer
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
|
* @retval osErrorParameter if some parameter is @p NULL.
|
||||||
|
* @retval osErrorISR if the function has been called from ISR
|
||||||
|
* context.
|
||||||
|
* @retval osErrorValue if a parameter has an invalid value.
|
||||||
*/
|
*/
|
||||||
osStatus osTimerStart(osTimerId timer_id, uint32_t millisec) {
|
osStatus osTimerStart(osTimerId timer_id, uint32_t millisec) {
|
||||||
|
|
||||||
if ((millisec == 0) || (millisec == osWaitForever))
|
if (timer_id == NULL) {
|
||||||
|
return osErrorParameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (port_is_isr_context()) {
|
||||||
|
return osErrorISR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((millisec == 0) || (millisec == osWaitForever)) {
|
||||||
return osErrorValue;
|
return osErrorValue;
|
||||||
|
}
|
||||||
|
|
||||||
timer_id->millisec = millisec;
|
timer_id->millisec = millisec;
|
||||||
chVTSet(&timer_id->vt, TIME_MS2I(millisec), (vtfunc_t)timer_cb, timer_id);
|
chVTSet(&timer_id->vt, TIME_MS2I(millisec), (vtfunc_t)timer_cb, timer_id);
|
||||||
|
@ -240,19 +289,54 @@ osStatus osTimerStart(osTimerId timer_id, uint32_t millisec) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Stop a timer.
|
* @brief Stop a timer.
|
||||||
|
*
|
||||||
|
* @param[in] timer_id the timer ID returned by @p osTimerCreate()
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
|
* @retval osErrorParameter if some parameter is @p NULL.
|
||||||
|
* @retval osErrorISR if the function has been called from ISR
|
||||||
|
* context.
|
||||||
|
* @retval osErrorResource if the object is in an invalid state.
|
||||||
*/
|
*/
|
||||||
osStatus osTimerStop(osTimerId timer_id) {
|
osStatus osTimerStop(osTimerId timer_id) {
|
||||||
|
|
||||||
|
if (timer_id == NULL) {
|
||||||
|
return osErrorParameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (port_is_isr_context()) {
|
||||||
|
return osErrorISR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chVTIsArmed(&timer_id->vt) == false) {
|
||||||
|
return osErrorResource;
|
||||||
|
}
|
||||||
|
|
||||||
chVTReset(&timer_id->vt);
|
chVTReset(&timer_id->vt);
|
||||||
|
|
||||||
return osOK;
|
return osOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Delete a timer.
|
* @brief Delete the timer object.
|
||||||
|
*
|
||||||
|
* @param[in] timer_id timer ID obtained by osTimerCreate
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
|
* @retval osErrorParameter if some parameter is @p NULL.
|
||||||
|
* @retval osErrorISR if the function has been called from ISR
|
||||||
|
* context.
|
||||||
*/
|
*/
|
||||||
osStatus osTimerDelete(osTimerId timer_id) {
|
osStatus osTimerDelete(osTimerId timer_id) {
|
||||||
|
|
||||||
|
if (timer_id == NULL) {
|
||||||
|
return osErrorParameter;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (port_is_isr_context()) {
|
||||||
|
return osErrorISR;
|
||||||
|
}
|
||||||
|
|
||||||
chVTReset(&timer_id->vt);
|
chVTReset(&timer_id->vt);
|
||||||
chPoolFree(&timpool, (void *)timer_id);
|
chPoolFree(&timpool, (void *)timer_id);
|
||||||
|
|
||||||
|
@ -261,6 +345,9 @@ osStatus osTimerDelete(osTimerId timer_id) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Send signals.
|
* @brief Send signals.
|
||||||
|
*
|
||||||
|
* @param[in] thread_id a thread identifier
|
||||||
|
* @return The previous signals mask.
|
||||||
*/
|
*/
|
||||||
int32_t osSignalSet(osThreadId thread_id, int32_t signals) {
|
int32_t osSignalSet(osThreadId thread_id, int32_t signals) {
|
||||||
int32_t oldsignals;
|
int32_t oldsignals;
|
||||||
|
@ -275,6 +362,9 @@ int32_t osSignalSet(osThreadId thread_id, int32_t signals) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Clear signals.
|
* @brief Clear signals.
|
||||||
|
*
|
||||||
|
* @param[in] thread_id a thread identifier
|
||||||
|
* @return The signals mask.
|
||||||
*/
|
*/
|
||||||
int32_t osSignalClear(osThreadId thread_id, int32_t signals) {
|
int32_t osSignalClear(osThreadId thread_id, int32_t signals) {
|
||||||
eventmask_t m;
|
eventmask_t m;
|
||||||
|
@ -291,6 +381,8 @@ int32_t osSignalClear(osThreadId thread_id, int32_t signals) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Wait for signals.
|
* @brief Wait for signals.
|
||||||
|
*
|
||||||
|
* @return An @p osEvent structure.
|
||||||
*/
|
*/
|
||||||
osEvent osSignalWait(int32_t signals, uint32_t millisec) {
|
osEvent osSignalWait(int32_t signals, uint32_t millisec) {
|
||||||
osEvent event;
|
osEvent event;
|
||||||
|
@ -313,8 +405,12 @@ osEvent osSignalWait(int32_t signals, uint32_t millisec) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Create a semaphore.
|
* @brief Create a semaphore.
|
||||||
* @note @p semaphore_def is not used.
|
* @note @p semaphore_def is not used in this implementation.
|
||||||
* @note Can involve memory allocation.
|
* @note Can involve memory allocation.
|
||||||
|
*
|
||||||
|
* @param[in] semaphore_def the semaphore object declared with @p osSemaphore
|
||||||
|
* @return The semaphore identifier.
|
||||||
|
* @retval NULL if the function failed.
|
||||||
*/
|
*/
|
||||||
osSemaphoreId osSemaphoreCreate(const osSemaphoreDef_t *semaphore_def,
|
osSemaphoreId osSemaphoreCreate(const osSemaphoreDef_t *semaphore_def,
|
||||||
int32_t count) {
|
int32_t count) {
|
||||||
|
@ -328,9 +424,18 @@ osSemaphoreId osSemaphoreCreate(const osSemaphoreDef_t *semaphore_def,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Wait on a semaphore.
|
* @brief Wait on a semaphore.
|
||||||
|
*
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
|
* @retval osErrorParameter if some parameter is @p NULL.
|
||||||
|
* @retval osErrorISR if the function has been called from ISR
|
||||||
|
* context.
|
||||||
|
* @retval osErrorResource if the object is in an invalid state.
|
||||||
|
* @retval osErrorValue if a parameter has an invalid value.
|
||||||
|
* @retval osErrorTimeoutResource if the function timed out.
|
||||||
*/
|
*/
|
||||||
int32_t osSemaphoreWait(osSemaphoreId semaphore_id, uint32_t millisec) {
|
int32_t osSemaphoreWait(osSemaphoreId semaphore_id, uint32_t millisec) {
|
||||||
|
/* TODO it is not consistent with specification.*/
|
||||||
msg_t msg = chSemWaitTimeout((semaphore_t *)semaphore_id, tmo(millisec));
|
msg_t msg = chSemWaitTimeout((semaphore_t *)semaphore_id, tmo(millisec));
|
||||||
switch (msg) {
|
switch (msg) {
|
||||||
case MSG_OK:
|
case MSG_OK:
|
||||||
|
@ -343,6 +448,9 @@ int32_t osSemaphoreWait(osSemaphoreId semaphore_id, uint32_t millisec) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Release a semaphore.
|
* @brief Release a semaphore.
|
||||||
|
*
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
*/
|
*/
|
||||||
osStatus osSemaphoreRelease(osSemaphoreId semaphore_id) {
|
osStatus osSemaphoreRelease(osSemaphoreId semaphore_id) {
|
||||||
|
|
||||||
|
@ -357,6 +465,9 @@ osStatus osSemaphoreRelease(osSemaphoreId semaphore_id) {
|
||||||
* @brief Deletes a semaphore.
|
* @brief Deletes a semaphore.
|
||||||
* @note After deletion there could be references in the system to a
|
* @note After deletion there could be references in the system to a
|
||||||
* non-existent semaphore.
|
* non-existent semaphore.
|
||||||
|
*
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
*/
|
*/
|
||||||
osStatus osSemaphoreDelete(osSemaphoreId semaphore_id) {
|
osStatus osSemaphoreDelete(osSemaphoreId semaphore_id) {
|
||||||
|
|
||||||
|
@ -370,6 +481,10 @@ osStatus osSemaphoreDelete(osSemaphoreId semaphore_id) {
|
||||||
* @brief Create a mutex.
|
* @brief Create a mutex.
|
||||||
* @note @p mutex_def is not used.
|
* @note @p mutex_def is not used.
|
||||||
* @note Can involve memory allocation.
|
* @note Can involve memory allocation.
|
||||||
|
*
|
||||||
|
* @param[in] mutex_def the mutex object declared with @p osMutex
|
||||||
|
* @return The mutex identifier.
|
||||||
|
* @retval NULL if the function failed.
|
||||||
*/
|
*/
|
||||||
osMutexId osMutexCreate(const osMutexDef_t *mutex_def) {
|
osMutexId osMutexCreate(const osMutexDef_t *mutex_def) {
|
||||||
|
|
||||||
|
@ -382,6 +497,11 @@ osMutexId osMutexCreate(const osMutexDef_t *mutex_def) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Wait on a mutex.
|
* @brief Wait on a mutex.
|
||||||
|
*
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
|
* @retval osErrorResource if the object is in an invalid state.
|
||||||
|
* @retval osErrorTimeoutResource if the function timed out.
|
||||||
*/
|
*/
|
||||||
osStatus osMutexWait(osMutexId mutex_id, uint32_t millisec) {
|
osStatus osMutexWait(osMutexId mutex_id, uint32_t millisec) {
|
||||||
|
|
||||||
|
@ -397,6 +517,9 @@ osStatus osMutexWait(osMutexId mutex_id, uint32_t millisec) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Release a mutex.
|
* @brief Release a mutex.
|
||||||
|
*
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
*/
|
*/
|
||||||
osStatus osMutexRelease(osMutexId mutex_id) {
|
osStatus osMutexRelease(osMutexId mutex_id) {
|
||||||
|
|
||||||
|
@ -411,6 +534,9 @@ osStatus osMutexRelease(osMutexId mutex_id) {
|
||||||
* @brief Deletes a mutex.
|
* @brief Deletes a mutex.
|
||||||
* @note After deletion there could be references in the system to a
|
* @note After deletion there could be references in the system to a
|
||||||
* non-existent semaphore.
|
* non-existent semaphore.
|
||||||
|
*
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
*/
|
*/
|
||||||
osStatus osMutexDelete(osMutexId mutex_id) {
|
osStatus osMutexDelete(osMutexId mutex_id) {
|
||||||
|
|
||||||
|
@ -424,9 +550,17 @@ osStatus osMutexDelete(osMutexId mutex_id) {
|
||||||
* @brief Create a memory pool.
|
* @brief Create a memory pool.
|
||||||
* @note The pool is not really created because it is allocated statically,
|
* @note The pool is not really created because it is allocated statically,
|
||||||
* this function just re-initializes it.
|
* this function just re-initializes it.
|
||||||
|
*
|
||||||
|
* @param[in] pool_def the pool object declared with @p osPool
|
||||||
|
* @return The pool identifier.
|
||||||
|
* @retval NULL if the function failed.
|
||||||
*/
|
*/
|
||||||
osPoolId osPoolCreate(const osPoolDef_t *pool_def) {
|
osPoolId osPoolCreate(const osPoolDef_t *pool_def) {
|
||||||
|
|
||||||
|
if ((pool_def == NULL) || port_is_isr_context()) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
chPoolObjectInit(pool_def->pool, (size_t)pool_def->item_sz, NULL);
|
chPoolObjectInit(pool_def->pool, (size_t)pool_def->item_sz, NULL);
|
||||||
chPoolLoadArray(pool_def->pool, pool_def->items, (size_t)pool_def->pool_sz);
|
chPoolLoadArray(pool_def->pool, pool_def->items, (size_t)pool_def->pool_sz);
|
||||||
|
|
||||||
|
@ -434,11 +568,20 @@ osPoolId osPoolCreate(const osPoolDef_t *pool_def) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate an object.
|
* @brief Allocate a memory block from the memory pool.
|
||||||
|
*
|
||||||
|
* @param[in] pool_id memory pool ID obtain referenced with osPoolCreate.
|
||||||
|
*
|
||||||
|
* @return The pointer to the allocated memory block.
|
||||||
|
* @retval NULL if the function failed.
|
||||||
*/
|
*/
|
||||||
void *osPoolAlloc(osPoolId pool_id) {
|
void *osPoolAlloc(osPoolId pool_id) {
|
||||||
void *object;
|
void *object;
|
||||||
|
|
||||||
|
if (pool_id == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
syssts_t sts = chSysGetStatusAndLockX();
|
syssts_t sts = chSysGetStatusAndLockX();
|
||||||
object = chPoolAllocI((memory_pool_t *)pool_id);
|
object = chPoolAllocI((memory_pool_t *)pool_id);
|
||||||
chSysRestoreStatusX(sts);
|
chSysRestoreStatusX(sts);
|
||||||
|
@ -447,21 +590,46 @@ void *osPoolAlloc(osPoolId pool_id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Allocate an object clearing it.
|
* @brief Allocate a memory block from the memory pool. The block is initialized to zero.
|
||||||
|
*
|
||||||
|
* @param[in] pool_id memory pool ID obtain referenced with osPoolCreate.
|
||||||
|
* @return The pointer to the allocated memory block.
|
||||||
|
* @retval NULL if the function failed.
|
||||||
*/
|
*/
|
||||||
void *osPoolCAlloc(osPoolId pool_id) {
|
void *osPoolCAlloc(osPoolId pool_id) {
|
||||||
void *object;
|
void *object;
|
||||||
|
|
||||||
|
if (pool_id == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
syssts_t sts = chSysGetStatusAndLockX();
|
||||||
object = chPoolAllocI((memory_pool_t *)pool_id);
|
object = chPoolAllocI((memory_pool_t *)pool_id);
|
||||||
memset(object, 0, pool_id->object_size);
|
chSysRestoreStatusX(sts);
|
||||||
|
|
||||||
|
if (object != NULL) {
|
||||||
|
memset(object, 0, pool_id->object_size);
|
||||||
|
}
|
||||||
|
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Free an object.
|
* @brief Return a memory block to a memory pool.
|
||||||
|
*
|
||||||
|
* @param[in] pool_id memory pool ID obtain referenced with osPoolCreate.
|
||||||
|
* @param[in] block address of the allocated memory block that is returned to the memory pool.
|
||||||
|
*
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
|
* @retval osErrorParameter if some parameter is @p NULL.
|
||||||
*/
|
*/
|
||||||
osStatus osPoolFree(osPoolId pool_id, void *block) {
|
osStatus osPoolFree(osPoolId pool_id, void *block) {
|
||||||
|
|
||||||
|
if (pool_id == NULL) {
|
||||||
|
return osErrorParameter;
|
||||||
|
}
|
||||||
|
|
||||||
syssts_t sts = chSysGetStatusAndLockX();
|
syssts_t sts = chSysGetStatusAndLockX();
|
||||||
chPoolFreeI((memory_pool_t *)pool_id, block);
|
chPoolFreeI((memory_pool_t *)pool_id, block);
|
||||||
chSysRestoreStatusX(sts);
|
chSysRestoreStatusX(sts);
|
||||||
|
@ -473,6 +641,12 @@ osStatus osPoolFree(osPoolId pool_id, void *block) {
|
||||||
* @brief Create a message queue.
|
* @brief Create a message queue.
|
||||||
* @note The queue is not really created because it is allocated statically,
|
* @note The queue is not really created because it is allocated statically,
|
||||||
* this function just re-initializes it.
|
* this function just re-initializes it.
|
||||||
|
*
|
||||||
|
* @param[in] queue_def the message queue object declared with
|
||||||
|
* @p osMessageQDef
|
||||||
|
* @param[in] thread_id a thread identifier
|
||||||
|
* @return The message queue identifier.
|
||||||
|
* @retval NULL if the function failed.
|
||||||
*/
|
*/
|
||||||
osMessageQId osMessageCreate(const osMessageQDef_t *queue_def,
|
osMessageQId osMessageCreate(const osMessageQDef_t *queue_def,
|
||||||
osThreadId thread_id) {
|
osThreadId thread_id) {
|
||||||
|
@ -480,8 +654,9 @@ osMessageQId osMessageCreate(const osMessageQDef_t *queue_def,
|
||||||
/* Ignoring this parameter for now.*/
|
/* Ignoring this parameter for now.*/
|
||||||
(void)thread_id;
|
(void)thread_id;
|
||||||
|
|
||||||
if (queue_def->item_sz > sizeof (msg_t))
|
if (queue_def->item_sz > sizeof (msg_t)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
chMBObjectInit(queue_def->mailbox,
|
chMBObjectInit(queue_def->mailbox,
|
||||||
queue_def->items,
|
queue_def->items,
|
||||||
|
@ -492,6 +667,16 @@ osMessageQId osMessageCreate(const osMessageQDef_t *queue_def,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Put a message in the queue.
|
* @brief Put a message in the queue.
|
||||||
|
*
|
||||||
|
* @param[in] millisec the timeout value, zero for no timeout
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
|
* @retval osErrorParameter if some parameter is @p NULL.
|
||||||
|
* @retval osErrorISR if the function has been called from ISR
|
||||||
|
* context.
|
||||||
|
* @retval osErrorResource if the object is in an invalid state.
|
||||||
|
* @retval osErrorValue if a parameter has an invalid value.
|
||||||
|
* @retval osErrorTimeoutResource if the function timed out.
|
||||||
*/
|
*/
|
||||||
osStatus osMessagePut(osMessageQId queue_id,
|
osStatus osMessagePut(osMessageQId queue_id,
|
||||||
uint32_t info,
|
uint32_t info,
|
||||||
|
@ -512,11 +697,14 @@ osStatus osMessagePut(osMessageQId queue_id,
|
||||||
else
|
else
|
||||||
msg = chMBPostTimeout((mailbox_t *)queue_id, (msg_t)info, tmo(millisec));
|
msg = chMBPostTimeout((mailbox_t *)queue_id, (msg_t)info, tmo(millisec));
|
||||||
|
|
||||||
return msg == MSG_OK ? osOK : osEventTimeout;
|
return msg == MSG_OK ? osOK : osErrorTimeoutResource;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get a message from the queue.
|
* @brief Get a message from the queue.
|
||||||
|
*
|
||||||
|
* @param[in] millisec the timeout value, zero for no timeout
|
||||||
|
* @return An @p osEvent structure.
|
||||||
*/
|
*/
|
||||||
osEvent osMessageGet(osMessageQId queue_id, uint32_t millisec) {
|
osEvent osMessageGet(osMessageQId queue_id, uint32_t millisec) {
|
||||||
msg_t msg;
|
msg_t msg;
|
||||||
|
@ -554,26 +742,51 @@ osEvent osMessageGet(osMessageQId queue_id, uint32_t millisec) {
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
osMailQId osMailCreate(const osMailQDef_t *queue_def, osThreadId thread_id) {
|
/**
|
||||||
|
* @brief Initialize and create a mail queue.
|
||||||
|
*
|
||||||
|
* @param[in] queue_def the mail object declared with @p osMailQDef
|
||||||
|
* @param[in] thread_id a thread identifier
|
||||||
|
* @return The thread identifier.
|
||||||
|
* @retval NULL if the function failed.
|
||||||
|
*/
|
||||||
|
osMailQId osMailCreate(const osMailQDef_t *mail_def, osThreadId thread_id) {
|
||||||
|
|
||||||
/* Ignoring this parameter for now.*/
|
/* Ignoring this parameter for now.*/
|
||||||
(void)thread_id;
|
(void)thread_id;
|
||||||
|
|
||||||
chDbgCheck(queue_def != NULL);
|
if ((mail_def == NULL) || port_is_isr_context()) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Init messages queue.*/
|
chDbgCheck(mail_def != NULL);
|
||||||
chFifoObjectInit(queue_def->fifo,
|
|
||||||
(size_t)queue_def->item_sz,
|
|
||||||
(size_t)queue_def->queue_sz,
|
|
||||||
queue_def->objbuf,
|
|
||||||
queue_def->msgbuf);
|
|
||||||
|
|
||||||
return queue_def->fifo;
|
/* Messages queue initialization.*/
|
||||||
|
chFifoObjectInit(mail_def->fifo,
|
||||||
|
(size_t)mail_def->item_sz,
|
||||||
|
(size_t)mail_def->queue_sz,
|
||||||
|
mail_def->objbuf,
|
||||||
|
mail_def->msgbuf);
|
||||||
|
|
||||||
|
return mail_def->fifo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocate a memory block from the mail queue that is filled with the mail information.
|
||||||
|
*
|
||||||
|
* @param[in] queue_id the mail queue identifier
|
||||||
|
* @param[in] millisec the timeout value, zero for no timeout
|
||||||
|
* @return The pointer to the allocated memory block.
|
||||||
|
* @retval NULL if the function failed.
|
||||||
|
*/
|
||||||
void *osMailAlloc(osMailQId queue_id, uint32_t millisec) {
|
void *osMailAlloc(osMailQId queue_id, uint32_t millisec) {
|
||||||
void *mail;
|
void *mail;
|
||||||
|
|
||||||
|
if ((queue_id == NULL) ||
|
||||||
|
(port_is_isr_context() && (millisec > 0))) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (port_is_isr_context()) {
|
if (port_is_isr_context()) {
|
||||||
chSysLockFromISR();
|
chSysLockFromISR();
|
||||||
mail = chFifoTakeObjectI(queue_id);
|
mail = chFifoTakeObjectI(queue_id);
|
||||||
|
@ -586,8 +799,58 @@ void *osMailAlloc(osMailQId queue_id, uint32_t millisec) {
|
||||||
return mail;
|
return mail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocate a memory block from the mail queue that is filled with the mail information.
|
||||||
|
* The memory block returned is cleared.
|
||||||
|
*
|
||||||
|
* @param[in] queue_id the mail queue identifier
|
||||||
|
* @param[in] millisec the timeout value, zero for no timeout
|
||||||
|
* @return The pointer to the allocated memory block.
|
||||||
|
* @retval NULL if the function failed.
|
||||||
|
*/
|
||||||
|
void *osMailCAlloc(osMailQId queue_id, uint32_t millisec) {
|
||||||
|
void *mail;
|
||||||
|
|
||||||
|
if ((queue_id == NULL) || (port_is_isr_context() && (millisec > 0))) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (port_is_isr_context()) {
|
||||||
|
chSysLockFromISR();
|
||||||
|
mail = chFifoTakeObjectI(queue_id);
|
||||||
|
chSysUnlockFromISR();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mail = chFifoTakeObjectTimeout(queue_id, tmo(millisec));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mail != NULL) {
|
||||||
|
memset(mail, 0, queue_id->free.pool.object_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Put the memory block specified with mail into the mail queue specified by queue.
|
||||||
|
*
|
||||||
|
* @param[in] queue_id the mail queue identifier
|
||||||
|
* @param[in] mail memory block previously returned by
|
||||||
|
* @p osMailAlloc() or @p osMailCAlloc()
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
|
* @retval osErrorParameter if some parameter is @p NULL.
|
||||||
|
*/
|
||||||
osStatus osMailPut(osMailQId queue_id, void *mail) {
|
osStatus osMailPut(osMailQId queue_id, void *mail) {
|
||||||
|
|
||||||
|
if (queue_id == NULL) {
|
||||||
|
return osErrorParameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mail == NULL) {
|
||||||
|
return osErrorParameter;
|
||||||
|
}
|
||||||
|
|
||||||
chDbgCheck((queue_id != NULL) && (mail != NULL));
|
chDbgCheck((queue_id != NULL) && (mail != NULL));
|
||||||
|
|
||||||
if (port_is_isr_context()) {
|
if (port_is_isr_context()) {
|
||||||
|
@ -604,6 +867,14 @@ osStatus osMailPut(osMailQId queue_id, void *mail) {
|
||||||
return MSG_OK;
|
return MSG_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Suspend the execution of the current RUNNING thread until a mail arrives.
|
||||||
|
* When a mail is already in the queue, the function returns instantly with the mail information.
|
||||||
|
*
|
||||||
|
* @param[in] queue_id the mail queue identifier
|
||||||
|
* @param[in] millisec the timeout value, zero for no timeout
|
||||||
|
* @return An @p osEvent structure.
|
||||||
|
*/
|
||||||
osEvent osMailGet(osMailQId queue_id, uint32_t millisec) {
|
osEvent osMailGet(osMailQId queue_id, uint32_t millisec) {
|
||||||
msg_t msg;
|
msg_t msg;
|
||||||
osEvent event = {
|
osEvent event = {
|
||||||
|
@ -616,6 +887,11 @@ osEvent osMailGet(osMailQId queue_id, uint32_t millisec) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (queue_id == NULL) {
|
||||||
|
event.status = osErrorParameter;
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
chDbgCheck(queue_id != NULL);
|
chDbgCheck(queue_id != NULL);
|
||||||
|
|
||||||
event.def.mail_id = queue_id;
|
event.def.mail_id = queue_id;
|
||||||
|
@ -637,11 +913,34 @@ osEvent osMailGet(osMailQId queue_id, uint32_t millisec) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returned event type.*/
|
/* Returned event type.*/
|
||||||
event.status = msg == MSG_OK ? osEventMail : osEventTimeout;
|
if ((millisec == 0) && (msg == MSG_TIMEOUT)) {
|
||||||
|
event.status = osOK;
|
||||||
|
} else {
|
||||||
|
event.status = msg == MSG_OK ? osEventMail : osEventTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
osStatus osMailFree(osMailQId queue_id, void *mail) {
|
/**
|
||||||
|
* @brief Free the memory block specified by mail and return it to the mail queue.
|
||||||
|
*
|
||||||
|
* @param[in] queue_id the mail queue identifier
|
||||||
|
* @param[in] mail pointer to the memory block returned
|
||||||
|
* by @p osMailGet.
|
||||||
|
* @return The function execution status.
|
||||||
|
* @retval osOK if the function succeeded.
|
||||||
|
* @retval osErrorParameter if some parameter is @p NULL.
|
||||||
|
*/
|
||||||
|
osStatus osMailFree(osMailQId queue_id, void *mail)
|
||||||
|
{
|
||||||
|
if (queue_id == NULL) {
|
||||||
|
return osErrorParameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mail == NULL) {
|
||||||
|
return osErrorParameter;
|
||||||
|
}
|
||||||
|
|
||||||
chDbgCheck((queue_id != NULL) && (mail != NULL));
|
chDbgCheck((queue_id != NULL) && (mail != NULL));
|
||||||
|
|
||||||
|
|
|
@ -442,18 +442,14 @@ const osMessageQDef_t os_messageQ_def_##name = { \
|
||||||
#else
|
#else
|
||||||
#define osMailQDef(name, queue_sz, type) \
|
#define osMailQDef(name, queue_sz, type) \
|
||||||
static msg_t os_mailQ_mb_buf_##name[queue_sz]; \
|
static msg_t os_mailQ_mb_buf_##name[queue_sz]; \
|
||||||
static mailbox_t os_mailQ_mb_obj_##name; \
|
|
||||||
static memory_pool_t os_mailQ_pool_obj_##name; \
|
|
||||||
static type os_mailQ_pool_buf_##name[queue_sz]; \
|
static type os_mailQ_pool_buf_##name[queue_sz]; \
|
||||||
|
static objects_fifo_t os_mailQ_fifo_##name; \
|
||||||
const osMailQDef_t os_mailQ_def_##name = { \
|
const osMailQDef_t os_mailQ_def_##name = { \
|
||||||
(queue_sz), \
|
(queue_sz), \
|
||||||
sizeof (type), \
|
sizeof (type), \
|
||||||
|
&os_mailQ_fifo_##name, \
|
||||||
(msg_t*)&os_mailQ_mb_buf_##name[0], \
|
(msg_t*)&os_mailQ_mb_buf_##name[0], \
|
||||||
(void *)&os_mailQ_pool_buf_##name[0], \
|
(void *)&os_mailQ_pool_buf_##name[0] \
|
||||||
{ \
|
|
||||||
(mailbox_t*)&os_mailQ_mb_obj_##name, \
|
|
||||||
&os_mailQ_pool_obj_##name \
|
|
||||||
} \
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -506,9 +502,10 @@ extern "C" {
|
||||||
uint32_t millisec);
|
uint32_t millisec);
|
||||||
osEvent osMessageGet(osMessageQId queue_id,
|
osEvent osMessageGet(osMessageQId queue_id,
|
||||||
uint32_t millisec);
|
uint32_t millisec);
|
||||||
osMailQId osMailCreate(const osMailQDef_t *queue_def,
|
osMailQId osMailCreate(const osMailQDef_t *mail_def,
|
||||||
osThreadId thread_id);
|
osThreadId thread_id);
|
||||||
void *osMailAlloc(osMailQId queue_id, uint32_t millisec);
|
void *osMailAlloc(osMailQId queue_id, uint32_t millisec);
|
||||||
|
void *osMailCAlloc(osMailQId queue_id, uint32_t millisec);
|
||||||
osStatus osMailPut(osMailQId queue_id, void *mail);
|
osStatus osMailPut(osMailQId queue_id, void *mail);
|
||||||
osEvent osMailGet(osMailQId queue_id, uint32_t millisec);
|
osEvent osMailGet(osMailQId queue_id, uint32_t millisec);
|
||||||
osStatus osMailFree(osMailQId queue_id, void *mail);
|
osStatus osMailFree(osMailQId queue_id, void *mail);
|
||||||
|
|
Loading…
Reference in New Issue