tasklet 与 softirq

2024-04-14 23:38
文章标签 tasklet softirq

本文主要是介绍tasklet 与 softirq,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、唠嗑
    对应的源码在 kernel/softirq.c 。
    softirq 里有很多的已定义的软中断处理。其中, tasklet只是其中的一个,在softirq_init中打开了 tasklet的中断
open_softirq(TASKLET_SOFTIRQ, tasklet_action);
    也就是说,如果触发了TASKLET_SOFTIRQ这个软中断,tasklet_action就会被执行。
    tasklet 用 tasklet_struct 来表示一个一个的小任务,并用 tasklet_init 来初始化(也可以用DECLARE_TASKLET 
或 DECLARE_TASKLET_DISABLED)。并调用 tasklet_schedule 来调用对应的小任务。而tasklet_schedule 是通过触发
TASKLET_SOFTIRQ的软中断执行tasklet_action,在tasklet_action中才是真正的调用到小任务的。tasklet 是基于 softirq
的基础之上。
    对 softirq 的思考,中断就是外来的一个信号触发一个动作。外来的中断如果是硬件中断就好理解了,如果是软件的,那就
是软中断了。软件就是直接调用 raise_softirq_irqoff 或者 raise_softirq 来触发对应的中断,相当于是硬件拉低一下电平。
二、API
2.1 softirq
void __init softirq_init(void)  
// 初始化void open_softirq(int nr, void (*action)(struct softirq_action *))
// 打开一个软中断,为什么叫打开而不叫注册呢,因为softirq是已经预定义好了。
enum
{HI_SOFTIRQ=0,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,BLOCK_SOFTIRQ,BLOCK_IOPOLL_SOFTIRQ,TASKLET_SOFTIRQ,SCHED_SOFTIRQ,HRTIMER_SOFTIRQ,RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */NR_SOFTIRQS
};void raise_softirq(unsigned int nr)
// 触发软中断, 其中有关中断的操作inline void raise_softirq_irqoff(unsigned int nr)
// 触发软中断,如果已经关中断了,那就调用这个 xxx_irqoff 就是这个意思2.2 taskletvoid tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data)
DECLARE_TASKLET(name, func, data)
DECLARE_TASKLET_DISABLED(name, func, data)
// 初始化 taskletstatic inline void tasklet_schedule(struct tasklet_struct *t)
// 调用static inline void tasklet_disable(struct tasklet_struct *t)
static inline void tasklet_enable(struct tasklet_struct *t)
// 使能操作extern void tasklet_kill(struct tasklet_struct *t);
// 从内核中把该tasklet丢掉


这篇关于tasklet 与 softirq的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904347

相关文章

Linux tasklet

static struct demo_dev *p = ...;//延时操作函数void demo_delay_action(unsigned long data){// 通过data获得设备相关指针static struct demo_dev *pdev = (static struct demo_dev *)data;//延时操作。。。。}//调用DECLARE_TASKLET(name

Tasklet 机制

在编写设备驱动时, tasklet 机制是一种比较常见的机制,通常用于减少中断处理的时间,将本应该是在中断服务程序中完成的任务转化成软中断完成。 为了最大程度的避免中断处理时间过长而导致中断丢失,有时候我们需要把一些在中断处理中不是非常紧急的任务放在后面执行,而让中断处理程序尽快返回。在老版本的 linux 中通常将中断处理分为 top half handler 、 bottom half ha

Linux驱动开发杂记(0x15) - tasklet

为了提高系统的响应能力和并发能力,Linux将中断处理分了上半部和下半部。当一个中断产生,调用该中断对应的处理程序(上半部),然后告诉系统,对应的后半部可以执行了,中断处理程序立即返回,下半部会在合适的时机由操作系统调用。这样一来就大大的减少了中断处理所需要的时间。 tasklet是中断处理下半部分最常用的一种方法,驱动程序一般先申请中断,在中断处理函数内完成中断上半部分的工作后调用taskle

中断处理的 tasklet 机制

中断处理的 tasklet 机制中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失。因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟。例如,假设一个数据块已经达到了网线,当中断控制器接受到这个中断请求信号时,Lin

Linux嵌入式驱动开发14——中断的原理以及按键中断的实现(tasklet中断下文)

中断 全系列传送门中断基础什么是中断?中断上下文Linux中断现在不可以嵌套 设备书中的中断节点和相关函数设备树中的中断节点中断相关函数获取中断号相关函数申请中断函数中断处理函数free_irq函数 按键中断实验(gpio_to_irq函数获取中断号)配置设备树驱动编写错误排查oops信息结果验证查看中断信息 按键中断实验(interrupt-parent和interrupts属性信息获取

Linux系统调试课:CPU 利用率中softirq飙高情况分析

文章目录 <font color=#0990d9>一、细化 CPU 利用率监控<font color=#0990d9>二、softirq飙高观测<font color=#0990d9>三、ksoftirqd机制 沉淀、分享、成长,让自己和他人都能有所收获!😄 CPU 利用率是一个很笼统的概念,在遇到 CPU 利用率飙高的问题时,我们需要看看 CPU到底在忙哪类事情,比

linux -- 中断管理 -- softirq机制

softirq的起始 do_IRQ();--> irq_enter(); //HARDIRQ部分的开始 更新系统中的一些统计量 标识出HARDIRQ上下文--> generic_irq_handler(); --> irq_exit(); //softirq部分的起始 irq_exit /** Exit an interrupt context. Process softirqs i

RK3568平台开发系列讲解(Linux系统篇)中断下文 tasklet

🚀返回专栏总目录 文章目录 一、什么是 taskle二、tasklet 相关接口函数2.1、静态初始化函数2.2、动态初始化函数2.3、关闭函数2.4、使能函数2.5、调度函数2.6、销毁函数 三、测试程序 沉淀、分享、成长,让自己和他人都能有所收获!😄

驱动基石之_tasklet中断下半部_工作队列_中断线程化处理

tasklet中断下半部 linux的中断分为两个部分: 1.中断上半部:在中断上半部期间,不允许被其他中断打断,直到中断上半部的服务函数执行完。 2.中断下半部:中断下半部,在执行中断下半部服务函数的期间,能被其它更高优先级别的中断打断。 使用流程 1.创建一个strcuct timer_list类型的变量,我把这个变量定义在结构体使是因为我这里使用的了两个按键,我把按键看

【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】中断服务下半部之tasklet详解

中断服务下半部之tasklet详解   Sailor_forever  sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/2008/07/13/2645186.aspx   【摘要】本文详解了中断服务下半部之tasklet实现机制。介绍了tasklet链表的组织形式tasklet