1 /** 2 * @file hi_task.h 3 * 4 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 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. 16 */ 17 18 /** 19 * @defgroup iot_task Task 20 * @ingroup osa 21 */ 22 #ifndef __HI_TASK_H__ 23 #define __HI_TASK_H__ 24 25 #include <hi_types_base.h> 26 27 #define HI_INVALID_TASK_ID 0xFFFFFFFF 28 #define HI_TASK_NAME_LEN 32 29 #define HI_DEFAULT_TSKNAME "default" /**< hi_task_attr default value. CNcomment:hi_task_attr的默认值CNend */ 30 #define HI_DEFAULT_TSKPRIO 20 /**< hi_task_attr default value. CNcomment:hi_task_attr的默认值CNend */ 31 #define HI_DEFAULT_STACKSIZE (4 * 1024) /**< hi_task_attr default value. CNcomment:hi_task_attr的默认值CNend */ 32 #define NOT_BIND_CPU (-1) 33 34 typedef struct { 35 hi_char name[HI_TASK_NAME_LEN]; /**< Task entrance function.CNcomment:入口函数CNend */ 36 hi_u32 id; /**< Task ID.CNcomment:任务ID CNend */ 37 hi_u16 status; /**< Task status.CNcomment:任务状态 CNend */ 38 hi_u16 priority; /**< Task priority.CNcomment:任务优先级 CNend */ 39 hi_pvoid task_sem; /**< Semaphore pointer.CNcomment:信号量指针CNend */ 40 hi_pvoid task_mutex; /**< Mutex pointer.CNcomment:互斥锁指针CNend */ 41 hi_u32 event_stru[3]; /**< Event: 3 nums.CNcomment:3个事件CNend */ 42 hi_u32 event_mask; /**< Event mask.CNcomment:事件掩码CNend */ 43 hi_u32 stack_size; /**< Task stack size.CNcomment:栈大小CNend */ 44 hi_u32 top_of_stack; /**< Task stack top.CNcomment:栈顶CNend */ 45 hi_u32 bottom_of_stack; /**< Task stack bottom.CNcomment:栈底CNend */ 46 hi_u32 mstatus; /**< Task current mstatus.CNcomment:当前mstatusCNend */ 47 hi_u32 mepc; /**< Task current mepc.CNcomment:当前mepc.CNend */ 48 hi_u32 tp; /**< Task current tp.CNcomment:当前tp.CNend */ 49 hi_u32 ra; /**< Task current ra.CNcomment:当前ra.CNend */ 50 hi_u32 sp; /**< Task SP pointer.CNcomment:当前SP.CNend */ 51 hi_u32 curr_used; /**< Current task stack usage.CNcomment:当前任务栈使用率CNend */ 52 hi_u32 peak_used; /**< Task stack usage peak.CNcomment:栈使用峰值CNend */ 53 hi_u32 overflow_flag; /**< Flag that indicates whether a task stack overflow occurs. 54 CNcomment:栈溢出标记位CNend */ 55 } hi_task_info; 56 57 typedef struct { 58 hi_u16 task_prio; 59 hi_u32 stack_size; 60 hi_u32 task_policy; 61 hi_u32 task_nice; 62 hi_u32 task_cpuid; 63 hi_char *task_name; 64 hi_void *resved; 65 } hi_task_attr; 66 67 /** 68 * @ingroup iot_task 69 * @brief Creates a task.CNcomment:创建任务。CNend 70 * 71 * @par 描述: 72 * Creates a task.CNcomment:创建任务。CNend 73 * 74 * @attention 75 * @li The space occupied by a task name string must be applied for by the caller and saved statically. 76 * The task name is not stored internally in the API.CNcomment:任务名字符串占用空间需要调用者 77 申请并静态保存,接口内部不对任务名进行存储。CNend 78 * @li If the size of the specified task stack is 0, use the default size specified by 79 * #OS_TSK_DEFAULT_STACK_SIZE. CNcomment:若指定的任务栈大小为0,则使用配置项 80 HI_DEFAULT_STACKSIZE指定默认的任务栈大小。CNend 81 * @li The size of the task stack should be 8-byte aligned. The principle for determining the task stack 82 * size is as follows: Do not use a too large or too small task stack size (to avoid waste or 83 * overflow).CNcomment:任务栈的大小按8byte大小对齐。确定任务栈大小的原则:够用即可(多则浪费, 84 少则任务栈溢出)。CNend 85 * @li The recommended user priority should be within the range of [10, 30]. Do not use the priorities of 86 * [0, 5] and [31].CNcomment:用户优先级配置建议使用[10,30],切记不可使用[0,5]和[31]号的优先级。CNend 87 * 88 * @param taskid [OUT] type #hi_u32*,task ID.CNcomment:任务ID号。CNend 89 * @param attr [IN] type #const task_attr_t*,task attributes,when NULL was set here,the properties 90 are configured as follows: task_name:"default" task_prio:20 stack_size:(4*1024) 91 CNcomment:任务属性,当该值为空时配置如下:任务名:"default" 92 任务优先级:20 任务栈大小:(4*1024),CNend 93 * @param task_route [IN] type #task_route task entry function.CNcomment:任务入口函数。CNend 94 * @param arg [IN] type #hi_void*,parameter that needs to be input to the task entry when a task is 95 * created. If this parameter does not need to be input, set this parameter to 0. 96 CNcomment:创建任务时需要传给任务入口的参数。如果不需要传递,参数直接填0。CNend 97 * 98 * @retval #0 Success 99 * @retval #Other Failure. For details, see hi_errno.h. 100 * @par 依赖: 101 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 102 * @see hi_task_delete。 103 */ 104 hi_u32 hi_task_create(hi_u32 *taskid, const hi_task_attr *attr, 105 hi_void* (*task_route)(hi_void *), hi_void *arg); 106 107 /** 108 * @ingroup iot_task 109 * @brief Deletes a task.CNcomment:删除任务。CNend 110 * 111 * @par 描述: 112 * Deletes a task.CNcomment:删除任务。CNend 113 * 114 * @attention 115 * @li Use this API with caution. A task can be deleted only after the confirmation of the user. The idle task 116 * and Swt_Task cannot be deleted.idle.CNcomment:任务及Swt_Task任务不能被删除。CNend 117 * @li When deleting a task, ensure that the resources (such as mutex and semaphore) applied by the task have 118 * been released.在删除任务时要保证任务申请的资源(如互斥锁、信号量等)已被释放。CNend 119 * 120 * @param taskid [IN] type #hi_u32,task ID. CNcomment:任务ID号。CNend 121 * 122 * @retval #0 Success 123 * @retval #Other Failure. For details, see hi_errno.h. 124 * @par 依赖: 125 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 126 * @see hi_task_create。 127 */ 128 hi_u32 hi_task_delete(hi_u32 taskid); 129 130 /** 131 * @ingroup iot_task 132 * @brief Suspends a task.CNcomment:挂起任务。CNend 133 * 134 * @par 描述: 135 * Suspends a task.CNcomment:挂起指定任务。CNend 136 * 137 * @attention 138 * @li A task cannot be suspended if it is the current task and is locked. 139 CNcomment:挂起任务的时候若为当前任务且已锁任务,则不能被挂起。CNend 140 * @li The idle task and Swt_Task cannot be suspended. 141 CNcomment:idle任务及Swt_Task任务不能被挂起。CNend 142 * @li The task cannot be blocked or suspended in the lock task status. 143 CNcomment:在锁任务调度状态下,禁止任务阻塞。CNend 144 * 145 * @param taskid [IN] type #hi_u32,task ID. CNcomment:任务ID号。CNend 146 * 147 * @retval #0 Success 148 * @retval #Other Failure. For details, see hi_errno.h. 149 * @par 依赖: 150 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 151 * @see hi_task_resume。 152 */ 153 hi_u32 hi_task_suspend(hi_u32 taskid); 154 155 /** 156 * @ingroup iot_task 157 * @brief Resumes a task.CNcomment:恢复挂起任务。CNend 158 * 159 * @par 描述: 160 * Resumes a task.CNcomment:恢复挂起指定任务。CNend 161 * 162 * @attention None 163 * @param taskid [IN] type #hi_u32,task ID. CNcomment:任务ID号。CNend 164 * 165 * @retval #0 Success 166 * @retval #Other Failure. For details, see hi_errno.h. 167 * @par 依赖: 168 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 169 * @see hi_task_suspend。 170 */ 171 hi_u32 hi_task_resume(hi_u32 taskid); 172 173 /** 174 * @ingroup iot_task 175 * @brief Obtains the task priority.CNcomment:获取任务优先级。CNend 176 * 177 * @par 描述: 178 * Obtains the task priority.CNcomment:获取任务优先级。CNend 179 * 180 * @attention None 181 * 182 * @param taskid [IN] type #hi_u32,task ID. CNcomment:任务ID号。CNend 183 * @param priority [OUT] type #hi_u32*,task priority.CNcomment:任务优先级。CNend 184 * 185 * @retval #0 Success 186 * @retval #Other Failure. For details, see hi_errno.h. 187 * @par 依赖: 188 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 189 * @see hi_task_set_priority。 190 */ 191 hi_u32 hi_task_get_priority(hi_u32 taskid, hi_u32 *priority); 192 193 /** 194 * @ingroup iot_task 195 * @brief Sets the task priority.CNcomment:设置任务优先级。CNend 196 * 197 * @par 描述: 198 Sets the task priority.CNcomment:设置任务优先级。CNend 199 * 200 * @attention 201 * @li Only the ID of the task created by the user can be configured. 202 CNcomment:仅可配置用户自己创建的任务ID。CNend 203 * @li The recommended user priority should be within the range of [10, 30]. Do not use the priorities of 204 * [0, 5] and [31].CNcomment:用户优先级配置建议使用[10,30],切记不可使用[0,5]和[31]号的优先级。CNend 205 * @li Setting user priorities may affect task scheduling. The user needs to plan tasks in the SDK. 206 CNcomment:设置用户优先级有可能影响任务调度,用户需要SDK中对各任务统一规划。CNend 207 * 208 * @param taskid [IN] type #hi_u32,task ID. CNcomment:任务ID号。CNend 209 * @param priority [IN] type #hi_u32,task priority.CNcomment:任务优先级。CNend 210 * 211 * @retval #0 Success 212 * @retval #Other Failure. For details, see hi_errno.h. 213 * @par 依赖: 214 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 215 * @see hi_task_get_priority。 216 */ 217 hi_u32 hi_task_set_priority(hi_u32 taskid, hi_u32 priority); 218 219 /** 220 * @ingroup iot_task 221 * @brief Obtains the task information.CNcomment:获取任务信息。CNend 222 * 223 * @par 描述: 224 * Obtains the task information.CNcomment:获取任务信息。CNend 225 * 226 * @attention None 227 * @param taskid [IN] type #hi_u32,task ID. CNcomment:任务ID号。CNend 228 * @param inf [OUT] type #hi_task_info* ,task information.CNcomment:任务信息。CNend 229 * 230 * @retval #0 Success 231 * @retval #Other Failure. For details, see hi_errno.h. 232 * @par 依赖: 233 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 234 * @see None 235 */ 236 hi_u32 hi_task_get_info(hi_u32 taskid, hi_task_info *inf); 237 238 /** 239 * @ingroup iot_task 240 * @brief Obtains the current task ID.CNcomment:获取当前任务ID。CNend 241 * 242 * @par 描述: 243 * Obtains the current task ID.CNcomment:获取当前任务ID。CNend 244 * 245 * @attention None 246 * @param None 247 * 248 * @retval #hi_u32 Task ID. If the task fails, #HI_INVALID_TASK_ID is returned. 249 CNcomment:任务ID,失败返回#HI_INVALID_TASK_ID。CNend 250 * @par 依赖: 251 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 252 * @see None 253 */ 254 hi_u32 hi_task_get_current_id(hi_void); 255 256 /** 257 * @ingroup iot_task 258 * @brief Lock task switch.CNcomment:禁止系统任务调度。CNend 259 * 260 * @par 描述: 261 * Lock task switch.CNcomment:禁止系统任务调度。CNend 262 * 263 * @attention Work pair with hi_task_unlock.CNcomment:与hi_task_unlock配对使用。CNend 264 * @param None 265 * 266 * @retval None 267 * @par 依赖: 268 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 269 * @see None 270 */ 271 hi_void hi_task_lock(hi_void); 272 273 /** 274 * @ingroup iot_task 275 * @brief Unlock task switch. CNcomment:允许系统任务调度。CNend 276 * 277 * @par 描述: 278 * Unlock task switch. CNcomment:允许系统任务调度。CNend 279 * 280 * @attention Work pair with hi_task_lock; Call hi_task_lock to disable task switch, then call hi_task_unlock 281 * reenable it. 282 CNcomment:与hi_task_lock配对使用;先调用hi_task_lock禁止任务调度,然后调用hi_task_unlock打开任务调度。CNend 283 * @param None 284 * 285 * @retval None 286 * @par 依赖: 287 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 288 * @see None 289 */ 290 hi_void hi_task_unlock(hi_void); 291 292 /** 293 * @ingroup iot_task 294 * @brief Task sleep.CNcomment:任务睡眠。CNend 295 * 296 * @par 描述: 297 * Task sleep.CNcomment:任务睡眠。CNend 298 * 299 * @attention 300 * @li In the interrupt processing function or in the case of a lock task, the hi_sleep operation fails. 301 CNcomment:在中断处理函数中或者在锁任务的情况下,执行hi_sleep操作会失败。CNend 302 * @li When less than 10 ms, the input parameter value should be replaced by 10 ms. When greater than 10 ms, 303 * the input parameter value should be exactly divided and then rounded-down to the nearest integer. 304 CNcomment:入参小于10ms时,当做10ms处理,Tick=1;大于10ms时,整除向下对齐,Tick = ms/10。CNend 305 * @li This function cannot be used for precise timing and will be woken up after Tick system scheduling. 306 * The actual sleep time is related to the time consumed by the Tick when the function is called. 307 CNcomment:本函数不能用于精确计时,将在Tick个系统调度后唤醒,实际睡眠时间与函数被调用时该Tick已消耗的时间相关。CNend 308 * @param ms [IN] type #hi_u32,sleep time (unit: ms). The precision is 10 ms. 309 CNcomment:睡眠时间(单位:ms),精度为10ms。CNend 310 * 311 * @retval #0 Success 312 * @retval #Other Failure. For details, see hi_errno.h. 313 * @par 依赖: 314 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 315 * @see None 316 */ 317 hi_u32 hi_sleep(hi_u32 ms); 318 319 /** 320 * @ingroup iot_task 321 * @brief Regiseter idle task callback.CNcomment:注册idle任务回调函数。CNend 322 * 323 * @par 描述: 324 * Regiseter idle task callback, if callback is NULL, means cancel registration. 325 CNcomment:注册idle任务回调函数,如果回调函数为空,表示取消注册。CNend 326 * 327 * @attention 328 * @li lowper sleep process handle after callback, callback should not contain complicated 329 operations that affect lowpower process . 330 CNcomment:低功耗睡眠处理在idle回调执行之后,回调函数避免处理复杂操作影响低功耗流程。CNend 331 * @li When less than 10 ms, the input parameter value should be replaced by 10 ms. When greater than 10 ms, 332 * @param cb [IN] type #hi_void_callback, callback in idle task.CNcomment:idle任务中的回调函数。CNend 333 * 334 * @retval #None 335 * @par 依赖: 336 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 337 * @see None 338 */ 339 hi_void hi_task_register_idle_callback(hi_void_callback cb); 340 341 /** 342 * @ingroup iot_task 343 * @brief Wait task excute finish.CNcomment:等待任务执行结束。CNend 344 * 345 * @par 描述: 346 * Wait task excute finish.CNcomment:等待任务执行结束。CNend 347 * 348 * @attention None 349 * @param taskid [IN] type #hi_u32, task id of the task to be waited finish. 350 CNcomment:被等待结束的任务ID。CNend 351 * @param wait_interval [IN] type #hi_u32, interval time of query task status when waiting. at least one tick. 352 CNcomment:等待时查询任务状态的间隔时间,至少间隔1个Tick。CNend 353 * 354 * @retval #None 355 * @par 依赖: 356 * @li hi_task.h:Describes the task APIs.CNcomment:文件用于描述任务相关接口。CNend 357 * @see None 358 */ 359 hi_void hi_task_join(hi_u32 taskid, hi_u32 wait_interval); 360 361 #endif 362