blob: 1f74cbf60b4eb80d3a57c33518b32e355590e00a [file] [log] [blame]
/*
* Copyright 2018-2019 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "fsl_common.h"
/*
* The OSA_USED macro can only be defined when the OSA component is used.
* If the source code of the OSA component does not exist, the OSA_USED cannot be defined.
* OR, If OSA component is not added into project event the OSA source code exists, the OSA_USED
* also cannot be defined.
* The source code path of the OSA component is <MCUXpresso_SDK>/components/osa.
*
*/
#if defined(OSA_USED)
#include "fsl_os_abstraction.h"
#include "common_task.h"
/*******************************************************************************
* Definitions
******************************************************************************/
typedef struct _common_task_state
{
OSA_TASK_HANDLE_DEFINE(commonTaskHandle);
OSA_MSGQ_HANDLE_DEFINE(msgqhandle, COMMON_TASK_MAX_MSGQ_COUNT, sizeof(void *));
uint8_t isInitialized;
} common_task_state_t;
/*******************************************************************************
* Prototypes
******************************************************************************/
void COMMON_TASK_task(osa_task_param_t param);
/*******************************************************************************
* Variables
******************************************************************************/
extern const uint8_t gUseRtos_c;
static common_task_state_t s_commonTaskState[1];
OSA_TASK_DEFINE(COMMON_TASK_task, COMMON_TASK_PRIORITY, 1, COMMON_TASK_STACK_SIZE, false);
/*******************************************************************************
* Code
******************************************************************************/
void COMMON_TASK_task(osa_task_param_t param)
{
common_task_state_t *commonTaskStateHandle = (common_task_state_t *)param;
common_task_message_t *msg;
do
{
if (KOSA_StatusSuccess ==
OSA_MsgQGet((osa_msgq_handle_t)commonTaskStateHandle->msgqhandle, &msg, osaWaitForever_c))
{
if (msg->callback)
{
msg->callback(msg->callbackParam);
}
}
} while (gUseRtos_c);
}
common_task_status_t COMMON_TASK_init(void)
{
osa_status_t status;
if (s_commonTaskState->isInitialized)
{
return kStatus_COMMON_TASK_Error;
}
s_commonTaskState->isInitialized = 1U;
status =
OSA_MsgQCreate((osa_msgq_handle_t)s_commonTaskState->msgqhandle, COMMON_TASK_MAX_MSGQ_COUNT, sizeof(void *));
assert(KOSA_StatusSuccess == status);
status = OSA_TaskCreate((osa_task_handle_t)s_commonTaskState->commonTaskHandle, OSA_TASK(COMMON_TASK_task),
s_commonTaskState);
assert(KOSA_StatusSuccess == status);
(void)status;
return kStatus_COMMON_TASK_Success;
}
common_task_status_t COMMON_TASK_deinit(void)
{
if (!s_commonTaskState->isInitialized)
{
return kStatus_COMMON_TASK_Error;
}
OSA_MsgQDestroy((osa_msgq_handle_t)s_commonTaskState->msgqhandle);
OSA_TaskDestroy((osa_task_handle_t)s_commonTaskState->commonTaskHandle);
s_commonTaskState->isInitialized = 0U;
return kStatus_COMMON_TASK_Success;
}
common_task_status_t COMMON_TASK_post_message(common_task_message_t *msg)
{
assert(msg);
assert(msg->callback);
assert(s_commonTaskState->isInitialized);
if (KOSA_StatusSuccess != OSA_MsgQPut((osa_msgq_handle_t)s_commonTaskState->msgqhandle, &msg))
{
return kStatus_COMMON_TASK_Error;
}
return kStatus_COMMON_TASK_Success;
}
#endif