Renesas Community
Search Community
User
Join or sign in
Site
Search Community
User
Renesas Engineering Community
FAQ
HELP
More
Cancel
Forums & Groups
English Community
中文社区(Chinese Community)
More
Cancel
かふぇルネ
forums-groups
Microcontrollers and Microprocessors
Other MCU/MPU Products
V850
More
Cancel
V850
104: V850 - Forum
【セルフプログラミング】マイコン暴走?
Home
Forum
Tags
More
Cancel
New
Replies
16 replies
Subscribers
446 subscribers
Views
29290 views
Users
0 members are here
startBlk
UB
sst.b
CubeSuite+
FlashEnv
endBlk
Options
Share
More
Cancel
Related
【セルフプログラミング】マイコン暴走?
よっしー9999
over 9 years ago
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);
・・・
}
Kon Nozomu(すと)
over 9 years ago
よっしー9999さん
すと@konです。
よっしー9999さんが書かれたアセンブラ表示によれば「?」で表記されたところが不正命令に当ると思います。
/*-----
8143 sst.b r8\, 0x1[ep]
fa6f ?
de4f ?
55174431 st.b r2\, 0x3144[r21] <---ここでストップ
-----*/
fa6f や de4fに当る命令コードが存在しないのだと思います。
では、どうして不正命令が紛れ込むのか…ですが、よくわかりません。
ライブラリがロードされていないとか、ライブラリを参照できていないとか、ライブラリがV850以外のものであるとか…なんにせよ、正しい状態ではないと思います。
プロジェクト環境にもよると思いますが、リンクの設定(ライブラリも一緒にリンク?)やライブラリのロード(個別にロードが必要?)などを見直してみてください。
> 「不正命令例外により停止しました」
と出るくらいなので、デバッガが仕込んだものではないと思うのですが…予測の域をでません。
Cancel
Up
0
Down
Reply
Cancel
チョコ
over 9 years ago
スタッフのチョコです。
よっしー9999様のスレッドにコメントさせていただきます。
セルフプログラミングの担当者にお問い合わせ内容を問い合わせていますので,今しばらくお待ちください。
なお,お問い合わせの中の「fa6f」「de4f」は不正命令には該当していません。
不正命令は,命令コードのオペコード(ビット10-5)が11111B で,サブオペコード(ビット26-23)が0111B-1111B,サブオペコード(ビット16)が0B であるものです。
Cancel
Up
0
Down
Reply
Cancel
よっしー9999
over 9 years ago
>すと@kon さん
ご回答ありがとうございます。
同じコードをmain()の最初の方で呼ぶと正常に動くんですよね。。
タスクから呼ぶと異常動作になります。
RAMのセクションをいじっていたら現象が変わりました。
↓がmapファイルの抜粋です。
TEXT_RAM RX 0x03ffd420(開始アドレス) 0x00000734(サイズ)
セルフライブラリはTEXT_RAMに配置されています。
0x03ffd420に0x734を足して、セクション範囲は0x3ffdb54
までかと思うのですが、逆アセンブルウィンドウを見る
と、添付ファイルのようにセクションの範囲外まで
アセンブリコードがあります。
実際、ステップ実行していくと範囲外にアクセスした
ためか、プログラムカウンタが変なところに飛んでいき
暴走しました。
同じコードでも呼ぶ場所によって動作が変わる
原因がまだ分かっておりません。。
Cancel
Up
0
Down
Reply
Cancel
Kirin
over 9 years ago
よっしー9999さん
タスクから呼び出す時にスタックの空きサイズが足りないのかもしれませんね。
あとは、FlashEnvを呼ぶ前にFlashInitがよばれていないとか、RAMにプログラムがコピーされていないとか。。。
PS
すとさん、チョコさん
担当さんも、再現手順が分からないと頭抱えそうですねー^^;
Cancel
Up
0
Down
Reply
Cancel
Kon Nozomu(すと)
over 9 years ago
すと@konです。
チョコさん&スタッフさんの対応を待ちながらご覧ください。
呼び出すタスクによって動作が異なる、となると怪しいのはスタックです。タスク毎に確保されているスタック量が足りていない可能性があります。
あとはmainタスクからOKで、他のタスクからNGなのであれば、NGタスクでのRAM破壊も考えられます。
う~ん、やっぱり担当者さんの回答待ちが無難ですね。
自分だったら不正アクセスがないかLPやEPの内容を確認するかな?
Cancel
Up
0
Down
Reply
Cancel
よっしー9999
over 9 years ago
>みなさま
ありがとうございまうす。
erase_mem()で使っている初期値付ローカル変数の値が代入している初期値と違いました。(ウォッチ式で確認)
なのでスタック破壊が原因かと思います。
スタック消費量を減らしてみようと思います。
Cancel
Up
0
Down
Reply
Cancel
チョコ
over 9 years ago
スタッフのチョコです。
よっしー9999様のスレッドにコメントさせていただきます。
担当者からの回答を以下に示します。
よっしー9999さまのスレッドに記載されたプログラムは,ラベルの_SelfLib_FlashEnv_Activate:はライブラリですが、それ以降の命令コードはライブラリのコードではないように思えます。おそらくRAM上にコピーしたライブラリを破壊しているか、またはRAMへのコピーを行っていなくて,RAMに残っている全く無関係なデータを実行しているものだと思います。
申し訳ございませんが,これらのご確認をお願いいたします。
Cancel
Up
0
Down
Reply
Cancel
よっしー9999
over 9 years ago
ありがとうございます。
mainタスクからは実行できているのでRAMへの
コピーはできているのかな、と思います。
どこかのタイミングでRAM上のライブラリを破壊しているのかなと思うのですが、どこで壊れているのかがまったく分かりません。。
Cancel
Up
0
Down
Reply
Cancel
Kirin
over 9 years ago
よっしー9999さん
QB-V850MINILをご使用になられているようなので
データが破壊されているアドレス
例えば「_SelfLib_FlashEnv_Activate」番地に対するライトアクセスでブレークを設定するといいかもしれません。
ブレークした個所1つずつ確認していけば、そのうち原因が見つかると思います。
Cancel
Up
0
Down
Reply
Cancel
よっしー9999
over 9 years ago
アドバイスありがとうございます。
やってみましたが、書き込みブレークは変数に対してしか使えないようです。。
Cancel
Up
0
Down
Reply
Cancel
>