XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_ttask.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_ttask.h"
15
16#include "../kernel/xf_task_base.h"
17#include "../port/xf_task_port_internal.h"
18
19/* ==================== [Defines] =========================================== */
20
21#define TAG "ttask"
22
23/* ==================== [Typedefs] ========================================== */
24
30
31/* ==================== [Static Prototypes] ================================= */
32
33static void xf_ttask_reset(xf_task_t task);
35static void xf_ttask_exec(xf_task_manager_t manager);
36static xf_task_t xf_ttask_constructor(xf_task_manager_t manager, xf_task_func_t func, void *func_arg, uint16_t priority,
37 void *config);
38
39/* ==================== [Static Variables] ================================== */
40
43 .exec = xf_ttask_exec,
44 .reset = xf_ttask_reset,
45 .update = xf_ttask_update,
46};
47
48/* ==================== [Macros] ============================================ */
49
50/* ==================== [Global Functions] ================================== */
51
56
58{
59 XF_ASSERT(task, XF_ERR_INVALID_ARG, TAG, "task must not be NULL");
60
62
63 if (handle->base.type != XF_TASK_TYPE_TTASK) {
64 XF_LOGE(TAG, "task must be ttask");
65 return XF_ERR_INVALID_ARG;
66 }
67
68 if (count > handle->count_max) {
69 XF_LOGE(TAG, "task must less than %d", (int)handle->count_max);
70 return XF_ERR_INVALID_ARG;
71 }
72
73 handle->count = count;
74
75 return XF_OK;
76}
77
79{
80 XF_ASSERT(task, 0, TAG, "task must not be NULL");
81
83
84 return handle->count;
85}
86
88{
89 XF_ASSERT(task, XF_ERR_INVALID_ARG, TAG, "task must not be NULL");
90
92
93 handle->count_max = count_max;
94
95 return XF_OK;
96}
97
98/* ==================== [Static Functions] ================================== */
99
100static xf_task_t xf_ttask_constructor(xf_task_manager_t manager, xf_task_func_t func, void *func_arg, uint16_t priority,
101 void *config)
102{
104
105 if (task == NULL) {
106 XF_LOGE(TAG, "memory alloc failed!");
107 return NULL;
108 }
109
110 xf_ttask_config_t *ttask_config = config;
111
112 uint32_t ticks = xf_task_msec_to_ticks(ttask_config->delay_ms);
113
114 xf_task_base_init(&task->base, manager, XF_TASK_TYPE_TTASK, priority, func, func_arg);
115
116 task->base.delay = ticks;
117 task->count = ttask_config->count;
118 task->count_max = ttask_config->count;
119
120 task->base.wake_up = xf_task_get_ticks() + ticks;
121
122 return (xf_task_t)task;
123}
124
126{
128
129 xf_task_base_reset(&handle->base);
130
131 handle->count = handle->count_max; // 重置计数器
132 handle->base.wake_up = xf_task_get_ticks() + handle->base.delay; // 重置唤醒时间
133}
134
135static void xf_ttask_time_handle(xf_task_t task, uint32_t time_ticks)
136{
138
139 int32_t timeout = time_ticks - handle->base.wake_up;
140
141 // 计数器到0,停止更新,进入删除状态
142 if (handle->count == 0) {
144 return;
145 }
146
147 // 转换超时时间,如果大于零则触发超时
148 handle->base.timeout = xf_task_ticks_to_msec(timeout);
149 if (timeout >= 0) {
151 // 根据循环次数重置循环结束点
152 handle->count = (handle->count != XF_TTASK_INFINITE_LOOP) ? (handle->count - 1) : (handle->count);
153 }
154
155}
156
158{
160 xf_task_time_t time_ticks = xf_task_get_ticks();
161
162 if (handle->base.delay != 0) {
163 xf_ttask_time_handle(task, time_ticks);
164 }
165
169 }
170
174 }
175
176 return time_ticks;
177}
178
180{
182
184 task->base.func(task);
185
186 if (task->base.delay != 0) {
187 task->base.wake_up = xf_task_get_ticks() + task->base.delay;
188 }
189}
xf_err_t xf_ttask_set_count_max(xf_task_t task, uint32_t count_max)
设置 ttask 循环次数的上限。
Definition xf_ttask.c:87
uint32_t xf_ttask_get_count(xf_task_t task)
获取 ttask 循环次数。
Definition xf_ttask.c:78
xf_err_t xf_ttask_set_count(xf_task_t task, uint32_t count)
设置 ttask 循环次数。其不能超过循环次数的上限。
Definition xf_ttask.c:57
#define XF_TASK_TYPE_TTASK
ttask 类型值。 XF_TASK_TYPE_ttask 通过 xf_task_reg.inc 拼接而来。
Definition xf_ttask.h:39
#define XF_TTASK_INFINITE_LOOP
Definition xf_ttask.h:40
#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。
#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
#define xf_malloc(x)
Definition xf_stdlib.h:38
task 的父对象,保存了 task 的公共属性。
xf_task_time_t wake_up
虚函数表,不在 base 对象实现,由子对象完成实现。
const xf_task_create_t constructor
ttask 创建传输参数。
Definition xf_ttask.h:47
uint32_t delay_ms
Definition xf_ttask.h:49
uint32_t count_max
Definition xf_ttask.c:28
xf_task_base_t base
Definition xf_ttask.c:26
static void task(xf_task_t task)
Definition xf_main.c:45
#define XF_LOGE(tag, format,...)
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)
int32_t xf_task_msec_to_ticks(int32_t msec)
static xf_task_t xf_ttask_constructor(xf_task_manager_t manager, xf_task_func_t func, void *func_arg, uint16_t priority, void *config)
Definition xf_ttask.c:100
static void xf_ttask_exec(xf_task_manager_t manager)
Definition xf_ttask.c:179
static xf_task_time_t xf_ttask_update(xf_task_t task)
Definition xf_ttask.c:157
struct _xf_ttask_handle_t xf_ttask_handle_t
static void xf_ttask_reset(xf_task_t task)
Definition xf_ttask.c:125
static const xf_task_vfunc_t _ttask_vfunc
Definition xf_ttask.c:41
static void xf_ttask_time_handle(xf_task_t task, uint32_t time_ticks)
Definition xf_ttask.c:135
void xf_ttask_vfunc_register(void)
Definition xf_ttask.c:52
#define TAG
Definition xf_ttask.c:21
定时器任务。