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.

[参考译文] TMS320F280049C:如果不是 EINT、堆栈可能会溢出

Guru**** 2560390 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1336671/tms320f280049c-could-stack-be-overflowed-if-not-eint

器件型号:TMS320F280049C

尊敬的 Champ:

我要求为我的客户提供服务。

它们已经初始化外设阶段和 PIE 阶段(初始化 PIE 矢量表、重新映射到 ISR 函数)并执行 Interrupt_enable (INT_x)以正确传播中断请求、而是特意执行它、而不在   PIE 初始化之后执行全局中断(EINT)、 并针对一些背景内容将其保持一段时间、然后最终启用全局中断(EINT)

该伪代码如下所示、

void init_interrupt (void)
{
    EALLOW;
    PieVectTable.SCIA_RX_INT = &Uart_Rx_Isr;
    ..... // other peripherals' PIE re-mapping to ISR functions
    ..... // other peripherals' PIE re-mapping to ISR functions
    EDIS;
    
    PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
    ..... // other peripherals' PIE IER
    ..... // other peripherals' PIE IER
    
    IER |= M_INT9 | ... |... ;
    
    //EINT;
    //ERTM;
}

在这段 没有执行 EINT 的时间 内、已经有外设中断请求一个接一个地在 CPU 阶段等待。 如果用户未启用 全局中断(EINT),在启用 EINT 并开始执行 ISR 之前堆栈是否会溢出?  

谢谢。此致、

约翰尼  

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

    Johnny、

               堆栈在(i)为中断提供服务时起作用、以及(ii)在调用期间起作用(当返回地址被压入堆栈时)。 当为中断提供服务而不是调用时、压入堆栈的寄存器数量要多得多、因此我看不出在未为中断提供服务时堆栈会如何溢出。 有关有用的提示、请参阅 www.ti.com/lit/SPRA820。

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

    您好、Hareesh。

    感谢您的回复。

    让我来详细描述一下客户的情况、请您详细说明一下。  

    原因用户 在 main ()中以如上所示的伪代码的形式执行了中断请求,在 while loop 中的语句(#ifele)中执行了中断请求(EINT)之前,没有启用后面的 INTM。 在代码运行到 while 循环(EINT)之前、实际上有外设的 ISR 请求、并传播到 CPU 阶段并等待 EINT。

    但是、客户发现 ISR (RX_ISR)肯定会100%发生(另一个器件始终向 F280049C 发送消息)、在冷复位后不生成 RX_ISR 的情况很少见、而客户通过此类测试确保应始终生成任何 ISR。 我们要确定、在启用 EINT 之前、堆栈是否可能已溢出、导致100%显示 ISR 可能会错过。

    是否有人想知道为什么 100%应该发生 ISR 未在重复冷复位后始终生成 ISR?

    谢谢。此致、

    约翰尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    原因用户 在 main ()中以如上所示的伪代码执行了中断请求,直到在 while 循环中的语句(#ifele)中执行了 INTM (EINT),才启用后面的 INTM。 在代码运行到 while loop (EINT)之前、实际上有外设的 ISR 请求、并传播到 CPU 阶段并等待 EINT。

    对不起,我不明白你在想说什么。

    但是、客户发现 ISR (RX_ISR)肯定会100%出现(另一个器件始终向 F280049C 发送消息)、在冷复位后 EINT 后不生成 RX_ISR 的情况非常罕见。 他们正在进行此类测试、以确保应始终生成任何 ISR。 因此,我们要确定,在启用 EINT 之前,堆栈是否已溢出,导致100%显示 ISR 可能会错过。

    堆栈与是否为中断提供服务无关。 TRUE、当中断服务开始时、要保存的寄存器被压入堆栈。 但是、中断是否被处理、与堆栈的条件无关。 如果堆栈已溢出(损坏)、它将影响到服务中断之前器件状态的恢复。 不是对中断本身的服务。

    关于为什么 100%应该发生 ISR 在重复冷复位后不会一直生成 ISR 的任何想法?

    客户应跟踪所有外设级别的使能位(i)(ii)在 PIE 级别、以及(iii)在 CPU 级别。