对于中断函数返回值的分析

发布者:Meshulun最新更新时间:2018-12-01 来源: eefocus关键字:中断函数  返回值 手机看文章 扫描二维码
随时随地手机看文章

在一次自己编写中断处理函数的时候,没有写函数的返回值,make的时候是正常编译通过的,但是在运行过程中就报错了,于是对中断函数的返回值进行了一定的了解,总结一下。


1.中断的注册与释放:


实现中断注册接口:


/*------------------------------------------------------------------------------------*/

int request_irq(unsigned int irq,

irqreturn_t (*handler)(int, void *,

struct pt_regs *),

unsigned long flags,

const char *dev_name,

void *dev_id);

 

void free_irq(unsigned int irq, void *dev_id);

/*------------------------------------------------------------------------------------*/

其中函数中的参数说明

unsigned int irq:所要注册的中断号

irqreturn_t (*handler)(int, void *, struct pt_regs *):中断服务程序的入口地址。

unsigned long flags:与中断管理有关的位掩码选项,有三组值:

(1). SA_INTERRUPT :快速中断处理程序,当使用它的是后处理器上所有的其他中断都被禁用。

(2). SA_SHIRQ :该中断是在设备之间可共享的

(3). SA_SAMPLE_RANDOM:这个位表示产生的中断能够有贡献给 /dev/random和 /dev/urandom 使用的加密池。

const char *dev_name:设备描述,表示那一个设备在使用这个中断。


void *dev_id:用作共享中断线的指针。它是一个独特的标识, 用在当释放中断线时以及可能还被驱动用来指向它自己的私有数据区(来标识哪个设备在中断) 。这个参数在真正的驱动程序中一般是指向设备数据结构的指针。在调用中断处理程序的时候它就会传递给中断处理程序的void *dev_id。(这是我的理解)如果中断没有被共享, dev_id 可以设置为 NULL, 但是使用这个项指向设备结构不管如何是个好主意。我们将在"实现一个处理"一节中看到 dev_id 的一个实际应用。


中断号的查看可以使用下面的命令:“cat /proc/interrupts”。


/proc/stat 记录了几个关于系统活动的低级统计量, 包括(但是不限于)自系统启动以来收到的中断数。stat 的每一行以一个文本字串开始, 是该行的关键词。


第一个数是所有中断的总数, 而其他每一个代表一个单个 IRQ 线, 从中断 0 开始,所有的计数跨系统中所有处理器而汇总的。这个快照显示, 中断号 4 已使用 1 次, 尽管当前没有安装处理。


以下是一个统计中断时间间隔的中断服务程序。


/*------------------------------------------------------------------------------------*/

irqreturn_t short_interrupt(int irq, void *dev_id, struct pt_regs *regs)

{

static long mytime=0;

static int i=0;

struct net_device *dev=(struct net_device *)dev_id;

 

if(i==0){

mytime=jiffies;

}else

if(iname,dev->irq);

}

 

i++;

return IRQ_HANDLED;

}

/*------------------------------------------------------------------------------------*/

这个函数实现的只是对两次发生中断的时间间隔的统计,时间单位是毫秒


函数参数说明:


int irq :在这里很明显传递过来的是中断号


void *dev_id :这个传递来的是设备的id号,可以根据这个设备id号得到相应设备的数据结构,进而的到相应设备的信息和相关数据。下面以提取网路数据为例来说明一下。


struct net_device *dev=( struct net_device *)dev_id; (这里的dev_id的值是注册中断的时候宏传递过来的,是注册中断函数的最后一个参数)


在这之后就可以用dev->name; dev->irq;等得到网络设备的信息了,当然提取ip数据报还得进行一些其它的工作。


struct pt_regs *regs :它指向一个数据结构,此结构保存的是中断之前处理器的寄存器和状态。主要用在程序调试。


关于中断处理函数的返回值:中断程序的返回值是一个特殊类型—irqreturn_t。但是中断程序的返回值却只有两个—IRQ_NONE和IRQ_HANDLED。


/* irqreturn.h */


#ifndef _LINUX_IRQRETURN_H


#define _LINUX_IRQRETURN_H


typedef int irqreturn_t;


/*For 2.4.x compatibility, 2.4.x can use

* typedef void irqreturn_t;

* #define IRQ_NONE

* #define IRQ_HANDLED

* #define IRQ_RETVAL(x)

...

* To mix old-style and new-style irq handler returns.

* IRQ_NONE means we didn't handle it.

* 中断程序接收到中断信号后发现这并不是注册时指定的中断原发出的中断信号.

*此时返回次值

* IRQ_HANDLED means that we did have a valid interrupt and handled it.

* 接收到了准确的中断信号,并且作了相应正确的处理

* IRQ_RETVAL(x) selects on the two depending on x being non-zero (for handled)

*/


#define IRQ_NONE (0)


#define IRQ_HANDLED (1)


#define IRQ_RETVAL(x) ((x) != 0) //这个宏只是返回0或非0


#endif


关键字:中断函数  返回值 引用地址:对于中断函数返回值的分析

上一篇:中断函数和中断处理函数
下一篇:带参数的中断程序实例

推荐阅读最新更新时间:2024-03-16 16:19

STM32库函数详解----(外部中断/事件控制器 EXTI)
1.void EXTI_DeInit (void) 函数解释:将EXTI外设寄存器重置为默注释。RCC_APB2PeriphResetCmd参数中没有EXTI外设的的宏,该外设重置采取的是直接向寄存器赋默认值的操作。 例子:EXTI_DeInit ( ); 2.void EXTI_Init (EXTI_InitTypeDef*EXTI_InitStruct) 函数解释:根据EXTI_InitStruct结构体中所配置的参数来初始化外设EXTI寄存器。结构体中模式成员设置了被使能线路是事件请求还是中断请求。 例子:EXTI_Init (&EXTI_InitStruct); EXTI_Line: EXTI_
[单片机]
通过库函数使用STM32f103串口中断的心得
STM32使用USART中断主要有一下几步: 1,定义中断结构体,和串口结构体 2,使能时钟 3,编写中断函数 4,使能中断 关于发送中断,笔者当时有个疑惑: 上图是关于状态寄存器(USART_SR)中的两位。 上图是控制寄存器1(USART_CR1)中的两位。 笔者当时的疑惑是,这两位都可以控制中断啊,DR数据被移走触发中断,DR数据被移走也会使TC为置一,也会产生中断,这尼玛不冲突了?笔者当时陷入了死循环。 后来笔者想通了,要进入发送中断,用库函数:USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); 这个函数时用来打开CR1中的响应位的,比如上一句
[单片机]
通过库<font color='red'>函数</font>使用STM32f103串口<font color='red'>中断</font>的心得
STC单片机PCA捕获中断函数
/***************************************************/ **函数名称:void PCA_Capture_Int(); **功能描述:PCA捕获中断函数,扩展32位计数 **说 明:中断发生后,计数器将32计数结果高位写入 /***************************************************/ void PCA_Capture_Int() {//PCA捕获中断 if(CR) {//如果计数器溢出 PCA_0.Dou_L++; //模块0高位临时变量自加 PCA_1.Dou_L++; //模
[单片机]
STM32写中断处理函数时,必须使用库函数,启动文件固定的函数
中断名其所在位置为stm32fxxx.h中的IRQn_Type枚举中,比如 /** * @brief STM32F4XX Interrupt Number Definition, according to the selected device * in @ref Library_configuration_section */ typedef enum IRQn { /****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ NonMaskableInt
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved