TuyaOS
定时队列服务

定时队列服务是TuyaOS基于workqueue实现的,满足一般的定时、循环等异步任务处理需求的基础能力。TuyaOS 在自身初始化的时候,已经完成了定时队列服务的创建,不需要开发者进行额外的操作,可以直接进行任务处理。

接口描述

工作队列优先级

typedef enum {
WORKQ_SERVICE_E
TuyaOS provides developers with two workqueue service for convenience.
Definition: tal_workq_service.h:19
@ WORKQ_SYSTEM
Definition: tal_workq_service.h:23
@ WORKQ_HIGHTPRI
Definition: tal_workq_service.h:27

TuyaOS提供了两种工作队列,分别为:

  • WORKQ_SYSTEM:低优先级服务,允许进行阻塞任务。
  • WORKQ_HIGHTPRI:高优先级服务,不允许进行阻塞任务。

添加任务到定时队列服务

OPERATE_RET tal_workq_init_delayed(WORKQ_SERVICE_E service, WORKQUEUE_CB cb, VOID_T *data, DELAYED_WORK_HANDLE *delayed_work);
OPERATE_RET tal_workq_init_delayed(WORKQ_SERVICE_E service, WORKQUEUE_CB cb, VOID_T *data, DELAYED_WORK_HANDLE *delayed_work)
init delayed work task

添加一个定时任务。提供回调函数以及处理参数,返回延时任务的句柄。

注意:任务是一次性的,异步处理的,所以参数data需要使用Malloc申请堆内存,data的内存可以在tal_workq_stop_delayed之后释放,避免内存泄露。

启动定时任务

OPERATE_RET tal_workq_start_delayed(DELAYED_WORK_HANDLE delayed_work,
TIME_MS interval, LOOP_TYPE type);
OPERATE_RET tal_workq_start_delayed(DELAYED_WORK_HANDLE delayed_work, TIME_MS interval, LOOP_TYPE type)
put work task in workqueue after delay

启动定时任务,开始计时,当计时时间达到interval之后,该定时任务将会被执行。

停止定时任务

OPERATE_RET tal_workq_stop_delayed(DELAYED_WORK_HANDLE delayed_work);
OPERATE_RET tal_workq_stop_delayed(DELAYED_WORK_HANDLE delayed_work)
stop delayed work

停止定时任务,停止计时,即使时时间达到interval,该定时任务也不会被执行。

删除定时任务

OPERATE_RET tal_workq_cancel_delayed(DELAYED_WORK_HANDLE delayed_work);
OPERATE_RET tal_workq_cancel_delayed(DELAYED_WORK_HANDLE delayed_work)
cancel delay work

删除一个定时任务,删除的时候,需要自行释放data,避免内存泄露。

示例代码

STATIC VOID __delay_work_cb(VOID_T *data)
{
PR_DEBUG("delay work is here %p", data);
}
STATIC DELAYED_WORK_HANDLE sg_delaywork;
OPERATE_RET sample_delaywork_service_test()
{
OPERATE_RET rt = OPRT_OK;
// 添加待执行任务
rt = tal_workq_init_delayed(WORKQ_SYSTEM, __delay_work_cb, NULL, &sg_delaywork);
EXPECT_EQ(rt, OPRT_OK);
// 启动定时任务,只执行一次
rt = tal_workq_start_delayed(sg_delaywork, 1000, LOOP_ONCE);
EXPECT_EQ(rt, OPRT_OK);
// delay等待定时任务执行
// 驱动定时任务
rt = tal_workq_stop_delayed(sg_delaywork);
EXPECT_EQ(rt, OPRT_OK);
// 删除定时任务
rt = tal_workq_stop_delayed(sg_delaywork);
EXPECT_EQ(rt, OPRT_OK);
sg_delaywork = NULL;
return OPRT_OK;
}
VOID_T tal_system_sleep(UINT32_T time_ms)
This API is used for system sleep.