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.

[参考译文] AM6422:FreeRTOS vApplicationStackOverflowHook

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1560805/am6422-freertos-vapplicationstackoverflowhook

器件型号:AM6422


工具/软件:

您好、

  我们使用 SDK 8.6、其中 R5F 内核运行 FreeRTOS 操作系统。 创建任务时、系统进入该 vApplicationStackOverflowHook 功能。

  让我来描述一下整个创建过程。 在 main 函数中、 xTaskCreateStatic 函数用于创建 freertos_main 优先级为 6、栈大小为 327680 的任务。 执行 vTaskStartScheduler 函数后、 freertos_main 任务会运行并最初使用该 TaskP_construct 函数创建一个新任务 A。 任务 A 的优先级为 22、栈大小为 8192 * 100。 在任务 A 中、还使用 TaskP_construct 函数创建了另一个任务 B、优先级为 13、栈大小为 327680。 按照此过程、任务 B 创建后、系统进入 vApplicationStackOverflowHook 函数、指示任务 A 中的栈溢出。但是、通过将 freertos_main 任务的优先级修改为 31 并在执行后删除任务本身、系统不再进入该 vApplicationStackOverflowHook 函数。 感谢您在分析这种情况时提供帮助。

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

    你好、wanglili、

    FreeRTOS 堆栈行为观察:
    •当 FREERTOS_MAIN 运行并删除自身时:
    •任务 A 和任务 B 在不发生栈溢出的情况下继续运行。
    •系统按预期工作;从 FREERTOS_MAIN 释放的堆栈现在可用于其他任务。
    •当 FREERTOS_MAIN 运行且自身不删除时:
    •执行任务 B、但触发了 vApplicationStackOverflowHook。
    •会为任务 A 报告溢出、表示在任务 B 执行期间超出了任务 A 的栈。

    后续步骤/建议:
    1.检查任务堆栈分配
    •检查任务 A 和任务 B 是否确实需要当前分配的栈大小。
    •使用 uxTaskGetStackHighWaterMark() 测量运行时的实际堆栈使用情况。

    2.暂时保持 freertos_main 运行
    •请勿提高其优先级;请将其保持在 6。
    •在堆叠调整后监控系统行为。


    3.收集水印统计数据
    •在运行时为每个任务调用 uxTaskGetStackHighWaterMark():
    •提供最少剩余的可用堆栈。
    •有助于为每项任务确定安全且理想的栈大小。


    4.迭代
    •逐步增加叠块大小。
    •使用高水位标记数据进行验证。
    •避免过度分配、但确保不会发生溢出。

    此致、

    Anil.