历史上的今天
返回首页

历史上的今天

今天是:2024年12月29日(星期日)

2018年12月29日 | 中断中处理延时及一些函数的调用规则

2018-12-29 来源:eefocus

1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念;


2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数在实现上本质是根据CPU频率进行一定次数的循环;最好不要使用mdelay,因为毫秒延时对内核来说已经是非常大了。但是在中断处理程序中使用msleep却不行。(见linux设备驱动开发详解第二版p210页)


3,printk函数在中断处理函数中可以使用,但是会占用较多时间,降低效率。在调IIC驱动的时候,由于IIC读取写入处理时必须进行一定延时,在我没有使用udelay的时候,竟然用printk就使IIC中断正常运行,当时在调试的时候,发现有些printk加上程序就正常,去掉就不正常,当时真是匪夷所思,但现在明白了,因此printk占用时间比较大,正好充当了IIC延时的功能。最后我把printk全部去掉,在需要延时的地方加入udelay,才使程序正常运行。


4,使用for和while等的空循环在中断处理函数中进行延时操作,在实际测试中发现并不能起到延时的功能,linux内核处理这种循环速度很快,并没有延时的效果。这跟裸板程序使用循环来延时的用法不相同。

 

1、中断是一种电信号,由硬件设备生成,并直接送入中断控制器的输入引脚上。然后再由中断控制器向处理器发送相应的信号。处理器一经检测到此信号,便中断自己的当前工作转而处理中断。此后,处理器会通知操作系统已经产生中断,这样,操作系统就可以对这个中断进行适当的处理了。

   

2、不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识。中断值通常被称为中断请求(IRQ)线。有些中断值是指定的,有些是动态分配的。特定的中断总与特定的设备相关联。

 

3、异常与中断不同,它在产生时必须考虑与处理器时钟同步。异常也常常称为同步中断。许多处理器体系结构处理异常与中断的方式类似,因此内核对它们的处理也很类似。

  

4、在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序,如果一个设备可以产生多种不同的中断,那么该设备就可以对应多个中断处理程序。一个设备的中断处理程序是它设备驱动程序的一部分。


5、中断处理程序与其他内核函数的真正区别在于:中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断上下文的特殊上下文中。

 

6、中断处理一般分为两个部分,中断处理程序是上半部-接收到一个中断就立即执行,但只做有严格时限的工作,这些工作都是在所有中断被禁止的情况下完成的。能够被允许稍后完成的工作被推迟到下半部去。通常情况下,下半部会在中断处理程序返回时立即执行。

 

7、Linux中的中断处理程序是无需重入的。当一个给定的中断处理程序正在执行时,相应的中断线在所有处理器上都会被屏蔽掉,以防止在同一中断线上接收另一个新的中断。通常情况下,所有其他的中断都是打开的,所以这些不同中断线上的其它中断都能被处理,但当前中断线总是被禁止的。由此可以看出,同一个中断处理程序绝对不会被同时调用以处理嵌套的中断。


8、共享的中断处理程序与非共享的在注册和运行方式上比较类似,但差异主要有以下三处:


注册中断处理程序函数request_irq()的参数flags必须设置SA_SHIRQ标志。


对每个注册的中断处理程序来说,dev_id参数必须唯一。不能给共享的处理程序传递NULL值。


中断处理程序必须能够区分它的设备是否真的产生了中断。否则它根本无法知道是它对应的设备发出了这个中断还是共享这条中断线的其它设备发出了这个中断。


9、当执行一个中断处理程序或下半部(soft_irq, 或者tasklet)时,内核处于中断上下文中。中断上下文和进程并没有什么瓜葛。因为没有进程的背景,所以中断上下文不可以睡眠。因此,不能从中断上下文中调用某些函数。如果一个函数睡眠,就不能在中断处理函数中使用它。中断上下文具有较为严格的时间限制,因为它打断了其他代码。中断上下文中的代码应当迅速简洁,尽量不要使用循环去处理繁重的工作。尽量把工作从中断处理程序中分离出来,放在下半部执行。中断处理程序并不具有自己的栈。相反,它共享被中断进程的内核栈。如果没有正在运行的进程,就使用idle进程的栈。中断处理程序共享别人的堆栈,所以它在栈中获取空间时必须非常节省。内核栈本就很有限,所有的内核代码都应该谨慎利用它。


10、Linux内核提供了一组接口用于操作机器上的中断状态。这些接口为我们提供了能够禁止当前处理器的中断系统,或屏蔽掉整个机器的一条中断线的能力,这些例程都是与体系结构相关的,可以在


11、控制中断系统的原因归根结底是需要提供同步。通过禁止中断,可以确保某个中断处理程序不会抢占当前代码,还可以禁止内核抢占。但它们都没有提供任何保护机制来防止来自其他处理器的并发访问。锁提供保护机制来防止来自其他处理器的并发访问。禁止中断提供保护机制来防止来自其他中断处理程序的并发访问。


推荐阅读

史海拾趣

Hoffman Engineering公司的发展小趣事

在Harry Hoffman的领导下,Hoffman Engineering不断扩展其产品线。从最初的压力机安全保护装置,公司逐渐研发出蒲公英掘具、碟靶投掷器、厨房用电动搅拌器等一系列创新产品。这些产品不仅丰富了Hoffman Engineering的市场布局,也展现了公司在不同领域的技术实力。特别是Hoffman的机柜系列产品,如接线箱和电源插座,逐渐成为市场上的热门产品,为公司带来了稳定的收入来源。

DAYA公司的发展小趣事

大雅智能,一家以智能厨电产品为主的电子科技公司,自创立之初就致力于技术研发和创新。在电子行业竞争激烈的今天,大雅智能凭借其独特的智能控制技术,成功打造了一系列具有市场竞争力的产品。从最初的智能电饭煲到如今的智能厨房生态系统,大雅智能通过技术创新,不断满足消费者对智能生活的追求,逐渐在电子行业中崭露头角。

Belkin公司的发展小趣事

贝尔金公司的业务始于1983年的美国加州霍桑。当时,它仅仅是一个在车库里运营的小企业,销售额仅为十八万美元。然而,这个看似不起眼的起点却孕育了一个未来的行业巨头。从最初的产品设计和生产,到逐步进入市场并获得消费者的认可,贝尔金凭借对电子产品连接技术的深入理解和创新,逐步在行业中崭露头角。

GREATECS公司的发展小趣事

随着电子行业的快速发展,贝尔金也紧跟时代步伐,不断进行技术革新和产品线拓展。2002年,贝尔金为苹果Dock连接器研发了一系列产品,包括汽车套件、电池组、读卡器等,这标志着它与苹果公司的深度合作开始。此后,贝尔金逐渐成为苹果官方合作配件制造商,其产品在苹果用户中享有很高的声誉。

Boundary Devices公司的发展小趣事

近年来,电子行业面临着诸多变革和挑战,如物联网的快速发展、人工智能的崛起等。面对这些变革,Boundary Devices积极调整战略,加强在物联网和人工智能领域的研发投入,推出了一系列符合市场趋势的新产品。同时,公司还加强与高校和研究机构的合作,共同推动电子行业的创新与发展。

Decawave公司的发展小趣事

2020年,美国RF解决方案的领先供应商Qorvo宣布收购Decawave。这一收购对于Decawave来说是一个重要的里程碑。Qorvo看中了Decawave在UWB技术领域的创新能力和市场潜力,通过收购整合,Qorvo能够更好地将Decawave的技术应用于其移动、汽车、消费类和工业物联网市场的产品中。同时,Decawave也借助Qorvo的全球资源和市场渠道,进一步扩大了其市场份额和影响力。

问答坊 | AI 解惑

监控云台问题?

高手请赐教: 1、云台解码器的拨码开关是不是用二进制确定其地址码?是不是所有的厂商都要用一个8拨片的拨码开关?有8个拨片的拨码开关和6个拨片的拨码开关一起的是怎么回事? 2、解码器的解码芯片如:ATMEL AT89c51 的程序加密以后还能不能读出 ...…

查看全部问答>

调试串口问题

请问怎样可以把调试串口UART0修改成普通的串口(即没有调试信息输出),需要修改哪些文件里的信息啊? 是不是还要修改注册表啊?我在文件WINCE500中搜索了下platform.reg,总共有以下三处路径有platform.reg, 我分别把它们关系到串口的地方的 ...…

查看全部问答>

zigbee应用剖析

初始化因为Z-Stack是在OS下运行的,所以在之前必须调用osalAddTasks()初始化任务。组织关于OS的API函数介绍请看文档:Z-Stack OSAL API (F8W-2003-0002),应该说协议栈的每层或者说每部分都有相关的API说明文档。osalAddTasks()初始 ...…

查看全部问答>

求助:EM78P153的代码选项寄存器word0、word1、word2怎么赋值

如题,EM78P153提供了三个代码选项寄存器,datasheet里面又说在执行程序时不能存取,那怎么赋值呢?这是位配置? 写了个延时函数 void delay(unsigned int z),调用的时候 delay(1000);出现warning说是从short转换到unsigned int溢出,改成25 ...…

查看全部问答>

新手啊~求PC.c 让我把任哲的程序做下来吧~~

电脑上走任哲的程序,报错 call to function \'PC_VectSet\' with no prototype 查出是没有pc.c,网上下载了2个PC.c 但是都不对(一个是QEMU仿真的) 这东西为什么这么难找到啊?…

查看全部问答>

多旋翼自主飞行器(C题)

多旋翼自主飞行器(C题) …

查看全部问答>

求助

图1D1的作用是什么,工作原理是怎么样的,求解释 …

查看全部问答>

micropython可以忽略SD卡启动了

在STM32分支中,以前在启动时,如果没有SD卡就从内部Flash启动(从内部Flash生成的PYBFlash中读取boot.py和main.py),否则就会从SD卡启动。 但是这样存在一个问题,当我们希望从内部flash启动而又使用SD卡保存数据时,在因为干扰信号使系统复位后 ...…

查看全部问答>

用microbit发报

用B键或者用pin2做触摸键,发送信号。pin0控制蜂鸣器,pin1控制马达。A键显示或清楚显示。 ########################## #   v 1.0 Initial Public Release #   This is a working CW Radio. \'B\' is key. \'A\' shows message ...…

查看全部问答>

RFID和NFC的联系与区别详解

    RFID(无线射频识别,Radio Frequency Identification)是一种非接触式的自动识别技术。最简单的RFID系统由标签(Tag)、阅读器(Reader)和天线(Antenna)三部分组成——在实际应用中还需要其他硬件和软件的支持。    其 ...…

查看全部问答>