【问题标题】:Using LinkedList in FreeRTOS fails to save values在 FreeRTOS 中使用 LinkedList 无法保存值
【发布时间】:2026-02-10 05:15:02
【问题描述】:

我正在使用 Atmel 328P 和 2560 在 Arduino 上运行 FreeRTOS 10.0

我需要使用 LinkedList,而不是重新发明*,我使用的是 LinkedList Arduino library here.

该库在标准 Arduino(循环)配置中工作,但是当我将其放入 RTOS 时,它无法保存值。 size() 计数器递增,就好像它正在保存一样,但返回的所有值都是“0”。

我最初预计这是库的实现问题,但尝试Qlist 会产生相同的结果。

为了让 LInkedList 正确处理 FreeRTOS 中的保存值,我需要做些什么特别的事情吗?

FreeRTOS 代码:

#include <Arduino_FreeRTOS.h>
#include <LinkedList.h>

void TaskTest( void *pvParameters );

void setup() {

  Serial.begin(115200);

  while (!Serial) {
    ;
  }

  xTaskCreate(
    TaskTest
    ,  (const portCHAR *)"Test"
    ,  128
    ,  NULL
    ,  2
    ,  NULL );
}

void loop()
{

}

void TaskTest( void *pvParameters __attribute__((unused)) )
{
  LinkedList<byte> list;

  for (int i = 0; i < 256; i++) {
    list.add(i);
    Serial.print(i);
    Serial.print(',');
    Serial.print(list.get(list.size() - 1));
    Serial.print(',');
    Serial.println(list.size());
  }

  for (;;)
  {
    vTaskDelay(1);
  }
}

FreeRTOS 代码输出(截断):

248,0,249
249,0,250
250,0,251
251,0,252
252,0,253
253,0,254
254,0,255
255,0,256

标准 Arduino 代码:

#include <LinkedList.h>

void setup() {
  Serial.begin(115200);

  while (!Serial) {
    ;
  }

}

void loop() {
  LinkedList<byte> list;

  for (int i = 0; i < 256; i++) {
    list.add(i);
    Serial.print(i);
    Serial.print(',');
    Serial.print(list.get(list.size() - 1));
    Serial.print(',');
    Serial.println(list.size());
  }

  for (;;)
  {
  }

}

标准 Arduino 代码输出(截断):

249,249,250
250,250,251
251,251,252
252,252,253
253,253,254
254,254,255
255,255,256

【问题讨论】:

    标签: c++ memory linked-list arduino freertos


    【解决方案1】:

    LinkedList 类使用“new”运算符在堆上动态分配新节点。您的 FreeRTOS 构建是否分配了足够的堆,例如您的非 FreeRTOS 循环代码?如果您将 heap_3 分配器与 FreeRTOS 本身一起使用,那么所有 FreeRTOS 对象和任务堆栈也将占用系统堆中的空间。

    【讨论】:

    • 这完全有可能。我经历过堆栈溢出,这会冻结处理器,但忘记了动态分配的数据会进入堆。我会觉得很奇怪,它甚至没有保存一个值,不是吗?虽然这意味着我有 0 个堆(或接近 0)可用。一旦我再次到达设备并报告回来,我将强制 RTOS 打印堆。