历史上的今天
返回首页

历史上的今天

今天是:2024年12月10日(星期二)

正在发生

2018年12月10日 | stm32学习笔记(八)中断服务函数与函数调用的区别

2018-12-10 来源:eefocus

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

1、两过程定义与作用
    

子程序是微机基本程序结构中的1种,基本程序结构包括顺序(简单)、分支(判断)、循环、子程序和查表等5种。
    

子程序是一组可以公用的指令序列,只要给出子程序的入口地址就能从主程序转入子程序。子程序在功能上具有相对的独立性,在执行主程序的过程中往往被多次调用,甚至被不同的程序所调用。一般微机首先执行主程序,碰到调用指令就转去执行子程序,子程序执行完后,返回指令就返回主程序断点(即调用指令的下一条指令),继续执行没有处理完的主程序,这一过程叫做(主程序)调用子程序过程。

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

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

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

2、两过程的联系与区别

2.1联系

    

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

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

2.2区别
    

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

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


http://blog.csdn.net/douyuhua0918/article/details/7473254


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


推荐阅读

史海拾趣

Excelitas公司的发展小趣事

随着技术的不断成熟和市场的扩大,Excelitas公司开始寻求全球扩张。公司先后在北美、欧洲和亚洲设立了研发中心和生产基地,以更好地服务全球客户。在全球扩张的过程中,Excelitas注重本土化战略,积极与当地企业合作,共同开拓市场。这一策略不仅帮助公司快速融入当地市场,还促进了公司业务的持续增长。

ERP公司的发展小趣事

进入21世纪20年代,电子智链紧跟智能化浪潮,将人工智能(AI)技术引入ERP系统。公司推出了“智链AI”解决方案,通过机器学习算法自动优化生产流程、预测市场需求和降低库存成本。这一创新使得电子智链在竞争激烈的ERP市场中脱颖而出,成为了电子行业数字化转型的领军企业。

Califia Lighting公司的发展小趣事

Califia Lighting深知品质是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到产品生产、检验、包装等各个环节都进行严格把关。同时,公司还注重客户服务和售后支持,及时解决客户在使用过程中遇到的问题,赢得了客户的信赖和好评。

浙江凡华(FANHAR)公司的发展小趣事

随着产品质量的不断提升和市场份额的逐步扩大,Califia Lighting开始积极寻求与国际市场的合作。他们与多个国家和地区的合作伙伴建立了稳定的合作关系,将产品出口到全球各地。同时,公司还参加了多个国际电子照明展会,与全球同行交流学习,进一步提升了公司的国际影响力。

e2v technologies公司的发展小趣事

2016年,e2v被Teledyne Technologies公司收购,成为Teledyne e2v。这一合并不仅为e2v带来了更多的资源和支持,也为其开启了新的发展篇章。Teledyne e2v在继续保持其在图像传感器领域的领先地位的同时,也积极拓展新的市场和应用领域,为电子行业的发展贡献更多的力量。

Appointech Inc公司的发展小趣事

为了进一步扩大市场份额,Appointech Inc公司开始积极拓展海外市场。通过与国际知名企业的合作,公司成功打入国际市场,产品销量大幅提升。同时,公司还积极参加国际电子展会和交流活动,与全球同行建立了广泛的合作关系,为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

问一下

如果感应头不工作是什么原因啊,工作的发光二极管亮,但是感应头不工作。谁知道有那些原因啊 程序好使,只是从硬件上找。…

查看全部问答>

Linux2.6完全 移植教程,基于TQ2440开发板

开发板移植好教程,入门者的福音 还在为Linux移植入门而烦恼吗?还在为Linux驱动而头痛吗?还在为没有一本从入门到真正移植的好书苦闷吗? 现在您有一个好的选择,天嵌科技推出一部和开发板完美结合的教程:从下载源码到将内核移植适合于TQ2440开 ...…

查看全部问答>

51和fpga通信

那个知道51怎么和FPGA通信啊?高手指点下啊!!…

查看全部问答>

ce ActiveSync连接的问题

ActiveSync通过USB接口连接设备一直挺好的,可今天我拔usb线断开连接啊,机子死机了,重启过后就不行了,ce设备起来后无法自动连上,我只好手动运行repllop.exe进行连接,连上后,下载程序,运行很慢。我卸载重装都不行,换USB接口也不行,请问我改 ...…

查看全部问答>

at89c51芯片加上cd4511bcn做一个计数器出错,请教下挫在那里?

at89c51芯片的p0管脚作为2个四位bcd码的输出到cd4511bcn中去,然后通过cd4511bcn输出到2个8段显示器中,但是总是没有任何反应,请各位帮忙看看:以下是代码: -+         COUNT        EQU     ...…

查看全部问答>

wince下怎么显示图像阴影

填充圆内的颜色, wince里不能用CreateHatchBrush显示各种阴影,那有什么其他函数能显示呢? 画直线, wince里不能用CreatePen的另一种函数,那如果我想画各种线该怎么做呢?比如点线…

查看全部问答>

诺基亚卖了Qt,未来还会卖什么?

  已经决定和微软合作开发Windows Phone手机的诺基亚,就把原来收购的 Qt放到了角落。据国外媒体报道,诺基亚决定将QT商业授权和服务业务出售给一家芬兰Digia公司,Digia计划雇用19名的诺基亚原来QT 相关雇员。        ...…

查看全部问答>

请大哥看看我的这个问题

我的MCU与上位机通信,同时需要处理一些事务,但当处理某些事务时是不允许上位机通信中断的,这样上位机通信有些时候就不通,当比较严重的时候是无法接受的,这是不是就要用到多任务操作系统了,专门用一个任务来与上位机中断通信,另外的任务来处 ...…

查看全部问答>

开关电源讲议

开关电源讲议,对初学者很有帮助的! [ 本帖最后由 aishuang 于 2011-7-17 07:43 编辑 ]…

查看全部问答>