XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_ntask.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_ntask.h"
15
16#include "../kernel/xf_task_base.h"
17#include "../port/xf_task_port_internal.h"
18
19/* ==================== [Defines] =========================================== */
20
21#define TAG "ntask"
22
23/* ==================== [Typedefs] ========================================== */
24
25typedef struct _xf_ntask_args_t {
27 void *args;
28 unsigned int size;
29 unsigned int len;
30 const char *name;
32
33typedef struct _xf_ntask_lc_t {
34 uint32_t lc;
35 const char *name;
38
46
47/* ==================== [Static Prototypes] ================================= */
48
49static void xf_ntask_reset(xf_task_t task);
51static void xf_ntask_exec(xf_task_manager_t manager);
52static xf_task_t xf_ntask_constructor(xf_task_manager_t manager, xf_task_func_t func, void *func_arg, uint16_t priority,
53 void *config);
54static void *xf_ntask_args_create(xf_list_t *head, const char *name, unsigned int size, unsigned int len);
55static void *xf_ntask_args_find(xf_list_t *head, const char *name);
56static xf_err_t xf_ntask_args_set(xf_list_t *head, const char *name, void *args);
57static xf_ntask_lc_t *xf_ntask_lc_find(xf_list_t *head, const char *name);
58static xf_ntask_lc_t *xf_ntask_lc_create(xf_list_t *head, const char *name);
59static void xf_ntask_args_remove_all(xf_list_t *head);
60static void xf_ntask_lc_remove_all(xf_list_t *head);
61
62/* ==================== [Static Variables] ================================== */
63
66 .exec = xf_ntask_exec,
67 .reset = xf_ntask_reset,
68 .update = xf_ntask_update,
69};
70
71/* ==================== [Macros] ============================================ */
72
73/* ==================== [Global Functions] ================================== */
74
79
81{
83
84 handle->compare = compare;
85}
86
87int xf_ntask_args_get_int(xf_task_t *task, const char *name)
88{
90
91 void *args = xf_ntask_args_find(&handle->args_list, name);
92
93 return *(int *)args;
94}
95
96float xf_ntask_args_get_float(xf_task_t *task, const char *name)
97{
99
100 void *args = xf_ntask_args_find(&handle->args_list, name);
101
102 return *(float *)args;
103}
104
105void *xf_ntask_args_get_array(xf_task_t *task, const char *name)
106{
108
109 void *args = xf_ntask_args_find(&handle->args_list, name);
110
111 return args;
112}
113
114xf_err_t xf_ntask_args_set_int(xf_task_t *task, const char *name, int value)
115{
117
118 xf_err_t err = xf_ntask_args_set(&handle->args_list, name, (void *)&value);
119
120 if (err == XF_OK) {
121 return XF_OK;
122 }
123
124 void *args = xf_ntask_args_create(&handle->args_list, name, sizeof(int), 1);
125
126 if (args == NULL) {
127 return XF_ERR_NO_MEM;
128 }
129
130 *(int *)args = value;
131
132 return XF_OK;
133}
134
135xf_err_t xf_ntask_args_set_float(xf_task_t *task, const char *name, float value)
136{
138
139 xf_err_t err = xf_ntask_args_set(&handle->args_list, name, (void *)&value);
140
141 if (err == XF_OK) {
142 return XF_OK;
143 }
144
145 void *args = xf_ntask_args_create(&handle->args_list, name, sizeof(float), 1);
146
147 if (args == NULL) {
148 return XF_ERR_NO_MEM;
149 }
150
151 *(float *)args = value;
152
153 return XF_OK;
154}
155
156xf_err_t xf_ntask_args_set_array(xf_task_t *task, const char *name, void *value, unsigned int size, unsigned int len)
157{
159
160 xf_err_t err = xf_ntask_args_set(&handle->args_list, name, value);
161
162 if (err == XF_OK) {
163 return XF_OK;
164 }
165
166 void *args = xf_ntask_args_create(&handle->args_list, name, size, len);
167
168 if (args == NULL) {
169 return XF_ERR_NO_MEM;
170 }
171
172 xf_memcpy(args, value, size * len);
173
174 return XF_OK;
175}
176
177uint32_t xf_ntask_get_lc(xf_task_t *task, const char *name)
178{
180
181 xf_ntask_lc_t *item = xf_ntask_lc_find(&handle->lc_list, name);
182 if (item != NULL) {
183 return item->lc;
184 }
185 item = xf_ntask_lc_create(&handle->lc_list, name);
186
187 return item->lc;
188}
189
190xf_err_t xf_ntask_set_lc(xf_task_t *task, const char *name, uint32_t lc)
191{
193
194 xf_ntask_lc_t *item = xf_ntask_lc_find(&handle->lc_list, name);
195 if (item == NULL) {
196 return XF_ERR_INVALID_ARG;
197 }
198 item->lc = lc;
199 return XF_OK;
200}
201
202bool xf_ntask_lc_is_first(xf_task_t *task, const char *name)
203{
205
207 if (item->name == name) {
208 return true;
209 }
210 return false;
211
212}
213
220
222{
224
225 handle->status = status;
226 return XF_OK;
227}
228
229/* ==================== [Static Functions] ================================== */
230
231static xf_task_t xf_ntask_constructor(xf_task_manager_t manager, xf_task_func_t func, void *func_arg, uint16_t priority,
232 void *config)
233{
235
236 if (task == NULL) {
237 XF_LOGE(TAG, "memory alloc failed!");
238 return NULL;
239 }
240
241 xf_task_base_init(&task->base, manager, XF_TASK_TYPE_NTASK, priority, func, func_arg);
242
243 xf_list_init(&task->lc_list);
244 xf_list_init(&task->args_list);
245 task->compare = NULL;
246 task->status = XF_NTASK_NONE;
247
248 BITS_SET1(task->base.signal, XF_TASK_SIGNAL_EVENT);
249
250 return (xf_task_t)task;
251}
252
254{
256
257 xf_task_base_reset(&handle->base);
258
261}
262
263static void xf_ntask_time_handle(xf_task_t task, uint32_t time_ticks)
264{
266
267 int32_t timeout = time_ticks - handle->base.wake_up;
268 // 转换超时时间,如果大于零则触发超时
269 handle->base.timeout = xf_task_ticks_to_msec(timeout);
270 if (timeout >= 0) {
272 handle->base.delay = 0;
273 handle->compare = NULL;
274 }
275
276}
277
279{
281
282 // 对比的调节如果符合则触发
283 int res = handle->compare(task);
284 if (res == 0) {
285 handle->compare = NULL;
286 handle->base.delay = 0;
288 }
289
290}
291
293{
295 xf_task_time_t time_ticks = xf_task_get_ticks();
296
297 if (handle->compare != NULL) {
299 }
300
301 if (handle->base.delay != 0) {
302 xf_ntask_time_handle(task, time_ticks);
303 }
304
308 }
309
313 }
314
315 return time_ticks;
316}
317
319{
321
323 task->base.func(task);
324
325 if (task->status == XF_NTASK_FINSHED) {
326 xf_ntask_lc_remove_all(&task->lc_list);
327 xf_ntask_args_remove_all(&task->args_list);
329 }
330 task->status = XF_NTASK_NONE;
331}
332
333static void *xf_ntask_args_create(xf_list_t *head, const char *name, unsigned int size, unsigned int len)
334{
335 xf_ntask_args_t *args = (xf_ntask_args_t *)xf_malloc(sizeof(xf_ntask_args_t) + size * len);
336 if (args == NULL) {
337 return NULL;
338 }
339 args->args = (void *)((uint8_t *)args + sizeof(xf_ntask_args_t));
340 args->name = name;
341 args->size = size;
342 args->len = len;
343 xf_list_init(&args->node);
344
345 xf_list_add_tail(&args->node, head);
346
347 return args->args;
348}
349
350static void *xf_ntask_args_find(xf_list_t *head, const char *name)
351{
352 xf_ntask_args_t *item;
353 xf_list_for_each_entry(item, head, xf_ntask_args_t, node) {
354 if (item->name == name) {
355 return item->args;
356 }
357 }
358 xf_list_for_each_entry(item, head, xf_ntask_args_t, node) {
359 if (xf_strcmp(item->name, name) == 0) {
360 return item->args;
361 }
362 }
363 return NULL;
364}
365
366static xf_err_t xf_ntask_args_set(xf_list_t *head, const char *name, void *args)
367{
368 xf_ntask_args_t *item = xf_ntask_args_find(head, name);
369 if (item == NULL) {
370 return XF_ERR_INVALID_ARG;
371 }
372
373 xf_memcpy(item->args, args, item->size * item->len);
374
375 return XF_OK;
376}
377
379{
380 xf_ntask_args_t *item, *_item;
381 xf_list_for_each_entry_safe(item, _item, head, xf_ntask_args_t, node) {
382 xf_list_del_init(&item->node);
383 xf_free(item);
384 }
385}
386
387static xf_ntask_lc_t *xf_ntask_lc_create(xf_list_t *head, const char *name)
388{
390 if (lc == NULL) {
391 return NULL;
392 }
393
394 xf_list_init(&lc->node);
395 lc->lc = 0;
396 lc->name = name;
397
398 xf_list_add_tail(&lc->node, head);
399
400 return lc;
401}
402
403static xf_ntask_lc_t *xf_ntask_lc_find(xf_list_t *head, const char *name)
404{
405 xf_ntask_lc_t *item;
406 xf_list_for_each_entry(item, head, xf_ntask_lc_t, node) {
407 if (item->name == name) {
408 return item;
409 }
410 }
411
412 return NULL;
413}
414
416{
417 xf_ntask_lc_t *item, *_item;
418 xf_list_for_each_entry_safe(item, _item, head, xf_ntask_lc_t, node) {
419 xf_list_del_init(&item->node);
420 xf_free(item);
421 }
422}
uint32_t xf_ntask_get_lc(xf_task_t *task, const char *name)
获取上下文位置 (给宏调用)
Definition xf_ntask.c:177
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
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_NONE
Definition xf_ntask.h:52
@ XF_NTASK_FINSHED
Definition xf_ntask.h:57
#define BITS_SET0(var, bits_mask)
设置 32 位变量 var 的对应位掩码 bits_mask 为 1 的地方为 0。
#define BITS_SET1(var, bits_mask)
设置 32 位变量 var 的对应位掩码 bits_mask 为 1 的地方为 1。
#define BITS_CHECK(src, bits_mask)
检查变量 var 在 bits_mask 的位置上是否存在 1。
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_ERR_INVALID_ARG
Definition xf_err.h:46
@ XF_OK
Definition xf_err.h:43
@ XF_ERR_NO_MEM
Definition xf_err.h:45
static void xf_list_init(xf_list_t *list)
动态初始化链表.
Definition xf_list.h:97
static void xf_list_add_tail(xf_list_t *new_node, xf_list_t *head)
xf_list_add_tail - 在指定节点之前添加一个 new_node.
Definition xf_list.h:168
static void xf_list_del_init(xf_list_t *entry)
xf_list_del_init - 从链表中删除节点, 并重新初始化.
Definition xf_list.h:266
#define xf_list_first_entry(ptr, type, member)
xf_list_first_entry - 获取链表中的第一个元素.
Definition xf_list.h:617
#define xf_list_for_each_entry_safe(pos, n, head, type, member)
list_for_each_entry_safe - 安全地迭代给定类型的链表,可删除链表节点。
Definition xf_list.h:876
#define xf_list_for_each_entry(pos, head, type, member)
list_for_each_entry - 迭代给定类型的链表。
Definition xf_list.h:732
#define xf_malloc(x)
Definition xf_stdlib.h:38
#define xf_free(x)
Definition xf_stdlib.h:39
#define xf_strcmp(dest, src)
Definition xf_string.h:46
#define xf_memcpy(dest, src, n)
Definition xf_string.h:44
unsigned int len
Definition xf_ntask.c:29
const char * name
Definition xf_ntask.c:30
xf_list_t node
Definition xf_ntask.c:26
unsigned int size
Definition xf_ntask.c:28
xf_list_t args_list
Definition xf_ntask.c:44
xf_list_t lc_list
Definition xf_ntask.c:43
xf_task_base_t base
Definition xf_ntask.c:40
xf_ntask_status_t status
Definition xf_ntask.c:42
xf_ntask_compare_func_t compare
Definition xf_ntask.c:41
uint32_t lc
Definition xf_ntask.c:34
const char * name
Definition xf_ntask.c:35
xf_list_t node
Definition xf_ntask.c:36
task 的父对象,保存了 task 的公共属性。
xf_task_time_t wake_up
虚函数表,不在 base 对象实现,由子对象完成实现。
const xf_task_create_t constructor
双向链表结构体.
Definition xf_list.h:64
static void task(xf_task_t task)
Definition xf_main.c:45
#define XF_LOGE(tag, format,...)
static void xf_ntask_event_handle(xf_task_t task)
Definition xf_ntask.c:278
static void xf_ntask_time_handle(xf_task_t task, uint32_t time_ticks)
Definition xf_ntask.c:263
static void xf_ntask_args_remove_all(xf_list_t *head)
Definition xf_ntask.c:378
static void xf_ntask_reset(xf_task_t task)
Definition xf_ntask.c:253
static xf_err_t xf_ntask_args_set(xf_list_t *head, const char *name, void *args)
Definition xf_ntask.c:366
struct _xf_ntask_lc_t xf_ntask_lc_t
static xf_ntask_lc_t * xf_ntask_lc_find(xf_list_t *head, const char *name)
Definition xf_ntask.c:403
static void xf_ntask_exec(xf_task_manager_t manager)
Definition xf_ntask.c:318
static void * xf_ntask_args_find(xf_list_t *head, const char *name)
Definition xf_ntask.c:350
void xf_ntask_vfunc_register(void)
Definition xf_ntask.c:75
static void * xf_ntask_args_create(xf_list_t *head, const char *name, unsigned int size, unsigned int len)
Definition xf_ntask.c:333
struct _xf_ntask_handle_t xf_ntask_handle_t
static const xf_task_vfunc_t _ntask_vfunc
Definition xf_ntask.c:64
static void xf_ntask_lc_remove_all(xf_list_t *head)
Definition xf_ntask.c:415
static xf_task_time_t xf_ntask_update(xf_task_t task)
Definition xf_ntask.c:292
static xf_task_t xf_ntask_constructor(xf_task_manager_t manager, xf_task_func_t func, void *func_arg, uint16_t priority, void *config)
Definition xf_ntask.c:231
struct _xf_ntask_args_t xf_ntask_args_t
static xf_ntask_lc_t * xf_ntask_lc_create(xf_list_t *head, const char *name)
Definition xf_ntask.c:387
#define TAG
Definition xf_ntask.c:21
无栈协程。
void xf_task_base_init(xf_task_base_t *task_base, xf_task_manager_t manager, xf_task_type_t type, uint16_t priority, xf_task_func_t func, void *arg)
task 初始化。
xf_err_t xf_task_base_set_state(xf_task_t task, xf_task_state_t state)
task 设置状态。
void xf_task_base_reset(xf_task_base_t *task_base)
重置 task base 部分内容
xf_err_t xf_task_vfunc_register(xf_task_type_t type, const xf_task_vfunc_t *vfunc)
task 的虚函数注册。
#define XF_TASK_SIGNAL_EVENT
#define XF_TASK_SIGNAL_TIMEOUT
#define XF_TASK_SIGNAL_READY
XF_TASK_TIME_TYPE xf_task_time_t
xf_task 时间戳类型。
void xf_task_delete(xf_task_t task)
任务删除函数。将任务加入销毁队列,并设置任务为删除态。
void(* xf_task_func_t)(xf_task_t task)
任务调用函数原型。
@ XF_TASK_STATE_RUNNING
xf_task_t xf_task_manager_get_current_task(xf_task_manager_t manager)
获取管理器运行的任务。
void * xf_task_manager_t
任务管理器句柄。
void * xf_task_t
任务句柄。
xf_task_time_t xf_task_get_ticks(void)
int32_t xf_task_ticks_to_msec(int32_t ticks)