【セルフプログラミング】マイコン暴走?

CubeSuite+を使ってセルフプログラミングの開発をしています。

ライブラリ関数(FlashEnv(1))を実行していると、
逆アセンブルウィンドウでプログラムがストップします。メッセージウィンドウには「不正命令例外により停止しました」
と表示されます。原因が分からないのでアドバイスいただけないでしょうか。

-------------
_SelfLib_FlashEnv_Activate:
b013 sst.b r2\, 0x30[ep]
6119 tst r1\, sp
ff37c765 ld.hu 0x65c6[lp]\, r6
3742 satadd -0x9\, r8
8143 sst.b r8\, 0x1[ep]
fa6f ?
de4f ?
55174431 st.b r2\, 0x3144[r21] <---ここでストップ
45a5 sst.w r20\, 0x88[ep]
fcff ?
-----------

FlashEnv(1)は以下の関数からコールしています。

int erase_mem(UB startBlk\, UB endBlk)
{
__DI(); //マスカブル割込み禁止

FlashEnv(1);

・・・
}
Parents
  • よっしー9999さん

    今回は方法論ではなく、外枠から推察してみました。

    ・RAM破壊の場所が変わった
    -> 領域で書き換わっているわけではない?
    -> 大規模なメモリ操作によるものではなさそう
    -> フラッシュ書き換え関数もしくは呼び出しに至る関数において引数不渡りか?

    ・mainタスクはOK、NGタスクはダメ
    -> mainタスクとNGタスクのスタック量の差は?
    -> mainタスクのスタック量をNGタスクと同等まで減らすとダメになる?
    -> NGタスクは関数の多重呼び出し等でスタックを浪費していないか?
    -> NGタスクで未初期化のポインタを参照していないか
    -> NGタスクで巨大な自動変数を利用していないか

    ・ヒープを使っていないか
    ->alloc系とfreeを繰り返していると解放漏れもありうる
    (解放漏れというと語弊がありますね。ヒープ管理領域が右肩上がりするケースがありました)


    今はホワイトボックス的にイタズラ箇所を探していると思いますが、行き詰ったらブラックボックス的にはこんな探し方もあるので、参考までに。
Reply
  • よっしー9999さん

    今回は方法論ではなく、外枠から推察してみました。

    ・RAM破壊の場所が変わった
    -> 領域で書き換わっているわけではない?
    -> 大規模なメモリ操作によるものではなさそう
    -> フラッシュ書き換え関数もしくは呼び出しに至る関数において引数不渡りか?

    ・mainタスクはOK、NGタスクはダメ
    -> mainタスクとNGタスクのスタック量の差は?
    -> mainタスクのスタック量をNGタスクと同等まで減らすとダメになる?
    -> NGタスクは関数の多重呼び出し等でスタックを浪費していないか?
    -> NGタスクで未初期化のポインタを参照していないか
    -> NGタスクで巨大な自動変数を利用していないか

    ・ヒープを使っていないか
    ->alloc系とfreeを繰り返していると解放漏れもありうる
    (解放漏れというと語弊がありますね。ヒープ管理領域が右肩上がりするケースがありました)


    今はホワイトボックス的にイタズラ箇所を探していると思いますが、行き詰ったらブラックボックス的にはこんな探し方もあるので、参考までに。
Children
No Data