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.

[参考译文] TMS570LS0914:IRQ 堆栈指针改变

Guru**** 2537080 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/963421/tms570ls0914-irq-stack-pointer-changes

器件型号:TMS570LS0914

您好!

我们遇到了 IRQ 堆栈指针问题。


执行 pogram 初始化后、IRQ SP 指向地址0x08000600。 (标准 sys_core.asm)

在程序执行期间的某个点、指针变为地址0x08016b58。

我们使用的是 FreeRTOS 和 MPU。
一个任务对该区域没有写入访问权限、IRQ SP 在其更改后指向该区域。
当一个中断被执行并且这个任务处于激活状态时、这将导致一个数据中止异常。

我假设中断模式继承了活动任务的 MPU 配置。 (是这样吗?)
如果在中断期间另一个任务处于活动状态、且该任务对该区域具有写入访问权限、则不会导致数据中止。

在使用调试器测试某些项目期间、我们多次看到此问题。
我们当前正在尝试找到根本原因、这会更改 IRQ 堆栈指针。

不幸的是、行为似乎是随机的。 有时数据中止是在几个小时后引起的、有时是在15分钟后引起的。

为了进行调试、我使用调试器手动更改了 IRQ SP 的值。

您有什么想法吗、什么可能导致 IRQ 堆栈指针的改变?

根据我的理解、这是一个单独的 CPU 寄存器。 因此、即使是阵列溢出或无效软件、也不应导致此行为。
即使是中断本身中的堆栈溢出、也不应在中断被保留后导致 IRQ SP 更改为另一个值。
当然、在执行中断期间、堆栈指针会随着调用内部函数而减小。

这样做的原因可能是什么?


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

    您好 Oliver、

    在启动期间定义中断堆栈指针。 在进入 sys_core.asm 中定义的中断服务例程(ISR)时、FreeRTOS 应切换到使用专用中断堆栈。  

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

    您好!

    堆栈指针在启动时正确初始化、如 sys_core.asm 中定义的那样。 我们已经检查了。

    问题是、该地址在程序执行期间的某个点变为无效地址。

    >> FreeRTOS 应在进入 sys_core.asm 中定义的中断服务例程(ISR)时切换到使用专用中断堆栈。

    我认为堆栈指针从用户 SP 到 IRQ SP 的交换是由处理器自动完成的、而不是由操作系统完成的。

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

    你是对的。 它是将堆栈指针从任务的堆栈切换到 ISR 堆栈的处理器。 老实说,我无法解释为什么堆栈指针看起来超出了 sys_core.asm 中定义的堆栈空间。

    您知道哪个 ISR 处理程序存在此问题吗?