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.

[参考译文] 编译器/MSP430F6734A:IAR C:如何获取将在 ISR 之后返回的程序计数器值

Guru**** 2582405 points
Other Parts Discussed in Thread: MSP430F6734A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/729105/compiler-msp430f6734a-iar-c-how-to-get-value-of-program-counter-that-will-be-returned-after-isr

器件型号:MSP430F6734A

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

您好!

我们将 IAR 7.12 C 用于我们的一个使用 MSP430F6734A 的项目、该项目具有96 KB 的闪存。

和为大型代码模型配置的 IAR C 编译器。

出于诊断目的、在中断例程内、我需要存储将在 ISR 之后执行的代码的地址。

该值(ISR 之前的程序计数器)在跳转到 ISR 例程之前被 MSP430自动推送到某个位置、并在 ISR 例程之后自动弹出。

我需要 C 变量中的32位值、如何获取它?

uint32_t program_counter_was;

void func1 (void)
{
.
}

void func2 (void)
{.}



void main (void)
{
...
__enable_interrupt ();

while (true)
{
func1();
func2();
.}

}

#pragma vector = Port1_vector /* 0xFFDE 端口1 */
__interrupt void Port1_ISR (void)
{...

program_counter_was =?? //此处,我需要存储将在 ISR
之后执行的代码的地址}

#pragma vector = RTC_vector
__interrupt void RTC_ISR (void)
{...

program_counter_was =?? //此处,我需要存储将在 ISR
之后执行的代码的地址}

#pragma vector = AUX_vector//* 0xFFE6 AUX Supply */
__interrupt void AUX_ISR (void)
{...

program_counter_was =?? //此处,我需要存储将在 ISR 之后执行的代码的地址
} 

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

    您好!

    可以使用内在函数__get_sp_register()从堆栈指针检索 PC 的值。 20位 PC 分为16位和4位。 最高4位被编码到 SP 的 SR 位中。 请参阅 UG 章6.2

    这种方法有一个警告。 检索 PC 时、根据中断函数和被压入堆栈的寄存器数量、将会有一个偏移量。 这意味着、每次更改代码或更改编译器选项时、您需要检查堆栈中保存了多少个寄存器。

    另请查看此主题 :https://e2e.ti.com/search?q=__get_SP_register&category=forum&date=&customdaterange=0&startdate=&enddate=

    此致、

    Andre

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

    您对此主题还有其他疑问吗? 如果不是、请为解决您的问题的帖子选择"已解决"、以便关闭此主题。 如果您有其他问题、请选择"提出相关问题"或"提出新问题"。
    非常感谢!

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

    我想您可以继续使用您的应用程序、因为您不再回复、所以我将关闭此帖子。
    如果您希望获得有关此主题的进一步帮助、请随时再次发表评论、它将重新打开主题。 如果您有其他问题、请选择"提出相关问题"或"提出新问题"。

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

    您好 Andre、

    很抱歉我迟到了。

    __get_sp_register()有助于获取当前堆栈位置的地址。

    但是、每个中断例程在栈结构方面具有唯一的指纹、跳过时取决于编译器压入的字节数量。

    因此、除非我检查反汇编并手动定位存储的 PC 值、否则当前堆栈指针不会产生太大的帮助。

    此外、我不知道编译器稍后可以更改该位置。 更可靠的方式将是完美的。

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

    遗憾的是、这种方法并不容易。 如上所述、正如您已经提到的、这取决于您的最终代码和最终编译器选项。

    Andre