2024年11月17日日曜日

無駄な36Hの原因は[18]

STM32ポエムです.

多忙な折ですが、謎のbugで36H無駄にしました.

開発しているのはUSB deviceです.そのUSB codeは、STM32CubeMXが吐き出す雛形codeを改造してSTM32F401で動かして実証済です.

その後、targetをSTM32H723Zに変えて同じことをして動かしてみる・・・だがHOSTがtimeoutして停まってしまう.状況は、F401なら動くがH723では動かない、なのです.

F401改造前/F401改造後/H723改造前/H723改造後 の4パターンを動かしてみると、H723改造後は動かない.

F401とH723のUSBの雛形codeを比較したけど差異なし.

さらに付随する状況が在って、Linuxではある程度認識するが、winでは認識しないレベルだということ.Linuxではlsusbまでは通るんです.でもwinでは「descriptor読めない」エラーで停まってる.(たまに読めることもある)

改造でdescriptorが壊れたのかと調べたが問題なし.

Linuxでlsusb -vと詳細表示させると、最後にUSB statusを読めなくて20秒ぐらいしてtimeoutするという状況なので、USB statusコマンドとやらが原因なのかと考えました.それでSTMでUSBコマンドを表示させたけどそれっぽい物を発見できず.

wiresharkで飛び交うUSB packetを読もうとしましたが、wiresharkを使うのは苦手なので打ち切りにしました.わたしはwiresharkを使う域に達していません.

ここで、F401改造前/F401改造後/H723改造前/H723改造後 の4パターンをもう一度試してみろとゴーストが囁きます.するとなんということでしょう、4パターン全てが動く.最初の頃に試した時とは違う結果なのですがさておく.

ということは、H723にゴテゴテ拡張した機能が悪さをしているのではないかということで、機能を1つ1つ止めてみる.

ついに原因判明.
 struct ADCdata ad[18];
とすべきところを、
 struct ADCdata ad;
にしちゃってました.別件のcodeと融合したときに間違えました.
memoryを壊しまくって、その癌細胞が偶然USB IFへ転移して死亡してました.

ちなみにadのサイズは6kBぐらいあるので、1個と18個ではRAMの逸脱量が100kBもあったのです.もっと判り易い死に方で早死にして欲しかった.こんな巨大bugが数日間もbuild errorを出さなかったのは何故かというと、ad[i]でアクセスせずに、ポインタでアクセスしていたからでした.

36Hが超もったいない.

かしこ

11 件のコメント:

  1. >ついに原因判明
    ソフト開発をやってると、「この手のバグ」は、よくあることですね・・・・
    ※これは、どちらでも、
    ・コンパイルは通っちゃう
    と言うのが「ミソ」ですね。「文法上」は、間違ってないので。
    この辺が、「C, C++ が、嫌われる理由」でもあるのですが。
    ※最近は、こう言うのを防ぐために、本気で、
    ・AIプログラミング
    が、イロイロと研究されてますね。簡単なプログラムなら、「ChatGPT」でも出来ちゃうし。
    (ただ、現時点では、まだ「完璧」と言うには程遠いので、逆に「人間には絶対発見不可能なバグ」とか、埋め込まれそうですが・・・・コワいですね)

    返信削除
    返信
    1. くそバグ
      no errorで通る通るwww まったくもー

      さらなる精進をして参る所存でござーる

      Rustって便利なのかと思ったけど、既存のライブラリがCかC++なのでRustに手を付ける気があまりしないのよねぇ・・・
      layer被せて使えたりするのかしら?

      削除
    2. >絶対発見不可能なバグ

      AIのニューラルネットはもう解析不能ですし

      削除
  2. >Rust
    なんか、「Rust言語を組み込み系で使う」のが、一部で流行ってるみたいですね。。。。
    https://www.google.com/search?client=firefox-b-d&q=STM32+rust
    STM32 rust - Google 検索
    で、一番初めにヒットするのがこれ
    https://qiita.com/Kosuke_Matsui/items/031b2d60f3242617115e
    STM32 NUCLEOボードによる組み込みRust開発環境構築
    ※「Rust言語」は、「所有権モデルや借用チェッカーなどの独自の概念があり、コンパイル時にエラーを検出できるため、安全性が高いです。」とのことなので、↑ みたいなバグを、未然に防ぐって意味なんでしょうね。(というか、こういう書き方自体を禁止してるかもです。)
    まぁ、いずれにしても、流行るかは「ライブラリ」次第でしょうね。まだこれからって感じ。

    返信削除
    返信
    1. 日本語サイトが検索にでるということはそこそこ普及してるってことかしら
      LinuxをRustで書くとかいってたのはまだ生きてるんですかね?

      削除
  3. murasaki
    c言語あるあるですねー。
    あまりに不審な挙動をするときは配列の引数エラーが多いですね。
    最近のコンパイラだとこの手のはワーニングではなくてエラーで止まったりします。コンパイルオプションでも変わるでしょうけど。

    返信削除
    返信
    1. いやはやまったくそのとおり
      しかし、USBに転移して発覚するとは呪われています
      ツキに見放されている
      このproj.はもうダメかな.....時間切れでパー

      削除
    2. 最初から人生最凶のクレイジースケジュールでした
      これを出来たらオレは神だというproj.

      削除
    3. murasaki
      侵食(憑依)先によっていろいろな挙動が見られますがよりによってUSBI/Fとは。
      知り合いのプログラマは最近は手こずるとchatGPTにソースを突っ込んで「バグを教えて」とやるらしいです。まあまあ当たるらしいです。

      削除
    4. softwareの心がわかるようになったとは、GPTにも霊性が宿りましたな 優秀

      削除
  4. あれ?2回書かれた?

    返信削除