您的位置:首页 > 其它

嵌入式开发基础从启动例程到硬件之轮询和中断

2020-07-16 06:11 295 查看

轮询和中断

概述

嵌入式产品是为了对外面发生的事情做出反应或向外推动而使用计算机。计算机逐个解释并执行程序计数器所表示的命令。也就是说,我只是按照事先设定的程序行事。
那么,为了获取外部的信息,进行与之相应的处理,该怎么做呢?作为方法之一,只要写上查看外部的命令就可以了呢?在此,以日常生活的例子为基础,对轮询和中断进行说明。

是亲自出去订货还是通过电话接受?

拜访每个家庭,问“有什么需要的东西吗,XX商店会为你送到“。在计算机的世界中,像这样事先去询问的方法叫做轮询。
与此相对,也有顾客打电话给XX商店订购的方法。从商店的角度来看,这是另一种方式,打来电话就对应,结束后再回到原来的事情,这样的方法,我们称之为”中断“,中断的工作被称之为”中断处理“。

XX商店先生每天都在A先生、B先生、C先生、D先生的家里转转。即使早上总是在同一时间开始工作,按顺序转的话也不会有什么事,如果被B先生要求去商店里查找库存里没有的东西,然后再去找批发商的话,B先生以后访问房子的时间就不同了。说不定就没有时间去D先生的家里。
在这种情况下,如果从各处的家里被要求“希望每天都来”,XX商店一个人是无法应对的.而且也不能满足“希望马上送货”的要求。为了即时应对这样的要求,使用了刚才列举的“中断”这一方法。

中断处理只有在有中断处理的情况下才会成立。在此,让我们考虑一下通过电话接受订货,送来刚出炉的披萨的披萨店。
为了一定要接订单的电话,电话进入时的处理必须很短。接电话的人只进行听订单后写投递单据的作业,投递的人另行雇用。投递的人数量不够,送信的范围很广的话,会有这样的情况,未处理的投递单据不断积累。另外,如果订单蜂拥而至,接电话1个人可能会处于持续谈话中的状态。此时,必须采取增加各自的人数,或者雇佣能够更迅速地进行操作的超人等应对措施。

本文说明了一边积极地去拜访,一边不能应对即时订货的XX商店,和只等待顾客的订货等被动营业的披萨店的例子。在一般的商店中,将XX商店和披萨店的业务组合在一起。
让我们来总结一下轮询和中断。
轮询:(定期)检查并处理事件发生
中断:当事件发生时,中断并处理事件

实例代码

嵌入式软件也是通过轮询和中断相结合而制成的。
使用轮询的程序写如下。

  main()
  {
   初始化
   重复以下操作
   {
     调查事件
     如果满足条件就处理
    }
  }

在实际的程序中,轮询是通过用while语句等旋转循环,在其中写出去订货逻辑来实现的。计算出事项的处理时间,
必须考虑不要超过调查现象的间隔(轮询周期)。调查多个现象,必须执行各自对应的处理时,要特别注意。
使用中断的程序写如下。

  // main函数(中断侧)
  main()
  {
   初始化
   重复以下操作
   {
    禁止中断
    不能被打断的处理
    中断许可
    可以中断的处理
   }
  }

  // 中断处理

  interrupt()

  {

   回避中断处理中使用的资源

   中断处理主体

   让避让的资源回归

  }

中断是,CPU利用预先拥有的中断的结构。CPU接收到中断信号后,将如果中断没有进入的情况下应该执行的地址装载到堆栈中。然后,通过将记述了中断处理内容的地址设置在程序计数器中,“跳转”到中断处理程序,进行处理。执行表示中断处理结束的中断恢复命令时,CPU取出放在堆栈中的地址,放入程序计数器中,像什么事都没有一样回到以前的事情。当然,为了在返回的时候不为难,在执行中断处理的时候,保存至今为止使用过的内存和寄存器的内容。中断处理结束后返回到之前的状态。

中断信号有两种。一种是在某些情况下可以不接受的中断(可屏蔽中断)。另一种是必须接受的中断(不可屏蔽中断)。当接受中断时执行不好的处理时,如果事先执行中断禁止命令,就可以不接受,变成可以屏蔽的中断。处理结束后,通过执行中断许可命令,再次接受中断。
中断信号进入后,到实际中断处理开始为止的时间称为中断应答时间。必须对应的现象会等到什么时候呢?
如果不确认与中断应答时间对接可以充分处理的话,就不能处理事件。在被中断方的函数中有禁止中断的处理时,也会加上这个处理时间。

在初次使用的时候,容易把以中断信号为契机的处理全部写在中断处理例行程序中。这样的话,中断一方的处理就会停滞。为了使从接受中断到恢复原来的任务为止的时间(中断处理时间)最小,之后可以进行的操作是:
在中断处理程序内只停留在设定标志,在被中断的一方进行处理。以刚才的披萨店为例,写投递单据是标志的设定。当然,中断处理时间被设计成比中断信号进入的间隔短。

有多个中断处理时,进行优先顺序。在执行优先顺序较低的中断处理的过程中,使其能够接受优先顺序较高的中断处理。将其称为多重中断。図6-3


假设函数interrupt1、interrupt2插入main函数。当函数interrupt2的中断优先级高于函数interrupt1时,如果函数interrupt1允许中断,则函数interrupt1在运行过程中也可以中断。

结束语

在中断处理中容易发生问题,而且很难解决,所以把大家容易绊倒的地方作为经验进行了总结。失败也是经验中的一部分,如果是专业人士的话,即使第一次被允许,也不会有第二次。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: