2025年6月8日日曜日

【STM32】UARTポエム

回路とかfirmwareとかのポエムです.

わたしは仕様をかっちり決めてする仕事じゃなくても歓迎します.
だってさぁ、仕様をかっちり決めれる人がその組織に居るのは稀ですから.仕様を決めれるというのはとても偉いことで、諸般の事情の全てを網羅的に理解している聖人が居るということですから、その人さえ居れば「開発フェーズはほぼ終了」と言えてしまう.
現実は、作るべき仕様を誰も思い描いてすらいない状況に放り込まれて「何か考えるからそれを元に考えてみてよ」という身の処し方になります.
微修正で済む要求なら「わかりましたやります」で良いんですが、デバイス変更不可避みたいな要求だと「このversionだと入れれないので次の試作で入れますわ」とかいう交渉になります.あと「PC側でやってもらいましょうかね」というのもよくある.

でもそうゆう仕事をしていると、だんだん仕様が膨れてゆくんですよね.
 ・LPFを2種切り替えにする →3種類にしてくれ
 ・サンプリング周波数は3kHz →300Hzと3kHzの2本建て
 ・制御信号の本数がどんどん増える →MBDやCNの極数が爆増する

いま設計してる装置もご多分に漏れず制御爆発の配線爆発でCPUのpin数が足りなくなりました.MBDも両面基板では済まなくなり4層基板が必須になってしまう面倒な成り行き.

そこでローカルにSUB-CPUを載せて、MAIN-CPUからSUB-CPUをUARTで制御することにしました.UARTなら配線は2本で済みます.いま、MAIN-SUB間の通信を開通させてるところです.

BOX内部の制御ですから、SPIかI2Cを使うのが普通でしょうけど、SPIとかI2Cって信号で軽くhandshakeしているでしょ.あれがかえってめんどくさいので敬遠しちゃいます.SPIの先にSLAVEが存在しないと(PCBを挿さないと)がっつんとDMAがhang-upしちゃったりするので面倒なんですなぁ.だから撃ちっ放しでもOKなUARTが好きなわたしです.

MAIN-CPUからUARTに10BYTEsぐらいのコマンドを送信します.
 コマンド1→10mSec→コマンド2→10mSec→コマンド3
みたくバババッと送信します.なお115200bps.

ところがSUB-CPUのUART受信がかなりの頻度でロストするんです.

なんでロストしているのか?

あまり好きじゃないのですけど、STM32のUART受信の作法は、1BYTE受信したら割込みをかけてもらいます.
↓1BYTE受信起動のおまじない
  HAL_UART_Receive_IT( &huart, &rxbyte, 1 )
↓受信割込みはこのcallbackに飛んできます.
  HAL_UART_RxCpltCallback()
このやり方をあまり好きじゃない理由は、BYTE毎に割込みは忙しすぎる気がするから.
115200bpsで1BYTEに要する時間は100uSecぐらいですから割込み激しいよね.

それはさておき、、、受信callbackでする処理は、今は実験なので、
 ・とりあえずBYTE毎にbufferに積む
 ・end delimiter(CR)が来たらechobackする
という簡単動作なのですが、10BYTEsをechobackしてると当然100uSecを超えちゃってロストします.
割込み内でechobackしないでmain()でechobackするようにしてもbufferが上書きされちゃうので死亡.
DMAでechobackすればすぐに返ってくるけど、DMA中に次のDMAを起動するわけにはいかないのでready待ちするのなら、blocking関数でechobackしたって同じじゃんと思うのでDMAは使わない.

などと諸事情があり、受信callbackではコマンドラインをキューに積むだけにして、main()でごゆるりとキューを消化させるようにしました.それで円満に動くようになりました.

あと、UART受信callbackの割込み優先度は高くしといた方がいいですね.

ちなみに、SUB-CPUはSTM32G030F6P6です.小さくていいです.しかしFLASHが32kBしかないので、debug modeだとFLASH占有70%ぐらいになっていて、release modeにしてサイズを半減させてます.これからI2Cを追加するのでまさかの容量不足にならんだろうなぁという予感に怯える.....

かしこ

20 件のコメント:

  1. 神奈川県人
    当初仕様からの変更対応、お疲れ様です。
    仕様が大きくなるにしたがって、仕様資源(ROM/RAM)増大、コード肥大化、パラメータ数増加対応の為、データ構造の見直しなどによる開発期間の延長、コスト増などがおきます。
    開発案件として最初に余裕があれば対応もできるし、顧客も当初からの仕様変更を考慮していただければありがたいのですが、
    厳しい顧客だと、仕様変更OK,納期延長NGで地獄のロードまっしぐらになってしまう場合があります。
    社員であればリスクは会社が負いますが、請負の場合は自己責任になるので、逃げられません。
    おっと、トラブル対応もありましたね。
    想定外の問題が発生して、その対応に時間がかかってしまうのは当初の予定にないので、こればっかりはやってみないとわからない。
    (ある程度は見積もりに含めますが、チップのバグ、なぞの不安定現象対策などは、開発を進めてから対処するので、出来高しだい)
    与えられた時間で精一杯やる、それでも厳しいときにはリスケして欲しいと思いながら、ギリギリまで粘って遅延・・・・orz。
    は最近NGみたいです。
    ギリギリまで粘るのではなく、遅延が見えたら報告してくださいといわれます。
    トラブルは出たら、まず報告、次に解析、遅延が確定したら、リスケするが、最近の流れみたいです。
    納期絶対主義で進めた結果、飛んでしまうのが一番NGと言うのが最近の流れみたいです。

    返信削除
    返信
    1. >仕様資源(ROM/RAM)増大、コード肥大化、パラメータ数増加対応の為、データ構造の見直しなどによる開発期間の延長、コスト増

      挙句の果てにデバイス変更 きゃーっ

      削除
    2. ゲームはβテスト(バグ)→リリース(生煮え)→ブラッシュアップ(完成)としてゆくのがあるみたいですが、
      ブラッシュアップした時にはすでに客が逃げてonlineが閑散としてたりして....
      モンハン大丈夫かなぁ あははー

      削除
  2. 神奈川県人
    今はオンラインアップデートがあるので、多少のバグは問題ありません。
    スマホゲームは毎週アップデートして、バランスの微調整とバグフィックスを続けていきます。
    ユーザーが激減したら、100連ガチャで数%のユーザーアップ・・・・するのかな?

    デバイス変更は厳しいですね。
    同じ系列だと負荷は少ないですが、シリーズが変更になると振り出しに戻る感じです。
    お客様がリスケを呑んでくれれば何とかなるのですが、多くのお客様は飲めないですね。
    リスケ=開発コストアップなので、経営者とかは結構厳しい。

    返信削除
    返信
    1. HWリソースは多めに盛っておくのがいいですね
      STM32をだんだん大盛りに変えていって、最終的にHighEndデバイスにしちゃいました

      削除
    2. その昔、まだ、
      ・インターネト普及前で、個人メールアドレスなど無い
      頃(今思えば、私は、そんな頃から、「プログラマ」やってたんだな・・・)
      プログラムのバージョンアップは、
      ・一日がかりの大仕事
      でした。単に「プログラムの置き換え」だけじゃなくて、テストデータでの動作確認から、本番機での確認、コンピュータの再起動で、異常動作しないか、とか、丹念にチェックしてました。

      -----
      時代は流れて、現在は、「そんな丁寧なことはやらなくなり」
      修正版プログラムは、「客先に、メールで送付」
      (最近、「zip, exe の添付禁止」のポリシーの会社も、増えてきましたが。。。)
      ユーザーに「バージョンアップ」してもらうだけで済ませることも多くなりました。
      (遠い場所の客だと、交通費だけで数万円とかあるし。余程のことが無いと、行くことは無いです。)
      そうなると、仮に不具合が起きても、
      ・次のバージョンアップファイル(セットアップファイル、インストーラー)を送るだけで済ませる、と言うことも良く有ります。
      ※不具合があれば「次に直せばいい」って、Windows の、
      ・Windows Update
      と、全く同じですね。Microsoft 自ら「そういうモノである」ということを「底辺ユーザ」までにも浸透させてくれたお陰で、この方式で「文句が出たこと」は今までありません。
      これは「良いこと」なのか「悪いこと」なのか・・・

      削除
    3. バグありでリリース→数年間メンテが続く みたいな、
      手離れをわざと悪くする仕組みって、
      忙しさが平準化されるから、
      soft会社の運営的にメリットなのかなと思ったりしてるわたくし

      でもゲーム開発の現場では、
      リリースまでは大量の技術者で大projectでやるけど、
      リリースしたらどんどん辞めちゃって、
      メンテ業務回すのがキツくなるとかなんとか

      リリースしたら辞めちまう気持ちはわかるが....

      削除
    4. >soft会社の運営的にメリット
      経営的観点からすると、昔は、
      ・一回のバージョンアップ辺りを「1日仕事」にして、客先に請求(その代わり、手離れは良い)
      で、今は、
      ・リリース回数は増やす(メールで済ます)が、「手離れをわざと悪く」させて、ついでに「客先の要望」を聞いて、その分は「請求する」
      みたくなってんのかな、とは思います。

      削除
    5. たくさん請求
      どんどん請求

      そういやマイナンバーはわざと永久updateしてます?

      削除
  3. murasaki
    >受信callbackではコマンドラインをキューに積むだけにして、main()でごゆるりとキューを消化させるようにしました.
    これ大事ですねー。以前は割り込み処理をアセンブラ以外で書くのも怖かったです。ちょっとした無駄コードのせいで処理がたてこんだときに受信こぼして大騒ぎになったりするるので。

    返信削除
    返信
    1. SUB-CPUにつないだDACをうごかしているところです
      やはり円満がいちばん大切です
      電車は人身事故でよく止まってしまいますが、バスは止まりませんように

      削除
  4. >受信callbackではコマンドラインをキューに積むだけにして、main()でごゆるりとキューを消化させるようにしました
    「割り込み処理」は、受付処理ダケして、複雑な後処理は「メイン(というか、受信割り込み以外の場所。当然プライオリティは低い)」に任せる、というのは、
    ・Windows のデバイスドライバでも採用している手法
    ですね。
    ※但し「後処理が終わっていない」のに、次の割り込みが来ると、
    「ブルースクリーン」になって終了してしまいます。
    なので、「後処理」と言えど「チンタラ」やってて良いワケでは無いですが。
    ※つか、このテクニックを「習得」出来たら、もはや、
    「立派にプログラマーを名乗って良い」と思います。
    (出来の悪いプログラマーは、「こんなことすら」理解していない。
    割り込み処理が「マトモに書けるかどうか」で、プログラマーのレベルが分かる。
    「のうたりんぷろぐらまー」は、「複雑な後処理」を、平然と、
    ・割り込み処理内に書いて
    「このソフト、たまに動かなくなるんだよねー」と言っちゃうんだよな~。
    私が見たソフトで、シリアル割り込み内に、「平然と」画面描画処理(結構複雑なの)を入れてて、「たまに通信エラー」とか起こしてて、
    ・原因不明です
    と、のたまってた・・・と言うのが有りました。

    返信削除
    返信
    1. >原因不明です

      そいつ呼吸すら禁止に処するべし

      削除
    2. PCは様々な動作速度のCPUがあるので遅いとめんどくさそう
      仕事の速い人が好きです

      削除
    3. FLASH容量不足にはならずに済みそうです(いまのところ)

      削除
    4. >そいつ呼吸すら禁止に処するべし
      私の知る限り(経験上)では、これは、
      ・職業プログラマの、平均的な姿
      のように思えます・・・
      ※私はこう言うのが嫌いで、「原因究明」しちゃうので、結構色んなところから「重宝されている」感があります。
      まぁこれは、私は、「ハードウエア出身」だからかも知れません。
      「ふつーのプログラマ」は、あまり「割り込みがどうの」とか、気にしないのカモ。
      ※でも、プログラマなのに、「食事をする哲学者の問題」も知らないのか?
      (私の周りでは、「そんなの知らない」と言うのがふつーだった気がする。)
      と、思わなくも無いですが。
      もっとも、昔はこう言うのは「OSの設計」とか、結構「クリティカルなところ」でないと、問題にならなかったのかも知れません。
      今はいきおい、
      ・一番安いPCでも「マルチコア」
      だし、何なら、あの、
      ・Raspberry Pi Zero
      すら、「デュアルコア」ですからねー・・・
      (Arduino すら、「マルチタスク」「マルチスレッド」書けるしね。)

      削除
    5. >Raspberry Pi Zero
      間違えました。
      ・Raspberry Pi Pico
      のほうでした。(ちなみに、最新の Raspberry Pi Zero は、「クアッドコア」です)
      ※もう、「Zero」とか「Nano」とか「Pico」とか、
      ・紛らわしすぎる・・・
      ※「Raspberry Pi Nano」は、
      ・ありそうで無い
      です、実在するのは、
      ・Nano Pi
      です・・・

      削除
    6. ヒラ的には、動作時間足りてるかな?と思う処理は、
      入り口と出口でportを叩いてオシロで処理時間を読み取るんですけど、
      これってHW屋特有の作法なんですかね?

      soft debugでもオシロで観測しないと気が済まねぇんですが

      cash使うと速くなったとかFPU速いとか、みんなオシロで見てるわたくし

      削除
    7. >みんなオシロで見てる
      大昔のコンピュータルームの映像には、よく、
      ・オシロスコープ
      が、映ってますね。Youtube とかで、昔の動画見てるとわかる。
      こんなのとか。
      https://youtu.be/Mme4YSzVspY?t=760
      >soft debugでもオシロで観測しないと気が済まねぇ
      私も、この手のやつはそうですね。
      まぁ、「最終成果物」は、「ソフト」ジャナクテ「ハード」だからですかね、組込み系とか特に。

      削除
    8. softのヒトはtick countで時間測定するヒトもいるのかなと思わんでもないけど組込みじゃそこまでするかどうかはやる気次第か…

      削除