【问题标题】:FreeRTOS freezesFreeRTOS 冻结
【发布时间】:2018-09-24 20:00:41
【问题描述】:

我有一个简单的 FreeRTOS 程序,基本上我需要计算运行不同次数的迭代所需的时间。 问题是它只是冻结并且不再执行,尽管迭代尚未完成,我需要它成功地到达 vTaskEndScheduler() 以终止,以便我可以正确计算时间。可能是什么原因? Freeze screenshot

  void Task1() {

    for (int i = 0; i < 100; i++)
 {
        printf("This is task 1 ");
        printf("Iteration number ");
        printf("%d", i);
        printf("\n");
        vTaskDelay(100);
    }
    vTaskEndScheduler();
};

void Task2() {

    for (int i = 0; i < 100; i++) {
        printf("This is task 2 ");
        printf("Iteration number ");
        printf("%d", i);
        printf("\n");


        vTaskDelay(100);
    }
    vTaskEndScheduler();
};



void main_blinky(void)
{
    enableFlushAfterPrintf();

    xTaskCreate(Task1, (signed char*) "t1", 100, NULL, 1, NULL);
    xTaskCreate(Task2, (signed char*) "t2", 100, NULL, 1, NULL);


    vTaskStartScheduler();
}

【问题讨论】:

    标签: c real-time freertos


    【解决方案1】:

    乍一看,在不了解您的系统的情况下,我会猜测 printf() 是导致问题的原因。它是如何实施的?它是线程安全的吗?您的任务是否有足够的堆栈空间来满足其堆栈要求,这取决于您使用的库:https://freertos.org/Stacks-and-stack-overflow-checking.html

    请参阅(免费但有些过时)书 (https://freertos.org/Documentation/RTOS_book.html) ref printf 中的注释。

    【讨论】:

      【解决方案2】:

      您必须首先为任务选择适当的堆栈,并确保在运行时可以通过堆大小访问它,然后我认为 问题可能出在 printf() 方法和实现方式上。

      【讨论】:

      • 这不只是另一个答案的后续副本吗?
      • 有点不同,我注意在编译前检查微控制器的静态堆大小值,如果配置不正确,可能会发生此错误。 @理查德
      猜你喜欢
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 2015-11-17
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多