🗐 電装工芸日記 - 舞台照明機器の製作とか -

能登半島地震で被災された方々にお見舞い申し上げます。

or 管理画面へ

2023年1月 この範囲を時系列順で読む この範囲をファイルに出力する

Icon of admin
 Windows上のVSCodeからSSHでRaspberryPiに接続してコードを編集・コンパイル・実行してみました。
 コードは俗に言う「Hello, World」。コンソールに簡単な文字列を表示するだけのモノです。
 VSCodeはユーザーインターフェースのデザイン更新が頻繁なのか、ネットの解説は出来るだけ新しいモノを参考にしないと見た目が違います。
 インストールと設定は次の通り。

 まずはRaspberryPi側から。sshでつながることを前提とする。
1)対象となるRaspberryPiをアップデート
 $ sudo apt update
 $ sudo apt upgrade
2)build-essentialをインストール。
 $ sudo apt install build-essential
 デバッカーのgdbが必要になる、上記で入らなかったらインストール
 $ sudo apt install gdb

 Windows(11)側
1)VSCodeをダウンロード
 https://code.visualstudio.comってのが本家みたい。
 環境に合わせてインストーラーをダウンロード
2)インストール
 ダウンロードしたインストーラーを起動して初期設定のまま進めてインストール。選択項目がある場合はよくわからんけど一番上を選択。
3)起動後、機能拡張の日本語パックを入れる(参考ページは呆れるほどあります)
 機能拡張のメニューから「Japanese Language Pack for Visual Studio Code」をインストール
 インストール後、アプリを再起動すると大半のメニューが日本語になっています。
4)同じく機能拡張の「Remote Development」を入れる
 他に必要な機能拡張は自動的に入ります。
5)ssh接続してみる
 以下を参考にすれば繋がると思います。
 「Visual Studio Codeを使ったC言語リモートコンパイルからリモートデバッグまで」
6)初回接続ではRaspberryPi側にも色々入れるようで少し時間がかかります。
7)この他にも自動的に入った機能拡張がありますが、よくわからんのでここには書きません。

 Windows上のVSCodeでコーディング、コンパイル、デバッグ、実行が出来ました。
 ブレークポイントありのデバッカーまで使えるのですから、Turbo-CのトラウマでC言語を敬遠していた時間が勿体ないと思える程に便利です。

#C言語
Icon of admin
 新年あけましておめでとうございます
 本年もよろしくお願い申し上げます

 さて、さかのぼること大晦日の夕方、実家に顔を出そうと思ったのですがどうも熱っぽい。計ると37.2度。
 ダルさは若干あるものの、抜けきっていない疲れなのか、流行り病の前兆なのかわかりません。
 大事を取って自宅に引きこもり。
 暇なんでRaspberryPiをC言語で開発する環境についてアレコレ調べています。
 大晦日に何してんの?って突っ込みは正しいと思いますが、外出出来ないのだから仕方ない。

 PythonはTeraTermでSSH接続してRaspberryPi上のViとかnanoとかで書いていました。debianに標準搭載のテキストエディタです。Windows上で操作すればコピペも出来るので特に不自由はありませんが、色々調べるウチにVSCodeが便利そうで使いたくなりました。C言語はカッコや行末のセミコロンを忘れてコンパイルエラーになることが多いのですが、これを防止する為だけに使っても意味があります。
 世の中進歩するというか便利なツールを作ってくれる貴兄がおりまして、VSCodeはプラグインを入れるとSSHで完全にリモート操作が出来る。コーディングはもちろんのこと、コンパイルもデバッグも出来るとのこと。すばらしい。
Visual Studio Codeを使ったC言語リモートコンパイルからリモートデバッグまで
 ゼロから設定するなら本文中にあるリンク「参考にした解説」も読む必要があります。
Visual Studio CodeでLinux ホストリモート開発
 ちょっと面倒ですが、SSHでリモート開発したいなんて考える人ならそれほど苦にならないでしょう。

 VSCodeは様々な言語をサポートしてくれる超絶強力なコーディングエディタです。

#C言語

2022年12月 この範囲を時系列順で読む この範囲をファイルに出力する

Icon of admin
 2022年の大晦日です。
 コロナの感染拡大は完全に収まりはしなかったものの、仕事ではその影響も和らぎ忙しくさせて頂いた一年でした。
 ご協力を頂いた各方面の方々に改めて感謝申し上げます。

 ただ、体力的には過負荷が続いたもので、年末休暇に入ってからの2日間は完全にシャットダウン。大晦日の今日になってようやく普通に戻ってきた感じです。
 年末にやるべきことの大半が出来ませんが、少しはこなして実家にも顔を出しましょう。
 C言語の書き方は妄想だけなので合間に少し進めます。

#雑談
Icon of admin
 書き方を考えています。
 PICマイコンを書く場合は、表面の機能からではなく、全体の構造からまとめていくからです。
 表面的な機能だけで装置は動きません。これらを後回しにすることを推奨するのではありませんが、機能と機能を能動的に結びつけなければ結果に至らないからです。
 DMXのディマーも、DMXを受信するだけでなく、アドレスを設定したり、ACの波長とゼロクロスポイントを取得したり、得た情報を結びつけて適切なタイミングでSCRをON/OFFしなければなりません。
 PICにおいてはハードウェアモジュールの割り込みフラグを用いるのは当然としても、1個のタイマーで複数の実行タイミングを生成出来なければなりません。タイマーはほんの数個しかありませんので、実行モジュール毎にタイマーを割り付けてタイムアップを取るのは不可能だからです。細かい構造は割愛しますが、環境に合わせた工夫を仕込んでおかないと動くモノも動かないのです。

 PICとは事情が違いますが、RaspberryPiを開発するなら複数のCPUスレッドに仕事を分散させて処理能力を出来るだけ引き出さないといけません。
 PythonでもC言語でも、プログラムをマルチスレッド化するだけならプロセスは一つでありCPUスレッドは1つしか使われません。CPUスレッドを振り分けるのはOSの仕事でプログラムの記述で指定することは出来ないようですが、CPUスレッドを最大限利用するにはマルチプロセスで書くことが最低条件となるようです。
 マルチプロセス化する方法はいくつかありますが、プロセスとプロセスの間に継承と共有をする情報があるならば工夫が必要です。これらを都度の例外とするのは開発においてもメンテナンスにおいても効率が良くありませんので、継承と共有の仕組みを最初から作っておくのが良いと思います。
 これから取り組もうとしている工夫は正にコレです。この仕組みがまとまればC言語での開発が飛躍的に発展します。

#C言語
Icon of admin
 マルチプロセスについて調べていました。
 fork()、exec()、共有メモリをセットで使えば良いようです。

Linuxプロセスの生成と実行 fork/exec

 fork()は現プロセスを別プロセスに完全コピーします。実行状態も含めてです。同じプログラムが別々のプロセスでfork()を実行する直前のコンディションで並列実行されますが、自身がコピーされた子プロセスなら別プロセスで実行したいプログラムをexec()で起動するというもの。exec()で別プログラムを起動すると呼び出したプログラムは終了しますので、結果として別プロセスで別プログラムが起動したことになります。共有メモリなどの設定を済ませてからfork()を実行すれば、共有メモリの情報を別プロセスの別プログラムに簡単に渡せるのでスマートです。

 以下、いささか愚痴ですし、教えを頂いている立場が言うことではないのですが、fork()、exec()、共有メモリがセットであることに触れずにfork()だけを切り取った情報が多いこと多いこと。ゴッタ煮説明が理解しにくいのは事実ですが、fork()だけではfork()の意味すらわからないと思うのです。私と同じことを調べている方がいたら、exec()に触れずにfork()だけを力説している情報は読み飛ばした方がいいと思います。もちろん、瞬間的に計算能力を増やすのにサブルーチン的な別プロセスを使う方法あるのでexec()を用いずfork()と共有メモリで組むこともあるとは思いますけど。
 マルチプロセスというとfork()単独の話ばかりが目につきますが、共有メモリをキーに掘り下げたところfork()、exec()、共有メモリの3点セットが理解出来たところです。

 話を戻しますが、共有メモリの情報を別プロセスに渡す方法も含め、具体的に解決した感じです。
 これなら、複数ある機能のどれかから別機能のプロセスを起動するより、必要な機能の全プロセスを起動するだけのメインプログラムを書いた方が管理しやすいような気がします。共有メモリなどを設定し、機能ごとのプロセスを起動していく最初に起動するプログラムです。一種のランチャーですね。

 うーん、やっぱりC言語は高級言語というよりアセンブラ風味だなぁ。

#C言語
Icon of admin
 C言語を習得する壁として代表的な機能は、
1)ポインタ
2)構造体、共有体
3)typedef(自分なりの変数の型を定義する)
 でしょうか。
 ポインタは以前も書きましたが、変数をアドレス値で読み書きする方法です。CPU、メモリ、デバイスというハードウェアの基本要素が頭に入ってないと捉えにくいのですが、わかればシンプルだと思います。
 構造体はPythonで言うところのタプルみたいなものです。
 共有体は機能はわかっても意味がイマイチピンときませんが、高度なことを書く際に便利なのでしょう。
 typedefにはじんわりとオブジェクト指向を感じますが、データベースにアクセスするなど、構造体を多用する際に便利な気がします。
 他は計算記述とループコマンドですが、これらは方言のレベルで受け入れればいいようです。配列に対する計算はPythonと少し違うみたいなので整理が必要です。
 要所の基本は理解できたっぽいので、とにかく書いて慣れることですね。
 呆れる程書いて体に馴染ませたPICのアセンブラ並にC言語を書けるようになれたら御の字です。

 実習はこれからですが、共有メモリも見えてきました。
 名前のままですが、複数のプロセスからアクセス(共有)できるメモリ領域を定義する方法です。
 mmap(メモリマップドファイル)とかpipeに似ていますが、mmapはRAMディスク上のファイルを共有するイメージで、pipeは変数の内容をシステムを通じて送受信するイメージです。どれもプロセス間で情報を共有する手段ですが、共有メモリはこの中でもローレベルでシンプルな方法だと思います。ローレベルすなわち速度が期待でき、最初の定義は面倒だけど定義さえ済めば単なる変数として扱えます。
 今時のOSは特定のプロセスがアクセスできるメモリ領域を制限することで動作の安定とセキュリティ(セキュア)を担保します。このため、別プロセスの領域にある変数(メモリ)にはポインタを使ってもアクセス出来ないのです。
 MS-DOSなどの初期のOSではありえなかった制限ですが、利便性とセキュアは矛盾するシステム要件ですから、抜け道として共有メモリが用意されたのしょう。アクセスが許可されたプロセスからはただのメモリ領域ですからポインタで普通に読み書き出来ます。動作速度が通常変数と大差ないのも嬉しい。
 共有メモリを定義して得られる情報はID、先頭アドレス、メモリサイズ、パーミッションだけです。OSやコンパイラがマネージしてくれない変数ですから、メモリに展開する構造体を手作業で管理しなければなりません。読み書きもマネージしれくれませんので、プロセス間で動作が衝突して誤動作に繋がる可能性があるので、セマフォを使うなり、データを一方通行にするなりして対策する必要もあります。この辺りはPICのアセンブラと同じですけどね。

 学んでて思うのですが、C言語はアセンブラを抽象化して書きやすくしたものだとするのが私には自然です。アセンブラを補助するマクロ集を膨らませていったらマクロ命令だけでもプログラムソースが書けるようになってしまい、ならばマクロの内容を整理したら更に便利ぢゃね?となったんじゃないかと勝手に想像しています。プログラム言語としてJAVAやPythonと同類に位置付けされますが、性根のところでは別分野の代物なんですよ。学ぶ側にとっては、俗に言う高級言語に分類するから逆に理解し難いんだと思うのです。ハードウェアが直に読むマシンコードを便利マクロだけで書くと思えばポインタなどは超お気楽な便利機能に見えてきます。
 つーて、アセンブラとかマシンコードって何?って聞かれてしまうと困ります。色彩をカラーフィルターの番号と光源のレベルで例えてしまう照明屋の言葉が一般には通じないことと同じです。

#C言語
Icon of admin
 ライトアップのご依頼が多くなっています。
 自家製の制御システムがあるので安く提供出来るのが強みですが、このところはリレーやタイマーが手に入らず難儀してました。
 今月に入ってダメもとでモノタロウさんを見直したところ在庫あり。メーカーのサイトを見ると「供給量が少ないのでご注意ください」とはあれど供給は復活している。
 速攻でオーダー。
 リレーはOMRONさんのG7L-2A-BUBですが、フランジ形状なので取り付けが楽で、小型で動作電流も少なく、20A流せるので使い勝手が良いリレーです。AC100vで駆動する物を主に使いますが、制御用のDC電源が不要だし、横繋ぎで動かせるし、既設のタイマーで動いているAC100v負荷があれば制御信号として電源を盗み出して使うことも出来ます。
 タイマーも数量限定ながら手に入りました。近い将来IoT化するつもりですが、電源の制御はシンプルなタイマーリレーに限ります。

#本業 #ガチ工作
Icon of admin
「行燈」を作らねばなりません。
 灯台の様な円筒の建物のライトアップを依頼されているのですが、歴史のある代物なので落ち着いた雰囲気にしたいと。
 建築デザイン的に窓の存在感が強いのでライトアップでも窓を主張したいと。
 カーテンを付けて光を透かせばいいのですが、ライトアップをしない面の窓からは出来るだけ光を漏らしたくないと。
 と、なりますと、内側から窓に向けた面だけが光る「箱」をこさえねばなりません。「行燈」なワケです。
 お金も手間も時間もかけられないし、どうしたものかと思案しておりますが、看板屋さんの知恵と資材を使わせてもらうことにしました。
 全体を木枠で作り、光を漏らしたくない面には肉厚のターポリンを張り、光らせる面にはノボリ看板で使う生地を張ります。相手物が相手物ですから防炎素材を使わないといけませんが、看板で使う素材は余程の安物でなければ防炎素材。
 ちょいと年末年始休暇を減らして製作ですねぇ。

#本業 #ガチ工作
Icon of admin
 もう数日頑張れば本業が落ち着きます。夏休み前の小学生みたいにワクワクした気持ちですが何をしましょう。
 手つかずの課題は特盛です。自由に何でも出来そうな解放感はあっても時間も気力も体力も資金も有限です。
 物理装置を作るのもいいのですが、暖かい部屋に籠ってヌクヌクと出来る課題がいい。
 まずはArt-Netエンジンですかね。これが出来れば幾つかの課題をクリアするキーになります。
 調光制御の底辺で必要になる計算ライブラリも重要でしょうか。レベル値にマスタ値を与えて出力値を得るとか、幾つかのレベル値をマージするライブラリです。調光卓的なシステムでは必須です。
 さらにはANSIエスケープシーケンスを用いた画面表示ライブラリです。これはpythonが苦手なfor文を多用せずには書けないのでC言語で書くのが必須だからです。
 明日は数か月ぶりの完全オフなのでゆっくり考えましょう。

追記
 ゆっくり考えようと思ったのですが、アホみたいに疲れが出て何も出来ませんでした。
 アドレナリンに頼って誤魔化すと反動が酷いお年頃。

#雑談
Icon of admin
 今扱っている課題ではハードウェアの処理能力を出来るだけ主題の処理に振り向けたいのです。
 C/C++の使用やポインタの活用は大いに貢献しそうですが、プロセス間通信をポインタを介して行うことは今時のOSでは無理っぽい。プロセスの独立性をOSがガッチリ固めるからです。
 プロセス間で通信するにはOSがマネージするpipeや共有メモリを用いないといけません。幸い、pythonで同様のことをするよりも処理速度が速いようなので現実的ではありますが、このレベルの情報になりますとその筋の上級者が書いているので前提が高度で完全理解には程遠いところです。もっと基礎を固めないといけません。

 現時点では同プロセス内でのスレッド処理で構成するのが現実的かなと。
 同プロセス内ならポインタを介してスレッド間で変数を共有できるそうです。
 ただ、Art-Netエンジン(受信/パッチ/送信の一連処理)を独立したプロセスにしたいので、いずれはプロセス間通信を多用出来る技術も習得しないといけません。
 理解には及んでいませんが、芸は無いけど速度が出せる共有メモリが一番良さそうです。

追記

 プロセス間でのメモリ共有
 説明は少ないですが、サンプルコードに余計な装飾がありませんし、ほぼANSI-Cで書かれているので理解しやすい。
 共有メモリを宣言し、そのメモリのアドレスを数値としてポインタ変数に渡しているだけです。別プロセスへのアドレスの渡し方が地味ですが、動作を理解するにはこれでいいのです。単に値が渡ればいいのか、特別な手段で渡すのか、明確にわかります。
 これを習得出来たら楽になりますね。

#C言語

■当面の課題

花粉症シーズンも一段落したようで重傷者にも笑顔が戻ってきました。私は原始人なので花粉が酷い日でも鼻の中が埃っぽいなぁくらいにしか感じませんけど。
気温の変化が激しいようですので、みなさま健康管理には注意してください。

編集

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■日付検索:

■カレンダー:

2023年1月
1234567
891011121314
15161718192021
22232425262728
293031

■カテゴリ:

■最近の投稿:

最終更新日時:
2024年5月17日(金) 11時57分19秒