Использование LinkedList в FreeRTOS не может сохранить значения - PullRequest
0 голосов
/ 18 мая 2018

Я использую FreeRTOS 10.0 на Arduino с Atmel 328P и 2560

Мне нужно использовать LinkedList и, скорее, заново изобретать колесо, я использую здесь библиотеку LinkedList Arduino. .

Библиотека работает в стандартной конфигурации Arduino (loop), но когда я помещаю ее в 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

1 Ответ

0 голосов
/ 18 мая 2018

Класс LinkedList динамически распределяет новые узлы в куче с помощью оператора 'new'.Достаточно ли выделено вашей сборке FreeRTOS, как, например, ваш код цикла, отличный от FreeRTOS?Если вы используете распределитель heap_3 с самой FreeRTOS, тогда все объекты FreeRTOS и стеки задач также будут занимать пространство из системной кучи.

...