我正在将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
的结果值正确。
我猜问题可能是堆栈或堆大小太小,但是我增加了堆栈和堆大小,但仍然无法正常工作。
谁能告诉我问题可能出在哪里?
答案 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