XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_ntask.h
浏览该文件的文档.
1
12#ifndef __XF_NTASK_H__
13#define __XF_NTASK_H__
14
15/* ==================== [Includes] ========================================== */
16
17#include "../kernel/xf_task_kernel.h"
18
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32/* ==================== [Defines] =========================================== */
33
38#define XF_TASK_TYPE_NTASK XF_TASK_TYPE_ntask
39
40/* ==================== [Typedefs] ========================================== */
41
45typedef struct _xf_ntask_sem_t {
46 uint32_t count;
48
50
59
60/* ==================== [Global Prototypes] ================================= */
61
71static inline
73 uint16_t priority)
74{
75 return xf_task_create_with_manager(manager, XF_TASK_TYPE_NTASK, func, func_arg, priority, NULL);
76}
77
85
93int xf_ntask_args_get_int(xf_task_t *task, const char *name);
94
102float xf_ntask_args_get_float(xf_task_t *task, const char *name);
103
111void *xf_ntask_args_get_array(xf_task_t *task, const char *name);
112
121xf_err_t xf_ntask_args_set_int(xf_task_t *task, const char *name, int value);
122
131xf_err_t xf_ntask_args_set_float(xf_task_t *task, const char *name, float value);
132
143xf_err_t xf_ntask_args_set_array(xf_task_t *task, const char *name, void *value, unsigned int size, unsigned int len);
144
152uint32_t xf_ntask_get_lc(xf_task_t *task, const char *name);
153
162xf_err_t xf_ntask_set_lc(xf_task_t *task, const char *name, uint32_t lc);
163
171
180
189bool xf_ntask_lc_is_first(xf_task_t *task, const char *name);
190
191/* ==================== [Macros] ============================================ */
192
193#define XF_NTASK_BEGIN(ntask) \
194 xf_task_t *_ntask = ntask; \
195 switch (xf_ntask_get_lc(ntask, __func__)) \
196 { \
197 case 0:
198
199#define XF_NTASK_END() \
200 } \
201 xf_ntask_set_lc(_ntask, __func__, 0); \
202 if(xf_ntask_lc_is_first(_ntask, __func__)) { \
203 xf_ntask_set_exit_status(_ntask, XF_NTASK_FINSHED); \
204 } else { \
205 xf_ntask_set_exit_status(_ntask, XF_NTASK_ENDED); \
206 }\
207 return
208
209#define xf_ntask_yield() \
210 do \
211 { \
212 xf_task_trigger(_ntask); \
213 xf_ntask_set_lc(_ntask, __func__, __LINE__); \
214 xf_ntask_set_exit_status(_ntask, XF_NTASK_YIELDED); \
215 return; \
216 case __LINE__:; \
217 } while (0)
218
219#define xf_ntask_until(compare_cb) \
220 do \
221 { \
222 xf_ntask_set_compare(_ntask, compare_cb); \
223 xf_ntask_set_lc(_ntask, __func__, __LINE__); \
224 xf_ntask_set_exit_status(_ntask, XF_NTASK_WAITING); \
225 return; \
226 case __LINE__:; \
227 } while (0)
228
229#define xf_ntask_delay(delay_ms) \
230 do \
231 { \
232 xf_task_set_delay(_ntask, delay_ms); \
233 xf_ntask_set_lc(_ntask, __func__, __LINE__); \
234 xf_ntask_set_exit_status(_ntask, XF_NTASK_WAITING); \
235 return; \
236 case __LINE__:; \
237 } while (0)
238
239#define xf_ntask_until_timeout(compare_cb, timeout_ms) \
240 do \
241 { \
242 xf_task_set_delay(_ntask, timeout_ms); \
243 xf_ntask_set_compare(_ntask, compare_cb); \
244 xf_ntask_set_lc(_ntask, __func__, __LINE__); \
245 xf_ntask_set_exit_status(_ntask, XF_NTASK_WAITING); \
246 return; \
247 case __LINE__:; \
248 } while (0)
249
250#define xf_ntask_exit() \
251 do \
252 { \
253 xf_ntask_set_lc(_ntask, __func__, 0); \
254 if(xf_ntask_lc_is_first(_ntask, __func__)) { \
255 xf_ntask_set_exit_status(_ntask, XF_NTASK_FINSHED); \
256 } else { \
257 xf_ntask_set_exit_status(_ntask, XF_NTASK_ENDED); \
258 } \
259 return; \
260 } while (0)
261
262typedef void xf_async_t;
263
264#define xf_await(func) \
265 case __LINE__: \
266 func;\
267 int _async_status = xf_ntask_get_exit_status(_ntask);\
268 if (_async_status == XF_NTASK_YIELDED || _async_status == XF_NTASK_WAITING) \
269 {\
270 xf_ntask_set_lc(_ntask, __func__, __LINE__); \
271 return; \
272 }\
273 else\
274 {\
275 xf_ntask_set_exit_status(_ntask, XF_NTASK_NONE);\
276 }
277
278#ifdef __cplusplus
279} /* extern "C" */
280#endif
281
287#endif // __XF_NTASK_H__
static xf_task_t xf_ntask_create_with_manager(xf_task_manager_t manager, xf_task_func_t func, void *func_arg, uint16_t priority)
创建无栈协程
Definition xf_ntask.h:72
uint32_t xf_ntask_get_lc(xf_task_t *task, const char *name)
获取上下文位置 (给宏调用)
Definition xf_ntask.c:177
_xf_ntask_status_t
Definition xf_ntask.h:51
struct _xf_ntask_sem_t xf_ntask_sem_t
ntask 信号量结构体。
enum _xf_ntask_status_t xf_ntask_status_t
xf_err_t xf_ntask_args_set_float(xf_task_t *task, const char *name, float value)
保存浮点变量
Definition xf_ntask.c:135
void xf_ntask_set_compare(xf_task_t task, xf_ntask_compare_func_t compare)
设置比较函数,回调函数返回 0,则任务继续进行,单次有效
Definition xf_ntask.c:80
xf_err_t xf_ntask_args_set_array(xf_task_t *task, const char *name, void *value, unsigned int size, unsigned int len)
保存数组
Definition xf_ntask.c:156
xf_ntask_status_t xf_ntask_get_exit_status(xf_task_t *task)
获取退出状态 (给宏调用)
Definition xf_ntask.c:214
int(* xf_ntask_compare_func_t)(xf_task_t task)
Definition xf_ntask.h:49
xf_err_t xf_ntask_set_lc(xf_task_t *task, const char *name, uint32_t lc)
设置上下文位置 (给宏调用)
Definition xf_ntask.c:190
void xf_async_t
Definition xf_ntask.h:262
xf_err_t xf_ntask_args_set_int(xf_task_t *task, const char *name, int value)
保存整数变量
Definition xf_ntask.c:114
bool xf_ntask_lc_is_first(xf_task_t *task, const char *name)
获取是否是最外层函数
Definition xf_ntask.c:202
void * xf_ntask_args_get_array(xf_task_t *task, const char *name)
获取保存的数组
Definition xf_ntask.c:105
#define XF_TASK_TYPE_NTASK
ntask 类型值。 XF_TASK_TYPE_ntask 通过 xf_task_reg.inc 拼接而来。
Definition xf_ntask.h:38
xf_err_t xf_ntask_set_exit_status(xf_task_t *task, xf_ntask_status_t status)
设置退出状态 (给宏调用)
Definition xf_ntask.c:221
int xf_ntask_args_get_int(xf_task_t *task, const char *name)
获取保存的整数变量
Definition xf_ntask.c:87
float xf_ntask_args_get_float(xf_task_t *task, const char *name)
获取保存的浮点变量
Definition xf_ntask.c:96
@ XF_NTASK_EXITED
Definition xf_ntask.h:55
@ XF_NTASK_NONE
Definition xf_ntask.h:52
@ XF_NTASK_YIELDED
Definition xf_ntask.h:54
@ XF_NTASK_ENDED
Definition xf_ntask.h:56
@ XF_NTASK_FINSHED
Definition xf_ntask.h:57
@ XF_NTASK_WAITING
Definition xf_ntask.h:53
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
ntask 信号量结构体。
Definition xf_ntask.h:45
uint32_t count
Definition xf_ntask.h:46
static void task(xf_task_t task)
Definition xf_main.c:45
xf_task_t xf_task_create_with_manager(xf_task_manager_t manager, xf_task_type_t type, xf_task_func_t func, void *func_arg, uint16_t priority, void *config)
在指定任务管理器下创建任务。
void(* xf_task_func_t)(xf_task_t task)
任务调用函数原型。
void * xf_task_manager_t
任务管理器句柄。
void * xf_task_t
任务句柄。