中断解读以及中断服务函数
文章目录
- 1、硬中断和软中断
- 2、中断服务程序(ISR)
- 3、面试题
从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。
1、硬中断和软中断
硬中断
由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq
)。软中断
为了满足实时系统的要求,中断处理应该是越快越好。linux
为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq
)来完成。硬中断和软中断的区别
1、软中断是执行中断指令产生的,而硬中断是由外设引发的。
2、硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。
3、硬中断是可屏蔽的,软中断不可屏蔽。
4、硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。
5、软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。
2、中断服务程序(ISR)
中断是嵌入式系统中重要的组成部分,但是在标准C
中不包含中断。许多编译开发商在标准C
上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR
),类似于__interrupt
、#program interrupt
等。当一个函数被定义为ISR
的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。
ISR程序编写的要求
- 不能返回值;
- 不能向
ISR
传递参数; ISR
应该尽可能的短小精悍;printf(char * lpFormatString,…)
以及浮点运算等函数会带来函数重入和性能问题,不能在ISR
中采用。
为什么不能有返回值?
中断服务函数的调用是硬件级别的,当中断产生,pc指针强制跳转到对应的中断服务函数入口,进入中断具有随机性,并不是某段代码对其进行调用,那么如果有返回值它的返回值返回给谁?显然这个返回值毫无意义,如果有返回值,它必定需要进行压栈操作,这样一来何时出栈怎么出栈将变得无法解决。
不能向ISR传递参数?
同理,也是由于这样会破坏栈的原因,因为函数传递参数必定会要求压栈出栈操作,由于进入中断服务函数的随机行,谁给它传递参数都成问题
像STM32
等,因为中断都是些硬件自动调用,没有程序去给他传递参数,也没有硬件去接收参数。 那其它函数怎么传参数给它呢?一般都是通过全局变量方式。不过为了避免中断函数重入,我们可以在进入中断服务函数之后将中断关闭,处理完后再开中断。
ISR应尽可能的短小精悍?
如果某个中断频繁产生,而它对应的ISR相当的耗时,那么对中断的响应就会无限的延迟,会丢掉很多的中断请求
printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。
这就涉及到一个中断嵌套问题,由于printf
之类的glibc
函数采用的是缓冲机制,这个缓冲区是共享的,相当于一个全局变量,第一层中断来时,它向缓冲里面写入一些部分内容,恰好这时来了个优先级更高的中断,它同样调用了printf
,也向缓冲里面写入一些内容,这样缓冲区的内容就错乱了。
3、面试题
__interrupt double compute_area (double radius)
{double area = PI * radius * radius;printf(" Area = %f", area);return area;
}
这个函数有太多的错误了,以至让人不知从何说起了:
- 1、
ISR
不能返回一个值。如果你不懂这个,那么你不会被雇用的。 - 2、
ISR
不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。 - 3、在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在
ISR
中做浮点运算。此外,ISR
应该是短而有效率的,在ISR
中做浮点运算是不明智的。 - 4、与第三点一脉相承,
printf()
经常有重入和性能上的问题。
中断解读以及中断服务函数相关推荐
- 嵌入式里的中断解读以及中断服务函数
不要年纪轻轻,就觉得自己进入了人生低谷,其实,后来你会发现你还有很大的下降空间. 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器.如果中断的线 ...
- 嵌入式中断服务函数的一些特点
--------------------------------------------- -- 时间:2019-02-20 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...
- STM32 关于外部中断线、中断源和中断服务函数的问题
STM32 关于外部中断线.中断源和中断服务函数的问题 中断线问题: 上图可以看出,PA0.PB0...PG0共用的EXTI0中断线,PA1.PB1...PG1共用的EXTI1中断线,也就是 编程里面 ...
- 中断函数 printf_嵌入式中断服务函数的一些特点
中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断.许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt.#program ...
- stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0,程序立马进入中断服务函数)
rf射频数据收发芯片的一个数据接收指示引脚连接stm32的一个gpio口,设置为中断口.当rf接收到数据的时候,数据接收指示引脚由高电平变为低电平,所以中断配置里面配置的是IPU,下降沿触发.系统复位 ...
- 串行口中断服务函数的触发条件-------TI/RI 触发
串行口中断服务函数和其他中断本质上是一样的,达到特定的条件,向CPU申请中断,进入中断服务函数: 我特意在郭天祥老师的书上找到了一句话:当数据被写入SBUF寄存器后,单片机自动开始从起始位发送数据,发 ...
- 正点原子STM32-串口中断服务函数USART1_IRQHandler关于USART_RX_STA的学习笔记
目录 USART1_IRQHandler 中断服务函数代码 介绍 函数USART_GetITStatus 每个状态描述 USART_RX_STA 接收状态标记的思考 USART1_IRQHandler ...
- PendSV中断服务函数
之前在系统滴答定时器中断服务函数中调用API函数xPortSysTickHandler(),xPortSysTickHandler()函数中通过向中断和状态寄存器的bit28写入1来启动PendSV中 ...
- stm32f103——中断——UART中断服务函数
在程序中,CPU对外界突发事件进行处理的方式又两种: 1>轮询系统:(在main中,使用while循环,进行循环判断外界事物是否发生) while(1){ ...
最新文章
- iphone打字怎么换行_库克扎心!12年iPhone老用户换机小米10 Pro,每天玩机七八小时...
- java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #4)
- Bootstrap导航中禁用导航链接
- 移植的7zip到Vxworks 取名vx7zip
- android上对cookie的读写操作,Android上对Cookie的读写操作(附Demo)
- linux下的pdf工具下载,Linux系统下的PDF好帮手 LinuxPDFeditor
- 想自己搭建服务器,永久运行网站?一个U盘大小的树莓派就够了!
- 鸡年生的男宝宝取什么名字好?为宝宝起名也有小技巧
- flv转mp4,电脑视频flv怎么批量转mp4格式
- DX11 游戏开发笔记 (一) 资源介绍
- 网络共享计算机怎么连接,网络共享,详细教您电脑怎么设置共享无线网络
- c语言中出现void错误,关于C语言问题
- opencv鱼眼镜头矫正
- 网络安全版的“让梦想照进现实”—— CCF-绿盟科技 鲲鹏科研基金
- 分享推荐一些 Google Chrome 插件
- 用八叉树优化RayCasting
- 濡沫江湖一直显示获取服务器列表失败,濡沫江湖存档如何获取?游戏存档获取方法图文分享...
- 护眼灯到底有没有护眼的效果?2022护眼儿童台灯选哪个牌子好
- 2020牛客国庆集训派对day2(A,C,D,E,F,G,H,J,)
- 基于模糊测试的分布式数据库安全研究(一)——模糊测试背景知识
热门文章
- 网页编程代码书写规范
- 计算机cpu性能过剩吗,如何选择合适的CPU想避免坑就来看看吧
- [C++程序设计](入门级题解)陶陶摘苹果
- 妇产科护理学重点知识
- 最全面的SpringMVC教程(四)——Controller 与 RestFul
- 中国需要“信用卡式”的生活:把明天的钱,拿到今天来用
- ArchSummit北京2015大会九大看点
- 新晋总监生存指南开篇之总监二三事
- Eclipse+Java+Swing实现电子相册管理系统
- 切图小贴士-手机Android平台“点九”的切图