WS63 SDK 文档 7021f4f@fbb_ws63
ws63 和 ws63e 解决方案的 SDK 文档
载入中...
搜索中...
未找到
los_task_pri.h
浏览该文件的文档.
1/* ----------------------------------------------------------------------------
2 * Copyright (c) Huawei Technologies Co., Ltd. 2013-2022. All rights reserved.
3 * Description: LiteOS Task Module Implementation Private HeadFile
4 * Author: Huawei LiteOS Team
5 * Create: 2013-01-01
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11 * of conditions and the following disclaimer in the documentation and/or other materials
12 * provided with the distribution.
13 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
14 * to endorse or promote products derived from this software without specific prior written
15 * permission.
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 * --------------------------------------------------------------------------- */
28
29#ifndef _LOS_TASK_PRI_H
30#define _LOS_TASK_PRI_H
31
32#include "los_task_base.h"
33#include "los_task.h"
34#include "los_sched_pri.h"
35#include "los_stackinfo_pri.h"
36#include "los_lockdep.h"
37#include "arch/task.h"
38#ifdef LOSCFG_KERNEL_SMP
39#include "los_mp_pri.h"
40#endif
41
42#ifdef __cplusplus
43extern "C" {
44#endif /* __cplusplus */
45
46#ifdef LOSCFG_TASK_STACK_STATIC_ALLOCATION
47#if ((LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE & (LOSCFG_STACK_POINT_ALIGN_SIZE - 1)) != 0)
48#error "idle task stack not aligned"
49#endif
50#if ((LOSCFG_BASE_CORE_TSK_SWTMR_STACK_SIZE & (LOSCFG_STACK_POINT_ALIGN_SIZE - 1)) != 0)
51#error "swtmr task stack not aligned"
52#endif
53#if ((LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE & (LOSCFG_STACK_POINT_ALIGN_SIZE - 1)) != 0)
54#error "default task stack not aligned"
55#endif
56#endif
57
58/* Task signal types */
59#define SIGNAL_NONE 0U
60#define SIGNAL_KILL (1U << 0)
61#define SIGNAL_SUSPEND (1U << 1)
62#define SIGNAL_AFFI (1U << 2)
63
64#define OS_INVALID_VALUE 0xFFFFFFFF
65
66/* default and non-running task's ownership id */
67#define OS_TASK_INVALID_CPUID 0xFFFF
68
69/* Null task ID */
70#define OS_TASK_ERRORID 0xFFFFFFFF
71
72#define OS_CHECK_TASK_BLOCK (OS_TASK_STATUS_DELAY | \
73 OS_TASK_STATUS_PEND | \
74 OS_TASK_STATUS_SUSPEND)
75
76/* Number of usable task priorities */
77#define OS_TSK_PRINUM (LOS_TASK_PRIORITY_LOWEST - LOS_TASK_PRIORITY_HIGHEST + 1)
78
79/* This Macro is used to get task control block index */
80#define OS_TSK_GET_INDEX(taskId) (taskId)
81
82/* This Macro is used to check task id */
83#define OS_TASK_ID_CHECK_INVALID(taskId) (OS_TSK_GET_INDEX(taskId) >= g_taskMaxNum)
84
85/* This Macro is used to obtain the pointer to a task control block using a corresponding parameter */
86#define OS_TCB_FROM_PENDLIST(ptr) LOS_DL_LIST_ENTRY(ptr, LosTaskCB, pendList)
87
88/* This Macro is used to obtain the pointer to a task control block that has a specified task ID */
89#define OS_TCB_FROM_TID(taskId) (((LosTaskCB *)g_osTaskCBArray) + (taskId))
90
91/* This Macro set default task stack memory pool */
92#ifndef OS_TASK_STACK_POOL
93#define OS_TASK_STACK_POOL m_aucSysMem1
94#endif
95
96/* Maximum number of tasks */
97extern UINT32 g_taskMaxNum;
98
99/* Starting address of a task */
102
103/* Releasing a resource hook function */
104typedef VOID (*TASK_RECYCLE_HOOK)(UINT32 taskId);
106
107/* delete task hook function */
108typedef VOID (*TASK_DELETE_HOOK)(UINT32 taskId);
110
111/* Time slice structure */
112typedef struct {
113 LosTaskCB *task; /* Current running task */
114 UINT16 time; /* Expiration time point */
115 UINT16 timeout; /* Expiration duration */
117
119{
120 return (LosTaskCB *)ArchCurrTaskGet();
121}
122
124{
125 ArchCurrTaskSet(task);
126}
127
134#ifdef LOSCFG_BASE_CORE_TSK_MONITOR
135extern UINT32 OsTaskMonInit(VOID);
136extern VOID OsTaskSwitchCheck(const LosTaskCB *oldTask, const LosTaskCB *newTask);
137#endif
138extern UINT32 OsShellCmdDumpTask(INT32 argc, const CHAR **argv);
139
140/* get task info */
141#define OS_ALL_TASK_MASK 0xFFFFFFFF
145extern VOID OsTaskAdd2TimerList(LosTaskCB *taskCB, UINT32 timeout);
147extern VOID OsTaskEntry(UINT32 taskId);
149
150#ifdef LOSCFG_DEBUG_SCHED_STATISTICS
151extern VOID OsSchedStat(LosTaskCB *runTask, LosTaskCB *newTask);
152#ifdef LOSCFG_KERNEL_SMP
153extern VOID OsSchedStatMgr(LosTaskCB *task);
154#endif /* LOSCFG_KERNEL_SMP */
155#endif /* LOSCFG_DEBUG_SCHED_STATISTICS */
156#if defined(LOSCFG_EXC_INTERACTION) || defined(LOSCFG_DEBUG_SCHED_STATISTICS)
157extern BOOL IsIdleTask(UINT32 taskId);
158#endif
159
161{
162 return OsSchedSuspend(taskCB);
163}
164
166
167/*
168 * After SCHED_MQ introduce per-cpu locks and when task is still protected by the global schedule lock,
169 * We need to deal with some task status in different ways from SCHED_SQ.
170 *
171 * 1) OsTaskIsSchedAfterDelete : The task is still scheduing when it's been added to the recycle list.
172 * 2) OsTaskIsSchedCanBeAborted : The task scheduling can be aborted when the global schedule lock is switched
173 to per-cpu lock in SCHED_MQ. This function is often used when the task is being
174 put to sleep.
175 * 3) OsTaskIsRunOrSched : The task is running or scheduling.
176 */
177
178#ifdef LOSCFG_SCHED_MQ
180{
181 return !!((taskCB->taskStatus & OS_TASK_STATUS_RUNNING) | (taskCB->taskExtStatus & OS_TASK_STATUS_SCHED));
182}
183
185{
186 return !!(taskCB->taskStatus & OS_TASK_STATUS_RUNNING);
187}
188
190{
191 return !!((taskCB->taskStatus & OS_TASK_STATUS_RUNNING) | (taskCB->taskExtStatus & OS_TASK_STATUS_SCHED));
192}
193
195{
196 task->taskExtStatus = extStatus;
197}
198
200{
201 task->taskExtStatus &= ~extStatus;
202}
203
205{
206 do { } while ((task->taskExtStatus & OS_TASK_IS_INOPERABLE) != 0);
207}
208
210{
211 return !!(task->taskExtStatus & OS_TASK_IS_INOPERABLE);
212}
213
214#else /* LOSCFG_SCHED_SQ */
215
217{
218 (VOID)taskCB;
219 return FALSE;
220}
221
223{
224 (VOID)taskCB;
225 return FALSE;
226}
227
232
234{
235 (VOID)task;
236 (VOID)extStatus;
237}
238
240{
241 (VOID)task;
242 (VOID)extStatus;
243}
244
249
251{
252 (VOID)task;
253 return FALSE;
254}
255#endif /* LOSCFG_SCHED_MQ */
256
257#ifndef LOSCFG_SCHED_LATENCY
267#else
269{
271}
272#endif
273
275{
276#ifdef LOSCFG_TASK_JOINABLE
277 if (OS_TASK_IS_JOINING(taskCB)) {
278 taskCB->joined->joinner = NULL;
279 taskCB->joined = NULL;
280 }
281#else
282 (VOID)taskCB;
283#endif
284}
285
286#ifdef LOSCFG_KERNEL_SMP
288{
289 taskCB->mpSignal = mpSignal;
290}
291#else
293{
294 (VOID)taskCB;
295 (VOID)signal;
296}
297#endif
298
299/*
300 * Check if needs to do the suspend operation on the running task.
301 * Return TRUE, if needs to do the suspension.
302 * Return FALSE, if meets following circumstances:
303 * 1. Do the suspension across cores, if SMP is enabled
304 * 2. Do the suspension when preemption is disabled
305 * 3. Do the suspension in hard-irq
306 * then LOS_TaskSuspend will directly return with 'ret' value.
307 */
309{
310 /* init default out return value */
311 *ret = LOS_OK;
312
313#ifdef LOSCFG_KERNEL_SMP
314 /* ASYNCHRONIZED. No need to do task lock checking */
315 if (taskCB->currCpu != ArchCurrCpuid()) {
317 LOS_MpSchedule(CPUID_TO_AFFI_MASK(taskCB->currCpu));
318 return FALSE;
319 }
320#else
321 (VOID)taskCB;
322#endif
323
324 if (!OsPreemptableInSched()) {
325 /* Suspending the current core's running task */
327 return FALSE;
328 }
329
330#ifdef LOSCFG_KERNEL_SMP
331 if (OS_INT_ACTIVE) {
332 /*
333 * suspend running task in interrupt.
334 * mask "suspend" signal and later suspend will be handled.
335 */
337 return FALSE;
338 }
339#endif
340
341 return TRUE;
342}
343
344#ifdef __cplusplus
345}
346#endif /* __cplusplus */
347
348#endif /* _LOS_TASK_PRI_H */
#define NULL
Definition common_def.h:21
#define STATIC
Definition common_def.h:57
#define INLINE
Definition common_def.h:65
#define LOSCFG_KERNEL_CORE_NUM
Definition los_config.h:258
#define OS_INT_ACTIVE
Definition los_hwi.h:56
#define LOS_ERRNO_TSK_SUSPEND_LOCKED
Definition los_task.h:301
STATIC INLINE VOID LOS_MpSchedule(UINT32 target)
Definition los_mp_pri.h:65
STATIC INLINE Percpu * OsPercpuGet(VOID)
Definition los_percpu_pri.h:81
UINT32 OsSchedSuspend(LosTaskCB *taskCB)
STATIC INLINE BOOL OsPreemptableInSched(VOID)
Definition los_sched_pri.h:152
@ INT_SUSPEND_DELETE_RESCH
Definition los_sched_pri.h:63
VOID OsSchedResched(VOID)
#define CPUID_TO_AFFI_MASK(cpuid)
Definition los_task.h:50
#define OS_TASK_STATUS_SCHED
Definition los_task_base.h:104
#define OS_TASK_IS_JOINING(taskCB)
Definition los_task_base.h:125
#define OS_TASK_STATUS_RUNNING
Definition los_task_base.h:76
#define OS_TASK_IS_INOPERABLE
Definition los_task_base.h:109
VOID OsTaskEntry(UINT32 taskId)
UINT32 g_taskMaxNum
STATIC INLINE BOOL OsTaskIsSchedAfterDelete(LosTaskCB *taskCB)
Definition los_task_pri.h:216
VOID(* TASK_DELETE_HOOK)(UINT32 taskId)
Definition los_task_pri.h:108
STATIC INLINE BOOL OsTaskIsSchedCanBeAborted(LosTaskCB *taskCB)
Definition los_task_pri.h:222
UINT8 * g_osIdleTaskStack[LOSCFG_KERNEL_CORE_NUM]
STATIC INLINE VOID OsTaskWaitCanOperate(LosTaskCB *task)
Definition los_task_pri.h:245
STATIC INLINE VOID OsTaskCancelJoin(LosTaskCB *taskCB)
Definition los_task_pri.h:274
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
Definition los_task_pri.h:118
TASK_DELETE_HOOK g_taskDeleteHook
STATIC INLINE VOID OsTaskSignalSet(LosTaskCB *taskCB, UINT32 signal)
Definition los_task_pri.h:292
UINT32 OsIdleTaskCreate(VOID)
VOID OsIdleHandler(VOID)
STATIC INLINE UINT32 OsSysTaskSuspend(LosTaskCB *taskCB)
Definition los_task_pri.h:160
LosTaskCB * g_osTaskCBArray
VOID OsTaskAdd2TimerList(LosTaskCB *taskCB, UINT32 timeout)
TASK_RECYCLE_HOOK g_taskRecycleHook
VOID OsTimerListDelete(LosTaskCB *taskCB)
UINT32 OsGetIdleTaskId(VOID)
STATIC INLINE BOOL OsTaskSuspendCheckOnRun(LosTaskCB *taskCB, UINT32 *ret)
Definition los_task_pri.h:308
UINT32 OsDbgTskInfoGet(UINT32 taskId)
#define SIGNAL_SUSPEND
Definition los_task_pri.h:61
CHAR * OsCurTaskNameGet(VOID)
VOID OsTaskScan(VOID)
STATIC INLINE BOOL OsTaskIsInoperable(LosTaskCB *task)
Definition los_task_pri.h:250
STATIC INLINE BOOL OsTaskIsRunOrSched(LosTaskCB *taskCB)
Definition los_task_pri.h:228
STATIC INLINE VOID OsCurrTaskSet(LosTaskCB *task)
Definition los_task_pri.h:123
STATIC INLINE VOID OsTaskReSched(VOID)
Definition los_task_pri.h:258
VOID ArchTaskSchedule(LosTaskCB *, LosTaskCB *)
STATIC INLINE VOID OsTaskExtStatusSet(LosTaskCB *task, UINT32 extStatus)
Definition los_task_pri.h:233
VOID OsIdleTask(VOID)
UINT32 OsTaskInit(VOID)
VOID(* TASK_RECYCLE_HOOK)(UINT32 taskId)
Definition los_task_pri.h:104
VOID ArchStartToRun(LosTaskCB *)
STATIC INLINE VOID OsTaskExtStatusClear(LosTaskCB *task, UINT32 extStatus)
Definition los_task_pri.h:239
VOID OsTaskProcSignal(VOID)
UINT32 OsShellCmdDumpTask(INT32 argc, const CHAR **argv)
unsigned short UINT16
Definition los_typedef.h:51
signed int INT32
Definition los_typedef.h:55
#define VOID
Definition los_typedef.h:88
#define LOS_OK
Definition los_typedef.h:122
#define TRUE
Definition los_typedef.h:98
#define FALSE
Definition los_typedef.h:94
unsigned char UINT8
Definition los_typedef.h:50
unsigned int UINT32
Definition los_typedef.h:52
char CHAR
Definition los_typedef.h:58
size_t BOOL
Definition los_typedef.h:83
Definition los_task_pri.h:112
LosTaskCB * task
Definition los_task_pri.h:113
UINT16 timeout
Definition los_task_pri.h:115
UINT16 time
Definition los_task_pri.h:114
UINT32 schedFlag
Definition los_percpu_pri.h:68
Definition los_task_base.h:131
UINT16 taskStatus
Definition los_task_base.h:137