1 /* 2 * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved. 3 * 4 * UniProton is licensed under Mulan PSL v2. 5 * You can use this software according to the terms and conditions of the Mulan PSL v2. 6 * You may obtain a copy of Mulan PSL v2 at: 7 * http://license.coscl.org.cn/MulanPSL2 8 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 9 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 10 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 11 * See the Mulan PSL v2 for more details. 12 * Create: 2009-12-22 13 * Description: task模块的模块内头文件 14 */ 15 #ifndef PRT_TASK_INTERNAL_H 16 #define PRT_TASK_INTERNAL_H 17 18 #include "prt_task_external.h" 19 #include "prt_asm_cpu_external.h" 20 21 /* 22 * 模块内宏定义 23 */ 24 #define OS_TSK_STACK_MAGIC g_tskModInfo.magicWord 25 #define OS_TSK_STACK_CFG_BY_USER 1 26 #define OS_TSK_STACK_CFG_BY_SYS 0 27 28 /* 29 * 模块内全局变量声明 30 */ 31 extern struct TagListObject g_tskCbFreeList; 32 extern struct TagListObject g_tskRecyleList; 33 34 /* 35 * 模块内函数声明 36 */ 37 extern void *OsTskMemAlloc(U32 size); 38 extern void OsTskIdleBgd(void); 39 extern U32 OsTaskDelStatusCheck(struct TagTskCb *taskCb); 40 extern void OsTskRecycle(void); 41 extern void OsTskStackInit(U32 stackSize, uintptr_t topStack); 42 OsMoveTaskToReady(struct TagTskCb * taskCb)43OS_SEC_ALW_INLINE INLINE void OsMoveTaskToReady(struct TagTskCb *taskCb) 44 { 45 /* If task is not blocked then move it to ready list */ 46 if ((taskCb->taskStatus & OS_TSK_BLOCK) == 0) { 47 OsTskReadyAdd(taskCb); 48 49 if ((OS_FLG_BGD_ACTIVE & UNI_FLAG) != 0) { 50 OsTskSchedule(); 51 return; 52 } 53 } 54 } 55 OsTskResRecycle(struct TagTskCb * taskCb)56OS_SEC_ALW_INLINE INLINE void OsTskResRecycle(struct TagTskCb *taskCb) 57 { 58 if (taskCb->stackCfgFlg == OS_TSK_STACK_CFG_BY_SYS) { 59 OS_ERR_RECORD(PRT_MemFree((U32)OS_MID_TSK, (void *)taskCb->topOfStack)); 60 } 61 } 62 OsTaskCreateChkAndGetTcb(struct TagTskCb ** taskCb)63OS_SEC_ALW_INLINE INLINE U32 OsTaskCreateChkAndGetTcb(struct TagTskCb **taskCb) 64 { 65 OsTskRecycle(); 66 67 if (ListEmpty(&g_tskCbFreeList)) { 68 return OS_ERRNO_TSK_TCB_UNAVAILABLE; 69 } 70 71 // 先获取到该控制块 72 *taskCb = GET_TCB_PEND(OS_LIST_FIRST(&g_tskCbFreeList)); 73 // 成功,从空闲列表中移除 74 ListDelete(OS_LIST_FIRST(&g_tskCbFreeList)); 75 76 return OS_OK; 77 } 78 79 #endif /* PRT_TASK_INTERNAL_H */ 80