sdk-hwV1.3/lichee/rtos-hal/include/osal/hal_workqueue.h

99 lines
2.5 KiB
C

#ifndef SUNXI_HAL_WAITQUEUE_H
#define SUNXI_HAL_WAITQUEUE_H
#ifdef __cplusplus
extern "C"
{
#endif
#include <stddef.h>
#include <stdint.h>
#ifdef CONFIG_KERNEL_FREERTOS
#include <FreeRTOS.h>
#include <task.h>
#include <aw_list.h>
#include <hal_sem.h>
#include <hal_time.h>
#include <hal_timer.h>
#include <hal_status.h>
enum
{
HAL_WORK_STATE_PENDING = 0x0001, /* Work item pending state */
HAL_WORK_STATE_SUBMITTING = 0x0002, /* Work item submitting state */
};
enum
{
HAL_WORK_TYPE_DELAYED = 0x0001,
};
typedef struct _hal_work hal_work;
typedef struct _hal_workqueue
{
struct list_head work_list;
hal_work *work_current;
hal_sem_t sem;
void *work_thread;
} hal_workqueue;
typedef struct _hal_work
{
struct list_head list;
void (*work_func)(hal_work *work, void *work_data);
void *work_data;
uint16_t flags;
uint16_t type;
osal_timer_t timer;
hal_workqueue *workqueue;
} hal_work;
typedef struct _hal_delayed_work
{
hal_work work;
} hal_delayed_work;
hal_workqueue *hal_workqueue_create(const char *name, uint16_t stack_size, uint8_t priority);
int hal_workqueue_destroy(hal_workqueue *queue);
int hal_workqueue_dowork(hal_workqueue *queue, hal_work *work);
int hal_workqueue_submit_work(hal_workqueue *queue, hal_work *work, hal_tick_t time);
int hal_workqueue_cancel_work(hal_workqueue *queue, hal_work *work);
int hal_workqueue_cancel_work_sync(hal_workqueue *queue, hal_work *work);
int hal_work_submit(hal_work *work, hal_tick_t time);
int hal_work_cancel(hal_work *work);
void hal_work_init(hal_work *work, void (*work_func)(hal_work *work, void *work_data), void *work_data);
void hal_delayed_work_init(hal_delayed_work *work, void (*work_func)(hal_work *work, void *work_data), void *work_data);
int hal_work_sys_workqueue_init(void);
#elif defined(CONFIG_RTTKERNEL)
#include <rtthread.h>
#include <workqueue.h>
#include <hal_time.h>
typedef struct rt_workqueue hal_workqueue;
typedef struct rt_work hal_work;
#define hal_work_init rt_work_init
hal_workqueue *hal_workqueue_create(const char *name, unsigned short stack_size, unsigned char priority);
int hal_workqueue_destroy(hal_workqueue *queue);
int hal_workqueue_dowork(hal_workqueue *queue, hal_work *work);
int hal_workqueue_submit_work(hal_workqueue *queue, hal_work *work, hal_tick_t time);
int hal_workqueue_cancel_work(hal_workqueue *queue, hal_work *work);
int hal_workqueue_cancel_work_sync(hal_workqueue *queue, hal_work *work);
#else
#error "can not support the RTOS!!"
#endif
#endif