diff --git a/kernel/include/los_event.h b/kernel/include/los_event.h index 4df94aa8..b568e680 100644 --- a/kernel/include/los_event.h +++ b/kernel/include/los_event.h @@ -155,6 +155,15 @@ extern "C" { */ #define LOS_ERRNO_EVENT_SHOULD_NOT_DESTROYED LOS_ERRNO_OS_ERROR(LOS_MOD_EVENT, 0x08) +/** + * @ingroup los_event + * Event reading error code: The event is being read in a system-level task. + * Value: 0x02001c09 + * + * Solution: Read the event in a valid task. + */ +#define LOS_ERRNO_EVENT_READ_IN_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_EVENT, 0x09) + /** * @ingroup los_event * Event control structure diff --git a/kernel/include/los_mux.h b/kernel/include/los_mux.h index 334c876c..822472d6 100644 --- a/kernel/include/los_mux.h +++ b/kernel/include/los_mux.h @@ -172,6 +172,16 @@ extern "C" { */ #define LOS_ERRNO_MUX_MAXNUM_ZERO LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x0C) +/** + * @ingroup los_mux + * + * Mutex error code: The API is called in a system-level task, which is forbidden. + * Value: 0x02001d0D + * + * Solution: Do not call the API in system-level tasks. + */ +#define LOS_ERRNO_MUX_PEND_IN_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_MUX, 0x0D) + /** * @ingroup los_mux * @brief Create a mutex. diff --git a/kernel/include/los_sem.h b/kernel/include/los_sem.h index cd403682..f9ec2d6f 100644 --- a/kernel/include/los_sem.h +++ b/kernel/include/los_sem.h @@ -156,6 +156,15 @@ extern "C" { */ #define LOS_ERRNO_SEM_MAXNUM_ZERO LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x0A) +/** + * @ingroup los_sem + * Semaphore error code: The API is called in a system-level task, which is forbidden. + * Value: 0x0200070B + * + * Solution: Do not call the API in system-level tasks. + */ +#define LOS_ERRNO_SEM_PEND_IN_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_SEM, 0x0B) + /** * @ingroup los_sem * @brief Create a Counting semaphore. diff --git a/kernel/include/los_task.h b/kernel/include/los_task.h index 20c910b3..6753f360 100644 --- a/kernel/include/los_task.h +++ b/kernel/include/los_task.h @@ -241,13 +241,14 @@ extern "C" { /** * @ingroup los_task - * Task error code: The operation is performed on the idle task. + * Task error code: The operation is performed on the system-level task. * * Value: 0x02000214 * - * Solution: Check the task ID and do not operate on the idle task. + * Solution: Check the task ID and do not operate on the system-level task. */ -#define LOS_ERRNO_TSK_OPERATE_IDLE LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x14) +#define LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK LOS_ERRNO_OS_ERROR(LOS_MOD_TSK, 0x14) +#define LOS_ERRNO_TSK_OPERATE_IDLE LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK /** * @ingroup los_task @@ -1284,6 +1285,14 @@ extern UINT32 LOS_TaskDetach(UINT32 taskID); */ #define OS_TASK_STATUS_EXIT 0x0100 +/** + * @ingroup los_task + * Flag that indicates the task property. + * + * The task is system-level task, like idle, swtmr and etc. + */ +#define OS_TASK_FLAG_SYSTEM_TASK 0x1000U + /** * @ingroup los_task * Flag that indicates the task or task control block status. diff --git a/kernel/src/los_event.c b/kernel/src/los_event.c index f81f1ff5..df4c4a42 100644 --- a/kernel/src/los_event.c +++ b/kernel/src/los_event.c @@ -108,6 +108,9 @@ LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UIN if (OS_INT_ACTIVE) { return LOS_ERRNO_EVENT_READ_IN_INTERRUPT; } + if (g_losTask.runTask->taskStatus & OS_TASK_FLAG_SYSTEM_TASK) { + return LOS_ERRNO_EVENT_READ_IN_SYSTEM_TASK; + } intSave = LOS_IntLock(); ret = LOS_EventPoll(&(eventCB->uwEventID), eventMask, mode); OsHookCall(LOS_HOOK_TYPE_EVENT_READ, eventCB, eventMask, mode, timeOut); @@ -204,6 +207,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventDestroy(PEVENT_CB_S eventCB) OsHookCall(LOS_HOOK_TYPE_EVENT_DESTROY, eventCB); return LOS_OK; } + LITE_OS_SEC_TEXT_MINOR UINT32 LOS_EventClear(PEVENT_CB_S eventCB, UINT32 eventMask) { UINT32 intSave; @@ -216,5 +220,3 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_EventClear(PEVENT_CB_S eventCB, UINT32 eventMa LOS_IntRestore(intSave); return LOS_OK; } - - diff --git a/kernel/src/los_mux.c b/kernel/src/los_mux.c index 1fd934b9..30556ba5 100644 --- a/kernel/src/los_mux.c +++ b/kernel/src/los_mux.c @@ -172,6 +172,10 @@ STATIC_INLINE UINT32 OsMuxValidCheck(LosMuxCB *muxPended) return LOS_ERRNO_MUX_PEND_IN_LOCK; } + if (g_losTask.runTask->taskStatus & OS_TASK_FLAG_SYSTEM_TASK) { + return LOS_ERRNO_MUX_PEND_IN_SYSTEM_TASK; + } + return LOS_OK; } diff --git a/kernel/src/los_sem.c b/kernel/src/los_sem.c index 664feccb..cbd777c9 100644 --- a/kernel/src/los_sem.c +++ b/kernel/src/los_sem.c @@ -202,6 +202,9 @@ STATIC_INLINE UINT32 OsSemValidCheck(LosSemCB *semPended) return LOS_ERRNO_SEM_PEND_IN_LOCK; } + if (g_losTask.runTask->taskStatus & OS_TASK_FLAG_SYSTEM_TASK) { + return LOS_ERRNO_SEM_PEND_IN_SYSTEM_TASK; + } return LOS_OK; } diff --git a/kernel/src/los_swtmr.c b/kernel/src/los_swtmr.c index 8f0ed3b9..23fd9f47 100644 --- a/kernel/src/los_swtmr.c +++ b/kernel/src/los_swtmr.c @@ -116,6 +116,9 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrTaskCreate(VOID) swtmrTask.pcName = "Swt_Task"; swtmrTask.usTaskPrio = 0; ret = LOS_TaskCreate(&g_swtmrTaskID, &swtmrTask); + if (ret == LOS_OK) { + OS_TCB_FROM_TID(g_swtmrTaskID)->taskStatus |= OS_TASK_FLAG_SYSTEM_TASK; + } return ret; } @@ -667,5 +670,3 @@ LITE_OS_SEC_TEXT UINT32 LOS_SwtmrDelete(UINT32 swtmrId) } #endif /* (LOSCFG_BASE_CORE_SWTMR == 1) */ - - diff --git a/kernel/src/los_task.c b/kernel/src/los_task.c index 1b406c87..d4d380ac 100644 --- a/kernel/src/los_task.c +++ b/kernel/src/los_task.c @@ -876,11 +876,17 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskSuspend(UINT32 taskID) taskCB = OS_TCB_FROM_TID(taskID); intSave = LOS_IntLock(); tempStatus = taskCB->taskStatus; + if (tempStatus & OS_TASK_STATUS_UNUSED) { retErr = LOS_ERRNO_TSK_NOT_CREATED; OS_GOTO_ERREND(); } + if (tempStatus & OS_TASK_FLAG_SYSTEM_TASK) { + retErr = LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK; + OS_GOTO_ERREND(); + } + if (tempStatus & OS_TASK_STATUS_SUSPEND) { retErr = LOS_ERRNO_TSK_ALREADY_SUSPENDED; OS_GOTO_ERREND(); @@ -1069,6 +1075,10 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID) taskCB = OS_TCB_FROM_TID(taskID); intSave = LOS_IntLock(); + if (taskCB->taskStatus & OS_TASK_FLAG_SYSTEM_TASK) { + LOS_IntRestore(intSave); + return LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK; + } if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { LOS_IntRestore(intSave); @@ -1133,6 +1143,9 @@ LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick) return LOS_ERRNO_TSK_DELAY_IN_LOCK; } + if (g_losTask.runTask->taskStatus & OS_TASK_FLAG_SYSTEM_TASK) { + return LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK; + } OsHookCall(LOS_HOOK_TYPE_TASK_DELAY, tick); if (tick == 0) { return LOS_TaskYield(); @@ -1201,6 +1214,10 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskPriSet(UINT32 taskID, UINT16 taskPrio) LOS_IntRestore(intSave); return LOS_ERRNO_TSK_NOT_CREATED; } + if (tempStatus & OS_TASK_FLAG_SYSTEM_TASK) { + LOS_IntRestore(intSave); + return LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK; + } isReady = OsSchedModifyTaskSchedParam(taskCB, taskPrio); LOS_IntRestore(intSave);