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.

[参考译文] MSP430FR5969:是否可以更改 ISR 的返回地址?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/626611/msp430fr5969-is-is-possible-to-make-changes-to-the-return-address-of-isr

器件型号:MSP430FR5969

您好!

在我的 MSP430FR5969中、我编写了一个代码、在该代码中、按下某个键时会触发中断。

但是、根据我的需求、我希望在每次中断(ISR)段执行后、执行一个特定的函数。

这样做的一种方法是在 ISR 中调用函数。 但是、由于函数足够大、这不是我要做的事情。  

我发现另一种方法是修改返回地址。 有人能告诉我、如何实现这一点吗?

是否有其他方法来完成我的任务?

我无法使用基于设置标志的 ISR。   ISR 执行后需要立即调用该函数。 代码应忘记所有内容、并执行特殊功能。

示例:

 

ISR 段
{
//执行 ISR
//设置一些值以标记变量
。}

void Special _ Emergency _ Func ()
{
//这是每次执行 ISR 时优先执行的大型函数
}



void main (void)
{
//init MSP430模块
while (1)
{
if (flag == x)
{
//执行这个大部分
//这些段非常大。
//在中断后,代码再次检查标志值之前,需要花费大量时间。
}


否则 if (flag == y)
{
//执行这个大部分
//这些段非常大。
//在中断后,代码再次检查标志值之前,需要花费大量时间。
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "忘记所有内容"是否意味着在特定函数完成后中断的旧代码不应继续?

    如果已经执行了特殊函数、应该会发生什么情况?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉我把你弄糊涂了。 我的意思是、在 ISR 返回后、应立即执行特殊函数。 特殊函数完成后、代码可以恢复 main 的 while 段。 更简单地说、当中断发生时、SPECIAL_FUNCTION 的优先级高于主段的优先级。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 能够调度任务。

    如果您不想使用 RTOS、则必须手动实施。 ISR 必须检查特殊函数是否已经在运行。 如果不是、请更改栈、使其看起来就像调用了特殊函数一样。 (编译器假设哪些寄存器可以使用而不保存它们、您可能需要将特殊函数声明为中断处理程序、并相应地调整栈。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果在 ISR 之后立即调用它*has *,您也可以从 ISR 调用它
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "一种方法是在 ISR 中调用函数。 但是、由于函数足够大、这不是我要做的事情。 "

    在 ISR 中调用一个大型函数将增加 ISR 执行的时间。 应用无法承受一个中断中的大量时钟周期。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、我无法使用 RTOS。 我想介绍堆栈修改方法。 因为、我以前没有这么做过、您能不能向正确的方向指出我? 可能是 MSP430FR5969的代码示例或建议阅读/文章?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是说"特殊函数应在 ISR 返回后立即执行"的人、如果必须在每个 ISR 之后调用它、无论如何、您都将浪费时钟周期。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在实际的中断处理程序内、堆栈如下所示:

        (笑声)
        从主循环堆栈数据
        PC (主循环中断的地方)
        SR (主循环的)
        由中断处理程序保存的寄存器
    SP→中断处理程序的附加堆栈数据

    要使中断处理程序返回到另一个函数、必须更改返回地址并修改栈、以便另一个函数返回到主循环:

        (笑声)
        从主循环堆栈数据
        PC (主循环中断的地方)
        SR (主循环的;这假定额外的函数被声明为一个中断处理程序)
        PC (额外功能的开始)
        SR (用于额外功能)

        由中断处理程序保存的寄存器
    SP→中断处理程序的附加堆栈数据

    最后保存的 SR 下面的内容令人厌烦(因为您不知道编译器到底做什么);您可能应该在汇编器中编写中断处理程序、以便控制它在栈上推入的内容。 (如果您已经在使用汇编器、而不是推送额外函数的 PC/SR、则只需更改 SR 即可重新启用中断、并跳转到额外函数)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道"浪费时钟周期"是什么意思。 我感谢您努力帮助我解决问题、但我认为您感到困惑。
    AFAIK、在 ISR 中调用一个函数、与在 ISR 外部调用它不同(例如、从 main 中调用)。
    在 ISR 中调用函数意味着为 ISR 返回提供更多时间、这反过来又使其他中断保持等待状态。 比如说、如果我从 main 调用函数、我不会等待其他中断。 当然、这是一种实现它的方法。 但是、正如前面所说的、它有自己的缺点、不符合我的目的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    其他中断等待的原因只是全局中断使能标志(GIE)被清除。 您只需在调用该函数之前在中断处理程序中设置它(然后必须为递归中断做好准备)。