Arduboyでスケッチが書き込めなくなったときは

単なるTipsです。

Natural Tiny Shell(NT-Shell)をArduinoに移植してみたの記事ではシリアルポートを常時使っています。

開発中、ときどきスケッチが書き込めなくなることがありました。
スケッチの書き込みもシリアルポート経由なので、スケッチの動作がおかしいと書き込みモードに切り替わらない場合があるようです。

Arduboyはハードリセットボタンがありますが、Arduboyのライブラリにも対策がされています。

それは、「電源オンのときにUPボタンとLEFTボタンを押しているとセーフモードになる」というものです。
セーフモードでは、ユーザのスケッチは実行されません。
そのため、スケッチ書き込みの邪魔をするようなコードがArduboyに書き込まれてしまっていても、それを回避することができます。

これはライブラリのコードを見ていたら偶然見つけました。
Arduboy-1.1.1/src/core/core.hに以下のような記載があります。

    /// Safe mode
/**
* Safe Mode is engaged by holding down both the LEFT button and UP button
* when plugging the device into USB.  It puts your device into a tight
* loop and allows it to be reprogrammed even if you have uploaded a very
* broken sketch that interferes with the normal USB triggered auto-reboot
* functionality of the device.
*
* This is most useful on Devkits because they lack a built-in reset
* button.
*/
void static inline safeMode() __attribute__((always_inline));

safeMode() の中身はcore.cppにありますが、何もしない命令(nop)の無限ループです。

これでもだめだったら、ハードウェアリセットという手段があります。

コメント

  1. ケダ より:

    今は必ず保険で起動時に5秒間のdelayをかましてる

  2. boochow より:

    私も自前でセーフモードを実装していました。