精华内容
下载资源
问答
  • 本文介绍了单片机中常见的中断函数调用子函数和主函数调用子函数的情况,如果同时调用会出现的问题一节解决方法。
  • 首先,调用程序过程发生的时间是已知固定的,即在主程序中的调用指令(CALL)执行时发生主程序调用程序,调用指令所在位置是已知固定的。而中断过程发生的时间一般的随机的,CPU在执行某一主

    相同点

    • 两者都需要保护断点(即下一条指令地址)、跳至子程序或中断服务程序、保护现场、子程序或中断处理、恢复现场、恢复断点(即返回主程序)。
    • 两者都可实现嵌套,即正在执行的子程序再调另一子程序或正在处理的中断程序又被另一新中断请求所中断,嵌套可为多级。

    不同点

    • 两者的根本区别主要表现在服务时间与服务对象不一样上。
    • 首先,调用子程序过程发生的时间是已知和固定的,即在主程序中的调用指令(CALL)执行时发生主程序调用子程序,调用指令所在位置是已知和固定的。而中断过程发生的时间一般的随机的,CPU在执行某一主程序时收到中断源提出的中断申请时,就发生中断过程,而中断申请一般由硬件电路产生,申请提出时间是随机的(软中断发生时间是固定的),也可以说,调用子程序是程序设计者事先安排的,而执行中断服务程序是由系统工作环境随机决定的;
    • 其次,子程序完全为主程序服务的,两者属于主从关系,主程序需要子程序时就去调用子程序,并把调用结果带回主程序继续执行。而中断服务程序与主程序两者一般是无关的,不存在谁为谁服务的问题,两者是平行关系;
    • 再其次,主程序调用子程序过程完全属于软件处理过程,不需要专门的硬件电路,而中断处理系统是一个软、硬件结合系统,需要专门的硬件电路才能完成中断处理的过程;
    • 最后,子程序嵌套可实现若干级,嵌套的最多级数由计算机内存开辟的堆栈大小限制,而中断嵌套级数主要由中断优先级数来决定,一般优先级数不会很大。
    • 不能返回值;不能向ISR传递参数;ISR应该尽可能的短小精悍;
    展开全文
  • 中断服务程序与普通程序有什么根本的区别? 答:中断服务程序是随机发生的,结束后要返回断点。普通程序是安排好的,没有断点。
  • 本韩淑伟PIC单片机中断处理的子函数,高级终端地址为0x08H
  • 中断服务函数函数调用的区别

    千次阅读 2019-12-23 17:02:06
    在《微机原理》《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用程序过程有一定相似性,但又有很大区别,调用程序过程相对比较容易掌握,通过...

    在《微机原理》和《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过把两过程结合起来,采用比较教学方法,能收到了很好的教学效果。

    1、两过程定义与作用

    子程序是微机基本程序结构中的1种,基本程序结构包括顺序(简单)、分支(判断)、循环、子程序和查表等5种。
    
    子程序是一组可以公用的指令序列,只要给出子程序的入口地址就能从主程序转入子程序。子程序在功能上具有相对的独立性,在执行主程序的过程中往往被多次调用,甚至被不同的程序所调用。一般微机首先执行主程序,碰到调用指令就转去执行子程序,子程序执行完后,返回指令就返回主程序断点(即调用指令的下一条指令),继续执行没有处理完的主程序,这一过程叫做(主程序)调用子程序过程。
    

    子程序结构可简化程序,防止重复书写错误,并可节省内存空间。计算机中经常把常用的各种通用的程序段编成子程序,提供给用户使用。用户在自己编写的程序中,只要会调用这些子程序,就可大大简化用户编程的困难。

    中断是计算机中央处理单元CPU与外设I/O交换数据的一种方式,除此方式外,还有无条件、条件(查询)、存贮器直接存取DMA和I/O通道等四种方式。由于无条件不可靠,条件效率低,DMA和I/O通道两方式硬件复杂,而中断方式CPU效率高,因此一般大多采用中断方式。
    

    中断概念是当计算机正在执行某一(主)程序时,收到一中断请求,如果中断响应条件成立,计算机就把正在执行的程序暂停一下,去响应处理这一请求,执行中断服务程序,处理完服务程序后,中断返回指令使计算机返回原来还没有执行完的程序断点处继续执行,这一过程称为中断过程。有了中断,计算机才能具有并行处理,实时处理和故障处理等重要功能。

    2、两过程的联系与区别

    2.1联系

    中断与调用子程序两过程属于完全不同的概念,但它们也有不少相似之处。两者都需要保护断点(即下一条指令地址)、跳至子程序或中断服务程序、保护现场、子程序或中断处理、恢复现场、恢复断点(即返回主程序)。两者都可实现嵌套,即正在执行的子程序再调另一子程序或正在处理的中断程序又被另一新中断请求所中断,嵌套可为多级。
    

    正是由于这些表面上的相似处,很容易使学生把两者混淆起来,特别是把中断也看为子程序,这就大错特错了。

    2.2区别

    中断过程与调用子程序过程相似点是表面的,从本质上讲两者是完全不一样的。
    

    两者的根本区别主要表现在服务时间与服务对象不一样上。首先,调用子程序过程发生的时间是已知和固定的,即在主程序中的调用指令(CALL)执行时发生主程序调用子程序,调用指令所在位置是已知和固定的。而中断过程发生的时间一般的随机的,CPU在执行某一主程序时收到中断源提出的中断申请时,就发生中断过程,而中断申请一般由硬件电路产生,申请提出时间是随机的(软中断发生时间是固定的),也可以说,调用子程序是程序设计者事先安排的,而执行中断服务程序是由系统工作环境随机决定的;其次,子程序完全为主程序服务的,两者属于主从关系,主程序需要子程序时就去调用子程序,并把调用结果带回主程序继续执行。而中断服务程序与主程序两者一般是无关的,不存在谁为谁服务的问题,两者是平行关系;第三,主程序调用子程序过程完全属于软件处理过程,不需要专门的硬件电路,而中断处理系统是一个软、硬件结合系统,需要专门的硬件电路才能完成中断处理的过程;第四,子程序嵌套可实现若干级,嵌套的最多级数由计算机内存开辟的堆栈大小限制,而中断嵌套级数主要由中断优先级数来决定,一般优先级数不会很大。


    中断是嵌入式系统中重要的组成部分,但是在标准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

    展开全文
  • 中断函数写法的比较

    2021-01-14 05:04:11
    写单片机程序,中断是免不了的。我比较喜欢用C写单片机程序,简单...不过中断函数的写法,各个编译器往往都会有些差别。最早写的C程序是51单片机的,用的编译器自然是大名鼎鼎的keil c了。Keil的功能还是非常强劲的...

    写单片机程序,中断是免不了的。我比较喜欢用C写单片机程序,简单而且可读性高,当然程序效率没有汇编的高。目前写过51单片机跟AVR单片机的C程序,最近在看MSP430的书。用C写不同的单片机程序其实都是大同小异,因此能对不熟悉的单片机也能很快上手写程序。不过中断函数的写法,各个编译器往往都会有些差别。

    最早写的C程序是51单片机的,用的编译器自然是大名鼎鼎的keil c了。Keil的功能还是非常强劲的,不仅能编译,还有软件仿真调试与硬件调试的功能。由于条件简陋,没用过什么仿真器,一直都是靠软件仿真调试程序的。Keil 中的中断函数一般格式如下:本文引用地址:http://www.eepw.com.cn/article/201611/316268.htm

    void 函数名() interrupt n using n

    {

    …….

    }

    其中函数名可以任意取,关键字interrupt用来指明这是一个中断服务函数,后面的n表示中断号,关键字using加后面的n表示使用哪一组寄存器。

    后然接触到AVR的单片机,该单片机开发环境一般用ICC或者是GCC。由于ICC是商用软件,而GCC是免费的,因此我一般用GCC来写AVR的C程序。现在版本的GCC for AVR有了一些改进,对于中断函数支持两种关键字ISR与SIGNAL,其格式如下:

    ISR(vect)

    {

    ………

    }

    SIGNAL(vect)

    {

    ……..

    }

    其中的vect就是中断向量名,根据不同的型号的AVR单片机的不同的中断源都会有相对应的中断向量名,比如外部中断0对于ISR格式的中断向量名为INT0_vect,对SIGNAL则为SIG_INTERRUPT0。

    最近在看TI的MSP430系列单片机的资料,看到该单片机采用C430写的中断服务函数有点像前两种的综合,其格式如下:

    interrupt [vect] void 函数名(void)

    {

    …….

    }

    其中vect也是中断向量名,函数名可以任取。

    比较这几种中断函数写法,本人更倾向于AVR的GCC的写法。首先对于中断函数来说即不能有输入参数又没有返回值,没必要再给它加个“void 函数名(void)”的形式的函数。而且光看中断向量名一般都能知道是哪个中断源产生,再写个中断函数名作解释似乎有点重复。对于keil c用中断向量号的形式来表示中断源,感觉有点麻烦,记住中断源的中断号比记中断向量要难多了。不过可能标准51的中断缘比较少,而且keil应该出来的比较早,所以才会采用这种方式。

    展开全文
  • 中断和函数调用的异同

    千次阅读 2020-03-28 10:01:22
    中断和函数调用的异同

                                                                               中断和函数调用的异同

    1、中断分为:软中断和硬件中断

         1)软中断:上层应用调用底层接口(以linux操作系统为例,在上层open函数,可以调用到kernel中的open函数)

         2)硬件中断:芯片比如SOC、MCU等IO口可以设置为中断功能,实现已外部通信功能;

    2、函数调用:一个函数调用另外一个函数

    展开全文
  • 程序是在需要的时候调用,在程序里可以预见它的使用。因为中断是由系统调用的,不知道什么时候中断,所以你可以选择允许中断或者不允许中断,这就好比你正在干工作时,电话铃响了,你可以选择接电话也可以选择不接...
  • 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己...
  • 中断函数调用的区别

    千次阅读 2017-08-04 00:17:00
    在《微机原理》《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用程序过程有一定相似性,但又有很大区别,调用程序过程相对比较容易掌握,通过...
  • 中断向量 中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址。...图一 中断函数声明 图二 配置中断服务函数 图三 设置中断服务函数的底层库函数举例 上图是利用山外
  • 在《微机原理》《计算机组成》等课程[1-4]教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用程序过程有一定相似性,但又有很大区别,调用程序过程相对比较容易掌握,通过...
  • 为什么单片机程序中,外部中断0服务函数中加入延时函数为什么要软件清0; void int0()interrupt { intflag 0=!intflag0; led9=intflag0; delay(20) IE0=0; 最后为什么要清零IE }
  • 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 ...
  • 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。  中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。  (1)...
  • 首先,函数调用是预料范围内的代码执行,是完全可控的,当前执行的函数调用另外一个函数时,是从当前代码段通过跳转指令主动跳转到另外一个代码段,只需保存跳转之前的栈顶指针(fp),栈底指针(sp)到栈空间,保存跳转...
  • 程序中断和调用程序有何区别

    万次阅读 多人点赞 2015-12-01 00:57:31
    两者的根本区别表现在服务时间服务对象上不一样。 1)调用程序发生的时间是已知的固定的,即在主程序的调用指令(CALL)执行时发生主程序调用程序过程,调用指令所在位置是已知的固定的;而中断过程发生的...
  • 学习笔记——stm32串口中断函数的逻辑理解

    千次阅读 多人点赞 2020-12-10 22:04:51
    这片文章主要是讲解原子给的代码里面的串口中断的中断函数,前面是我个人的学习路径。 关于stm32串口的学习,主要分为以下几个点 1.USART的功能内部结构。 功能包括同步、异步模式、双工通信、半工通信等 内部结构...
  • [STM32H743] DMA中断服务函数编写流程

    千次阅读 2019-11-18 21:09:46
    [STM32H743] DMA中断服务函数判断条件 1:首先->配置中断 /* 开启DMA1 Stream0的中断 */ HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);//抢占优先级0,优先级0 HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn)...
  • 51单片机最常用的程序封装集合,含延时,LED灯驱动,串口收发,外部中断,定时器控制,IAP,触摸按键等封装函数库。
  • stm32中断服务函数名称表速查

    千次阅读 多人点赞 2017-01-25 21:44:03
    *参考启动文件 startup_stm... 中断服务函数名(固定) 匹配对象 WWDG_IRQHandler Window Watchdog PVD_IRQHandler PVD through EXTI Line detect TAMPER_IRQHandler Tamper RTC_IRQHandler RTC FLASH_IRQHan
  • 中断函数中的问题,中断被调函数中的问题,寄存器组。
  • STM32学习记录之定时器中断代替延时函数实现更精准计时(延时) 延时在很多函数处理中都是一个必不可少的操作,对于很多初学者来说,都知道在代码里加一句delay()就能延时,如果再了解多一点就知道delay_us(xx)就能...
  • 中断向量,中断向量表 ,中断服务函数

    千次阅读 多人点赞 2019-07-29 12:31:52
    所谓中断是指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,而转去执行为内部/外部事件或程序预先安排的事件的服务程序,待中断服务程序执行完毕...
  • stm32端口、中断初始化及中断函数

    千次阅读 2019-07-24 19:38:39
    对于stm32端口、中断初始化及中断函数的调用 端口初始化 首先来看下官方提供的端口初始化库函数(以stm32f4xx为例) ps:很多时候看官方提供的函数比较困难,所以结合例子进行分析,部分官方代码未能展示,可在keil...
  • 所谓中断是指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,而转去执行为内部/外部事件或程序预先安排的事件的服务程序,待中断服务程序执行完毕...
  • msp430学习笔记之中断处理函数

    千次阅读 2015-07-09 21:43:31
    这两个中断处理函数区别在修改后的多用了switch语句,里面还有TAIV,也就是中断向量值 仔细阅读数据手册,发现 TAIFG 的中断入口地址是 TIMERA1_VECTOR, 同时也是 TACCR1 //TACCTR2 的 CCIFG 的入口地址...
  • STM32单片机串口接收中断函数的编写

    千次阅读 2020-02-19 14:53:30
    其实学单片机使用的时候,往往大家都觉得简单,很快就过了,但其实有一些东西是值得深思的,我以前在写程序的时候往往都是发送数据,那么调用重写的printf()函数就可以了,但这次的项目中用到了NRF双全工通讯,这就...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 155,260
精华内容 62,104
关键字:

中断函数和子函数的区别