/* * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved. * * UniProton is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: * http://license.coscl.org.cn/MulanPSL2 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. * Create: 2009-12-22 * Description: 任务模块的对外头文件。 */ #ifndef PRT_TASK_H #define PRT_TASK_H #include "prt_buildef.h" #include "prt_module.h" #include "prt_errno.h" #if (OS_HARDWARE_PLATFORM == OS_CORTEX_M4) #include "./hw/armv7-m/prt_task.h" #endif #ifdef __cplusplus #if __cplusplus extern "C" { #endif /* __cpluscplus */ #endif /* __cpluscplus */ /* * 任务名的最大长度。 * * 任务名的最大长度,包括结尾符'\0'。 */ #define OS_TSK_NAME_LEN 16 /* * U32类型的PID中,TCB Index占用的比特数 */ #define OS_TSK_TCB_INDEX_BITS ((4 - OS_TSK_CORE_BYTES_IN_PID) * 8) /* * 从线程PID获取核内线程handle号 */ #define GET_HANDLE(pid) ((pid) & ((1U << OS_TSK_TCB_INDEX_BITS) - 1)) /* * 硬中断核内线程handle号 */ #define OS_HWI_HANDLE ((1U << OS_TSK_TCB_INDEX_BITS) - 1) /* * 从线程PID获取核号 */ #define GET_COREID(pid) ((U8)((pid) >> OS_TSK_TCB_INDEX_BITS)) /* * 将coreid与handle组成PID, coreid:[0, OS_MAX_CORE_NUM); handle:[0, 255] */ #define COMPOSE_PID(coreid, handle) \ ((((U32)(coreid)) << OS_TSK_TCB_INDEX_BITS) + ((U8)(handle))) /* 将(coreid)与(handle)组成PID,UIPC不使用该接口 */ /* * 支持的优先级(0~31),OS系统IDLE线程使用最低优先级(31),用户不能使用。 * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_00 0 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_01 1 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_02 2 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_03 3 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_04 4 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_05 5 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_06 6 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_07 7 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_08 8 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_09 9 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_10 10 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_11 11 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_12 12 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_13 13 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_14 14 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_15 15 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_16 16 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_17 17 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_18 18 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_19 19 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_20 20 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_21 21 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_22 22 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_23 23 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_24 24 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_25 25 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_26 26 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_27 27 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_28 28 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_29 29 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_30 30 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_31 31 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_32 32 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_33 33 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_34 34 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_35 35 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_36 36 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_37 37 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_38 38 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_39 39 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_40 40 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_41 41 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_42 42 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_43 43 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_44 44 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_45 45 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_46 46 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_47 47 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_48 48 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_49 49 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_50 50 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_51 51 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_52 52 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_53 53 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_54 54 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_55 55 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_56 56 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_57 57 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_58 58 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_59 59 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_60 60 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_61 61 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_62 62 /* * 可用的任务优先级宏定义。 * */ #define OS_TSK_PRIORITY_63 63 /* * 任务或任务控制块状态标志。 * * 任务控制块未被使用。 */ #define OS_TSK_UNUSED 0x0000 /* * 任务或任务控制块状态标志。 * * 任务控制块被使用,任务被创建。 */ #define OS_TSK_INUSE 0x0001 /* * 任务或任务控制块状态标志。 * * 任务被挂起。 */ #define OS_TSK_SUSPEND 0x0004 /* * 任务或任务控制块状态标志。 * * 任务被阻塞(等待信号量)。 */ #define OS_TSK_PEND 0x0008 /* * 任务或任务控制块状态标志。 * * 任务在等待信号量或者事件的标志。 */ #define OS_TSK_TIMEOUT 0x0010 /* * 任务或任务控制块状态标志。 * * 任务被延时。 */ #define OS_TSK_DELAY 0x0020 /* * 任务或任务控制块状态标志。 * * 任务已就绪,已加入就绪队列。 */ #define OS_TSK_READY 0x0040 /* * 任务或任务控制块状态标志。 * * 任务正运行,仍在就绪队列。 */ #define OS_TSK_RUNNING 0x0080 /* * 任务或任务控制块状态标志。 * * OS_TSK_EVENT_PEND --- 任务阻塞于等待读事件。 */ #define OS_TSK_EVENT_PEND 0x0800 /* * 任务或任务控制块状态标志。 * * OS_TSK_EVENT_TYPE --- 任务读事件类型,0:ANY; 1:ALL。 */ #define OS_TSK_EVENT_TYPE 0x1000 /* * 任务或任务控制块状态标志。 * * OS_TSK_QUEUE_PEND --- 任务阻塞与等待队列。 */ #define OS_TSK_QUEUE_PEND 0x2000 /* * 任务或任务控制块状态标志。 * * OS_TSK_QUEUE_BUSY --- 队列正在读写数据。 */ #define OS_TSK_QUEUE_BUSY 0x4000 /* * 任务模块的错误码定义。 */ /* * 任务错误码:申请内存失败。 * * 值: 0x02000301 * * 解决方案: 分配更大的私有FSC内存分区 * */ #define OS_ERRNO_TSK_NO_MEMORY OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x01) /* * 任务错误码:指针参数为空。 * * 值: 0x02000302 * * 解决方案: 检查参数指针是否为NUL。 */ #define OS_ERRNO_TSK_PTR_NULL OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x02) /* * 任务错误码:任务栈大小未按16字节大小对齐。 * * 值: 0x02000303 * * 解决方案: 检查入参任务栈大小是否按16字节对齐。 */ #define OS_ERRNO_TSK_STKSZ_NOT_ALIGN OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x03) /* * 任务错误码:任务优先级非法。 * * 值: 0x02000304 * * 解决方案: 检查入参任务优先级不能大于63,其他平台不能大于31。 */ #define OS_ERRNO_TSK_PRIOR_ERROR OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x04) /* * 任务错误码:任务入口函数为空。 * * 值: 0x02000305 * * 解决方案: 检查入参任务入口函数是否为NULL。 */ #define OS_ERRNO_TSK_ENTRY_NULL OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x05) /* * 任务错误码:任务名的指针为空或任务名为空字符串。 * * 值: 0x02000306 * * 解决方案: 检查任务名指针和任务名。 */ #define OS_ERRNO_TSK_NAME_EMPTY OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x06) /* * 任务错误码:指定的任务栈空间太小。 * * 值: 0x02000307 * * 解决方案: 检查任务栈是否小于OS_TSK_MIN_STACK_SIZE。 */ #define OS_ERRNO_TSK_STKSZ_TOO_SMALL OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x07) /* * 任务错误码:任务ID非法。 * * 值: 0x02000308 * * 解决方案: 检查当前运行任务的PID是否超过任务最大数或检查用户入参任务PID是否合法。 */ #define OS_ERRNO_TSK_ID_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x08) /* * 任务错误码:任务已被挂起。 * * 值: 0x02000309 * * 解决方案: 检查所挂起任务是否为已挂起任务。 */ #define OS_ERRNO_TSK_ALREADY_SUSPENDED OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x09) /* * 任务错误码:任务未被挂起。 * * 值: 0x0200030a * * 解决方案: 检查所恢复任务是否未挂起。 */ #define OS_ERRNO_TSK_NOT_SUSPENDED OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x0a) /* * 任务错误码:任务未创建。 * * 值: 0x0200030b * * 解决方案: 检查任务是否创建。 */ #define OS_ERRNO_TSK_NOT_CREATED OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x0b) /* * 任务错误码:在锁任务的状态下删除当前任务。 * * 值: 0x0300030c * * 解决方案: 用户确保删除任务时,将任务解锁。 * */ #define OS_ERRNO_TSK_DELETE_LOCKED OS_ERRNO_BUILD_FATAL(OS_MID_TSK, 0x0c) /* * 任务错误码:在硬中断的处理中进行延时操作。 * * 值: 0x0300030d * * 解决方案: 此操作禁止在中断中进行调度。 * */ #define OS_ERRNO_TSK_DELAY_IN_INT OS_ERRNO_BUILD_FATAL(OS_MID_TSK, 0x0d) /* * 任务错误码:在锁任务的状态下进行延时操作。 * * 值: 0x0200030e * * 解决方案: 检查是否锁任务。 */ #define OS_ERRNO_TSK_DELAY_IN_LOCK OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x0e) /* * 任务错误码:任务ID不在Yield操作指定的优先级队列中。 * * 值: 0x0200030f * * 解决方案: 检查操作的任务的优先级。 */ #define OS_ERRNO_TSK_YIELD_INVALID_TASK OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x0f) /* * 任务错误码:Yield操作指定的优先级队列中,就绪任务数小于2。 * * 值: 0x02000310 * * 解决方案: 检查指定优先级就绪任务,确保就绪任务数大于1。 */ #define OS_ERRNO_TSK_YIELD_NOT_ENOUGH_TASK OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x10) /* * 任务错误码:没有可用的任务控制块资源或配置项中任务裁剪关闭。 * * 值: 0x02000311 * * 解决方案: 打开配置项中任务裁剪开关,并配置足够大的任务资源数。 */ #define OS_ERRNO_TSK_TCB_UNAVAILABLE OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x11) /* * 任务错误码:操作IDLE任务。 * * 值: 0x02000312 * * 解决方案: 检查是否操作IDLE任务。 */ #define OS_ERRNO_TSK_OPERATE_IDLE OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x12) /* * 任务错误码:在锁任务的状态下挂起当前任务。 * * 值: 0x03000313 * * 解决方案: 确保任务挂起的时候,任务已经解锁。 * */ #define OS_ERRNO_TSK_SUSPEND_LOCKED OS_ERRNO_BUILD_FATAL(OS_MID_TSK, 0x13) /* * 任务错误码:系统初始化任务激活失败。 * * 值: 0x02000314 * * 解决方案: 查看任务栈是否配置错误。 * */ #define OS_ERRNO_TSK_ACTIVE_FAILED OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x14) /* * 任务错误码:配置的任务数量太多,配置的最大任务个数不能大于254, * 总任务个数不包括Idle任务且不能为0。 * * 值: 0x02000315 * * 解决方案: 在任务配置项中将最大任务数改为小于等于254且大于0。 */ #define OS_ERRNO_TSK_MAX_NUM_NOT_SUITED OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x15) /* * 任务错误码:获取任务信息时,用户实际欲获取任务数为0。 * * 值: 0x02000316 * * 解决方案: 获取任务信息时,用户实际输入的欲获取任务数不为0。 */ #define OS_ERRNO_TSK_INPUT_NUM_ERROR OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x16) /* * 任务错误码:用户配置的任务栈首地址未16字节对齐。 * * 值: 0x02000317 * * 解决方案: 配置进来任务栈首地址需16字节对齐。 */ #define OS_ERRNO_TSK_STACKADDR_NOT_ALIGN OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x17) /* * 任务错误码:任务正在操作队列。 * * 值: 0x02000318 * * 解决方案: 让被删除的任务得到调度读取完队列数据,即可删除。 */ #define OS_ERRNO_TSK_QUEUE_DOING OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x18) /* * 任务错误码:任务退出时没有完全释放资源。 * * 值: 0x03000319 * * 解决方案: 任务退出前确保完全释放其占有的资源(如消息,互斥信号量等)。 * */ #define OS_ERRNO_TSK_EXIT_WITH_RESOURCE OS_ERRNO_BUILD_FATAL(OS_MID_TSK, 0x19) /* * 任务错误码:解锁任务之前并未上锁。 * * 值: 0x0200031a * * 解决方案: 任务上锁解锁必须配对使用,不能不加锁,直接解锁,可能导致误解锁。 */ #define OS_ERRNO_TSK_UNLOCK_NO_LOCK OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x1a) /* * 任务错误码:指定的任务栈地址太大导致任务栈初始化的时候整形溢出。 * * 值: 0x0200031b * * 解决方案: 限制任务栈地址大小,确保任务栈初始化地址不大于0xFFFFFFFF。 */ #define OS_ERRNO_TSK_STACKADDR_TOO_BIG OS_ERRNO_BUILD_ERROR(OS_MID_TSK, 0x1b) /* * 任务ID的类型定义。 */ typedef U32 TskHandle; /* * 任务优先级的类型定义。 */ typedef U16 TskPrior; /* * 任务状态的类型定义。 */ typedef U16 TskStatus; /* * 任务信息结构体 */ struct TskInfo { /* 任务切换时的SP */ uintptr_t sp; /* 任务切换时的PC */ uintptr_t pc; /* 任务状态 */ TskStatus taskStatus; /* 任务优先级 */ TskPrior taskPrio; /* 任务栈的大小 */ U32 stackSize; /* 任务栈的栈顶 */ uintptr_t topOfStack; /* 任务名 */ char name[OS_TSK_NAME_LEN]; /* 任务入口函数 */ void *entry; /* 任务控制块地址 */ void *tcbAddr; /* 栈底 */ uintptr_t bottom; /* 栈当前使用的大小 */ U32 currUsed; /* 栈使用的历史峰值 */ U32 peakUsed; /* 栈是否溢出 */ bool ovf; /* 任务上下文 */ struct TskContext context; }; /* * 任务模块配置信息的结构体定义。 * * 保存任务模块的配置项信息。 */ struct TskModInfo { /* 最大支持的任务数 */ U32 maxNum; /* 缺省的任务栈大小 */ U32 defaultSize; /* Idle任务的任务栈大小 */ U32 idleStackSize; /* 任务栈初始化魔术字 */ U32 magicWord; }; /* * @brief 任务入口函数类型定义。 * * @par 描述 * 用户通过任务入口函数类型定义任务入口函数,在任务创建触发之后调用该函数进行任务执行。 * @attention 无。 * * @param param1 [IN] 类型#uintptr_t,传递给任务处理函数的第一个参数。 * @param param2 [IN] 类型#uintptr_t,传递给任务处理函数的第二个参数。 * @param param3 [IN] 类型#uintptr_t,传递给任务处理函数的第三个参数。 * @param param4 [IN] 类型#uintptr_t,传递给任务处理函数的第四个参数。 * * @retval 无。 * @par 依赖 *