Skip to content

Commit

Permalink
FreeRTOS interface using new return status
Browse files Browse the repository at this point in the history
  • Loading branch information
QuangHaiNguyen committed Apr 21, 2024
1 parent 4845731 commit 8687d1b
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 62 deletions.
142 changes: 81 additions & 61 deletions easy_embedded/service/task_worker/freertos_port/ez_freertos_port.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,18 @@ static StackType_t used_stack_size = 0;
/*****************************************************************************
* Function Definitions
*****************************************************************************/
static bool ezFreeRTOSPort_CreateThread(struct ezTaskWorker *worker,
void *thread_func);
static bool ezFreeRTOSPort_CreateSemaphore(struct ezTaskWorker *worker);
static bool ezFreeRTOSPort_GiveSemaphore(struct ezTaskWorker *worker);
static bool ezFreeRTOSPort_TakeSemaphore(struct ezTaskWorker *worker, uint32_t tick_to_wait);
static bool ezFreeRTOSPort_CreateEvent(struct ezTaskWorker *worker);
static bool ezFreeRTOSPort_SetEvent(struct ezTaskWorker *worker, uint32_t events);
static bool ezFreeRTOSPort_GetEvent(struct ezTaskWorker *worker, uint32_t events, uint32_t tick_to_wait);
static EZ_RTOS_STATUS ezFreeRTOSPort_CreateThread(struct ezTaskWorker *worker,
void *thread_func);
static EZ_RTOS_STATUS ezFreeRTOSPort_CreateSemaphore(struct ezTaskWorker *worker);
static EZ_RTOS_STATUS ezFreeRTOSPort_GiveSemaphore(struct ezTaskWorker *worker);
static EZ_RTOS_STATUS ezFreeRTOSPort_TakeSemaphore(struct ezTaskWorker *worker,
uint32_t tick_to_wait);
static EZ_RTOS_STATUS ezFreeRTOSPort_CreateEvent(struct ezTaskWorker *worker);
static EZ_RTOS_STATUS ezFreeRTOSPort_SetEvent(struct ezTaskWorker *worker,
uint32_t events);
static EZ_RTOS_STATUS ezFreeRTOSPort_GetEvent(struct ezTaskWorker *worker,
uint32_t events,
uint32_t tick_to_wait);


/*****************************************************************************
Expand Down Expand Up @@ -110,7 +114,9 @@ struct ezTaskWorkerThreadInterfaces *ezFreeRTOSPort_GetInterface(void)
*
* @param[in] worker: pointer to the task worker who "owns" the thread
* @param[in] thread_func: threadx function
* @return true if success, else false
* @return RTOS_STATUS_OK: success
* RTOS_STATUS_ERR: cannot create thread
* RTOS_STATUS_ERR_ARG: wrong input arguments
*
* @pre ezFreeRTOSPort_Init must be called first
* @post None
Expand All @@ -122,10 +128,10 @@ struct ezTaskWorkerThreadInterfaces *ezFreeRTOSPort_GetInterface(void)
* @see ezFreeRTOSPort_Init
*
*****************************************************************************/
static bool ezFreeRTOSPort_CreateThread(struct ezTaskWorker *worker,
void *thread_func)
static EZ_RTOS_STATUS ezFreeRTOSPort_CreateThread(struct ezTaskWorker *worker,
void *thread_func)
{
bool ret = false;
EZ_RTOS_STATUS ret_status = RTOS_STATUS_ERR_ARG;
TaskHandle_t xHandle = NULL;

EZTRACE("ezFreeRTOSPort_CreateThread()");
Expand All @@ -151,16 +157,17 @@ static bool ezFreeRTOSPort_CreateThread(struct ezTaskWorker *worker,

if(xHandle == NULL)
{
ret_status = RTOS_STATUS_ERR;
EZERROR("Create thread failed");
}
else
{
ret_status = RTOS_STATUS_OK;
EZINFO("Create thread for worker = %s successfully", worker->worker_name);
ret = true;
}
}

return ret;
return ret_status;
}


Expand All @@ -172,7 +179,9 @@ static bool ezFreeRTOSPort_CreateThread(struct ezTaskWorker *worker,
* @details
*
* @param[in] worker: pointer to the task worker who "owns" the thread
* @return true if success, else false
* @return RTOS_STATUS_OK: success
* RTOS_STATUS_ERR: cannot create semaphore
* RTOS_STATUS_ERR_ARG: wrong input arguments
*
* @pre ezFreeRTOSPort_Init must be called first
* @post None
Expand All @@ -184,28 +193,28 @@ static bool ezFreeRTOSPort_CreateThread(struct ezTaskWorker *worker,
* @see ezFreeRTOSPort_Init
*
*****************************************************************************/
static bool ezFreeRTOSPort_CreateSemaphore(struct ezTaskWorker *worker)
static EZ_RTOS_STATUS ezFreeRTOSPort_CreateSemaphore(struct ezTaskWorker *worker)
{
bool ret = false;
EZ_RTOS_STATUS ret_status = RTOS_STATUS_ERR_ARG;

EZTRACE("ezFreeRTOSPort_CreateSemaphore()");

if(worker != NULL)
{
worker->semaphore_h = xSemaphoreCreateMutexStatic(&worker->sem);

if(worker->semaphore_h == NULL)
{
EZERROR("Create semaphore failed");
ret_status = RTOS_STATUS_ERR;
}
else
{
EZINFO("Create semaphore for worker = %s successfully", worker->worker_name);
ret = true;
ret_status = RTOS_STATUS_OK;
}
}

return ret;
return ret_status;
}


Expand All @@ -217,9 +226,11 @@ static bool ezFreeRTOSPort_CreateSemaphore(struct ezTaskWorker *worker)
* @details
*
* @param[in] worker: pointer to the task worker who "owns" the thread
* @return true if success, else false
* @return RTOS_STATUS_OK: success
* RTOS_STATUS_ERR: cannot give semaphore
* RTOS_STATUS_ERR_ARG: wrong input arguments
*
* @pre semaphore must be created first
* @pre semaphore must be created first
* @post None
*
* \b Example
Expand All @@ -229,27 +240,27 @@ static bool ezFreeRTOSPort_CreateSemaphore(struct ezTaskWorker *worker)
* @see ezFreeRTOSPort_CreateSemaphore
*
*****************************************************************************/
static bool ezFreeRTOSPort_GiveSemaphore(struct ezTaskWorker *worker)
static EZ_RTOS_STATUS ezFreeRTOSPort_GiveSemaphore(struct ezTaskWorker *worker)
{
bool ret = false;
BaseType_t status = pdFALSE;
BaseType_t rtos_status = pdFALSE;
EZ_RTOS_STATUS ret_status = RTOS_STATUS_ERR_ARG;

EZTRACE("ezFreeRTOSPort_GiveSemaphore()");

if(worker != NULL)
{
status = xSemaphoreGive(worker->semaphore_h);
if(status != pdTRUE)
rtos_status = xSemaphoreGive(worker->semaphore_h);
if(rtos_status != pdTRUE)
{
ret_status = RTOS_STATUS_ERR;
EZERROR("Give semaphore failed");
}
else
{
ret = true;
ret_status = RTOS_STATUS_OK;
}
}

return ret;
return ret_status;
}


Expand All @@ -264,7 +275,9 @@ static bool ezFreeRTOSPort_GiveSemaphore(struct ezTaskWorker *worker)
* @param[in] tick_to_wait: number of tick to wait for the semaphore's availability.
* EZ_THREAD_WAIT_NO for no wait and EZ_THREAD_WAIT_FOREVER to wait until
* semphore available
* @return true if success, else false
* @return RTOS_STATUS_OK: success
* RTOS_STATUS_OK_TIMEOUT: success but could not take semaphore within tick_to_wait
* RTOS_STATUS_ERR_ARG: wrong input arguments
*
* @pre semaphore must be created first
* @post None
Expand All @@ -276,14 +289,14 @@ static bool ezFreeRTOSPort_GiveSemaphore(struct ezTaskWorker *worker)
* @see ezFreeRTOSPort_CreateSemaphore
*
*****************************************************************************/
static bool ezFreeRTOSPort_TakeSemaphore(struct ezTaskWorker *worker, uint32_t tick_to_wait)
static EZ_RTOS_STATUS ezFreeRTOSPort_TakeSemaphore(struct ezTaskWorker *worker,
uint32_t tick_to_wait)
{
bool ret = false;
BaseType_t status = pdFALSE;
EZ_RTOS_STATUS ret_status = RTOS_STATUS_ERR_ARG;
BaseType_t rtos_status = pdFALSE;
TickType_t wait_option = 0;

EZTRACE("ezFreeRTOSPort_TakeSemaphore()");

if(worker != NULL)
{
if(tick_to_wait == EZ_THREAD_WAIT_NO)
Expand All @@ -299,20 +312,21 @@ static bool ezFreeRTOSPort_TakeSemaphore(struct ezTaskWorker *worker, uint32_t t
wait_option = tick_to_wait;
}

status = xSemaphoreTake(worker->semaphore_h, wait_option);
rtos_status = xSemaphoreTake(worker->semaphore_h, wait_option);

if(status != pdTRUE)
if(rtos_status != pdTRUE)
{
EZERROR("Take semaphore failed");
ret_status = RTOS_STATUS_OK_TIMEOUT;
EZERROR("Take semaphore timeout");
}
else
{
ret_status = RTOS_STATUS_OK;
EZDEBUG("Semaphore taken");
ret = true;
}
}

return ret;
return ret_status;
}


Expand All @@ -324,7 +338,9 @@ static bool ezFreeRTOSPort_TakeSemaphore(struct ezTaskWorker *worker, uint32_t t
* @details
*
* @param[in] worker: pointer to the task worker who "owns" the thread
* @return true if success, else false
* @return RTOS_STATUS_OK: success
* RTOS_STATUS_ERR: cannot create event
* RTOS_STATUS_ERR_ARG: wrong input arguments
*
* @pre ezFreeRTOSPort_Init must be called first
* @post None
Expand All @@ -336,25 +352,27 @@ static bool ezFreeRTOSPort_TakeSemaphore(struct ezTaskWorker *worker, uint32_t t
* @see ezFreeRTOSPort_Init
*
*****************************************************************************/
static bool ezFreeRTOSPort_CreateEvent(struct ezTaskWorker *worker)
static EZ_RTOS_STATUS ezFreeRTOSPort_CreateEvent(struct ezTaskWorker *worker)
{
bool ret = false;
EZ_RTOS_STATUS ret_status = RTOS_STATUS_ERR_ARG;

EZTRACE("ezFreeRTOSPort_CreateEvent()");

if(worker != NULL)
{
worker->events_h = xEventGroupCreateStatic(&worker->events);

if(worker->events_h == NULL)
{
ret_status = RTOS_STATUS_ERR;
EZERROR("Create event failed");
}
else
{
ret = true;
ret_status = RTOS_STATUS_OK;
}
}

return ret_status;
}


Expand All @@ -367,7 +385,7 @@ static bool ezFreeRTOSPort_CreateEvent(struct ezTaskWorker *worker)
*
* @param[in] worker: pointer to the task worker who "owns" the thread
* @param[in] events: events to set
* @return true if success, else false
* @return RTOS_STATUS_OK: success
*
* @pre event must be created first
* @post None
Expand All @@ -378,17 +396,17 @@ static bool ezFreeRTOSPort_CreateEvent(struct ezTaskWorker *worker)
* @see ezFreeRTOSPort_CreateEvent
*
*****************************************************************************/
static bool ezFreeRTOSPort_SetEvent(struct ezTaskWorker *worker, uint32_t events)
static EZ_RTOS_STATUS ezFreeRTOSPort_SetEvent(struct ezTaskWorker *worker,
uint32_t events)
{
bool ret = false;
EZ_RTOS_STATUS ret_status = RTOS_STATUS_ERR_ARG;

EZTRACE("ezFreeRTOSPort_SetEvent()");

if(worker != NULL)
{
(void)xEventGroupSetBits(worker->events_h, events);
EZDEBUG("Set event = %x successfully", events);
ret = true;
ret_status = RTOS_STATUS_OK;
}
}

Expand Down Expand Up @@ -417,9 +435,11 @@ static bool ezFreeRTOSPort_SetEvent(struct ezTaskWorker *worker, uint32_t events
* @see ezFreeRTOSPort_CreateEvent
*
*****************************************************************************/
static bool ezFreeRTOSPort_GetEvent(struct ezTaskWorker *worker, uint32_t events, uint32_t tick_to_wait)
static EZ_RTOS_STATUS ezFreeRTOSPort_GetEvent(struct ezTaskWorker *worker,
uint32_t events,
uint32_t tick_to_wait)
{
bool ret = false;
EZ_RTOS_STATUS ret_status = RTOS_STATUS_ERR_ARG;
EventBits_t ret_bits = 0;
TickType_t ticks_to_wait = 0;

Expand All @@ -440,25 +460,25 @@ static bool ezFreeRTOSPort_GetEvent(struct ezTaskWorker *worker, uint32_t events
ticks_to_wait = tick_to_wait;
}

ret_bits = xEventGroupWaitBits(
worker->events_h,
events,
pdTRUE,
pdFALSE,
ticks_to_wait);
ret_bits = xEventGroupWaitBits(worker->events_h,
events,
pdTRUE,
pdFALSE,
ticks_to_wait);

if((ret_bits & events) == events)
{
ret_status = RTOS_STATUS_OK;
EZDEBUG("Get event = %x successfully", ret_bits);
ret = true;
}
else
{
EZERROR("Get event failed");
ret_status = RTOS_STATUS_OK_TIMEOUT;
EZERROR("Get event timeout");
}
}

return ret;
return ret_status;
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ static EZ_RTOS_STATUS ezThreadXPort_CreateSemaphore(struct ezTaskWorker *worker)
* RTOS_STATUS_ERR: cannot give semaphore
* RTOS_STATUS_ERR_ARG: wrong input arguments
*
* @pre semaphore must be created first
* @pre semaphore must be created first
* @post None
*
* \b Example
Expand Down

0 comments on commit 8687d1b

Please sign in to comment.