不要年纪轻轻,就觉得自己进入了人生低谷,其实,后来你会发现你还有很大的下降空间。

从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。

一、硬中断和软中断

(1) 硬中断

由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。

(2) 软中断

为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。

(5)硬中断和软中断的区别

软中断是执行中断指令产生的,而硬中断是由外设引发的。

硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。

硬中断是可屏蔽的,软中断不可屏蔽。

硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。

软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。

二、中断服务程序(ISR)

中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。

ISR程序编写的要求:
  (1)不能返回值;
  (2)不能向ISR传递参数;
  (3) ISR应该尽可能的短小精悍;
  (4) printf(char * lpFormatString,…)以及浮点运算等函数会带来函数重入和性能问题,不能在ISR中采用。

a.为什么不能有返回值?

       中断服务函数的调用是硬件级别的,当中断产生,pc指针强制跳转到对应的中断服务函数入口,进入中断具有随机性,并不是某段代码对其进行调用,那么如果有返回值它的返回值返回给谁?显然这个返回值毫无意义,如果有返回值,它必定需要进行压栈操作,这样一来何时出栈怎么出栈将变得无法解决。

b.不能向ISR传递参数?

         同理,也是由于这样会破坏栈的原因,因为函数传递参数必定会要求压栈出栈操作,由于进入中断服务函数的随机行,谁给它传递参数都成问题

【ps】像STM32等,因为中断都是些硬件自动调用,没有程序去给他传递参数,也没有硬件去接收参数。 那其它函数怎么传参数给它呢?一般都是通过全局变量方式。不过为了避免中断函数重入,我们可以在进入中断服务函数之后将中断关闭,处理完后再开中断。

c.ISR应尽可能的短小精悍?

如果某个中断频繁产生,而它对应的ISR相当的耗时,那么对中断的响应就会无限的延迟,会丢掉很多的中断请求

d.printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。

       这就涉及到一个中断嵌套问题,由于printf之类的glibc函数采用的是缓冲机制,这个缓冲区是共享的,相当于一个全局变量,第一层中断来时,它向缓冲里面写入一些部分内容,恰好这时来了个优先级更高的中断,它同样调用了printf,也向缓冲里面写入一些内容,这样缓冲区的内容就错乱了。

下面可能是嵌入式面试的一个题目:

__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() 经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。【做嵌入式的必须记住】

嵌入式里的中断解读以及中断服务函数相关推荐

  1. 中断解读以及中断服务函数

    文章目录 1.硬中断和软中断 2.中断服务程序(ISR) 3.面试题 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器.如果中断的线是激活的,中 ...

  2. 嵌入式中断服务函数的一些特点

    --------------------------------------------- -- 时间:2019-02-20 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...

  3. 中断函数 printf_嵌入式中断服务函数的一些特点

    中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断.许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt.#program ...

  4. 正点原子STM32-串口中断服务函数USART1_IRQHandler关于USART_RX_STA的学习笔记

    目录 USART1_IRQHandler 中断服务函数代码 介绍 函数USART_GetITStatus 每个状态描述 USART_RX_STA 接收状态标记的思考 USART1_IRQHandler ...

  5. 面试题之二:中断服务函数

    中断问题也是面试嵌入式岗位时,面试官比较喜欢拷问的问题之一,作为一个嵌入式开发人员,自然少不了与中断打交道,裸机程序中作为前台服务程序,发挥着重要的作用. 中断服务函数应该注意的四大点: 1.中断服务 ...

  6. stm32 中断服务函数是如何进入的

    今天在看stm32的中断,一时间不理解stm32主函数是如何进入中断函数的,按C编程的理解,会有个特定的入口之类的,但是看demo过程中没有发现入口. 以串口中断服务函数void USART1_IRQ ...

  7. 联众服务器超时中断,http连接中客户端中断了请求,服务端会中断执行吗?超时时间设置?...

    由于http是基于tcp的,在tcp中,客户端中断了连接,服务端是无法感知的,只能通过发心跳包来检测,而显然我们的nginx是没有发心跳包的,所以,包括nginx,php-fpm都是不知道客户端已断开 ...

  8. linux内核响应,读书笔记——Linux内核源代码情景分析——3.4  中断的响应和服务...

    CPU响应中断 CPU从中断控制器取得中断向量,然后根据具体的中断向量从中断向量表IDT中找到对应的表项,而该表项应该是一个中断门.这样,CPU就根据中断门的设置而到达了该通道的总服务程序入口. 由于 ...

  9. STM32 关于外部中断线、中断源和中断服务函数的问题

    STM32 关于外部中断线.中断源和中断服务函数的问题 中断线问题: 上图可以看出,PA0.PB0...PG0共用的EXTI0中断线,PA1.PB1...PG1共用的EXTI1中断线,也就是 编程里面 ...

最新文章

  1. 【牛客网】牛客练习赛19 F 算式子【数学--递推 、前缀、数字】
  2. ubuntu11.04中如何像其他版本一样快速回到桌面
  3. 使用CDS view开发SAP Marketing contact的facet追溯工具
  4. 在WinCE中实现Screen Rotation(屏幕旋转)
  5. 1.1 了解web性能
  6. Linux中的head命令
  7. python对象--加减重构
  8. 机器学习基础知识(一):机器学习三大流派
  9. C51单片机LCD1602驱动程序
  10. 计算机导论的论文范例,★计算机导论论文提纲范文计算机导论论文提纲格式模板...
  11. 实战之8051驱动8位数码管
  12. 比值法判定无穷级数收敛/发散性质MATLAB
  13. 计算机类专业必备的软件,拿来把你
  14. 使用原始武器的现代战争
  15. python tensorflow车型识别(一):建立数据
  16. 机器学习基石 5.3 Effective Number of Hypotheses
  17. U启动U盘启动盘制作
  18. 学python有必要用固态硬盘吗-pythonssd
  19. 2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿。但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪
  20. 佳能Canon PIXMA MG6320 一体机驱动

热门文章

  1. QCC3040---htf文件修改
  2. Excel如何把身份证号码升级到18位
  3. Java REST API Server 性能比较 Tomcat/Jetty/Grizzly/Undertow
  4. 人工神经网络的应用领域,人工神经网络技术及应用
  5. Java开发思考笔记
  6. 计算机网页设计论文范文,计算机网页设计学论文参考文献 计算机网页设计专著类参考文献哪里找...
  7. 桌面html倒计时如何添加,JavaScript 实现Html页面倒计时效果的简单实例
  8. C语言余数为0输出intact,C语言中的宏是怎么展开的?
  9. OBS如何实现毫秒级超低延时直播
  10. 我的网络流sap,isap,dinic三种方法的对比总结