ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

Guru Meditation Error: Core 1 panic'ed (IllegalInstruction)

M5StampS3でSakurIOのライブラリーで以下のエラーがでて再起動してしまう。

Guru Meditation Error: Core  1 panic'ed (IllegalInstruction). Exception was unhandled.

I2C通信している箇所でstartReceive()を呼び出して戻って来てないっぽい。

  this->startReceive(reservedResponseLength+3);
  result = this->receiveByte();

startReceiveの終わりに"end startReceive"を出力する様にしたら出力されているのでここまでは実行されている様だ。

uint8_t SakuraIO_I2C::startReceive(uint8_t length){
  dbg("requestForm=");
  dbgln(length);
  Wire.requestFrom((uint8_t)SAKURAIO_SLAVE_ADDR, length, (uint8_t)true);
  mode = MODE_READ;
  dbgln("end startReceive");
  delay(100);
}

あとは戻るだけなのでスタックに問題がありそう。
とここまで書いていて気づいた。

こちらでreturnがない時にとあって、startReceiveにはreturnがないではないか。 多分これか?

reject.tokyo

returnがないとスタックがずれちゃいそうだな。
M5StampPicoで使っていたときは問題なかったけど、レジスタの使い方やスタックの使い方の違いとかでたまたまうまく行ってただけの様だ。

PlatformIOの環境更新したら直るかと思って実行してしまった後で気づいて、更新が終わるまで2時間以上かかりそうなので、明日試す。

追記(1/6):
やっぱりreturn 追加したらクラッシュしなくなった。
一応pull request出した(*1)けどSakuraIOモジュール自体もう供給されてないので反映されるかは分からないのと、他にもWire.begin()しないようにしたりしたいので、今後はforkした自分のプロジェクトを使う事にする。

github.com

*1: masterブランチからpull request出してしまって後から追加した変更がpull requestにも追加されてしまったので一旦取り消した。