【问题标题】:freertos vTaskDelete(NULL) no free memoryfreertos vTaskDelete(NULL) 没有可用内存
【发布时间】:2015-02-23 22:18:08
【问题描述】:

我开始学习 FreeRTOS。刚才我正在尝试使用此代码制作打印任务功能:

static void vTaskPrint(void *pvParameters) {
    taskENTER_CRITICAL();
    printf("%s", (char *)pvParameters);
    printf("xPortGetFreeHeapSize: %d\r\n", xPortGetFreeHeapSize());
    taskEXIT_CRITICAL();
    vTaskDelete(NULL);
}

但是在 14 次调用之后:

xTaskCreate(vTaskPrint, (char *)"vTaskPrint", configMINIMAL_STACK_SIZE, (void *)buffer, 3, (xTaskHandle *)NULL);

皮质 M3 内存不足:

************** TEST GPIO & LEDS FREERTOS OPEN103Z EVB **************
vTaskLeds
xPortGetFreeHeapSize: 7832
vTaskReadKeys
xPortGetFreeHeapSize: 7232
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 6632
[INFO] vTaskPrint created successful
Key pressed CENTER KEY
xPortGetFreeHeapSize: 6032
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 5432
[INFO] vTaskPrint created successful
Key pressed LEFT
xPortGetFreeHeapSize: 4832
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 4232
[INFO] vTaskPrint created successful
Key pressed LEFT
xPortGetFreeHeapSize: 3632
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 3032
[INFO] vTaskPrint created successful
Key pressed LEFT
xPortGetFreeHeapSize: 2432
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 1832
[INFO] vTaskPrint created successful
Key pressed LEFT
xPortGetFreeHeapSize: 1232
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 632
[INFO] vTaskPrint created successful
Key pressed LEFT
xPortGetFreeHeapSize: 32
[INFO] vTaskPrint created successful
[ERROR] vTaskPrint not created successful

如何释放内存?

【问题讨论】:

    标签: cortex-m3 freertos


    【解决方案1】:

    当您在任务中删除时,分配给该任务的内存将从空闲任务中释放出来。因此,您必须让空闲任务在某个时候运行。这在您正在调用的函数的文档中明确说明:http://www.freertos.org/a00126.html

    在大多数应用程序中,空闲任务将是运行最多的任务,因此您的测试有些人为。

    顺便说一句:从临界区调用 printf 之类的长函数确实不是一个好主意,而且您通过从临界区调用 xPortGetFreeHeapSize() 违反了 FreeRTOS API 使用规则(尽管您可能会得到在这种情况下,一般的经验法则是不要从临界区或调度程序被锁定时调用 RTOS API 函数)。涵盖此问题的常见问题解答页面在这里:http://www.freertos.org/FAQHelp.html

    FreeRTOS 网站上有大量信息,还有一个专门的支持论坛,等待着 FreeRTOS 专家,所有这些都可供您免费使用,所以我不明白为什么人们会在其他任何地方问 FreeRTOS 问题。

    【讨论】:

    • 很抱歉如果我打扰了你,但我不知道 freertos.org 上的论坛的存在。我正在编写一些小例子来尝试学习。为此,如果它是打印 xPortGetFreeHeapSize() 函数的更礼貌的方式并不重要,但它可以帮助我找出问题:我的内存不足......我会尝试使用 vApplicationIdleHook (void) 函数,但我在优先级上犯了一个错误。现在一切正常。非常感谢。
    • 您应该使用信号量或互斥量,而不是调用 taskENTER_CRITICAL 和 taskEXIT_CRITICAL。见freertos.org/a00113.html
    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 2018-02-17
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 2012-12-06
    相关资源
    最近更新 更多