代码之家  ›  专栏  ›  技术社区  ›  pidizzle

在没有任何预先设置的情况下,硬件中断如何触发软件处理程序[关闭]

  •  -1
  • pidizzle  · 技术社区  · 6 年前

    我目前正在学习处理器中断,遇到了一些困惑。据我所知,处理器有一组外设的外部中断。这样制造商就可以通过自己的外围设备提供中断处理器的方法。我知道这个特殊的处理器(ARM Cortex M0+)一旦外部中断线被触发,它将进入它的向量表和相应的中断请求偏移量,并且(这里我可能错了)将在该地址执行ARM thumb代码。

    如果我理解正确,一些处理器会查看IRQ地址的值,它会指向中断处理程序的地址。

    在学习ARM Cortex M0+向量表时,thumb代码在该地址做什么?我假设它正在做一些类似于将PC寄存器设置为中断处理程序地址的事情,但这只是一个暗中操作。

    问题2

    另外,到目前为止,我发现处理EIC中断的唯一方法是使用以下代码片段

    void EIC_Handler() {
      // Code to handle interrupt
    }
    

    我很困惑在我的实际c代码中,如何在没有设置或显式引用的情况下调用这个函数。程序如何从向量表查找到调用这个函数?

    编辑#1:

    关于包含拇指代码的向量表,我错了。向量表包含异常处理程序的地址。

    阅读/学习 关于如何处理软件中的外部中断,我注意到每个源代码都说只需添加上面的代码片段。我很好奇中断是如何从硬件一直到呼叫我的 EIC_Handler() 除了定义函数和EIC之外,我没有设置任何东西。所以我研究了什么是向量表,以及当不同的中断发生时,处理器如何处理向量表的某些部分。这仍然没有回答我的问题,因为我没有自己设置向量表,但是我的 EIC\U处理程序() 函数仍在被调用。

    所以在编译时,必须创建向量表,并且相应的IRQ句柄指向我的

    我发现IDE(Atmel studio)和我选择的项目配置附带了一个定义弱函数的小文件、重置处理程序的实现和向量表。还有一个定制的链接器脚本,它获取函数的地址并将它们放入向量表中,如果实现了弱函数,它将指向该实现,并在适当的中断请求发生时调用它。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Colin    6 年前

    对于皮质M0(和其他皮质?向量表不包含拇指代码,它是一个函数的地址列表,这些函数是异常处理程序的实现。

    当处理器获得异常时,它首先推送堆栈帧( xPSR PC , LR R12 , R3-R0 MSP PSP

    当有一个 POP 加载 个人计算机 ,或 BX 处理器从异常处理程序返回的来自异常处理程序的指令,它卸下被推送的堆栈帧,并从停止的位置继续执行。此过程在 Cortex M0+ User Guide - Exception Entry And Exit

    根据您使用的工具集/库的不同,有不同的方法来定义向量表,并指出它应该在内存中的位置。

    通常有弱链接的函数,其名称与微控制器可用的异常有关,当您在源文件中实现它们时,这些函数被链接而不是弱函数,并且它们的地址被放入向量表中。

    我没有使用基于Atmel的ARMs的经验,但是@Lundin在评论中说向量表位于“startup\u samxxx.c”文件中。如果您是从零开始的,那么您需要确保您有一个合适的向量表,并且它位于一个合理的位置。