自学linux驱动从入门到放弃(十三)中断上下文

本文详细介绍了Linux内核中的中断上下文,包括tasklet结构体的成员及功能,以及如何初始化和调度tasklet。在中断处理过程中,中断函数通常在中断上文执行,而复杂任务则交给tasklet在中断下文处理。通过`tasklet_schedule`调度tasklet,并在适当时候使用`tasklet_kill`注销。示例代码展示了从申请中断到初始化和调度tasklet的完整流程。
摘要由CSDN通过智能技术生成

        在中断中,分为中断上文和下文(tasklet),在request_irq中注册的函数为中断函数,一般是中断上文,中断下文一般用于处理一些复杂耗时间的程序。

1.中断上下文

1.1 tasklet结构体

struct tasklet_struct
{
	struct tasklet_struct *next;
	unsigned long state;
	atomic_t count;
	void (*func)(unsigned long);
	unsigned long data;
};
成员描述
*nexttasklet链表中下一个tasklet
state

tasklet 的状态

TASKLET_STATE_SCHED        已经被调度,将要运行

TASKLET_STATE_RUN        正在运行

counttasklet的引用计数,如果它不为0,则tasklet被禁止,不允许执行;只有当它为0时,tasklet才被激活,并且在被设置为挂起(TASKLET_STATE_SCHED)状态时,该tasklet才能够被执行。
 
(*func)(unsigned long)tasklet的处理函数
datatasklet fun的参数

1.2 tasklet 初始化

void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), 
                    unsigned long data);
参数描述
*ttasklet结构体指针
(*func)(unsigned long)tasklet处理函数
datatasklet参数

 1.3 tasklet 调度

static inline void tasklet_schedule(struct tasklet_struct *t)

1.4 调用过程

        1)定义tasklet结构体

        2)初始化tasklet

        3)编写tasklet function

        4)调度tasklet

        5)注销tasklet

1.5 伪代码

struct tasklet_struct key_task;

void key_task_fun(unsigned long data)    //tasklet function
{
    printk("key tasklet fun is action!\n");
}

irqreturn_t key_fun(int irq,void *args)    //interrupt function
{
	printk(KERN_ERR "test fun is action!!\n");
    tasklet_schedule(&key_task);    //开始调度tasklet
	return IRQ_HANDLED;
}

int led_probe(struct platform_device *pdev){

    int ret;
	gpio_res = gpiod_get_index(&pdev->dev,"key",0,GPIOD_OUT_LOW);	//获取名为key的gpio属性

    ret = gpiod_direction_input(gpio_res);		//将引脚设置为输入
	
	irq = of_irq_get(pdev->dev.of_node, 0);    //通过设备树结点获取中断信息

	ret = request_irq(irq, key_fun, IRQF_TRIGGER_RISING, "key_interrupt", NULL);	//申请中断号
    tasklet_init(&key_task,key_task_fun, 0);    //初始化tasklet
	
    //注册设备号
    //创建class
    //生成设备节点	
	return 0;
}

static void charDev_exit(void)
{

    //释放gpio
    tasklet_kill(&key_task);    //注销tasklet
    //释放irq
    //注销设备节点
    //注销类
    //注销设备号
		
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值