STM32でDDC/DCCを作ろう! INDEXページへ
前回かくかくしかじかと説明した事情でSTM32F405でHARD FAULT発生中.
STM32F405のdatasheetを読んでいて、Memory protection unit(MPU)というのが在ります.205にはMPUは無いようです.
405のdatasheetによると、
1)保護領域へのアクセスを監視する
2)メモリ空間を8つの領域に分割し、さらにそれらを8分割して保護領域となす
てなことのようです.
405で出ているHARD FAULTはMPUのせいじゃないかと疑りの目を向けているところ.
MPUはさておき、今回はHARD FAULTが出ちまった時の追求方法を書きます.
1)debuggerでrunさせる
2)HardFault_Handler()で止まる.でも何処が原因なのかは不明
3)フォルトアナライザを開く
4)フォルトアナライザから情報を読み取る
変な場所を触らないでよとお怒りです.変な場所とは0x200c1100である.
5)フォルトアナライザの右上にこのようなボタンが!
ぴこぴこと押してみましょう.
fault発生個所がsource codeで示されます.あら便利.
ともあれこのケースでは、adr->DIEPTSIZがアドレス0x200c1100を指しており、そこを触ったのでSTM32F405がお怒りになっていると判ります.悪いのは0x200c1100です.
一方でDIEPTSIZとはUSBのレジスタであり、USB BASE ADDRESSは0x40040000です.0x200c1100とはかけ離れています.怪しい.
--------
0x200c1100は何者なのか?
Cortex-M4のdatasheetに解説がありました. それによると、SRAMにbitアクセスするための特殊領域のようです.だけどそれでhard faultが生じるものかしら? それは不明です.
Memory protection unit(MPU)が例外検知したとき
これもCortex-M4のdatasheetに解説がありました.MPUが例外検出したらメモリマネジメントfaultが生じると書かれています.
すなわちMemManage_Handler()でhangupするはずです.ところが現状はHardFault_Handler()でhangupしているのですからMPUは無関係と思われます.
今宵はここまでにしとうございます.
かしこ
>Memory protection unit(MPU)というのが在ります
返信削除組み込みマイクロコントローラのくせに、仮想記憶でもやるのか?
・・・と思ってたんですが、よく考えると、アーキテクチャは「ARM」でしたね。
※ハイエンドだと、linuxとか動くし・・・
この辺になると、マルチタスク・マルチスレッドのデバッグになるので、難儀しますね。
私も、こういうののデバッグはイヤですね。ホント「魔法のように」メモリ値が書き換わってたりしますからね。
(まぁ、勿論、必ず「何処かで誰かが」書き換えてるわけですが・・・)
MPUの存在を知って、リンカがアドレス空間をぐねぐねするのかい?ってわたしも思いました.
削除CoreTexM4はそこまでは器用ではないらしいのでLinuxは動かないと思いますが、RTOSを載せるとマルチタスク処理はしてくれるらしく、進化の中間的なCPUなのかなと.
スレッドをたくさん走らせるハイブローなsoft屋さんは雲の上の人々です.
"DIEPTSIZ = adr->DIEPTSIZ;" の行番号が、この値だからエラーが出たんだったりして・・・
削除なワケないか、さすがにw
クルマのナンバーが4274だったらどうしよう的なww
削除っていうか、
削除DIEPTSIZ = adr->DIEPTSIZ;
って、なんかおかしくないですか? C言語的に。
※全部大文字って、普通「定数値」ですよね?それに代入って・・・
(まぁ、意図的にやればできないことはないですが・・・)
※これ、コンパイラのバグだったりして。
全部大文字の変数に代入すると、おかしくなるとか?
ヘッダファイルを見ると、レジスタ名は大文字で定義されていますね.
削除具体的には構造体のメンバ変数名がDIEPTSIZってことになってます.
実は、Hard Faultは謎の展開で解決しつつありんす.
>レジスタ名は大文字で定義
削除ああ、そういうことですか。組み込み系だと、ありがち。
(確かに、ある意味「固定」だし)
レジスタ名大文字は見かけますね.他にはマクロも大文字でしょうか.
削除わたしはsoftware code書いて給料もらった経験がほとんどないので表記作法とか知らないんですねぇ.勝手流です. (verilogはhardwareなので除くとして)