X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=Include%2Fvos_task.h;fp=Include%2Fvos_task.h;h=23c077b0e646c99bdce12e053e65fa7b1b05565e;hb=1f71b9a76eacf92b39c1ce6f782f8404a34f60a9;hp=0000000000000000000000000000000000000000;hpb=254694245736881ecfff4eb0d1503bf3f49a21be;p=scp%2Focu%2F5gnr.git diff --git a/Include/vos_task.h b/Include/vos_task.h new file mode 100644 index 0000000..23c077b --- /dev/null +++ b/Include/vos_task.h @@ -0,0 +1,315 @@ +/****************************************************************************** +############################################################################### +# Copyright (c) [2017-2020] [ICT/CAS] # +# Licensed under the ORAN Software License v1.0 (License) # +############################################################################### +******************************************************************************/ + + +#ifndef __VOS_TASK_H__ +#define __VOS_TASK_H__ + +#include "vos_types.h" +#include "vos_module.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/** VOS任务的参数个数. */ +#define VOS_MAX_TASK_ARGS 10 + +/** 任务的缺省栈大小. */ +#define VOS_DEFAULT_STACKSIZE __VOS_DEFAULT_STACKSIZE + +/** 任务入口定义宏. */ +#define DECLARE_VOS_TASK(VOS_TASK_ENTRY)\ + VOID VOS_TASK_ENTRY(\ + ULONG ulArg1, ULONG ulArg2,\ + ULONG ulArg3, ULONG ulArg4,\ + ULONG ulArg5, ULONG ulArg6,\ + ULONG ulArg7, ULONG ulArg8,\ + ULONG ulArg9, ULONG ulArg10\ + ) + +/** 任务优先级枚举值,创建任务时请使用下面的枚举值,不要用立即数. */ +typedef enum VOS_task_pri_s +{ + TASK_PRIORITY_TIME_CRITICAL = __TASK_PRIORITY_TIME_CRITICAL, + TASK_PRIORITY_HIGHEST = __TASK_PRIORITY_HIGHEST, + TASK_PRIORITY_HIGHER = __TASK_PRIORITY_HIGHER, + TASK_PRIORITY_HIGH = __TASK_PRIORITY_HIGH, + TASK_PRIORITY_ABOVE_NORMAL = __TASK_PRIORITY_ABOVE_NORMAL, + TASK_PRIORITY_NORMAL = __TASK_PRIORITY_NORMAL, + TASK_PRIORITY_BELOW_NORMAL = __TASK_PRIORITY_BELOW_NORMAL, + TASK_PRIORITY_LOWEST = __TASK_PRIORITY_LOWEST, + TASK_PRIORITY_IDLE = __TASK_PRIORITY_IDLE, +}VOS_task_pri_t; + +typedef VOS_msg_code_handler_ptr VOS_user_task_entry; + + +/** 用户任务结构体 */ +typedef struct VOS_user_task_s +{ + CHAR userTaskName[VOS_NAME_MAX_LENGTH]; ///< 用户任务名 + VOS_user_task_entry userTaskEntry; ///< 用户任务入口 + ULONG moduleID; ///< 用于 VOS_Malloc 的第二个参数 +}VOS_user_task_t; + + +/** 任务入口函数类型. */ +typedef VOID (*VOS_TASK_ENTRY)( ULONG pArg1, ULONG pArg2, ULONG pArg3, + ULONG pArg4, ULONG pArg5, ULONG pArg6, + ULONG pArg7, ULONG pArg8, ULONG pArg9, + ULONG pArg10 ); + +/** + * 任务创建 宏, + * 该宏 会创建一个线程,栈大小为 VOS_DEFAULT_STACKSIZE 。 + * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH + * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值 + * @param[in] pfEntry 任务入口函数, 原型为VOS_TASK_ENTRY,10个ULONG 参数,无返回值 + 定义时使用宏DECLARE_VOS_TASK定义,eg:DECLARE_VOS_TASK(task1){ .... } + * @param[in] lTaskArg 传给任务入口函数的参数,类型为ULONG pArgs[10] + * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL + */ +#define VOS_TaskCreate( taskName, lPriority, pfEntry, lTaskArg )\ + VOS_TaskCreate_Ex_X( taskName, pfEntry, #pfEntry, (ULONG)(lPriority), VOS_DEFAULT_STACKSIZE, (ULONG *)(lTaskArg) ) + +/** + * 任务创建 宏, + * 该宏 会创建一个线程。 + * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH + * @param[in] pfEntry 任务入口函数, 原型为VOS_TASK_ENTRY,10个ULONG 参数,无返回值 + 定义时使用宏DECLARE_VOS_TASK定义,eg:DECLARE_VOS_TASK(task1){ .... } + * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值 + * @param[in] ulStackSize 栈大小 + * @param[in] lTaskArg 传给任务入口函数的参数,类型为ULONG pArgs[10] + * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL + */ +#define VOS_TaskCreateEx( taskName, pfEntry, lPriority, ulStackSize, lTaskArg )\ + VOS_TaskCreate_Ex_X( taskName, pfEntry, #pfEntry, lPriority, ulStackSize, lTaskArg ) + + +/** + * 任务延时 宏, + * 当前任务睡眠一定的时间. + * @param[in] lMsec 延时时间,毫秒 + * @return VOS_OK - 成功,其他 - 失败 + */ +#define VOS_TaskDelay( lMsec )\ + (LONG)VOS_TaskDelay_Ex_X( (lMsec), __FILE__, __LINE__ ) + + +/** + * 任务删除 API, + * 将指定任务删除 。 + * @param[in] hTaskHandle 任务创建时返回的任务句柄 + * @param[in] ulExitCode 任务退出码,仅在windows系统中有效,其他传 0 即可 + * @return VOS_OK - 成功,其他 - 失败 + */ +LONG VOS_TaskTerminate( VOS_HANDLE hTaskHandle, ULONG ulExitCode ); + +/** + * 将任务信息注册到vos task,在任务入口的最开始调用。main函数则在调用VOS_init()后调用 + * @return VOS_OK - 成功,其他 - 失败 + */ +LONG VOS_TaskInfoAttach(void); + +/** +* 得到当前VOS任务句柄 +* @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL +*/ +VOS_HANDLE VOS_GetCurrentTask( VOID ); + + +/** + * 获得任务优先级 + * + * @param[in] hTaskHandle 任务创建时返回的任务句柄 + * @param[out] pPrio 任务优先级 + * @return VOS_OK - 成功,其他 - 失败 + */ +LONG VOS_TaskGetPriority( VOS_HANDLE hTaskHandle, ULONG *pPrio ); + + +/** + * 设置任务优先级 + * + * @param[in] hTaskHandle 任务创建时返回的任务句柄 + * @param[in] ulnewPrio 任务优先级 + * @return VOS_OK - 成功,其他 - 失败 + */ +LONG VOS_TaskSetPriority( VOS_HANDLE hTaskHandle, ULONG ulnewPrio ); + + +/** + * 获取当前任务的名字. + * + * @param[out] szTaskName 任务名,长度 VOS_NAME_MAX_LENGTH + * @return VOS_OK - 成功,其他 - 失败 + */ +LONG VOS_GetCurrentTaskName( CHAR szTaskName[VOS_NAME_MAX_LENGTH] ); + + +/** + * 判断任务句柄是否有效. + * + * @param[in] hTaskHandle 任务句柄 + * @return 有效返回真,否则返回假 + */ +BOOL VOS_TaskHandleVerify( VOS_HANDLE hTaskHandle ); + + +/** + * 创建宿主任务,宿主任务可以绑定多个用户任务(回调函数),栈大小为 VOS_DEFAULT_STACKSIZE。 + * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH + * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值 + * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL + */ +#define VOS_TaskHostCreate( taskName, lPriority )\ + VOS_TaskHostCreate_Ex_X( taskName, lPriority, VOS_DEFAULT_STACKSIZE) + +/** + * 创建宿主任务,宿主任务可以绑定多个用户任务(回调函数)。 + * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH + * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值 + * @param[in] ulStackSize 栈大小 + * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL + */ +#define VOS_TaskHostCreateEx( taskName, lPriority, ulStackSize )\ + VOS_TaskHostCreate_Ex_X( taskName, lPriority, ulStackSize ) + + + +/** + * 删除宿主任务,同时该宿主任务下的用户任务将被全部删除 + * + * @param[in ] szTaskName 宿主任务名 + * @param[in ] ulExitCode 退出码(暂未使用,填0即可) + * @return VOS_OK - 成功,其他 - 失败 + */ +LONG VOS_TaskHostTerminate(CHAR szTaskName[VOS_NAME_MAX_LENGTH], ULONG ulExitCode); + + +/** + * 向宿主任务中添加用户任务(回调函数)。 + * + * @param[in ] hostTaskName 宿主任务名 + * @param[in ] userTask 用户任务 + * @return VOS_OK - 成功,其他 - 失败 + */ +LONG VOS_UserTaskAttach(CHAR hostTaskName[VOS_NAME_MAX_LENGTH],VOS_user_task_t *userTask); + + +/** + * 从宿主任务中删除用户任务(回调函数)。 + * + * @param[in ] hostTaskName 宿主任务名 + * @param[in ] userTaskName 用户任务 + * @return VOS_OK - 成功,其他 - 失败 + */ +LONG VOS_UserTaskDetach(CHAR hostTaskName[VOS_NAME_MAX_LENGTH],CHAR userTaskName[VOS_NAME_MAX_LENGTH]); + + + +/** + * 设置任务的CPU亲和性 + * + * @param[in ] taskName 任务名(包含宿主任务,不包含用户任务) + * @param[in ] size CPU个数 + * @param[in ] cpus CPU ID 数组 + * @return VOS_OK - 成功,其他 - 失败 + */ +LONG VOS_TaskAffinitySet(CHAR taskName[VOS_NAME_MAX_LENGTH],LONG size,LONG cpus[]); + + +/** + * 获取任务的CPU亲和性,如果实际CPU个数超过cpus数组大小,则只返回size个cpu ID,返回值为 VOS_ERROR_BAD_ARGUMENTS + * + * @param[in ] taskName 任务名(包含宿主任务,不包含用户任务) + * @param[in ] size cpus数组大小 + * @param[out] size cpus数组有效值个数 + * @param[in ] cpus CPU ID 数组 + * @return VOS_OK - 成功,其他 - 失败 + */ +LONG VOS_TaskAffinityGet(CHAR taskName[VOS_NAME_MAX_LENGTH],LONG *size,LONG cpus[]); + + + +/*=========================================================================================================================*/ +/* ###### 下面的函数不要直接调用,使用上面提供的宏 ###### */ + +/** +* 任务创建 API,不要直接使用,通过 VOS_TaskCreate 宏使用 +* 该API会创建一个线程,栈大小为 VOS_DEFAULT_STACKSIZE 。 +* @param[in] szTaskName 任务名,长度为 VOS_NAME_MAX_LENGTH +* @param[in] pfnFunc 任务入口函数, 原型为VOS_TASK_ENTRY,10个ULONG 参数,无返回值 +* @param[in] szFuncName 任务入口函数名 +* @param[in] ulStartPriority 优先级,使用 VOS_task_pri_t 枚举值 +* @param[in] ulStackSize 栈大小 +* @param[in] pArgs 传给任务入口函数的参数,类型为ULONG pArgs[10] +* @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL +*/ +VOS_HANDLE VOS_TaskCreate_Ex_X( CHAR szTaskName[VOS_NAME_MAX_LENGTH], + VOS_TASK_ENTRY pfnFunc, + CHAR *szFuncName, + ULONG ulStartPriority, + ULONG ulStackSize, + ULONG pArgs[VOS_MAX_TASK_ARGS]); + +/** +* 任务延时 API,不要直接使用,通过 VOS_TaskDelay 宏使用 +* 当前任务睡眠一定的时间. +* @param[in] lMsec 延时时间,毫秒 +* @param[in] szFileName 调用者的文件 +* @param[in] iLine 调用者的行号 +* @return VOS_OK - 成功,其他 - 失败 +*/ +LONG VOS_TaskDelay_Ex_X( ULONG lMsec, CHAR *szFileName, INT iLine ); + + +/** + * 创建宿主任务,不要直接使用,通过 VOS_TaskHostCreate 宏使用,宿主任务可以绑定多个用户任务(回调函数)。 + * + * @param[in] szTaskName 任务名,长度为 VOS_NAME_MAX_LENGTH + * @param[in] ulStartPriority 优先级,使用 VOS_task_pri_t 枚举值 + * @param[in] ulStackSize 栈大小 + * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL + */ +VOS_HANDLE VOS_TaskHostCreate_Ex_X( CHAR szTaskName[VOS_NAME_MAX_LENGTH], + ULONG ulStartPriority, + ULONG ulStackSize); + + +/** + * 获得当前任务的进程ID(PID) + * + * @return 返回进程ID(PID) + */ +ULONG VOS_TaskSelfGetPID(void); + + +/** + * 获得当前任务的线程ID(SPID) + * + * @return 返回线程ID(SPID) + */ +ULONG VOS_TaskSelfGetSPID(void); + + +/** + * 获得当前任务的线程ID(thread ID) + * + * @return 返回线程ID(thread ID) + */ +ULONG VOS_TaskSelfThreadID(void); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __VOS_TASK_H__ */