This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TM4C1294NCPDT:GPIO_setCallback 崩溃

Guru**** 2330870 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/595560/compiler-tm4c1294ncpdt-gpio_setcallback-crashing

器件型号:TM4C1294NCPDT

工具/软件:TI C/C++编译器

您好!

我有一个用于 I/O 引脚的中断服务例程、地址是 ISR 0x0001A628。 当我查看反汇编时、我们有以下内容:-

000085c6:494A LDR R1、[PC、#0x128]
000085c8:2000 MOV r0、#0
000085ca:F00EF8CF BL #0x1676c

使用内存浏览器查看 PC+0x128文字池中存储的常量为0x0001A629。 这是编译器错误。

奇怪的是、如果我使用 ISR 的地址填充回调结构、则该结构有效、并且填充了正确的地址。

谢谢、

Richard。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、
    您是否说 BL #0x1676c 导致代码崩溃?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    否 我所说的是编译器将0x0001A629放置在 字面量池中、而 不是将0x0001A628放置在 ISR 的实际地址中。  

    000085c6:494A LDR R1、[PC、#0x128]
    000085c8:2000 MOV r0、#0
    000085ca:F00EF8CF BL #0x0001A629  

    Richard。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    也许它设置为9而不是8、因为它是 Cortex、所有调用都设置了低位以指示拇指调用?

    我似乎还记得、对于 Cortex、中断表也是如此。 嗯、我只是检查了我的中断表、这似乎是这样的。

    Robert