Files
OpenTXW81X/sdk/include/osal/work.h
T
2025-08-27 09:51:58 +01:00

72 lines
2.0 KiB
C

#ifndef _OS_TASK_WORK_H_
#define _OS_TASK_WORK_H_
#include "typesdef.h"
#include "errno.h"
#include "list.h"
#include "osal/string.h"
#include "osal/time.h"
#include "osal/timer.h"
#include "osal/mutex.h"
#include "osal/task.h"
#include "osal/semaphore.h"
#ifdef __cplusplus
extern "C" {
#endif
struct os_work;
typedef int32(*os_work_func_t)(struct os_work *work);
typedef void (*os_run_func_t)(uint32 param1, uint32 parma2, uint32 param3);
struct os_work {
struct list_head list;
struct os_workqueue *wkq;
uint32 running: 1, alloc : 1, delay: 1, pri: 5, init: 1, rev: 7;
uint32 schedule;
uint64 expired;
os_work_func_t func;
};
struct os_workqueue {
char *name;
uint16 priority: 10, init: 1, wait_sema: 1, rev: 4;
uint16 stack_size;
struct os_timer timer;
struct os_task task;
struct list_head works;
struct list_head delay_works;
struct os_semaphore sema;
struct os_work *runwk;
uint64 run_jiff;
};
#define OS_WORK_INIT(work, function, priority) do{\
os_memset(work, 0, sizeof(struct os_work));\
(work)->init = 1;\
(work)->func = function;\
(work)->pri = ((priority)&0x1f);\
}while (0)
#define OS_WORK_REINIT(work) do{\
(work)->init = 1;\
}while (0)
int32 mainwkq_monitor_init(void);
int32 os_workqueue_init(struct os_workqueue *wkq, char *name, uint16 priority, uint16 stack_size);
void os_work_schedule(struct os_workqueue *wkq, struct os_work *work);
void os_work_schedule_delay(struct os_workqueue *wkq, struct os_work *work, uint32 delay_ms);
void os_work_cancle(struct os_work *work, uint8 sync);
void os_work_cancle2(struct os_work *work, uint8 sync); //执行此API后,必须设置init=1才能再次schedule work
int32 os_run_func(os_run_func_t func, uint32 param1, uint32 param2, uint32 param3);
int32 os_run_func_delay(os_run_func_t func, uint32 param1, uint32 param2, uint32 delay_ms);
int32 os_run_work(struct os_work *work);
int32 os_run_work_delay(struct os_work *work, uint32 delay_ms);
#endif