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.

[参考译文] TMS320F28069:ISR 堆栈用法与 RTOS 结合使用

Guru**** 2538950 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1268068/tms320f28069-isr-stack-usage-in-combination-with-an-rtos

器件型号:TMS320F28069
Thread 中讨论的其他器件:SYSBIOS

您好!

我的软件遇到了一个问题、该问题导致它由于堆栈溢出问题而随机失败。 我刚开始使用一个包含大约10个任务的 RTOS。 当中断发生时、它主要位于其中一个中断的堆栈内。 为此、所有任务堆栈必须较大以适应各种中断的随机发生。 这不仅浪费了大量内存、而且我缓慢地达到了部件的内存极限。

我的问题是、如何仅针对中断将堆栈指针重定向到专用堆栈段。 另外、堆栈指针的重写如何与中断嵌套交互。 根据我的理解、ISR 的每个条目必须首先检查栈指针是否在其专用段内、如果不执行重写、则只需保持原样。 进行堆栈点重定位的最后一个 ISR 必须将其恢复为原始值。
在软件和链接器中实现此目标的正确方法是什么、是否有其他方法可以实现类似的目标。 重要中断的数量相当小(3个左右)、最好使用一个其它技术来为每个中断静态建立一个堆栈、而不是为所有中断共用一个堆栈。

提前感谢

托比亚斯

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

    您是在编写自己的 RTOS、还是使用我们的现有实现(如 FreeRTOS 或 SYSBIOS)之一? 如果您正在开发自己的实现、可以查看这些现有实现以了解如何处理此问题。 不过、我不知道有任何实现针对每个中断具有单独堆栈。

    惠特尼

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

    它是 FreeRTOS 的较旧版本。 有些器件稍微做了一些调整、但对我关注的问题而言没有什么重要意义。
    Im 无需考虑将每个 ISR 分成自己的堆栈。 我需要为某些选定的 ISR 使用一个堆栈。 我的想法是重复使用常规的 C 栈、在 FreeRTOS 接管之前必须对其进行维护。 这涉及检索指向不再使用的位置的栈指针地址、以及将某些 ISR 重定向到该内存段。

    托比亚斯

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

    尊敬的 Tobias:

    我正在与编译器团队核实如何更改 ISR 中的堆栈。

    同时、我能想到的另一种解决方案是、将 ISR 内容卸载到任务上。 ISR 只需调用一个 SemPost/taskNotify 函数来取消阻止任务。 您可以为此任务提供专用堆栈并根据需要分配优先级。 该解决方案在您的情况下是否起作用?

    此致。

    维纳  

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

    您好、Veena:

    感谢您的努力。
    首先、这是您提出的一个有趣的解决方案、但我不确定是否可以满足将其委派给额外任务的延迟要求。 有关执行基于 FOC 的电机控制以及计算能力和存储器的信息、请访问此处。
    对于一个或两个 ISR、我更喜欢的方法仍然是将堆栈重新定位到其他一些位置。 即使它不是同一个堆栈、也会保护大量内存。
    此致。

    托比亚斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在向编译器团队检查是否要更改 ISR 中的堆栈。

    遗憾的是、编译器没有支持读取或写入 SP (栈指针)的功能。  综上所述、此类操作最好在手动编码的汇编函数中实现。  我不了解此类函数的任何示例。

    谢谢。此致、

    -乔治

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

    SYS/BIOS"Hwi 调度程序"有一些汇编代码、用于在进入和离开中断时更新堆栈指针。 如果我调用正确、它会像您描述的那样为 ISR 使用常规系统堆栈(cmd 文件中的.stack)。 这就是我能想到的壁橱例子。

    如果您安装了 SYS/BIOS、要查看的代码位于 BIOS_6_83_00_18\packages/ti\sysbios\bineste\c28\中。

    惠特尼

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

    惠特尼、您好!

    这是一个非常好的观点。 我会查看它、然后回复我找到的内容。 现在我想弄清楚如何在 RTOS 接管之前获取实际的 SP、并评估是否需要将在此之前的大部分 init 函数打包到单独的函数中、以从大量调用中释放堆栈。