2つのタスクでfreeRTOSを使用したときの予期しない動作

Arduino UnoでMPU9250ブレークアウトボードを使用しています。
私が使用したライブラリはこちらにあります。 以下が私のコードです。

#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()
{

}

問題は、2つのタスクが定義されていると、プログラムが自動的に再起動されることです。しかし 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 答え

タスクを作成したら、スケジューラを起動する必要があります。

setup 関数を終了する前、およびタスクを作成した後に vTaskStartScheduler()を呼び出します。

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

参考までに、Arduino-UNO(ATMega-328P搭載)のRAMは非常に限られているため、タスクが作成されないことがあります。 xTaskCreate 関数の戻り値を確認してください。

0
追加された
やりました。しかしまだうまくいきません。 MPU9250 IMU(Wire、0x68); をコメントアウトすれば正常に実行できるので、問題はライブラリだと思います。
追加された 著者 Lion Lai,

タスクを作成したら、スケジューラを起動する必要があります。

setup 関数を終了する前、およびタスクを作成した後に vTaskStartScheduler()を呼び出します。

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

参考までに、Arduino-UNO(ATMega-328P搭載)のRAMは非常に限られているため、タスクが作成されないことがあります。 xTaskCreate 関数の戻り値を確認してください。

0
追加された
やりました。しかしまだうまくいきません。 MPU9250 IMU(Wire、0x68); をコメントアウトすれば正常に実行できるので、問題はライブラリだと思います。
追加された 著者 Lion Lai,

タスクを作成したら、スケジューラを起動する必要があります。

setup 関数を終了する前、およびタスクを作成した後に vTaskStartScheduler()を呼び出します。

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

参考までに、Arduino-UNO(ATMega-328P搭載)のRAMは非常に限られているため、タスクが作成されないことがあります。 xTaskCreate 関数の戻り値を確認してください。

0
追加された
やりました。しかしまだうまくいきません。 MPU9250 IMU(Wire、0x68); をコメントアウトすれば正常に実行できるので、問題はライブラリだと思います。
追加された 著者 Lion Lai,

この問題に遭遇したとき、それは通常私の割り込みベクタが適切なハンドラを指していなかったことです。そのため、例えばRTOSがコンテキストの切り替えを行う必要があるとき、それはla-la landに飛び降りました。タスクを削除するとライブラリコールを実行できますが、同じように失敗すると言うので、ハンドラが正しく設定されていない可能性があります。

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がコンテキストの切り替えを行う必要があるとき、それはla-la landに飛び降りました。タスクを削除するとライブラリコールを実行できますが、同じように失敗すると言うので、ハンドラが正しく設定されていない可能性があります。

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
追加された

setup()の最後に、スケジューラを起動する必要があります。

//これで、個々のタスクのスケジューリング制御を引き継ぐタスクスケジューラ//が自動的に起動されます。

vTaskStartScheduler();

これが私のプロジェクトとあなたのプロジェクトの間で違うと思うことのすべてです。

0
追加された

setup()の最後に、スケジューラを起動する必要があります。

//これで、個々のタスクのスケジューリング制御を引き継ぐタスクスケジューラ//が自動的に起動されます。

vTaskStartScheduler();

これが私のプロジェクトとあなたのプロジェクトの間で違うと思うことのすべてです。

0
追加された