Arduino 将freeRTOS用于两个任务时出现意外行为

Arduino 将freeRTOS用于两个任务时出现意外行为,arduino,arduino-uno,freertos,Arduino,Arduino Uno,Freertos,我将MPU9250转接板与Arduino Uno一起使用。 我使用的库来自。 下面是我的代码 #包括 #包括“mpu9250.h” MPU9250 IMU(导线,0x68); 智力状态; 作废任务_1(作废*pvParameters) { (void)pvc参数; 对于(;;) { } } 作废任务_2(作废*参数) { (void)pvc参数; 对于(;;) { } } 无效设置(){ 序列号开始(115200); 而(!Serial){} 状态=IMU.begin(); 如果(状态

我将MPU9250转接板与Arduino Uno一起使用。
我使用的库来自。
下面是我的代码

#包括
#包括“mpu9250.h”
MPU9250 IMU(导线,0x68);
智力状态;
作废任务_1(作废*pvParameters)
{
(void)pvc参数;
对于(;;)
{
}
}
作废任务_2(作废*参数)
{
(void)pvc参数;
对于(;;)
{
}
}
无效设置(){
序列号开始(115200);
而(!Serial){}
状态=IMU.begin();
如果(状态<0){
Serial.println(“IMU初始化失败”);
Serial.println(“检查IMU接线或尝试循环电源”);
串行打印(“状态:”);
Serial.println(状态);
而(1){}
}
xTaskCreate(
任务2,
(const-portCHAR*)“task2”//仅为人类命名
128,//堆栈大小
无效的
1,//优先级
无效);
xTaskCreate(
任务1,
(const-portCHAR*)“task1”//仅为人类命名
128,//堆栈大小
无效的
1,//优先级
无效);
}
void循环()
{
}
问题是,当定义了两个任务时,程序将自动重新启动。但是当我注释掉任务1时,程序运行良好。
xTaskCreate
的结果值正确

我猜问题可能是堆栈或堆的大小太小,但我增加了堆栈和堆的大小,但仍然不起作用

有人能告诉我问题可能来自何处吗?

在安装()结束时,您需要启动计划程序:

//现在,任务调度器自动启动,它接管了对单个任务的调度控制

vTaskStartScheduler()


这就是我所看到的我的项目与你的项目之间的不同之处。

一旦你创建了任务,你就必须启动scheduler

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


仅供参考,Arduino UNO(配备ATMega-328P)的RAM非常有限,可能会发生一些无法创建的任务。检查
xTaskCreate
函数的返回值。

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

FreeRTOS网站上有一个关于运行新项目的常见问题解答,我建议您通读该解答,以帮助解决此类问题:


您还可以查看FreeRTOS附带的其他一些AVR示例,了解它们是如何设置中断的:

您使用的是协作式还是抢占式调度器?内存不足?您是否知道堆栈类型的
128
的大小可能是
4bytes
,从而有效地分配堆栈的
512B
?我也不知道你的调度程序是从哪里开始的。同样,在arduino freeRTOS的例子中,它也没有调用这样的东西。我应该在我的例子中称之为?完成了。但还是不行。我认为问题在于库,因为一旦我注释掉
mpu9250imu(Wire,0x68)它可以正常运行。