精华内容
下载资源
问答
  • 中断服务函数的写法

    千次阅读 2016-12-05 09:54:30
    编写中断服务函数时,经常使用到2个函数: 第一个函数是判断某个中断是否发生 另一个是清除某个中断标志位。 在这里需要注意的一点就是:中断事件发生以后,CPU的主权交给了中断控制器,进入中断执行中断服务函数,...

    编写中断服务函数时,经常使用到2个函数:

    • 第一个函数是判断某个中断是否发生
    • 另一个是清除某个中断标志位。

    在这里需要注意的一点就是:中断事件发生以后,CPU的主权交给了中断控制器,进入中断执行中断服务函数,执行完中断程序后,在将CPU的主权交给主程序。在退出中断前要清除中断标志位,否则在退出中断后,标志位没有清除。会再一次进入中断,一直循环,所以:要清除中断标志位。

    void EXTI3_IRQHandler(void)
    {
        if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生
        {
            中断逻辑…
            EXTI_ClearITPendingBit(EXTI_Line3); //清除 LINE 上的中断标志位
        }
    }
    展开全文
  • 中断向量 中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址。...图一 中断函数声明 图二 配置中断服务函数 图三 设置中断服务函数的底层库函数举例 上图是利用山外

    中断向量
    中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址。

    运行过程
    在中断响应过程中,CPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址。

    这里写图片描述
    图一 中断函数声明
    这里写图片描述
    图二 配置中断服务函数
    这里写图片描述
    图三 设置中断服务函数的底层库函数

    举例
    上图是利用山外K60库配置PORTC和DMA0的中断服务函数实例
    图二中PORTC_IRQHandler是需要设置的中断服务程序(用户自己设置),PORTC_VECT0Rn是中断向量表中的中断向量(K60底层已设置)。set_vector_handler函数的意义是将PORTC_IRQHandler的地址(PORTC_IRQHandler在图一中是定义的函数名,在图二中代表该函数在内存中的首地址)“赋值”给中断向量PORTC_VECT0Rn。
    简单来说,set_vector_handler(PORTC_VECT0Rn, PORTC_IRQHandler);的作用是把PORTC_IRQHandler添加到中断向量表中。
    K60在获取中断类型号(码)后,经计算(中断类型码*4)得到该中断类型服务子程序入口地址在中断向量表的位置(即中断向量PORTC_VECT0Rn),然后从中取出这个地址(PORTC_IRQHandler),转到相应的子程序(void PORTC_IRQHandle())。

    简单来说,中断向量指向地址,该地址下存放的是用户需要在中断时执行的函数。
    先获取中断类型号,再在中断向量表中找中断向量,指向一个地址,执行其中的中断服务程序。

    下图为山外K60平台部分中断号类型声明和中断向量表编号声明
    这里写图片描述

    如有错误,欢迎指正!

    展开全文
  • 嵌入式里的中断解读以及中断服务函数

    千次阅读 多人点赞 2018-11-26 15:27:16
    从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己...

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

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

    一、硬中断和软中断

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

     

    展开全文
  • 中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。...当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码 例: _interrupt double compute_are...

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

    例:

    _interrupt double compute_area(double radius)

    {   

      double area=PI*radius*radius;

      printf("%f\n", area);

      return area;

    }

      中断服务程序需要满足如下要求:
      (1)不能返回值;
      (2)不能向ISR传递参数;
      (3) ISR应该尽可能的短小精悍;
      (4) printf(char * lpFormatString,…)函数会带来重入和性能问题,不能在ISR中采用

      (5)在许多处理器、编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额外的寄存器入栈,有些处理器/编译器就不允许ISR 中做浮点运算。此外,ISR 应该是短而有效率的,在ISR 中做浮点运算是不明智的

     

    参考 : http://blog.csdn.net/maochengtao/article/details/40373039

     

    转载于:https://www.cnblogs.com/Deanboy/p/7552273.html

    展开全文
  • 如何创建一个中断服务函数1.编写常规中断处理程序2.编写快速中断处理程序3.处理程序命名 摘要:本节主要讲解如何创建一个中断服务函数的过程。 1.如何创建一个中断服务函数 自从1.1.0版Chibios/RT提供了一种用于...
  • 第十六章:中断服务函数的调用机制

    千次阅读 多人点赞 2018-01-12 21:25:06
    (初学中断,学到中断服务函数时感受到蛋蛋的惊讶,main中并没有调用但确实执行了,简直超出了我对c的理解,几番百度之后,总算有所收获!) 1首先是定性的理解:当中断触发之后会保存当前堆栈和寄存器(不清楚还有...
  • C51中断函数

    2020-08-03 19:25:58
    C51的中断函数格式为:void FuncIr(void) interrupt x [using y],本文主要对C51的中断函数进行了分析
  • 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己...
  • 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。 (1)...
  • 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。  中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。  (1)...
  • C51中断函数格式

    千次阅读 2017-07-14 23:24:30
    C51 Keil 编译器中断函数语法定义:void 函数名() interrupt n using m C51编译器允许0~31个中断,C51控制器所提供的中断及中断地址如下: 中断号 中断源 中断地址 0 EXTERNAL 0 0003H 1 TIMER/COUNTER 0 ...
  • 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。 如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己...
  • 中断处理函数注意事项

    千次阅读 2020-05-09 11:49:24
    中断服务函数由硬件触发,因此不能获得参数,也无法返回值;另一方面,在中断服务函数中使用不可重入的函数,往往会导致问题。
  • 中断函数

    千次阅读 2014-10-22 12:44:15
    C51的中断函数格式为:void FuncIr(void) interrupt x [using y] 以下是梦游的一些分析:  一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过只能用...
  • GCC-AVR 编写中断服务函数的注意事项

    千次阅读 2014-06-22 14:24:08
    2.中断函数格式 现在官方推荐的中断书写格式就有一种: ISR(INTERRUPT_vect)//INTERRUPT_vect是中断向量名称 { //中断处理代码 } 3.中断向量的名称 中断向量的名称在WinAVR的最近几个版本中有所变化...
  • 中断函数调用的异同
  • **STM32外部中断查询: 15-10线的外部中断共用一个中断函数,怎么在该函数里查询是哪个中断线产生了中断呢**? 使用 EXTI_GetITStatus()来查询哪根线产生了中断。比如EXTI_GetITStatus(EXTI_Line13)就是查询13线是否...
  • CPSR开关中断实现函数

    千次阅读 2014-09-03 17:39:11
    某系统中对中断的打开、关闭函数如下: static __inline int wsn_DisableInterrupt(void) { register int retval, temp; __asm__ volatile ( "mrs %0, cpsr\n" "\torr %1, %0, #0xC
  • Attachinterrupt()函数 本例主要是实现利用中断控制LED灯的亮灭,中断源是通过抬起或按下按键 。 中断函数格式:attachinterrupt(interrupt,function,mode)
  • MSP430中断c函数模板大全

    千次阅读 2012-06-24 23:42:26
    转载一篇MSP430中断c语言函数...端口1中断函数 多中断中断源:P1IFG.0~P1IFG7 进入中断后应首先判断中断源,退出中断前应清除中断标志,否则将再次引发中断 *******************************************
  • STM32共用中断和共用中断函数的判断

    千次阅读 2016-12-09 21:21:35
    STM32外部中断查询: 15-10线的外部中断共用一个中断函数,怎么在该函数里查询是哪个中断线产生了中断呢?使用 EXTI_GetITStatus()来查询哪根线产生了中断。 比如EXTI_GetITStatus(EXTI_Line13)就是查询13线是否...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 174,355
精华内容 69,742
关键字:

中断服务函数的一般形式