Несподівана поведінка при використанні freeRTOS з двома завданнями

Я використовую плату проби MPU9250 з Arduino Uno.
Бібліотека, яку я використовувала, - це тут .
Нижче мій код.

#include 

#include "mpu9250.h"

MPU9250 IMU(Wire,0x68);
int status;

void task_1(void *pvParameters)
{
  (void) pvParameters;

  for (;;)
  {
  }
}

void task_2(void *pvParameters)
{
  (void) pvParameters;

  for (;;)
  {
  }
}

void setup() {
  Serial.begin(115200);
  while(!Serial) {}

  status = IMU.begin();
  if (status < 0) {
    Serial.println("IMU initialization unsuccessful");
    Serial.println("Check IMU wiring or try cycling power");
    Serial.print("Status: ");
    Serial.println(status);
    while(1) {}
  }

  xTaskCreate(
  task_2,
  (const portCHAR *)"task2",//A name just for humans
  128,//Stack size
  NULL,
  1,//priority
  NULL);

  xTaskCreate(
  task_1,
  (const portCHAR *)"task1",//A name just for humans
  128,//Stack size
  NULL,
  1,//priority
  NULL);

}

void loop()
{

}

Проблема полягає в тому, що при визначенні двох завдань програма буде перезавантажена автоматично. Але коли я коментую task_1 , програма працює нормально. Значення результату xTaskCreate є правильним.

Я думаю, проблема може бути стек або розмір купи є занадто малим, але я збільшив стек і розмір купи, і це все ще не працює.

Чи може хто-небудь сказати мені, звідки проблема може бути?

2
Чи використовуєте ви спільний або випереджувальний планувальник? Не вистачає пам'яті? Чи знаєте ви, що 128 для типу стека має розмір StackType_t , який може бути 4bytes , таким чином, ефективно виділяючи 512B з стек? Я також не бачу, де запущений ваш планувальник.
додано Автор tilz0R, джерело
Чи використовуєте ви спільний або випереджувальний планувальник? Не вистачає пам'яті? Чи знаєте ви, що 128 для типу стека має розмір StackType_t , який може бути 4bytes , таким чином, ефективно виділяючи 512B з стек? Я також не бачу, де запущений ваш планувальник.
додано Автор tilz0R, джерело
Ні, у прикладі arduino freeRTOS, це не називало такої речі. Чи варто називати це у своєму прикладі?
додано Автор Lion Lai, джерело
Ні, у прикладі arduino freeRTOS, це не називало такої речі. Чи варто називати це у своєму прикладі?
додано Автор Lion Lai, джерело

7 Відповіді

Після того як ви створили свої завдання, ви повинні почати планувальник.

Зателефонуйте vTaskStartScheduler() перед виходом з функції setup і після створення завдань.

https://www.freertos.org/a00132.html

Тільки для info, Arduino-UNO (з ATMega-328P) має дуже обмежений RAM та це може відбутися деякі завдання не будуть утворені. Перевірте повернення значення функцій xTaskCreate .

0
додано
Зробив це. Але все одно не працює. Я думаю, що проблема полягає в бібліотеці, тому що як тільки я коментую MPU9250 IMU (Wire, 0x68); він може працювати нормально.
додано Автор Lion Lai, джерело

Після того як ви створили свої завдання, ви повинні почати планувальник.

Зателефонуйте vTaskStartScheduler() перед виходом з функції setup і після створення завдань.

https://www.freertos.org/a00132.html

Тільки для info, Arduino-UNO (з ATMega-328P) має дуже обмежений RAM та це може відбутися деякі завдання не будуть утворені. Перевірте повернення значення функцій xTaskCreate .

0
додано
Зробив це. Але все одно не працює. Я думаю, що проблема полягає в бібліотеці, тому що як тільки я коментую MPU9250 IMU (Wire, 0x68); він може працювати нормально.
додано Автор Lion Lai, джерело

Після того як ви створили свої завдання, ви повинні почати планувальник.

Зателефонуйте vTaskStartScheduler() перед виходом з функції setup і після створення завдань.

https://www.freertos.org/a00132.html

Тільки для info, Arduino-UNO (з ATMega-328P) має дуже обмежений RAM та це може відбутися деякі завдання не будуть утворені. Перевірте повернення значення функцій xTaskCreate .

0
додано
Зробив це. Але все одно не працює. Я думаю, що проблема полягає в бібліотеці, тому що як тільки я коментую MPU9250 IMU (Wire, 0x68); він може працювати нормально.
додано Автор Lion Lai, джерело

Коли я стикаюся з цією проблемою, як правило, мої вектори переривань не вказують на відповідних обробників. Таким чином, коли RTOS необхідно зробити перемикач контексту, наприклад, він вискочив у ла-ла-землю. Оскільки ви говорите, що винесення завдань дозволяє виконувати виклик бібліотеки, але не працює так само, можливо, ніхто з ваших обробників не налаштовано правильно.

The FreeRTOS website has an FAQ about getting new projects to run that I would suggest reading through to help troubleshoot this kind of problem: https://www.freertos.org/FAQHelp.html#faq

You might also look at some of the other AVR examples included with FreeRTOS to see how they have interrupts setup: https://www.freertos.org/a00090.html#ATMEL

0
додано

Коли я стикаюся з цією проблемою, як правило, мої вектори переривань не вказують на відповідних обробників. Таким чином, коли RTOS необхідно зробити перемикач контексту, наприклад, він вискочив у ла-ла-землю. Оскільки ви говорите, що винесення завдань дозволяє виконувати виклик бібліотеки, але не працює так само, можливо, ніхто з ваших обробників не налаштовано правильно.

The FreeRTOS website has an FAQ about getting new projects to run that I would suggest reading through to help troubleshoot this kind of problem: https://www.freertos.org/FAQHelp.html#faq

You might also look at some of the other AVR examples included with FreeRTOS to see how they have interrupts setup: https://www.freertos.org/a00090.html#ATMEL

0
додано

Наприкінці налаштування() потрібно запустити планувальник:

// Тепер автоматично запускається планувальник завдань, який бере на себе контроль планування окремих завдань //.

vTaskStartScheduler ();

Це все, що я бачу, відмінний між моїм проектом і вашим.

0
додано

Наприкінці налаштування() потрібно запустити планувальник:

// Тепер автоматично запускається планувальник завдань, який бере на себе контроль планування окремих завдань //.

vTaskStartScheduler ();

Це все, що я бачу, відмінний між моїм проектом і вашим.

0
додано