zoukankan      html  css  js  c++  java
  • 嵌入式中断服务函数的一些特点

      中断是嵌入式系统中重要的组成部分,但是在标准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,也向缓冲里面写入一些内容,这样缓冲区的内容就错乱了。

  • 相关阅读:
    oracle 时间加减法 与C#
    BCB编写DLL
    面试题:产生一个长度为100的数组,为数组中的每一项随机填充1100之间的数并且保证不重复 (C#实现)
    公司内部员工运算测试题
    MVP 模式是否应该这样修改?
    MVP 模式是否应该这样修改2?
    面试题:一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现(C#)
    使用游标进行跨数据库循环更新
    Hive 安装配置流程
    Scala的基本语法:集合应用
  • 原文地址:https://www.cnblogs.com/thammer/p/5017329.html
Copyright © 2011-2022 走看看