1 /******************************************************************************
3 * Copyright (c) 2020 ICT/CAS.
5 * Licensed under the O-RAN Software License, Version 1.0 (the "Software License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * https://www.o-ran.org/software
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 *******************************************************************************/
21 #ifndef __VOS_TASK_H__
22 #define __VOS_TASK_H__
24 #include "vos_types.h"
25 #include "vos_module.h"
30 #endif /* __cplusplus */
33 #define VOS_MAX_TASK_ARGS 10
36 #define VOS_DEFAULT_STACKSIZE __VOS_DEFAULT_STACKSIZE
39 #define DECLARE_VOS_TASK(VOS_TASK_ENTRY)\
41 ULONG ulArg1, ULONG ulArg2,\
42 ULONG ulArg3, ULONG ulArg4,\
43 ULONG ulArg5, ULONG ulArg6,\
44 ULONG ulArg7, ULONG ulArg8,\
45 ULONG ulArg9, ULONG ulArg10\
48 /** 任务优先级枚举值,创建任务时请使用下面的枚举值,不要用立即数. */
49 typedef enum VOS_task_pri_s
51 TASK_PRIORITY_TIME_CRITICAL = __TASK_PRIORITY_TIME_CRITICAL,
52 TASK_PRIORITY_HIGHEST = __TASK_PRIORITY_HIGHEST,
53 TASK_PRIORITY_HIGHER = __TASK_PRIORITY_HIGHER,
54 TASK_PRIORITY_HIGH = __TASK_PRIORITY_HIGH,
55 TASK_PRIORITY_ABOVE_NORMAL = __TASK_PRIORITY_ABOVE_NORMAL,
56 TASK_PRIORITY_NORMAL = __TASK_PRIORITY_NORMAL,
57 TASK_PRIORITY_BELOW_NORMAL = __TASK_PRIORITY_BELOW_NORMAL,
58 TASK_PRIORITY_LOWEST = __TASK_PRIORITY_LOWEST,
59 TASK_PRIORITY_IDLE = __TASK_PRIORITY_IDLE,
62 typedef VOS_msg_code_handler_ptr VOS_user_task_entry;
66 typedef struct VOS_user_task_s
68 CHAR userTaskName[VOS_NAME_MAX_LENGTH]; ///< 用户任务名
69 VOS_user_task_entry userTaskEntry; ///< 用户任务入口
70 ULONG moduleID; ///< 用于 VOS_Malloc 的第二个参数
75 typedef VOID (*VOS_TASK_ENTRY)( ULONG pArg1, ULONG pArg2, ULONG pArg3,
76 ULONG pArg4, ULONG pArg5, ULONG pArg6,
77 ULONG pArg7, ULONG pArg8, ULONG pArg9,
82 * 该宏 会创建一个线程,栈大小为 VOS_DEFAULT_STACKSIZE 。
83 * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH
84 * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值
85 * @param[in] pfEntry 任务入口函数, 原型为VOS_TASK_ENTRY,10个ULONG 参数,无返回值
86 定义时使用宏DECLARE_VOS_TASK定义,eg:DECLARE_VOS_TASK(task1){ .... }
87 * @param[in] lTaskArg 传给任务入口函数的参数,类型为ULONG pArgs[10]
88 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
90 #define VOS_TaskCreate( taskName, lPriority, pfEntry, lTaskArg )\
91 VOS_TaskCreate_Ex_X( taskName, pfEntry, #pfEntry, (ULONG)(lPriority), VOS_DEFAULT_STACKSIZE, (ULONG *)(lTaskArg) )
96 * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH
97 * @param[in] pfEntry 任务入口函数, 原型为VOS_TASK_ENTRY,10个ULONG 参数,无返回值
98 定义时使用宏DECLARE_VOS_TASK定义,eg:DECLARE_VOS_TASK(task1){ .... }
99 * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值
100 * @param[in] ulStackSize 栈大小
101 * @param[in] lTaskArg 传给任务入口函数的参数,类型为ULONG pArgs[10]
102 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
104 #define VOS_TaskCreateEx( taskName, pfEntry, lPriority, ulStackSize, lTaskArg )\
105 VOS_TaskCreate_Ex_X( taskName, pfEntry, #pfEntry, lPriority, ulStackSize, lTaskArg )
111 * @param[in] lMsec 延时时间,毫秒
112 * @return VOS_OK - 成功,其他 - 失败
114 #define VOS_TaskDelay( lMsec )\
115 (LONG)VOS_TaskDelay_Ex_X( (lMsec), __FILE__, __LINE__ )
121 * @param[in] hTaskHandle 任务创建时返回的任务句柄
122 * @param[in] ulExitCode 任务退出码,仅在windows系统中有效,其他传 0 即可
123 * @return VOS_OK - 成功,其他 - 失败
125 LONG VOS_TaskTerminate( VOS_HANDLE hTaskHandle, ULONG ulExitCode );
128 * 将任务信息注册到vos task,在任务入口的最开始调用。main函数则在调用VOS_init()后调用
129 * @return VOS_OK - 成功,其他 - 失败
131 LONG VOS_TaskInfoAttach(void);
135 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
137 VOS_HANDLE VOS_GetCurrentTask( VOID );
143 * @param[in] hTaskHandle 任务创建时返回的任务句柄
144 * @param[out] pPrio 任务优先级
145 * @return VOS_OK - 成功,其他 - 失败
147 LONG VOS_TaskGetPriority( VOS_HANDLE hTaskHandle, ULONG *pPrio );
153 * @param[in] hTaskHandle 任务创建时返回的任务句柄
154 * @param[in] ulnewPrio 任务优先级
155 * @return VOS_OK - 成功,其他 - 失败
157 LONG VOS_TaskSetPriority( VOS_HANDLE hTaskHandle, ULONG ulnewPrio );
163 * @param[out] szTaskName 任务名,长度 VOS_NAME_MAX_LENGTH
164 * @return VOS_OK - 成功,其他 - 失败
166 LONG VOS_GetCurrentTaskName( CHAR szTaskName[VOS_NAME_MAX_LENGTH] );
172 * @param[in] hTaskHandle 任务句柄
173 * @return 有效返回真,否则返回假
175 BOOL VOS_TaskHandleVerify( VOS_HANDLE hTaskHandle );
179 * 创建宿主任务,宿主任务可以绑定多个用户任务(回调函数),栈大小为 VOS_DEFAULT_STACKSIZE。
180 * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH
181 * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值
182 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
184 #define VOS_TaskHostCreate( taskName, lPriority )\
185 VOS_TaskHostCreate_Ex_X( taskName, lPriority, VOS_DEFAULT_STACKSIZE)
188 * 创建宿主任务,宿主任务可以绑定多个用户任务(回调函数)。
189 * @param[in] taskName 任务名,长度为 VOS_NAME_MAX_LENGTH
190 * @param[in] lPriority 优先级,使用 VOS_task_pri_t 枚举值
191 * @param[in] ulStackSize 栈大小
192 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
194 #define VOS_TaskHostCreateEx( taskName, lPriority, ulStackSize )\
195 VOS_TaskHostCreate_Ex_X( taskName, lPriority, ulStackSize )
200 * 删除宿主任务,同时该宿主任务下的用户任务将被全部删除
202 * @param[in ] szTaskName 宿主任务名
203 * @param[in ] ulExitCode 退出码(暂未使用,填0即可)
204 * @return VOS_OK - 成功,其他 - 失败
206 LONG VOS_TaskHostTerminate(CHAR szTaskName[VOS_NAME_MAX_LENGTH], ULONG ulExitCode);
210 * 向宿主任务中添加用户任务(回调函数)。
212 * @param[in ] hostTaskName 宿主任务名
213 * @param[in ] userTask 用户任务
214 * @return VOS_OK - 成功,其他 - 失败
216 LONG VOS_UserTaskAttach(CHAR hostTaskName[VOS_NAME_MAX_LENGTH],VOS_user_task_t *userTask);
220 * 从宿主任务中删除用户任务(回调函数)。
222 * @param[in ] hostTaskName 宿主任务名
223 * @param[in ] userTaskName 用户任务
224 * @return VOS_OK - 成功,其他 - 失败
226 LONG VOS_UserTaskDetach(CHAR hostTaskName[VOS_NAME_MAX_LENGTH],CHAR userTaskName[VOS_NAME_MAX_LENGTH]);
233 * @param[in ] taskName 任务名(包含宿主任务,不包含用户任务)
234 * @param[in ] size CPU个数
235 * @param[in ] cpus CPU ID 数组
236 * @return VOS_OK - 成功,其他 - 失败
238 LONG VOS_TaskAffinitySet(CHAR taskName[VOS_NAME_MAX_LENGTH],LONG size,LONG cpus[]);
242 * 获取任务的CPU亲和性,如果实际CPU个数超过cpus数组大小,则只返回size个cpu ID,返回值为 VOS_ERROR_BAD_ARGUMENTS
244 * @param[in ] taskName 任务名(包含宿主任务,不包含用户任务)
245 * @param[in ] size cpus数组大小
246 * @param[out] size cpus数组有效值个数
247 * @param[in ] cpus CPU ID 数组
248 * @return VOS_OK - 成功,其他 - 失败
250 LONG VOS_TaskAffinityGet(CHAR taskName[VOS_NAME_MAX_LENGTH],LONG *size,LONG cpus[]);
254 /*=========================================================================================================================*/
255 /* ###### 下面的函数不要直接调用,使用上面提供的宏 ###### */
258 * 任务创建 API,不要直接使用,通过 VOS_TaskCreate 宏使用
259 * 该API会创建一个线程,栈大小为 VOS_DEFAULT_STACKSIZE 。
260 * @param[in] szTaskName 任务名,长度为 VOS_NAME_MAX_LENGTH
261 * @param[in] pfnFunc 任务入口函数, 原型为VOS_TASK_ENTRY,10个ULONG 参数,无返回值
262 * @param[in] szFuncName 任务入口函数名
263 * @param[in] ulStartPriority 优先级,使用 VOS_task_pri_t 枚举值
264 * @param[in] ulStackSize 栈大小
265 * @param[in] pArgs 传给任务入口函数的参数,类型为ULONG pArgs[10]
266 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
268 VOS_HANDLE VOS_TaskCreate_Ex_X( CHAR szTaskName[VOS_NAME_MAX_LENGTH],
269 VOS_TASK_ENTRY pfnFunc,
271 ULONG ulStartPriority,
273 ULONG pArgs[VOS_MAX_TASK_ARGS]);
276 * 任务延时 API,不要直接使用,通过 VOS_TaskDelay 宏使用
278 * @param[in] lMsec 延时时间,毫秒
279 * @param[in] szFileName 调用者的文件
280 * @param[in] iLine 调用者的行号
281 * @return VOS_OK - 成功,其他 - 失败
283 LONG VOS_TaskDelay_Ex_X( ULONG lMsec, CHAR *szFileName, INT iLine );
287 * 创建宿主任务,不要直接使用,通过 VOS_TaskHostCreate 宏使用,宿主任务可以绑定多个用户任务(回调函数)。
289 * @param[in] szTaskName 任务名,长度为 VOS_NAME_MAX_LENGTH
290 * @param[in] ulStartPriority 优先级,使用 VOS_task_pri_t 枚举值
291 * @param[in] ulStackSize 栈大小
292 * @return 成功返回VOS_HANDLE 类型的任务句柄,失败返回NULL
294 VOS_HANDLE VOS_TaskHostCreate_Ex_X( CHAR szTaskName[VOS_NAME_MAX_LENGTH],
295 ULONG ulStartPriority,
302 * @return 返回进程ID(PID)
304 ULONG VOS_TaskSelfGetPID(void);
310 * @return 返回线程ID(SPID)
312 ULONG VOS_TaskSelfGetSPID(void);
316 * 获得当前任务的线程ID(thread ID)
318 * @return 返回线程ID(thread ID)
320 ULONG VOS_TaskSelfThreadID(void);
325 #endif /* __cplusplus */
327 #endif /* __VOS_TASK_H__ */