disable_irq与disable_irq_nosync使用场景

Linux设备驱动,关于中断屏蔽有两个接口:disable_irq和disable_irq_nosync,该两接口使用场景如下:

1、disable_irq:在非中断处理函数中使用,会阻塞;

2、disable_irq_nosync:在中断处理函数中使用,不会阻塞;用于屏蔽相应中断;

一、为什么要屏蔽中断

使能中断后,一旦触发中断,系统会进入中断处理函数;如果下一个中断触发的时候,前一个中断处理函数已经完成,这是理想状态,不会发生异常;如果前一个中断处理函数还未完成,那么就会导致中断嵌套。为了不出现中断嵌套,必须在中断处理函数中屏蔽中断,待中断处理完成后,再主动使能中断

二、disable_irq不能放在中断处理函数中

如果在中断处理函数中使用disable_irq屏蔽相应中断,系统将会出现死锁状态,最后死机,然后重启。(已验证)

三、enable_irq配套使用

当中断处理函数已经完成所有工作,在返回之前需要主动调用接口enable_irq使能中断,否则该中断将一直被屏蔽。(已验证)

四、附上距离传感器中断处理处理函数

//PS中断处理
static irqreturn_t ltr559_irq_handler(int irq, void *arg)
{
struct ltr559_data *data = (struct ltr559_data *)arg;

//printk("%s\n",__func__);

if (NULL == data)
return IRQ_HANDLED;

//后面必须有使能中断
disable_irq_nosync(data->irq);
//屏蔽中断,不会造成死锁
schedule_delayed_work(&data->ps_work, 0);
//调用延时工作队列
return IRQ_HANDLED;
}

//PS工作任务
//重要接口
static void ltr559_ps_work_func(struct work_struct *work)
{
struct ltr559_data *data = container_of(work, struct ltr559_data, ps_work.work);
struct i2c_client *client=data->client;
int als_ps_status;
int psval_lo, psval_hi, psdata;
static u32 ps_state_last = 2;
//Far as default.

mutex_lock(&data->op_lock);

als_ps_status = i2c_smbus_read_byte_data(client, LTR559_ALS_PS_STATUS);
//printk("%s ps_open_state=%d, als_ps_status=0x%x\n",__func__,data->ps_open_state,als_ps_status);
if (als_ps_status < 0)
goto workout;
/* Here should check data status,ignore interrupt status. */
/* Bit 0: PS Data
* Bit 1: PS interrupt
* Bit 2: ASL Data
* Bit 3: ASL interrupt
* Bit 4: ASL Gain 0: ALS measurement data is in dynamic range 2 (2 to 64k lux)
*                 1: ALS measurement data is in dynamic range 1 (0.01 to 320 lux)
*/

//使能情况
if ((data->ps_open_state == 1) && (als_ps_status & 0x02)) {
psval_lo = i2c_smbus_read_byte_data(client, LTR559_PS_DATA_0);
if (psval_lo < 0) {
psdata = psval_lo;
goto workout;
}
psval_hi = i2c_smbus_read_byte_data(client, LTR559_PS_DATA_1);
if (psval_hi < 0) {
psdata = psval_hi;
goto workout;
}
psdata = ((psval_hi & 7) << 8) | psval_lo;
printk("%s: psdata=%d(0x%x), near_thrd=%u, far_thrd=%u, dynamic_noise=%u\n",
  __func__, psdata, (u32)psdata, data->platform_data->prox_threshold,
  data->platform_data->prox_hsyteresis_threshold, data->dynamic_noise);

if(psdata >= data->platform_data->prox_threshold){

data->ps_state = 0; //near
ltr559_set_ps_threshold(client, LTR559_PS_THRES_LOW_0, data->platform_data->prox_hsyteresis_threshold);
ltr559_set_ps_threshold(client, LTR559_PS_THRES_UP_0, 0x07ff);
printk("%s: near, update near_thrd=%u, far_thrd=%u\n",
  __func__, 0x7ff, data->platform_data->prox_hsyteresis_threshold);
} else if (psdata <= data->platform_data->prox_hsyteresis_threshold){
data->ps_state = 1; //far

//该宏已经定义
#if defined(CONFIG_PICCOLO_COMMON)
  if (data->dynamic_noise > 20 && psdata < (data->dynamic_noise - 50) ) {
 data->dynamic_noise = psdata;
 if(psdata < 100) {
 }else if(psdata < 200){
 data->platform_data->prox_threshold = psdata+230;
 data->platform_data->prox_hsyteresis_threshold = psdata+180;
 }else if(psdata < 500){
 data->platform_data->prox_threshold = psdata+280;
 data->platform_data->prox_hsyteresis_threshold = psdata+230;
 }else if(psdata < 1500){
 data->platform_data->prox_threshold = psdata+420;
 data->platform_data->prox_hsyteresis_threshold = psdata+350;
 }else{  
 data->platform_data->prox_threshold= 1800;
 data->platform_data->prox_hsyteresis_threshold= 1700;
 pr_err("ltr559 the proximity sensor rubber or structure is error!\n");
 }
 printk("%s: NEW prox_threshold=%u, prox_hsyteresis_threshold=%u !!!\n",
__func__, data->platform_data->prox_threshold,
    data->platform_data->prox_hsyteresis_threshold);
  }
#endif

ltr559_set_ps_threshold(client, LTR559_PS_THRES_LOW_0, 0);
ltr559_set_ps_threshold(client, LTR559_PS_THRES_UP_0, data->platform_data->prox_threshold);
printk("%s: far, update near_thrd=%u, far_thrd=0\n",
  __func__, data->platform_data->prox_threshold);
} else {
data->ps_state = ps_state_last;
}

printk("%s: ps_state_last = %u, ps_state = %u\n", __func__, ps_state_last, data->ps_state);
if((ps_state_last != data->ps_state) || (data->ps_state == 0)) //need report the input event constant when near 
{
//上报数据
input_report_abs(data->input_dev_ps, ABS_DISTANCE, data->ps_state);
input_sync(data->input_dev_ps);
printk("%s: report ABS_DISTANCE=%s\n",__func__, data->ps_state ? "far" : "near");

ps_state_last = data->ps_state; 
//Report ABS value only if the state changed.
}
else
printk("%s: ps_state still %s\n", __func__, data->ps_state ? "far" : "near");
}
workout:
enable_irq(data->irq);
//使能
irq
mutex_unlock(&data->op_lock);
//解锁
}

时间: 2024-08-14 10:31:18

disable_irq与disable_irq_nosync使用场景的相关文章

【转】中断处理函数中不用disable_irq而用disable_irq_nosync原因

原文网址:http://blog.csdn.net/skyflying2012/article/details/8265869 今天在写触摸屏驱动时在中断处理函数中使用disable_irq关中断发现在进入中断处理后内核就挂掉了,于是研究了一下才发现disable_irq关闭中断并等待中断处理完后返回, 而disable_irq_nosync立即返回. 在中断处理程序中应该使用disable_irq_nosync来关闭中断 先看一下disable_irq_nosync,内核代码中是这样解释的:

Linux内核设计与实现 读书笔记

第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的task_struct连在一起组成了一个双向链表 3. 2.6内核的内核栈底放的是thread_info结构,其中有指向task_struct的指针: 4. current宏可以找到当前进程的task_struct:X86是通过先找到thread_info结构,而PPC是有专门的寄存器存当前task_s

【转】14.5.6 禁止和激活中断线

原文网址:http://book.51cto.com/art/201311/418637.htm 14.5.6  禁止和激活中断线 在上一节中讨论的几个宏只能禁止和激活处理器上所有的中断.但在某种情况下,只需要禁止或激活一条特定的中断线.这就需要使用本节讨论的一些函数.禁止和激活特定中断线的函数如下: void disable_irq(unsigned int irq); void disable_irq_nosync(unsigned int irq); void enable_irq(uns

linux中断相关知识

中断相关API: 补充:request_irq最后一个参数 dev_id ,和 free_irq 最后一个参数devid和中断服务函数的最后一个参数 dev_id 是同一个参数. 1)中断注册函数: request_irq(unsigned int irq, //中断号 irq_handler_t handler, //中断服务函数 unsigned long flags, //中断标志, const char *name, //中断名,随便 void *dev_id) //中断id,只要是惟一

《好好说话》:常见沟通场景的应对误区与应答思路、应答句式。4星。

全书针对谈话的常见场景,分析双方的本质问题和应答方的常见应对误区.应该的应答思路与句式.对沟通双方的思路的分析比较有功力. 感觉是从大专辩论赛的角度来组织全书的结构的.我更同意马东在序言中的说法,这本书更应该叫<好好思考>.不过如果从“好好思考”的角度来写书,全书的结构和重点要做一些变化. 书中把语言沟通的五种常见场景(沟通.说服.谈判.演讲.辩论)称作五个维度,还画了一个五边形,我认为这是全书最大的败笔,这里说“五种场景”比“五个维度”跟合适,用表格比用五边形更合适. 个人感觉:在大部分的场

淘宝网的质量属性的场景描述

质量属性 可用性 简单介绍 系统应能长期稳定地提供服务,近似7 X 24小时工作强度: 在负载过重或是系统崩溃的情况下,能保证用户请求不丢失: 当系统出现故障或崩溃时,恢复时间不超过两小时: 场景部分 可能的值 刺激源 业务快速发展 刺激 PHP模式易开发.难维护 制品 淘宝的网页 环境 更换技术 相应 改PHP为Java, 改MySql为oracle 相应度量 2004年开始稳定的供其使用 质量属性 可修改性 简单介绍 修改某个子系统或服务时,不影响其他子系统或服务: 场景部分 可能的值 刺激

小程序的使用场景及用途分析

今天看了小程序的介绍,仔细研究了一番,忽然有了这么一个想法,小程序是口碑传播的大杀器. 小程序依托于微信,先看下张小龙对于这两个的表述 我认为微信是一个工具,这是一个非常庞大的目标,我不认为工具是低层面的东西,事实上,人类从原始人进化到现在正是因为会使用工具.工具有好坏之分,要做一个非常好的工具难度是非常大的. 希望微信及微信相关的产品希望它展现给用户的是更有价值是他所需要的东西,用完即走体现在微信的方方面面,帮助用户提高它的效率,缩短他完成一个任务所需要的时间. 小程序是一个不需要下载安装就可

kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)

问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行"随机读写"的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? 4.partitions设计的目的的根本原因是什么? 一.入门 1.简介 Kafka is a distributed,partitioned,replicated commit logservice.它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现.k

《虚拟人》:准科幻,讨论人的记忆与思维能力能够复制到机器之后的种种场景。3星。

感觉实质内容更像科幻小说(形式上不像).一开始判断人类将可以把大脑中的记忆与思维能力复制到软件,后面大部分都基于这个假设来讨论由此带来的社会.法律.宗教方面的各种可能出现的场景.3星. 以下是书中一些内容的摘抄: 1:事实上,有人与我持相同看法.本书内容大部分来自2003—2011年间我赞助过的座谈会和研讨会,书中观点参考了当今诸多颇具创造性.技术性和科学性的研究先锋们的观点.#286 2:“有重要证据显示,人类不是唯一拥有能够产生意识神经基质的物种.非人类动物,包括所有哺乳动物和鸟类.许多其他