From c886629e279a5fe0a670d33ebbc14a6166e3d113 Mon Sep 17 00:00:00 2001 From: zff Date: Mon, 18 Oct 2021 14:22:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E7=B3=BB=E7=BB=9Fpend=E7=B1=BB=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=9C=AA=E5=AF=B9=E8=BD=AF=E4=BB=B6=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E5=99=A8=E4=BB=BB=E5=8A=A1=E8=BF=9B=E8=A1=8C=E9=99=90=E5=88=B6?= =?UTF-8?q?=EF=BC=8C=E5=AE=B9=E6=98=93=E5=BC=95=E5=8F=91=E8=BD=AF=E4=BB=B6?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E5=99=A8=E4=BB=BB=E5=8A=A1=E9=9D=9E=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E6=8C=82=E8=B5=B7=EF=BC=8C=20=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E5=93=8D=E5=BA=94=E4=B8=8D=E5=8F=8A=E6=97=B6=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit close: #I44CI9 Signed-off-by: zff Change-Id: I6aa612f3c34eef274eaa0c98efed0a3c4736de6e --- kernel/include/los_event.h | 9 +++++++++ kernel/include/los_mux.h | 10 ++++++++++ kernel/include/los_sem.h | 9 +++++++++ kernel/include/los_task.h | 15 ++++++++++++--- kernel/src/los_event.c | 6 ++++-- kernel/src/los_mux.c | 4 ++++ kernel/src/los_sem.c | 3 +++ kernel/src/los_swtmr.c | 5 +++-- kernel/src/los_task.c | 17 +++++++++++++++++ 9 files changed, 71 insertions(+), 7 deletions(-) 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);