2025年5月25日日曜日

UART絶賛死亡中(4日目)

UART絶賛死亡中1~3日目はcloseした.外部HWの処理待ちが廻り廻ってhungupを招いていた.

本日は4日目、UARTが動かない別のトラブルである.

トラブルシュートのため、ゴテゴテとついてたperipheralを全部そぎ落として、原因箇所を特定したcodeはとてもシンプル.ブルーはMXが吐き出したcodeで、赤のみヒラサカが追加したcode.たったこれだけで何が起こるっていうんだ!?

↓main()
int main(void){
  MPU_Config();
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_UART7_Init();
  HAL_Delay(100);①
  HAL_UART_Receive_IT(&huart7, &ccc, 1);②
  while(1){}
}

↓UART受信callback
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
  HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);③
  HAL_UART_Receive_IT(&huart7, &ccc, 1);④
}

①このdelayを入れると、callbackに飛んでこなくなるというトラブル.
①を削除すると正常にcallbackされる.あまりにも謎すぎて笑う.

②UART1文字受信の初回起動.受信したらcallbackしてくれってな意味

③callbackの確認用LEDチカチカ

④次回のUART1文字受信を起動

なんだよこれ? (笑)

起動時に周辺機器の時間調整でwait入れるのなんかフツーじゃん.
まさかHAL_Delayがキモだったとは思わず、追い詰めるのに苦労したよ.
ちなみに、HAL_Delay(1)→HAL_Delay(10)→HAL_Delay(100)と症状は重くなる.1msだと結構動くが、100msだと全然動かない.

さて、謎の100mSecは何かである.

STM32H743のUART7にはSTM32G030が接続され、G030は10mSec毎に文字を打ち続けている.

H743のUART割込みが動かないケース:
    MX_UART7_Init();
    HAL_Delay(100);
    HAL_UART_Receive_IT(&huart7, &ccc, 1);

H743のUART割込みが動くケース:
    MX_UART7_Init();
    HAL_UART_Receive_IT(&huart7, &ccc, 1);

仮説:
UART7を初期化してからRecieve_ITを起動するまでの間に、G030がバシバシ打電しているはずである.起動直後のUART7に信号が過剰に入ってくるので、Recieve_ITした時点でUART7がoverrunしているのではないか?

netの情報では、overrun FLAGを消すにはHAL_UART_Abort()ではダメで、フラグを直接消しに行かなくちゃダメなどという書き込みを見かける.

対策:
  HAL_Delay(100);①
  __HAL_UART_CLEAR_OREFLAG(&huart7);  ←これ追加でFLAG消去
  HAL_UART_Receive_IT(&huart7, &ccc, 1);②

対策は成功しました.

感想:
これってけっこうおぞましい気がするんだよなぁ.
STM32H743の起動時にUARTをinitするでしょ.init routineはMXが吐き出したcodeで、main()の先頭である.
init後に、外部HWの起動待ちで3秒5秒ぐらいは当たり前でwaitするじゃん.
Recieve_IT()するのはその後である.
だけど、外部HW(この場合はSTM32G030)が早起きクンだったり、寝起きにglitch出したりしたら、UARTがoverrunで止まってしまうと言ってる.
今まで本件で困った経験は無かったが、運が良かっただけだったんだな.

かしこ

16 件のコメント:

  1. 「謎のDelay」を、入れる/入れない で、動く/動かなくなる、なんて、
    ・日常茶飯事
    ですね(笑)
    ※特に「Windows 系」をやってると、頻繁に起きる。
    相手は「windows API」なので、もう「言われた通り」に、するしかない(笑)

    ↑ の現象は、
    ・半分はエラッタ
    なのかなー、とも思わなくは無いですが。
    ※やっぱり「ソフトを良く分かってない」人が、ハードの設計してるのかな?
    まぁ、いずれにしても「ハード設計者の想定外」の使い方をしてるんだろうなとは思います。
    ※この辺になると「ハードが悪い」「ソフトが悪い」じゃなくて、
    ・どの機能を、ハード/ソフト(ライブラリ)で、実現するか?
    が、ちゃんと決まってない(要するに「設計思想」の問題)のような気がする。で、その辺も「ちゃんとドキュメント化されてない(間に合ってない?)」と、ドツボにはまる、のでしょうね。
    ※中途半端に「Code Generate」されると、あと、
    ・何が必要で、何が不要(既にライブラリ内で初期化やってるとか)
    とか、分からなくなりがちだし。
    (プラス「ライブラリの不具合」で、「フラグを直接消しに行かなくちゃダメ」とか、そんなの分かるかい!(← ねむいさんのブログにも、このセリフがあったな(笑))に、なっちゃうし・・・)

    まぁ、多少とも「進展があって」なによりです。

    返信削除
    返信
    1. 組み込みCPUのお仕事ってライブラリではまるのを回避する仕事ですねー

      生成されたcodeを使いたがらない上級者の気持ちはよーくわかる

      削除
    2. >ライブラリではまるのを回避する仕事
      これは、
      ・ソフト屋全員の宿命
      ですね。
      ※もはや「全く、ライブラリの類を使わない開発」は、現代ではあり得ませんので。
      Arduino だって、「ゴリゴリに」ライブラリ頼み、だし。

      削除
    3. ライブラリの闇を祓う魔術師=ソフト屋

      しかし回復の呪文が効くかどうかはわからないお仕事です

      削除
  2. なるほどですー。
    ソフトのライブラリというか、UARTのハード的な実装の問題かもですね。エラー発生時にエラーステータスだけ残して動作を続けるか、エラーステータスをクリアするまで動作を止めるかはUARTの実装次第かもですねー。後者の方が、システム組むうえで信頼度上げられるので自分は好きです。エラーおこしたまま動き続けるのはどのデータまでが正しいか確認が難しいので・・。
    CPUが起動する前からバリバリデータを送られるのは結構きついシステムですね。初期化時にしつこくエラー対策を入れるのが吉ですね。
    遊技機も複数のCPUが非同期に起動したりノイズでダウンしてWDTでコールドスタートしたりするので、通信周りは結構気を遣います。このあたりはだいたいトラブってデバッグも時間が掛かります。4日で原因突き止めて対処できたのは凄いと思います~。パチパチ。

    返信削除
    返信
    1. 従来の設計は1CPUで20chぐらいを制御していました.
      ところが制御内容が次第に増えて、CPUのピン数が足りないとかいろいろあって、1ch毎に小さなCPUを載せることにしました.
      通信経路を整備しているところでいきなり4日間ロス.
      ヤバいです.

      STM32 UARTのエラーFLAG clearについては、
      保存するか消すかがちぐはぐみたいな気がしないでもない
      もっそ爽快感がほしいですね

      削除
    2. 読者

      cpuはPS3で 1760台つなぎましょう
      https://nlab.itmedia.co.jp/games/articles/1012/07/news066.html
      アメリカ空軍はなんと、PS3を使ってスーパーコンピュータ

      削除
    3. 初期PS3はLinuxが動いたのでクラスタできます
      電気喰います

      削除
    4. CPU自体のクセもそうですが、周辺機能のクセや引っ掛かりなどを無意識に回避できるように体で覚えなくてはいけないのでシステム屋はみんな保守的なんだと思います。とにかく変えたがらない。難しことはしたがらない。関係ないだろうと思っていた完全安パイな変更が、全然別な機能の潜在バグを永き眠りから呼び起こしてひどい目に遭うのが定番の流れです。
      しかもそれが複合系や長期間欠系のバグだととても悲惨なことに・・。

      削除
    5. 地下鉄とか山手線に乗ってるスーツ姿の人々はみんな↑こうゆう人なんですね
      えへー

      削除
    6. おそらくそうだと思います。新しいことにはなんでも反対するのと自分の保身がスーツ着ている人の仕事かと。COBOLとOffice2003をこよなく愛します。

      削除
    7. 丸の内線の客層ですかぁ?
      田園都市線の客層ですかぁ?
      えへー

      削除
    8. 読者
      プログラマーは
      終電で帰れなくなるので
      亀〇(わすれた 有 ? 戸)
      在住なのに
      アパートは山手線の駅と
      聞いたことある(平社員はタクシー代でない)
      なお
      さいたまけんクルド人街のひとはあきはばらかえりに
      飲んだくれて上野のカプセルホテルらしい

      削除
    9. 亀戸、亀有
      似て非なるものですね
      いままで気づきませんでした

      市川と市原の違いは身に染みています

      厚木と本厚木はそんなに変わらない

      削除
  3. 神奈川県人
    >組み込みCPUのお仕事ってライブラリではまるのを回避する仕事ですねー
    Cコンパイラー初期の頃はライブラリーはバグがあって当たり前で、
    低レベル関数を使って動かすのがよくありました。
    バージョンが上がっていくと安定して動くので、ライブラリーを使うのが当たり前になった記憶があります。
    でも組み込み系は新しいデバイスができるとそれにあわせてライブラリーが変更されるので、どうしてもバグが生まれやすい。
    昔ネットワーク系のデバイスを使った時、なぞの不安定現象が発生して、設計した回路や、ノイズなどが原因か徹夜して調査していた事があります。
    メーカが提供している評価ボードだと問題ないけど、それを参考にして作った基板の挙動がおかしかったです。

    対策方法の詳細は忘れましたが、ネットで見つけたマジックワード的な対応をしたら回路はそのままで、安定して動き始めた事がありました。

    返信削除
    返信
    1. マジックといえば、
      最近のラノベ・アニメ業界では「無詠唱魔術」が流行しています
      「手かざし」「お百度」も退魔に有効と聞きます

      削除