XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_task_kernel.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_task.h"
15#include "xf_task_base.h"
16#include "xf_task_manager.h"
17#include "../port/xf_task_port_internal.h"
18
19/* ==================== [Defines] =========================================== */
20
21#define TAG "xf_task"
22
23/* ==================== [Typedefs] ========================================== */
24
25/* ==================== [Static Prototypes] ================================= */
26
27/* ==================== [Static Variables] ================================== */
28
29/* ==================== [Macros] ============================================ */
30
31/* ==================== [Global Functions] ================================== */
32
34 void *func_arg, uint16_t priority, void *config)
35{
36 XF_ASSERT(manager, NULL, TAG, "manager must not be NULL");
37 XF_ASSERT(func, NULL, TAG, "func must not be NULL");
38 XF_ASSERT(priority < XF_TASK_PRIORITY_LEVELS, NULL, TAG, "priority must less than %d", XF_TASK_PRIORITY_LEVELS);
39 // XF_ASSERT(config, NULL, TAG, "args must not be NULL");
40
41 const xf_task_vfunc_t *vfunc = xf_task_get_vfunc(type);
42 xf_task_t task = vfunc->constructor(manager, func, func_arg, priority, config);
43
44 return task;
45}
46
48{
49 XF_ASSERT(task, XF_RETURN_VOID, TAG, "task must not be NULL");
50
52 xf_task_manager_t manager = handle->manager;
53
55}
56
58{
59 XF_ASSERT(task, XF_RETURN_VOID, TAG, "task must not be NULL");
60
62
63 handle->vfunc->reset(task);
64}
65
67{
68 XF_ASSERT(task, NULL, TAG, "task must not be NULL");
69
70 xf_task_base_t *task_base = (xf_task_base_t *)task;
71
72 return task_base->arg;
73}
74
76{
77 XF_ASSERT(task, 0, TAG, "task must not be NULL");
78
79 xf_task_base_t *task_base = (xf_task_base_t *)task;
80
81 return task_base->timeout;
82}
83
85{
86 XF_ASSERT(task, NULL, TAG, "task must not be NULL");
87
88 xf_task_base_t *task_base = (xf_task_base_t *)task;
89
90 return task_base->manager;
91}
92
93#if XF_TASK_HUNGER_IS_ENABLE
94
95void xf_task_feel_hungery_enable(xf_task_t task, uint32_t hunger_time)
96{
97 XF_ASSERT(task, XF_RETURN_VOID, TAG, "task must not be NULL");
98
99 xf_task_base_t *task_base = (xf_task_base_t *)task;
100
102 task_base->hunger_time = hunger_time;
103}
104
106{
107 XF_ASSERT(task, XF_RETURN_VOID, TAG, "task must not be NULL");
108 xf_task_base_t *task_base = (xf_task_base_t *)task;
109 task_base->hunger_time = 0;
111}
112
113#endif // XF_TASK_HUNGER_IS_ENABLE
114
116{
117 XF_ASSERT(task, XF_ERR_INVALID_ARG, TAG, "task must not be NULL");
118 xf_task_base_t *task_base = (xf_task_base_t *)task;
119 xf_task_manager_t manager = task_base->manager;
120 if (task_base->state == XF_TASK_STATE_DELETE) {
122 }
123
125 task_base->suspend_time = xf_task_get_ticks();
126
127 return XF_OK;
128}
129
131{
132 XF_ASSERT(task, XF_ERR_INVALID_ARG, TAG, "task must not be NULL");
133
134 xf_task_base_t *task_base = (xf_task_base_t *)task;
135 xf_task_manager_t manager = task_base->manager;
136 if (task_base->state != XF_TASK_STATE_SUSPEND) {
138 }
139
142
143 xf_task_time_t resume_time = xf_task_get_ticks() - task_base->suspend_time;
144
145 task_base->wake_up += resume_time;
146
147 return XF_OK;
148}
149
151{
152 XF_ASSERT(task, XF_ERR_INVALID_ARG, TAG, "task must not be NULL");
154
156
157 return XF_OK;
158}
159
161{
162 XF_ASSERT(task, _XF_TASK_TYPE_NONE, TAG, "task must not be NULL");
164
165 return (xf_task_type_t)handle->type;
166}
167
169{
170 XF_ASSERT(task, _XF_TASK_STATE_NONE, TAG, "task must not be NULL");
172
173 return (xf_task_state_t)handle->state;
174}
175
177{
178 XF_ASSERT(task, 0, TAG, "task must not be NULL");
180
181 return (uint16_t)handle->priority;
182}
183
185{
186 XF_ASSERT(task, XF_ERR_INVALID_ARG, TAG, "task must not be NULL");
187 XF_ASSERT(priority < XF_TASK_PRIORITY_LEVELS, XF_ERR_INVALID_ARG, TAG, "priority must less than %d",
190
191 if (handle->priority != priority) {
192 handle->priority = priority;
193 // 如果是等待队列中,则修改其所在的优先级队列
194 if (handle->state == XF_TASK_STATE_READY) {
196 }
197 }
198
199 return XF_OK;
200}
201
203{
204 XF_ASSERT(task, XF_ERR_INVALID_ARG, TAG, "task must not be NULL");
206
207 int32_t ticks = xf_task_msec_to_ticks(delay_ms);
208 handle->delay = ticks;
209 handle->wake_up = xf_task_get_ticks() + ticks;
210
211 return XF_OK;
212}
213
215{
216 XF_ASSERT(task, XF_ERR_INVALID_ARG, TAG, "task must not be NULL");
218
219 if (handle->func != func) {
220 handle->func = func;
221 }
222
223 if (handle->arg != arg) {
224 handle->arg = arg;
225 }
226
227 return XF_OK;
228}
229
230#if XF_TASK_USER_DATA_IS_ENABLE
232{
233 XF_ASSERT(task, XF_ERR_INVALID_ARG, TAG, "task must not be NULL");
235
236 handle->user_data = user_data;
237
238 return XF_OK;
239}
240
242{
243 XF_ASSERT(task, NULL, TAG, "task must not be NULL");
245
246 return handle->user_data;
247}
248#endif // XF_TASK_USER_DATA_IS_ENABLE
249
250/* ==================== [Static Functions] ================================== */
#define XF_RETURN_VOID
Definition xf_check.h:47
#define XF_ASSERT(condition, retval, tag, format,...)
xfusion 断言宏(条件 不成立 时则输出日志后返回)。
Definition xf_check.h:150
#define BITS_SET0(var, bits_mask)
设置 32 位变量 var 的对应位掩码 bits_mask 为 1 的地方为 0。
#define BITS_SET1(var, bits_mask)
设置 32 位变量 var 的对应位掩码 bits_mask 为 1 的地方为 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_INVALID_STATE
Definition xf_err.h:47
task 的父对象,保存了 task 的公共属性。
xf_task_time_t wake_up
xf_task_manager_t manager
uint32_t hunger_time
xf_task_time_t suspend_time
const xf_task_vfunc_t * vfunc
xf_task_func_t func
虚函数表,不在 base 对象实现,由子对象完成实现。
const xf_task_create_t constructor
const xf_task_reset_t reset
static void task(xf_task_t task)
Definition xf_main.c:45
const xf_task_vfunc_t * xf_task_get_vfunc(xf_task_type_t type)
task 获取虚函数。
本头文件外界无法调用,manager 基于 base 进行调度。 开放部分在 xf_task_kernel.h .
#define XF_TASK_SIGNAL_EVENT
#define XF_TASK_SIGNAL_RESUME
#define XF_TASK_FALG_FEEL_HUNGERY
外部设置的标志位,内部只会读取不会设置.
XF_TASK_TIME_TYPE xf_task_time_t
xf_task 时间戳类型。
xf_err_t xf_task_set_user_data(xf_task_t task, void *user_data)
设置当前任务的 user_data。
xf_err_t xf_task_set_delay(xf_task_t task, uint32_t delay_ms)
设置任务的延时。
xf_err_t xf_task_set_priority(xf_task_t task, uint16_t priority)
设置当前任务的优先级。
xf_err_t xf_task_suspend(xf_task_t task)
任务进入挂起。挂起态的任务不会参与调度。
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)
在指定任务管理器下创建任务。
xf_task_state_t xf_task_get_state(xf_task_t task)
获取当前任务的状态。
void xf_task_reset(xf_task_t task)
任务重置。将任务的一些参数进行重置。
uint16_t xf_task_get_priority(xf_task_t task)
获取当前任务的优先级。
xf_err_t xf_task_set_func(xf_task_t task, xf_task_func_t func, void *arg)
设置当前任务的执行函数(某些种类任务可能不适用)。
xf_task_manager_t xf_task_get_manager(xf_task_t task)
从任务获取管理器对象。
void xf_task_feel_hungery_enable(xf_task_t task, uint32_t hunger_time)
启用任务感受饥饿的功能。
xf_err_t xf_task_trigger(xf_task_t task)
任务触发。无论是否到达唤醒时间,都会触发。
void * xf_task_get_arg(xf_task_t task)
从任务对象获取任务自定义参数。
void xf_task_feel_hungery_disable(xf_task_t task)
禁用任务感受饥饿功能。
void * xf_task_get_user_data(xf_task_t task)
获取当前任务的 user_data。
xf_task_type_t xf_task_get_type(xf_task_t task)
获取当前任务类型。
void xf_task_delete(xf_task_t task)
任务删除函数。将任务加入销毁队列,并设置任务为删除态。
xf_err_t xf_task_resume(xf_task_t task)
任务从挂起中恢复,进入调度。
#define TAG
int32_t xf_task_get_timeout(xf_task_t task)
获取任务的超时时间。
void(* xf_task_func_t)(xf_task_t task)
任务调用函数原型。
@ XF_TASK_STATE_SUSPEND
@ XF_TASK_STATE_DELETE
@ XF_TASK_STATE_READY
@ _XF_TASK_STATE_NONE
enum _xf_task_type_t xf_task_type_t
任务类型,通过注册表 xf_task_reg.inc 生成相关的内容。
enum _xf_task_state_t xf_task_state_t
任务状态枚举。
@ _XF_TASK_TYPE_NONE
#define XF_TASK_PRIORITY_LEVELS
配置任务最高优先级,1 ~ 1024 之间。
xf_err_t xf_task_manager_task_blocked(xf_task_manager_t manager, xf_task_t task)
设置当前任务为阻塞。
xf_err_t xf_task_manager_task_suspend(xf_task_manager_t manager, xf_task_t task)
设置当前任务为挂起。
xf_err_t xf_task_manager_task_ready(xf_task_manager_t manager, xf_task_t task)
设置当前任务为就绪。
xf_err_t xf_task_manager_task_destory(xf_task_manager_t manager, xf_task_t task)
设置当前任务为销毁。
任务管理器。
void * xf_task_manager_t
任务管理器句柄。
void * xf_task_t
任务句柄。
xf_task_time_t xf_task_get_ticks(void)
int32_t xf_task_msec_to_ticks(int32_t msec)