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

中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。
  中断服务程序需要满足如下要求:
  (1)不能返回值;
  (2)不能向ISR传递参数;
  (3) ISR应该尽可能的短小精悍;
  (4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用。

  参阅网上资料和个人的一些理解

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

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

  B.不能向ISR传递参数?

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

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

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

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

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

原网址:http://www.cnblogs.com/thammer/p/5017329.html

(SAW:Game Over!)

嵌入式中断服务函数的一些特点相关推荐

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

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

  2. 嵌入式里的中断解读以及中断服务函数

    不要年纪轻轻,就觉得自己进入了人生低谷,其实,后来你会发现你还有很大的下降空间. 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器.如果中断的线 ...

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

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

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

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

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

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

  6. stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0,程序立马进入中断服务函数)

    rf射频数据收发芯片的一个数据接收指示引脚连接stm32的一个gpio口,设置为中断口.当rf接收到数据的时候,数据接收指示引脚由高电平变为低电平,所以中断配置里面配置的是IPU,下降沿触发.系统复位 ...

  7. 串行口中断服务函数的触发条件-------TI/RI 触发

    串行口中断服务函数和其他中断本质上是一样的,达到特定的条件,向CPU申请中断,进入中断服务函数: 我特意在郭天祥老师的书上找到了一句话:当数据被写入SBUF寄存器后,单片机自动开始从起始位发送数据,发 ...

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

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

  9. PendSV中断服务函数

    之前在系统滴答定时器中断服务函数中调用API函数xPortSysTickHandler(),xPortSysTickHandler()函数中通过向中断和状态寄存器的bit28写入1来启动PendSV中 ...

最新文章

  1. 运动想象脑机接口中迁移学习的完整流程
  2. Redis的安装部署
  3. 【网络安全】Windows恶意软件BazarLoader分析
  4. 【ABAP】Native SQL
  5. jquery 总结
  6. 【DND图形库】四、文本绘制和按键检测
  7. Linux学习之系统编程篇:杀死 / 取消线程
  8. python正则表达式知识点
  9. 盘点那些世间顶级直男hhhhhh | 今日最佳
  10. 单文件组件的组件传值_移动端组件化架构(下)
  11. 安卓手机网页 字体垂直方向对齐_初学Excel办公软件字体对齐调整
  12. python 发送 smtp
  13. python解释器的下载与安装
  14. 8位串行加法器 计算机组成原理,安尧-2013434158-计算机组成原理8位加法器实验报告.doc...
  15. NV21 旋转+转为NV12
  16. 阿里Maven仓库不限容量,免费用
  17. 全局鼠标手势linux,Firefox通过用户脚本和热键进行的全局鼠标手势(Win7 / Linux + FF 68 esr)...
  18. suse11sp3上面配置zypper源
  19. 视频监控摄像头的互联网化实践思路
  20. matlab源知识库,MATLAB產生隨機數

热门文章

  1. Reading——The Non-Designer's Design Book
  2. MeeGo 1.2发布
  3. ubuntu java classpath_java – 如何为Ubuntu中的文件夹设置CLASSPATH变量
  4. neo4j 在centos 中的安装
  5. 一篇文章教你学会使用SpringBoot实现文件上传和下载
  6. gin-vue-admin菜单配置教程:父子菜单
  7. Linux系统下常用rpm包搜索网站
  8. 有没有高效的记视频笔记方法?--天若OCR文字识别记视频笔记
  9. Linux centos 6.7设置MySQL为开机启动
  10. Linux vim剪切/删除命令(结合p粘贴使用就是剪切)