2025年10月22日水曜日

バッファ操作マン (STM32)

オレってこないだまで動画編集マンだったじゃん.
秋の展示会シーズンに向けた準備だったので、動画編集作業は終わった.

それで次の仕事は「バッファ操作マン」になっているんだ.
オレみたいなただのホビーストがやってるんだからなかなか進まない.

以下のような仕様であり、わたしには未体験ゾーンな難易度である.

CPUAとCPUBの通信.

通信路: UART、全2重、2Mbps、フロー制御なし、差動バッファかまして差動伝送

CPUAが出す情報は2種類
 1)100mSec毎に5kBYTEの定期便(binary)
 2)不定期、不定量で低速度なstatus返信(string)

CPUBが出す情報は1種類
 3)不定期、不定量で低速度なcommand(string)

3は簡単なのでさておく.

問題は1と2である.
1はDMAが必須.
2はDMAである必要はないが、1に相乗りさせるのでDMA.
定期便毎の相乗り枠は128BYTEであるが、満杯になるかもしれない.
満杯なら次の便に乗せる.
乗せ方はCR末尾で区切って乗せる.

切って乗せてバラしたりするのめんどくさい.
リングバッファに仮putして送信する直前にgetしてとかなんとかやってる.

実を云うと、こんな風な6:1のタコ足通信に加えてPCとの接続が2系統ある.HWリソース全部使ってる未体験ゾーン.
 CPUA-CPUB  DMA
 CPUC-CPUB  DMA
 CPUD-CPUB  DMA
 CPUE-CPUB  DMA
 CPUF-CPUB  DMA
 CPUG-CPUB  DMA
    CPUB-(UART)-PC  割込み
    CPUB-(USB)-PC

かしこ

12 件のコメント:

  1. LS244バッファじゃだめみたいですね 毒者

    返信削除
    返信
    1. RS485バッファを流用中
      波形綺麗です

      削除
  2. murasaki
    バッファ操作はそれだけでオライリーの本が書けそうな一大分野ですね。現状かなり大変そうですが、ノイズ対策や伝文解析が加わったら更にカオスになりそうです。

    返信削除
    返信
    1. 現在なぜか3が動かなくて困ってる

      削除
    2. あるあるですねー💦
      一番問題なさそうなものが何故か動かない。
      しかも調べると原因がまあまあ込み入っていたりするという・・。
      ちなみに動かないのは送信側と受信側のどちらでしょうか。とか聞いてみたくなる今日この頃。

      削除
    3. なぜか受信callbackに飛んでこないという病気
      ったく根性みせろよSTM32

      削除
    4. murasaki
      いろいろ要因が考えられるやつですねー。
      受信レジスタに値が入っていて(受信できていて)割り込まない場合は、割り込みまわりですかね。
      割り込みが他のチャンネルと共用になっているとか、優先度が低いと他の優先度の高い割り込みを処理した後なんかのレジスタの値を設定してあげないと割り込みし直さないとか、CPUのクセみたいな奴があるかもですねー。

      削除
    5. murasaki
      いろいろ要因が考えられるやつですねー。
      受信レジスタに値が入っていて(受信できていて)割り込まない場合は、割り込みまわりですかね。
      割り込みが他のチャンネルと共用になっているとか、優先度が低いと他の優先度の高い割り込みを処理した後なんかのレジスタの値を設定してあげないと割り込みし直さないとか、CPUのクセみたいな奴があるかもですねー。

      削除
    6. 癖かもしんない

      TXは3BYTE送信
      RXは3BYTE受信 →受信後callback正常

      TXは1BYTE送信
      RXは1BYTE受信 →受信後callbackかからない

      ↑こんなかんじがする

      なおUSARTのUART使いしていて生じるトラブル

      UARTのUART使いでこうゆうトラブルは出ていない

      削除
    7. たぶん原因わかった
      ・CPUAが起動する前からCPUBがコマンドを送っていると
      ・CPUAのUARTが起動する前にHW bufferがoverflowしていて
      ・CPUAのUARTにRX指令しても動かない

      ↑前にもみたトラブル

      逐次フラグクリアすれば治る
      __HAL_UART_CLEAR_OREFLAG(huart);
      __HAL_UART_FLUSH_DRREGISTER(huart);

      削除
  3. 最近良く使っていますがCopilotに対策方法を聞いたらどんな回答があるでしょうか。

    返信削除
    返信
    1. copilot:
      「手かざしは試しましたか? 手かざしで治るケースが近年多く報告されています」

      削除