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.

[参考译文] MSP430FR6989:是否可以在退出中断后调用中断函数?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/878683/msp430fr6989-is-it-possible-to-have-an-interrupt-call-a-function-once-the-interrupt-is-exited

器件型号:MSP430FR6989

我的问题更多是抽象的、但我稍后会尝试提供一些伪代码。 我正在尝试实施一个系统、在该系统中、我的 MSP 将在收到外部信号后开始特定的过程。 我对中断非常熟悉、知道它是根据需要在中断中运行整个计算的、 从中断调用函数时、它被冻结、因为"过程"(原谅我、我现在不能认为合适的术语)会在中断中等待、直到函数完成。 我要查找的内容与以下内容类似:

CONFIG_SETTINGS (void)
{
//configure stuff
}

int main()
{
//设置数据
enable_interrupts ();
_low_power_mode ();
}

#pragma vector = interrup_vector
_中断 void CHECK_SIGNAL (void)
{
//接收字节
//检查启动信号
如果(START 信号=接收到)
函数(void);
}

void 函数(void)
{
//执行所有计算
//我要在中执行的操作
//此函数
//中断}

我知道上面很少的代码使用正确的语法或关键字、但这更多是一个概念问题、而不是一个调试问题。 上述伪代码的运行方式是、"进程"将在 ISR 内运行函数、然后在函数停止执行后返回到 ISR。 考虑到这种做法是不好的、我的设置理论上允许这样做、因为我可以保证在函数完成之前不会有其他外部中断到达。  

我想知道 MSP 架构是否允许该过程看起来更像:

  1. 进入 ISR
  2. 接收到 START 信号
  3. 中断被禁用/标志被清除
  4. ISR 退出  
  5. 函数
  6. 完成功能后重新输入 LPM

有什么方法可以做到这一点吗?

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

    尊敬的 Alex:

    您的描述很好。

    确实、在 ISR 内部、最好不要调用执行所需时间较长的函数。  如果功能较短、则没关系。  这实际上取决于系统中发生的其他情况、以及系统中是否存在对计时至关重要的其他情况。

    建议的方法是在 ISR 中设置一个标志、然后返回到 main。  在主检查中、如果标志被置位、并且如果为真、则调用函数、否则进入低功耗模式。

    CONFIG_SETTINGS (空)

       //配置数据


    int flag = false;

    int main()

       //设置数据
       enable_interrupts ();
       
       while (1)
       {
           //进入睡眠模式。
           _bis_SR_register (LPM3_bits + GIE);//_low_power_mode ();
           
           //发生中断,使我们处于唤醒状态-检查我们的标志
           if (flag == true)
               function();
           
       }//结束 while 循环


    #pragma vector = interrupt_vector
    _interrupt void CHECK_SIGNAL (void)

       //接收字节
       //检查启动信号
       如果(START 信号=接收到)
           flag = true;
       
       //当我们从中断返回时,我们不想回到睡眠状态,我们希望保持活动状态
       _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);


    void 函数(void)

       //执行所有计算
       //我要在中执行的操作
       //此函数
       中断

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

    感谢 Dennis 的回复!  

    我不知道您可以在 while 环路中进入低功耗模式、因为我认为 LPM "取代"任何形式的无限循环。 这是一个游戏改变者。

    我对汇编风格的编码不是很熟悉(因此是 low_power_mode_#()函数)、所以您能给我一个快速的概览或资源来读取以下行吗?

     _bis_SR_register (LPM3_bits + GIE);//_low_power_mode ();
     _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);

    我知道这是进入/改变 LPM 状态、但我不知道自己编写这些状态。  

    再次感谢!

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

    尊敬的 Alex:

    这些是生成特定汇编代码的宏、但看起来更像 C 语句、称为"内在函数"。  MSP430编译器指南 第6.8.1节对它们进行了介绍。

    这些低功耗内在函数会修改 SR 寄存器中控制 CPU 和计时的特定位。   我建议查看 MSP430FR6989用户指南第4.3.3节、其中介绍了 CPU 寄存器。  下面是一个片段:

    那么、这里是它的工作原理...

     1。指令_ bis_SR_register (LPM3_bits + GIE) 生成汇编代码、在该代码下设置 GIE、SCG1、SCG0和 CPUOFF SR 位、从而有效地禁用时钟系统并停止 CPU。  您现在处于 LPM3模式。  请注意、由于其他原因、编译器会自动插入额外的 NOP 指令。

    2.当一个中断发生时、这些位被 ISR 硬件自动清零并且 PC 和 SR 被压入堆栈。

    3.在 ISR 处理程序中,应用程序代码执行其任务,然后决定下一步要执行的操作。 返回到等待下一个中断的 LPM3状态、还是继续 main.c 中的下一条指令(这将是您的 while 循环)?

    5.如果你只是从中断返回、SR 将在中断发生前被 SR 值取代、你返回 LPM3等待下一个中断发生。

    但是、如果你使用 _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS)指令、GIE、SCG0、SCG1和 CPUOFF 位被清零、从而允许 CPU 继续执行。

    这是否有帮助?

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

    是的、这对您有很大帮助。 感谢 Dennis 的参与!