0

这个问题涉及在 MIPS 汇编中为 MPLABX 中由 XC32 编译的项目编写 ISR。

我的主要项目是用 C 编写的,因此我成功地分支到 Timer1 中断,如下所示:

void __ISR (_TIMER_1_VECTOR, IPL7SRS) mISR {
    // do stuff
}

但是,当我尝试使用这种格式使这个 ISR 的汇编版本工作时:

    .global TheRealISR

    .section .vector_17,code # Note : Timer1 is IRQ 17
    .align 2
    .set nomips16
    .global __vector_dispatch
    .ent __vector_dispatch
__vector_dispatch:
    j TheRealISR
    nop
    .end __vector_dispatch
    .size __vector_dispatch,.-__vector_dispatch

我永远不能用断点来捕获程序执行。打开计时器后,我的代码处于无限循环中,但是(可能)在计时器关闭后,程序没有进入 ISR,而是跳到代码的不同部分。

一些需要注意的事情:ISR 的 C 版本也崩溃了,直到我在控制寄存器中将向量间距设置为 8 字节(上电时默认为零)。除非我在链接器文件中也将向量间距设置为 8,否则 MIPS 版本根本无法编译(注意,没有这个,C 版本仍然可以正常运行!)。我必须将向量间距设置为 16 以避免 MIPS ISR 引发异常,即使当我检查生成的 lst 文件时,它占用的空间也不会超过任何默认异常处理程序。向量间距为 8 时,处理器会在计时器关闭后立即抛出异常,我什至无法在断点处捕获任何内容。我使用的是 PIC32,Coprocessor0 的 Cause 寄存器中的值为 0x801c10,应该告诉我来源等同于“保留”)。

在另一个论坛答案(https://www.microchip.com/forums/m306645.aspx)中,一位评论者说发帖者应该看看编译器如何翻译 ISR 的 C 版本,但我不知道该怎么做那。在 lst 文件中,我只能查看最终的汇编命令,而不是如何使用所有 .section 等内容编写它,尽管暗示这可以通过他们提供的示例来完成。我还应该注意,作为 XC32 示例提供的核心计时器的 ISR 如下所示:

.section .vector_0, code
    j CoreTimerIntHandler
    nop

...所以我不确定我会如何搞砸(注意:我也尝试过这种简单的风格,但无济于事。这个示例项目甚至不包含自定义链接器脚本,所以我没有不知道他们如何避免向量间距的问题。这里的任何帮助将不胜感激。

4

0 回答 0