ひとしれずひっそり

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

Duolingo 201日

Duolingo で200日目のマイルストーンを達成して201日目となった。
いつの間にかハートが無限大になっていて、広告も出なくなった。
長く続けているご褒美なのか?

2回目のダイヤモンドリーグに上がって残留できるかとおもったが、後半どんどん追い抜かれた。
やはり強者揃いで手を抜く人はいない感じ。

まあ、気にせず自分のペースで365日を目指そう。

中国語は相変わらず発音は難しいが、文の組み立てはいくらかできる様になってきた。

M5StackデバイスでPC側で通信ポートが認識できない時

M5StackデバイスでPC側で通信ポートが認識できない事がよくある。

(サーボ)モーターやリレーを使っていたりすると良くあって、M5Stackデバイス単体にすると認識される様になったりする。
多分電源が安定しなくなるとか逆起電力のせいとかで影響されて認識できないとかではないかと思う。
そういうときはAボタンなどを押して起動した時に、モーターやリレーのIOを使う前に無限ループの待ち状態にするとハードはそのままで通信できる用になる。

https://github.com/katsuyoshi/info-calc/blob/main/platformio/info_calc/src/main.cpp#L856-L863

    M5.update();
    // サーボが動き出すと通信ができなくなるのでAボタンを押しながら起動すると
    // サーボ初期化せず書き込みできる様にここで停止させる。
    if (M5.BtnA.isPressed()) {
        while(true) {
            delay(1000);
        }
    }

これ以外でも認識できなくなることはあるが、VSCodeを立ち上げ直したら認識できたとか、リセットやAボタン押しながら書き込みするとかある。
それでもダメで何でーってなることもある。

G0をLOWにしてリセットかければダウンロードモードになるというのをラングシップの記事で今知った。
ENがリセットになっているのも知らなかった。M5StampとかリセットボタンがないのでUSBケーブル抜き差ししたり無駄にプログラムをもう一回書いたりしていたがENを一旦LOWにすればいいのか。

lang-ship.com

rst:0x7 (TG0WDT_SYS_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)

なんかの拍子にM5StampS3でプログラム書き込み後に以下のリブートがかかって全然動かなくなってしまった。

rst:0x7 (TG0WDT_SYS_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)

検索して以下が見つかった。

community.platformio.org

platformio.iniに以下を追加して解決した。

board_build.flash_mode = dio

前にもこんな設定した様な気がするが…

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にも追加されてしまったので一旦取り消した。