Linux中断子系统---tasklet

一、tasklet相关API

初始化函数:
void tasklet_init(struct tasklet_struct *t,
void (*func)(unsigned long), unsigned long data);
函数参数和返回值含义如下:
t:要初始化的 tasklet
func: tasklet 的处理函数。
data: 要传递给 func 函数的参数
或者使用DECLARE_TASKLET(name, func, data)

调度tasklet函数:
void tasklet_schedule(struct tasklet_struct *t);

其中tasklet_struct 结构体如下:

struct tasklet_struct
{
	struct tasklet_struct *next;
	unsigned long state;
	atomic_t count;
	void (*func)(unsigned long); //tasklet执行的函数
	unsigned long data; //函数func的入参
};

tasklet是在中断上下文中执行任务的,所以处理过程中其他进程是无法被调度到的,而且中断执行过程中也是无法休眠的,它的适用场景是处理一些耗时短的任务(如果耗时长其他进程得不到调度,系统会卡顿)。
/* by 面朝大海0902 */

二、tasklet使用方法

/* 定义 taselet */
struct tasklet_struct testtasklet;

/* tasklet 处理函数 */
void testtasklet_func(unsigned long data)
{
/* tasklet 具体处理内容 */
}

/* 中断处理函数 */
irqreturn_t test_handler(int irq, void *dev_id)
{
......
/* 调度 tasklet */
tasklet_schedule(&testtasklet);
......
}

/* 驱动入口函数 */
static int __init xxxx_init(void)
{
......
/*初始化tasklet*/
tasklet_init(&testtasklet, testtasklet_func, data);
/* 注册中断处理函数 */
request_irq(xxx_irq, test_handler, 0, "xxx", &xxx_dev);
......
}

此处参考《【正点原子】I.MX6U嵌入式Linux驱动开发指南》

三、驱动使用实例及实验结果

/* by 面朝大海0902 /
tasklet的驱动使用代码与下一节我们讲的Linux中断子系统—工作队列重复率很高,所以驱动代码及相关验证,我们与下一讲合二为一,详细请参考下一节Linux中断子系统—工作队列
/
by 面朝大海0902 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值