feat: 支持posix 和 cmsis join能力
支持API: LOS_TaskJoin LOS_TaskDeatch pthread_join pthread_deatch osThreadJoin osThreadDetach Close #I44V26 Signed-off-by: zhushengle <zhushengle@huawei.com> Change-Id: Ib61e69c280eef2e4b3b79d9bba7bbd5a300c7fe4
This commit is contained in:
@@ -369,8 +369,66 @@ extern "C" {
|
||||
*/
|
||||
#define LOS_ERRNO_TSK_OPERATE_SWTMR LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x22)
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Task error code: Task timeout.
|
||||
*
|
||||
* Value: 0x02000223
|
||||
*
|
||||
* Solution: Check whether the waiting time and timeout are reasonable.
|
||||
*/
|
||||
#define LOS_ERRNO_TSK_TIMEOUT LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x23)
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Task error code: This task cannot wait for other tasks to finish.
|
||||
*
|
||||
* Value: 0x02000224
|
||||
*
|
||||
* Solution: Check the task properties and whether it is waiting for other tasks to finish.
|
||||
*/
|
||||
#define LOS_ERRNO_TSK_NOT_JOIN LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x24)
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Task error code: Tasks can't join himself.
|
||||
*
|
||||
* Value: 0x02000225
|
||||
*
|
||||
* Solution: Check whether the task ID is the current running task.
|
||||
*/
|
||||
#define LOS_ERRNO_TSK_NOT_JOIN_SELF LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x25)
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Task error code: This task operation is not allowed to be performed in an interrupt.
|
||||
*
|
||||
* Value: 0x02000226
|
||||
*
|
||||
* Solution: Check whether the interface is used in interrupts.
|
||||
*/
|
||||
#define LOS_ERRNO_TSK_NOT_ALLOW_IN_INT LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x26)
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Task error code: An exited task cannot be deleted.
|
||||
*
|
||||
* Value: 0x02000227
|
||||
*
|
||||
* Solution: Check whether a Joinable task exists. If so, call LOS_TaskJoin to reclaim resources.
|
||||
*/
|
||||
#define LOS_ERRNO_TSK_ALREADY_EXIT LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x27)
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Task error code: Locked scheduling does not allow tasks to be blocked.
|
||||
*
|
||||
* Value: 0x02000228
|
||||
*
|
||||
* Solution: Check for faulty lock scheduling logic.
|
||||
*/
|
||||
#define LOS_ERRNO_TSK_SCHED_LOCKED LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x28)
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Define the type of the task entry function.
|
||||
@@ -393,17 +451,21 @@ typedef struct tagTskInitParam {
|
||||
UINT32 uwResved; /**< Reserved */
|
||||
} TSK_INIT_PARAM_S;
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Task detach attribute.
|
||||
*/
|
||||
#define LOS_TASK_ATTR_JOINABLE 0x80000000
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Task name length
|
||||
*
|
||||
*/
|
||||
#define LOS_TASK_NAMELEN 32
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Task information structure.
|
||||
*
|
||||
*/
|
||||
typedef struct tagTskInfo {
|
||||
CHAR acName[LOS_TASK_NAMELEN]; /**< Task entrance function */
|
||||
@@ -1088,6 +1150,45 @@ extern CHAR* LOS_TaskNameGet(UINT32 taskID);
|
||||
*/
|
||||
extern VOID LOS_UDelay(UINT64 microseconds);
|
||||
|
||||
/* *
|
||||
* @ingroup los_task
|
||||
* @brief: cpu delay.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to wait for the subtask to finish and reclaim the resource.
|
||||
*
|
||||
* @attention:
|
||||
* <ul><li>None.</li></ul>
|
||||
*
|
||||
* @param taskID [IN] task ID.
|
||||
* @param retval [IN] Value returned when the task is complete.
|
||||
*
|
||||
* @retval: None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_task.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see LOS_TaskDetach.
|
||||
*/
|
||||
extern UINT32 LOS_TaskJoin(UINT32 taskID, UINTPTR *retval);
|
||||
|
||||
/* *
|
||||
* @ingroup los_task
|
||||
* @brief: Modify the task attributes to detach.
|
||||
*
|
||||
* @par Description:
|
||||
* This API is used to modify the attribute of the specified task to detach.
|
||||
*
|
||||
* @attention:
|
||||
* <ul><li>None.</li></ul>
|
||||
*
|
||||
* @param taskID [IN] task ID.
|
||||
*
|
||||
* @retval: None.
|
||||
* @par Dependency:
|
||||
* <ul><li>los_task.h: the header file that contains the API declaration.</li></ul>
|
||||
* @see LOS_TaskJoin.
|
||||
*/
|
||||
extern UINT32 LOS_TaskDetach(UINT32 taskID);
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Null task ID
|
||||
@@ -1175,6 +1276,14 @@ extern VOID LOS_UDelay(UINT64 microseconds);
|
||||
*/
|
||||
#define OS_TASK_STATUS_PEND_TIME 0x0080
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Flag that indicates the task or task control block status.
|
||||
*
|
||||
* The task exits and waits for the parent thread to reclaim the resource.
|
||||
*/
|
||||
#define OS_TASK_STATUS_EXIT 0x0100
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Flag that indicates the task or task control block status.
|
||||
@@ -1185,11 +1294,12 @@ extern VOID LOS_UDelay(UINT64 microseconds);
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
* Flag that indicates the task is in userspace.
|
||||
* Flag that indicates the task or task control block status.
|
||||
*
|
||||
* The task is a user task.
|
||||
* Task join properties, The parent thread needs to reclaim
|
||||
* the resource after the task ends.
|
||||
*/
|
||||
#define OS_TASK_STATUS_USERSPACE 0x8000
|
||||
#define OS_TASK_FLAG_JOINABLE 0x8000
|
||||
|
||||
/**
|
||||
* @ingroup los_task
|
||||
@@ -1354,6 +1464,8 @@ typedef struct {
|
||||
CHAR *taskName; /**< Task name */
|
||||
LOS_DL_LIST pendList;
|
||||
LOS_DL_LIST timerList;
|
||||
LOS_DL_LIST joinList;
|
||||
UINTPTR joinRetval; /**< Return value of the end of the task, If the task does not exit by itself, the ID of the task that killed the task is recorded. */
|
||||
EVENT_CB_S event;
|
||||
UINT32 eventMask; /**< Event mask */
|
||||
UINT32 eventMode; /**< Event mode */
|
||||
|
||||
@@ -50,6 +50,9 @@ extern "C" {
|
||||
#error "Must specify the maximum value that tick timer counter supports!"
|
||||
#endif
|
||||
|
||||
#define OS_TASK_BLOCKED_STATUS (OS_TASK_STATUS_PEND | OS_TASK_STATUS_SUSPEND | \
|
||||
OS_TASK_STATUS_EXIT | OS_TASK_STATUS_UNUSED)
|
||||
|
||||
STATIC SchedScan g_swtmrScan = NULL;
|
||||
STATIC SortLinkAttribute *g_taskSortLinkList = NULL;
|
||||
STATIC LOS_DL_LIST g_priQueueList[OS_PRIORITY_QUEUE_NUM];
|
||||
@@ -511,7 +514,7 @@ BOOL OsSchedTaskSwitch(VOID)
|
||||
|
||||
if (runTask->taskStatus & (OS_TASK_STATUS_PEND_TIME | OS_TASK_STATUS_DELAY)) {
|
||||
OsAdd2SortLink(&runTask->sortList, runTask->startTime, runTask->waitTimes, OS_SORT_LINK_TASK);
|
||||
} else if (!(runTask->taskStatus & (OS_TASK_STATUS_PEND | OS_TASK_STATUS_SUSPEND | OS_TASK_STATUS_UNUSED))) {
|
||||
} else if (!(runTask->taskStatus & OS_TASK_BLOCKED_STATUS)) {
|
||||
OsSchedTaskEnQueue(runTask);
|
||||
}
|
||||
|
||||
|
||||
@@ -123,6 +123,22 @@ STATIC_INLINE UINT32 OsCheckTaskIDValid(UINT32 taskID)
|
||||
return ret;
|
||||
}
|
||||
|
||||
STATIC VOID OsRecycleTaskResources(LosTaskCB *taskCB, UINTPTR *stackPtr)
|
||||
{
|
||||
if (!(taskCB->taskStatus & OS_TASK_STATUS_EXIT)) {
|
||||
LOS_ListAdd(&g_losFreeTask, &taskCB->pendList);
|
||||
taskCB->taskStatus = OS_TASK_STATUS_UNUSED;
|
||||
}
|
||||
if (taskCB->topOfStack != 0) {
|
||||
#if (LOSCFG_EXC_HARDWARE_STACK_PROTECTION == 1)
|
||||
*stackPtr = taskCB->topOfStack - OS_TASK_STACK_PROTECT_SIZE;
|
||||
#else
|
||||
*stackPtr = taskCB->topOfStack;
|
||||
#endif
|
||||
taskCB->topOfStack = (UINT32)NULL;
|
||||
}
|
||||
}
|
||||
|
||||
STATIC VOID OsRecyleFinishedTask(VOID)
|
||||
{
|
||||
LosTaskCB *taskCB = NULL;
|
||||
@@ -133,14 +149,12 @@ STATIC VOID OsRecyleFinishedTask(VOID)
|
||||
while (!LOS_ListEmpty(&g_taskRecyleList)) {
|
||||
taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_taskRecyleList));
|
||||
LOS_ListDelete(LOS_DL_LIST_FIRST(&g_taskRecyleList));
|
||||
LOS_ListAdd(&g_losFreeTask, &taskCB->pendList);
|
||||
#if (LOSCFG_EXC_HARDWARE_STACK_PROTECTION == 1)
|
||||
stackPtr = taskCB->topOfStack - OS_TASK_STACK_PROTECT_SIZE;
|
||||
#else
|
||||
stackPtr = taskCB->topOfStack;
|
||||
#endif
|
||||
stackPtr = 0;
|
||||
OsRecycleTaskResources(taskCB, &stackPtr);
|
||||
LOS_IntRestore(intSave);
|
||||
|
||||
(VOID)LOS_MemFree(OS_TASK_STACK_ADDR, (VOID *)stackPtr);
|
||||
taskCB->topOfStack = (UINT32)NULL;
|
||||
intSave = LOS_IntLock();
|
||||
}
|
||||
LOS_IntRestore(intSave);
|
||||
}
|
||||
@@ -188,6 +202,10 @@ LITE_OS_SEC_TEXT_MINOR UINT8 *OsConvertTskStatus(UINT16 taskStatus)
|
||||
return (UINT8 *)"Running";
|
||||
} else if (taskStatus & OS_TASK_STATUS_READY) {
|
||||
return (UINT8 *)"Ready";
|
||||
} else if (taskStatus & OS_TASK_STATUS_EXIT) {
|
||||
return (UINT8 *)"Exit";
|
||||
} else if (taskStatus & OS_TASK_STATUS_SUSPEND) {
|
||||
return (UINT8 *)"Suspend";
|
||||
} else if (taskStatus & OS_TASK_STATUS_DELAY) {
|
||||
return (UINT8 *)"Delay";
|
||||
} else if (taskStatus & OS_TASK_STATUS_PEND) {
|
||||
@@ -195,8 +213,6 @@ LITE_OS_SEC_TEXT_MINOR UINT8 *OsConvertTskStatus(UINT16 taskStatus)
|
||||
return (UINT8 *)"PendTime";
|
||||
}
|
||||
return (UINT8 *)"Pend";
|
||||
} else if (taskStatus & OS_TASK_STATUS_SUSPEND) {
|
||||
return (UINT8 *)"Suspend";
|
||||
}
|
||||
|
||||
return (UINT8 *)"Impossible";
|
||||
@@ -606,8 +622,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID)
|
||||
UINT32 retVal;
|
||||
LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
|
||||
|
||||
(VOID)taskCB->taskEntry(taskCB->arg);
|
||||
|
||||
taskCB->joinRetval = (UINTPTR)taskCB->taskEntry(taskCB->arg);
|
||||
retVal = LOS_TaskDelete(taskCB->taskID);
|
||||
if (retVal != LOS_OK) {
|
||||
PRINT_ERR("Delete Task[TID: %d] Failed!\n", taskCB->taskID);
|
||||
@@ -671,6 +686,11 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsNewTaskInit(LosTaskCB *taskCB, TSK_INIT_PARAM_S *
|
||||
taskCB->stackPointer = HalTskStackInit(taskCB->taskID, taskInitParam->uwStackSize, topOfStack);
|
||||
SET_SORTLIST_VALUE(&taskCB->sortList, OS_SORT_LINK_INVALID_TIME);
|
||||
LOS_EventInit(&(taskCB->event));
|
||||
|
||||
if (taskInitParam->uwResved & LOS_TASK_ATTR_JOINABLE) {
|
||||
taskCB->taskStatus |= OS_TASK_FLAG_JOINABLE;
|
||||
LOS_ListInit(&taskCB->joinList);
|
||||
}
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
@@ -892,6 +912,124 @@ LOS_ERREND:
|
||||
return retErr;
|
||||
}
|
||||
|
||||
STATIC VOID OsTaskJoinPostUnsafe(LosTaskCB *taskCB)
|
||||
{
|
||||
LosTaskCB *resumedTask = NULL;
|
||||
|
||||
if (taskCB->taskStatus & OS_TASK_FLAG_JOINABLE) {
|
||||
if (!LOS_ListEmpty(&taskCB->joinList)) {
|
||||
resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(taskCB->joinList)));
|
||||
OsSchedTaskWake(resumedTask);
|
||||
}
|
||||
taskCB->taskStatus |= OS_TASK_STATUS_EXIT;
|
||||
}
|
||||
}
|
||||
|
||||
STATIC UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB)
|
||||
{
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_EXIT) {
|
||||
return LOS_OK;
|
||||
} else if ((taskCB->taskStatus & OS_TASK_FLAG_JOINABLE) && LOS_ListEmpty(&taskCB->joinList)) {
|
||||
OsSchedTaskWait(&taskCB->joinList, LOS_WAIT_FOREVER);
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
STATIC UINT32 OsTaskSetDetachUnsafe(LosTaskCB *taskCB)
|
||||
{
|
||||
if (taskCB->taskStatus & OS_TASK_FLAG_JOINABLE) {
|
||||
if (LOS_ListEmpty(&(taskCB->joinList))) {
|
||||
LOS_ListDelete(&(taskCB->joinList));
|
||||
taskCB->taskStatus &= ~OS_TASK_FLAG_JOINABLE;
|
||||
return LOS_OK;
|
||||
}
|
||||
/* This error code has a special purpose and is not allowed to appear again on the interface */
|
||||
return LOS_ERRNO_TSK_NOT_JOIN;
|
||||
}
|
||||
|
||||
return LOS_NOK;
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskJoin(UINT32 taskID, UINTPTR *retval)
|
||||
{
|
||||
LosTaskCB *taskCB = NULL;
|
||||
UINTPTR stackPtr = 0;
|
||||
UINT32 intSave;
|
||||
UINT32 ret;
|
||||
|
||||
ret = OsCheckTaskIDValid(taskID);
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (OS_INT_ACTIVE) {
|
||||
return LOS_ERRNO_TSK_NOT_ALLOW_IN_INT;
|
||||
}
|
||||
|
||||
if (g_losTaskLock != 0) {
|
||||
return LOS_ERRNO_TSK_SCHED_LOCKED;
|
||||
}
|
||||
|
||||
if (taskID == LOS_CurTaskIDGet()) {
|
||||
return LOS_ERRNO_TSK_NOT_JOIN_SELF;
|
||||
}
|
||||
|
||||
taskCB = OS_TCB_FROM_TID(taskID);
|
||||
intSave = LOS_IntLock();
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) {
|
||||
LOS_IntRestore(intSave);
|
||||
return LOS_ERRNO_TSK_NOT_CREATED;
|
||||
}
|
||||
|
||||
ret = OsTaskJoinPendUnsafe(taskCB);
|
||||
LOS_IntRestore(intSave);
|
||||
if (ret == LOS_OK) {
|
||||
LOS_Schedule();
|
||||
|
||||
if (retval != NULL) {
|
||||
*retval = taskCB->joinRetval;
|
||||
}
|
||||
|
||||
intSave = LOS_IntLock();
|
||||
taskCB->taskStatus &= ~OS_TASK_STATUS_EXIT;
|
||||
OsRecycleTaskResources(taskCB, &stackPtr);
|
||||
LOS_IntRestore(intSave);
|
||||
(VOID)LOS_MemFree(OS_TASK_STACK_ADDR, (VOID *)stackPtr);
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDetach(UINT32 taskID)
|
||||
{
|
||||
UINT32 intSave;
|
||||
UINT32 ret;
|
||||
LosTaskCB *taskCB = NULL;
|
||||
|
||||
ret = OsCheckTaskIDValid(taskID);
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (OS_INT_ACTIVE) {
|
||||
return LOS_ERRNO_TSK_NOT_ALLOW_IN_INT;
|
||||
}
|
||||
|
||||
taskCB = OS_TCB_FROM_TID(taskID);
|
||||
intSave = LOS_IntLock();
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) {
|
||||
LOS_IntRestore(intSave);
|
||||
return LOS_ERRNO_TSK_NOT_CREATED;
|
||||
}
|
||||
|
||||
ret = OsTaskSetDetachUnsafe(taskCB);
|
||||
LOS_IntRestore(intSave);
|
||||
return ret;
|
||||
}
|
||||
|
||||
LITE_OS_SEC_TEXT_INIT STATIC_INLINE VOID OsRunningTaskDelete(UINT32 taskID, LosTaskCB *taskCB)
|
||||
{
|
||||
LOS_ListTailInsert(&g_taskRecyleList, &taskCB->pendList);
|
||||
@@ -911,21 +1049,27 @@ LITE_OS_SEC_TEXT_INIT STATIC_INLINE VOID OsRunningTaskDelete(UINT32 taskID, LosT
|
||||
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID)
|
||||
{
|
||||
UINT32 intSave;
|
||||
LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
|
||||
UINTPTR stackPtr;
|
||||
UINTPTR stackPtr = 0;
|
||||
LosTaskCB *taskCB = NULL;
|
||||
|
||||
UINT32 ret = OsCheckTaskIDValid(taskID);
|
||||
if (ret != LOS_OK) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
taskCB = OS_TCB_FROM_TID(taskID);
|
||||
intSave = LOS_IntLock();
|
||||
|
||||
if ((taskCB->taskStatus) & OS_TASK_STATUS_UNUSED) {
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) {
|
||||
LOS_IntRestore(intSave);
|
||||
return LOS_ERRNO_TSK_NOT_CREATED;
|
||||
}
|
||||
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_EXIT) {
|
||||
LOS_IntRestore(intSave);
|
||||
return LOS_ERRNO_TSK_ALREADY_EXIT;
|
||||
}
|
||||
|
||||
/* If the task is running and scheduler is locked then you can not delete it */
|
||||
if (((taskCB->taskStatus) & OS_TASK_STATUS_RUNNING) && (g_losTaskLock != 0)) {
|
||||
PRINT_INFO("In case of task lock, task deletion is not recommended\n");
|
||||
@@ -934,6 +1078,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID)
|
||||
|
||||
OsHookCall(LOS_HOOK_TYPE_TASK_DELETE, taskCB);
|
||||
OsSchedTaskExit(taskCB);
|
||||
OsTaskJoinPostUnsafe(taskCB);
|
||||
|
||||
LOS_EventDestroy(&(taskCB->event));
|
||||
taskCB->event.uwEventID = OS_NULL_INT;
|
||||
@@ -943,24 +1088,19 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID)
|
||||
(VOID)memset_s((VOID *)&g_cpup[taskCB->taskID], sizeof(OsCpupCB), 0, sizeof(OsCpupCB));
|
||||
#endif
|
||||
if (taskCB->taskStatus & OS_TASK_STATUS_RUNNING) {
|
||||
taskCB->taskStatus = OS_TASK_STATUS_UNUSED;
|
||||
OsRunningTaskDelete(taskID, taskCB);
|
||||
if (!(taskCB->taskStatus & OS_TASK_STATUS_EXIT)) {
|
||||
taskCB->taskStatus = OS_TASK_STATUS_UNUSED;
|
||||
OsRunningTaskDelete(taskID, taskCB);
|
||||
}
|
||||
LOS_IntRestore(intSave);
|
||||
LOS_Schedule();
|
||||
return LOS_OK;
|
||||
} else {
|
||||
taskCB->taskStatus = OS_TASK_STATUS_UNUSED;
|
||||
LOS_ListAdd(&g_losFreeTask, &taskCB->pendList);
|
||||
#if (LOSCFG_EXC_HARDWARE_STACK_PROTECTION == 1)
|
||||
stackPtr = taskCB->topOfStack - OS_TASK_STACK_PROTECT_SIZE;
|
||||
#else
|
||||
stackPtr = taskCB->topOfStack;
|
||||
#endif
|
||||
(VOID)LOS_MemFree(OS_TASK_STACK_ADDR, (VOID *)stackPtr);
|
||||
taskCB->topOfStack = (UINT32)NULL;
|
||||
}
|
||||
|
||||
taskCB->joinRetval = LOS_CurTaskIDGet();
|
||||
OsRecycleTaskResources(taskCB, &stackPtr);
|
||||
LOS_IntRestore(intSave);
|
||||
(VOID)LOS_MemFree(OS_TASK_STACK_ADDR, (VOID *)stackPtr);
|
||||
return LOS_OK;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user