linux中断下文之软中断(中断三)

  软中断对应的中断号不多,一般用在网络设备驱动,块设备驱动当中。

一、概述

  Linux 源码 linux_sdk/kernel/include/linux/interrupt.h 文件中定义了一个枚举类型,用于标识软中断的不同类型或优先级。每个枚举常量对应一个特定的软中断类型。

enum
{
	HI_SOFTIRQ=0,
	TIMER_SOFTIRQ,
	NET_TX_SOFTIRQ,
	NET_RX_SOFTIRQ,
	BLOCK_SOFTIRQ,
	IRQ_POLL_SOFTIRQ,
	TASKLET_SOFTIRQ,
	SCHED_SOFTIRQ,
	HRTIMER_SOFTIRQ, /* Unused, but kept as tools rely on the
			    numbering. Sigh! */
	RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */

	NR_SOFTIRQS
};

  每个枚举常量的含义:

HI_SOFTIRQ:高优先级软中断
TIMER_SOFTIRQ:定时器软中断
NET_TX_SOFTIRQ:网络传输发送软中断
NET_RX_SOFTIRQ:网络传输接收软中断
BLOCK_SOFTIRQ:块设备软中断
IRQ_POLL_SOFTIRQ:中断轮询软中断
TASKLET_SOFTIRQ:任务软中断
SCHED_SOFTIRQ:调度软中断
HRTIMER_SOFTIRQ, /* Unused, but kept as tools rely on the numbering. Sigh! */
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */
NR_SOFTIRQS:表示软中断的总数,用于指示软中断类型的数据

  中断号的优先级越小,代表优先级越高。在驱动代码中,我们可以使用Linux 驱动代码中上述的软中断。
  这里要注意:Linux 内核的开发者并不希望我们添加一个自定义的软中断,如果我们要用软中断,建议使用 tasklet。Linux 内核开发者不建议自定义软中断

二、软中断接口函数

2.1、open_softirq函数

  注册软中断,使用 open_softirq 函数,函数原型如下所示:

void open_softirq(int nr,void (*action)(struct softirq_action *));

  nr: 软中断的编号或优先级。它是一个整数,表示要注册的软中断的标识符。
  action: 指向一个函数的指针,这个函数将作为软中断的处理程序。该函数接受一个structsoftirq_action 类型的参数。

2.2、raise_softirq函数

  触发软中断,使用 raise_softirq 函数,函数原型如下所示:

void raise_softirq(unsigned int nr);

  nr: 软中断的编号或优先级。它是一个整数,表示要注册的软中断的标识符。

2.3、raise_softirq_irqoff函数

  在禁用硬件中断的情况下,触发软中断使用 raise_softirq_irqoff 函数,函数原型如下所示:

void raise_softirq_irqoff(unsigned int nr);

  nr: 软中断的编号或优先级。它是一个整数,表示要注册的软中断的标识符。

你可能感兴趣的:(RK3568,linux驱动开发笔记(迅为),linux)