0.简介
tasklet的实现主要是为了满足嵌入式系统开发过程中经常会遇到定时周期任务、延时任务等需求。在bcos系统中,tasklet在空闲任务中执行,空闲任务在系统中的优先级最低。所以,当系统中没有其他任务执行时,空闲任务会检查tasklet队列中是否有超时的任务需要执行。用户在使用tasklet时一定要注意这一点。tasklet的回调函数的执行与我们预期执行的时间的误差取决于系统中其他线程任务的繁忙程度,当然由于空闲任务的优先级最低,所以在tasklet回调函数执行的过程中可能会被其他高优先级的就绪任务抢占。
1.接口
tasklet的数据结构:
typedef struct bcos_tasklet_s
{
/* 链表头 */
struct list_head list;
/* 回调函数 */
void (*handler)(void *ptr);
/* 任务参数 */
void *ptr;
/* 任务延时间戳 */
BC_OS_TICK stamp;
}bcos_tasklet_t;
对数据结构静态初始化接口:
/* 静态初始化tasklet */
#define BCOS_TASKLET_STATIC_INIT(name, handler, ptr) \
{ \
LIST_HEAD_INIT(name.list), \
handler, \
ptr, \
0, \
}
将tasklet提交给系统处理:
/*
* 将tasklet节点添加到tasklet执行队列, 如果时立即执行的tasklet,系统会
* 尽快调度执行,如果是延时任务,系统会在超时