将freeRTOS与两个任务一起使用时出现意外行为

时间:2018-08-16 15:04:49

标签: arduino arduino-uno freertos

我正在将MPU9250中断板与Arduino Uno一起使用。
我使用的库来自here
下面是我的代码。

#include <Arduino_FreeRTOS.h>

#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的结果值正确。

我猜问题可能是堆栈或堆大小太小,但是我增加了堆栈和堆大小,但仍然无法正常工作。

谁能告诉我问题可能出在哪里?

3 个答案:

答案 0 :(得分:0)

在setup()结束时,您需要启动调度程序:

//现在,任务调度程序将自动启动,它负责控制单个任务的调度。// p

vTaskStartScheduler();

这就是我所能完成的项目与您的项目所见之处。

答案 1 :(得分:0)

创建任务后,必须启动调度程序。

在退出vTaskStartScheduler()函数之前和创建任务之后,请调用setup

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

仅就此信息而言,Arduino-UNO(与ATMega-328P一起)具有非常有限的RAM,并且可能会发生某些无法创建的任务。检查xTaskCreate函数的返回值。

答案 2 :(得分:0)

当我遇到这个问题时,通常是因为我的中断向量没有指向适当的处理程序。因此,例如,当RTOS需要进行上下文切换时,它跳入了la-la大地。因为您说取出任务可以使它运行到库调用,但是以相同的方式失败,所以可能没有正确设置您的处理程序。

FreeRTOS网站上有一个有关运行新项目的常见问题解答,我建议您通读以帮助解决此类问题: https://www.freertos.org/FAQHelp.html#faq

您还可以查看FreeRTOS随附的其他一些AVR示例,以了解它们如何进行中断设置:https://www.freertos.org/a00090.html#ATMEL