1 /******************************************************************************
2 ###############################################################################
3 # Copyright (c) [2017-2020] [ICT/CAS] #
4 # Licensed under the ORAN Software License v1.0 (License) #
5 ###############################################################################
6 ******************************************************************************/
10 #define __VOS_TASK_H__
12 #include "vos_types.h"
13 #include "vos_module.h"
18 #endif /* __cplusplus */
21 #define VOS_MAX_TASK_ARGS 10
24 #define VOS_DEFAULT_STACKSIZE __VOS_DEFAULT_STACKSIZE
27 #define DECLARE_VOS_TASK(VOS_TASK_ENTRY)\
29 ULONG ulArg1, ULONG ulArg2,\
30 ULONG ulArg3, ULONG ulArg4,\
31 ULONG ulArg5, ULONG ulArg6,\
32 ULONG ulArg7, ULONG ulArg8,\
33 ULONG ulArg9, ULONG ulArg10\
36 /** 任务优先级枚举值,创建任务时请使用下面的枚举值,不要用立即数. */
37 typedef enum VOS_task_pri_s
39 TASK_PRIORITY_TIME_CRITICAL = __TASK_PRIORITY_TIME_CRITICAL,
40 TASK_PRIORITY_HIGHEST = __TASK_PRIORITY_HIGHEST,
41 TASK_PRIORITY_HIGHER = __TASK_PRIORITY_HIGHER,
42 TASK_PRIORITY_HIGH = __TASK_PRIORITY_HIGH,
43 TASK_PRIORITY_ABOVE_NORMAL = __TASK_PRIORITY_ABOVE_NORMAL,
44 TASK_PRIORITY_NORMAL = __TASK_PRIORITY_NORMAL,
45 TASK_PRIORITY_BELOW_NORMAL = __TASK_PRIORITY_BELOW_NORMAL,
46 TASK_PRIORITY_LOWEST = __TASK_PRIORITY_LOWEST,
47 TASK_PRIORITY_IDLE = __TASK_PRIORITY_IDLE,
50 typedef VOS_msg_code_handler_ptr VOS_user_task_entry;
54 typedef struct VOS_user_task_s
56 CHAR userTaskName[VOS_NAME_MAX_LENGTH]; ///< 用户任务名
57 VOS_user_task_entry userTaskEntry; ///< 用户任务入口
58 ULONG moduleID; ///< 用于 VOS_Malloc 的第二个参数
63 typedef VOID (*VOS_TASK_ENTRY)( ULONG pArg1, ULONG pArg2, ULONG pArg3,
64 ULONG pArg4, ULONG pArg5, ULONG pArg6,
65 ULONG pArg7, ULONG pArg8, ULONG pArg9,
70 * 该宏 会创建一个线程,栈大小为 VOS_DEFAULT_STACKSIZE 。
71 * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH
72 * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值
73 * @param[in] pfEntry 任务入口函数, 原型为VOS_TASK_ENTRY,10个ULONG 参数,无返回值
74 定义时使用宏DECLARE_VOS_TASK定义,eg:DECLARE_VOS_TASK(task1){ .... }
75 * @param[in] lTaskArg 传给任务入口函数的参数,类型为ULONG pArgs[10]
76 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
78 #define VOS_TaskCreate( taskName, lPriority, pfEntry, lTaskArg )\
79 VOS_TaskCreate_Ex_X( taskName, pfEntry, #pfEntry, (ULONG)(lPriority), VOS_DEFAULT_STACKSIZE, (ULONG *)(lTaskArg) )
84 * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH
85 * @param[in] pfEntry 任务入口函数, 原型为VOS_TASK_ENTRY,10个ULONG 参数,无返回值
86 定义时使用宏DECLARE_VOS_TASK定义,eg:DECLARE_VOS_TASK(task1){ .... }
87 * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值
88 * @param[in] ulStackSize 栈大小
89 * @param[in] lTaskArg 传给任务入口函数的参数,类型为ULONG pArgs[10]
90 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
92 #define VOS_TaskCreateEx( taskName, pfEntry, lPriority, ulStackSize, lTaskArg )\
93 VOS_TaskCreate_Ex_X( taskName, pfEntry, #pfEntry, lPriority, ulStackSize, lTaskArg )
99 * @param[in] lMsec 延时时间,毫秒
100 * @return VOS_OK - 成功,其他 - 失败
102 #define VOS_TaskDelay( lMsec )\
103 (LONG)VOS_TaskDelay_Ex_X( (lMsec), __FILE__, __LINE__ )
109 * @param[in] hTaskHandle 任务创建时返回的任务句柄
110 * @param[in] ulExitCode 任务退出码,仅在windows系统中有效,其他传 0 即可
111 * @return VOS_OK - 成功,其他 - 失败
113 LONG VOS_TaskTerminate( VOS_HANDLE hTaskHandle, ULONG ulExitCode );
116 * 将任务信息注册到vos task,在任务入口的最开始调用。main函数则在调用VOS_init()后调用
117 * @return VOS_OK - 成功,其他 - 失败
119 LONG VOS_TaskInfoAttach(void);
123 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
125 VOS_HANDLE VOS_GetCurrentTask( VOID );
131 * @param[in] hTaskHandle 任务创建时返回的任务句柄
132 * @param[out] pPrio 任务优先级
133 * @return VOS_OK - 成功,其他 - 失败
135 LONG VOS_TaskGetPriority( VOS_HANDLE hTaskHandle, ULONG *pPrio );
141 * @param[in] hTaskHandle 任务创建时返回的任务句柄
142 * @param[in] ulnewPrio 任务优先级
143 * @return VOS_OK - 成功,其他 - 失败
145 LONG VOS_TaskSetPriority( VOS_HANDLE hTaskHandle, ULONG ulnewPrio );
151 * @param[out] szTaskName 任务名,长度 VOS_NAME_MAX_LENGTH
152 * @return VOS_OK - 成功,其他 - 失败
154 LONG VOS_GetCurrentTaskName( CHAR szTaskName[VOS_NAME_MAX_LENGTH] );
160 * @param[in] hTaskHandle 任务句柄
161 * @return 有效返回真,否则返回假
163 BOOL VOS_TaskHandleVerify( VOS_HANDLE hTaskHandle );
167 * 创建宿主任务,宿主任务可以绑定多个用户任务(回调函数),栈大小为 VOS_DEFAULT_STACKSIZE。
168 * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH
169 * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值
170 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
172 #define VOS_TaskHostCreate( taskName, lPriority )\
173 VOS_TaskHostCreate_Ex_X( taskName, lPriority, VOS_DEFAULT_STACKSIZE)
176 * 创建宿主任务,宿主任务可以绑定多个用户任务(回调函数)。
177 * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH
178 * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值
179 * @param[in] ulStackSize 栈大小
180 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
182 #define VOS_TaskHostCreateEx( taskName, lPriority, ulStackSize )\
183 VOS_TaskHostCreate_Ex_X( taskName, lPriority, ulStackSize )
188 * 删除宿主任务,同时该宿主任务下的用户任务将被全部删除
190 * @param[in ] szTaskName 宿主任务名
191 * @param[in ] ulExitCode 退出码(暂未使用,填0即可)
192 * @return VOS_OK - 成功,其他 - 失败
194 LONG VOS_TaskHostTerminate(CHAR szTaskName[VOS_NAME_MAX_LENGTH], ULONG ulExitCode);
198 * 向宿主任务中添加用户任务(回调函数)。
200 * @param[in ] hostTaskName 宿主任务名
201 * @param[in ] userTask 用户任务
202 * @return VOS_OK - 成功,其他 - 失败
204 LONG VOS_UserTaskAttach(CHAR hostTaskName[VOS_NAME_MAX_LENGTH],VOS_user_task_t *userTask);
208 * 从宿主任务中删除用户任务(回调函数)。
210 * @param[in ] hostTaskName 宿主任务名
211 * @param[in ] userTaskName 用户任务
212 * @return VOS_OK - 成功,其他 - 失败
214 LONG VOS_UserTaskDetach(CHAR hostTaskName[VOS_NAME_MAX_LENGTH],CHAR userTaskName[VOS_NAME_MAX_LENGTH]);
221 * @param[in ] taskName 任务名(包含宿主任务,不包含用户任务)
222 * @param[in ] size CPU个数
223 * @param[in ] cpus CPU ID 数组
224 * @return VOS_OK - 成功,其他 - 失败
226 LONG VOS_TaskAffinitySet(CHAR taskName[VOS_NAME_MAX_LENGTH],LONG size,LONG cpus[]);
230 * 获取任务的CPU亲和性,如果实际CPU个数超过cpus数组大小,则只返回size个cpu ID,返回值为 VOS_ERROR_BAD_ARGUMENTS
232 * @param[in ] taskName 任务名(包含宿主任务,不包含用户任务)
233 * @param[in ] size cpus数组大小
234 * @param[out] size cpus数组有效值个数
235 * @param[in ] cpus CPU ID 数组
236 * @return VOS_OK - 成功,其他 - 失败
238 LONG VOS_TaskAffinityGet(CHAR taskName[VOS_NAME_MAX_LENGTH],LONG *size,LONG cpus[]);
242 /*=========================================================================================================================*/
243 /* ###### 下面的函数不要直接调用,使用上面提供的宏 ###### */
246 * 任务创建 API,不要直接使用,通过 VOS_TaskCreate 宏使用
247 * 该API会创建一个线程,栈大小为 VOS_DEFAULT_STACKSIZE 。
248 * @param[in] szTaskName 任务名,长度为 VOS_NAME_MAX_LENGTH
249 * @param[in] pfnFunc 任务入口函数, 原型为VOS_TASK_ENTRY,10个ULONG 参数,无返回值
250 * @param[in] szFuncName 任务入口函数名
251 * @param[in] ulStartPriority 优先级,使用 VOS_task_pri_t 枚举值
252 * @param[in] ulStackSize 栈大小
253 * @param[in] pArgs 传给任务入口函数的参数,类型为ULONG pArgs[10]
254 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
256 VOS_HANDLE VOS_TaskCreate_Ex_X( CHAR szTaskName[VOS_NAME_MAX_LENGTH],
257 VOS_TASK_ENTRY pfnFunc,
259 ULONG ulStartPriority,
261 ULONG pArgs[VOS_MAX_TASK_ARGS]);
264 * 任务延时 API,不要直接使用,通过 VOS_TaskDelay 宏使用
266 * @param[in] lMsec 延时时间,毫秒
267 * @param[in] szFileName 调用者的文件
268 * @param[in] iLine 调用者的行号
269 * @return VOS_OK - 成功,其他 - 失败
271 LONG VOS_TaskDelay_Ex_X( ULONG lMsec, CHAR *szFileName, INT iLine );
275 * 创建宿主任务,不要直接使用,通过 VOS_TaskHostCreate 宏使用,宿主任务可以绑定多个用户任务(回调函数)。
277 * @param[in] szTaskName 任务名,长度为 VOS_NAME_MAX_LENGTH
278 * @param[in] ulStartPriority 优先级,使用 VOS_task_pri_t 枚举值
279 * @param[in] ulStackSize 栈大小
280 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
282 VOS_HANDLE VOS_TaskHostCreate_Ex_X( CHAR szTaskName[VOS_NAME_MAX_LENGTH],
283 ULONG ulStartPriority,
290 * @return 返回进程ID(PID)
292 ULONG VOS_TaskSelfGetPID(void);
298 * @return 返回线程ID(SPID)
300 ULONG VOS_TaskSelfGetSPID(void);
304 * 获得当前任务的线程ID(thread ID)
306 * @return 返回线程ID(thread ID)
308 ULONG VOS_TaskSelfThreadID(void);
313 #endif /* __cplusplus */
315 #endif /* __VOS_TASK_H__ */