ソフトの変更工数を削減するために、
組込みソフトのアーキテクチャを一新し、フレームワーク構造にしようとしているのですが、
参考になるような書籍はありませんでしょうか?
OSレスでソースコードの行数は40万行くらい。
変数はすべてグローバル変数で、モジュール分割・隠蔽化の概念がまったくないソースコードです。
複数のモータや電動弁を制御するのが主なタスクです。
組込みで、アーキテクチャ設計がきちんとなされた、
綺麗なソースコードを読んで勉強してみたいのですが、なかなかそのようなソースコードを発見できずにいます。
おすすめのOSS等ありましたら、教えていただけませんか?
最近悩んでいるのが異常処理で、
いかに各モジュールの異常をとりもらすことなく、
素早くアクチュエータを停止にもっていくかが課題です。
他にも下記のような課題があります。
・通常制御と異常制御をどのように切り替えれば、時間制約を満たしたうえでソフトの構造が綺麗になるのか
・ROM,RAMの使用量,CPUの実行時間を抑えて、かつ設計変更時のミスを減らせるようなデータ構造の考え方
・モジュール間の依存関係をできるだけ少なくするための設計方法
・モジュール間のデータの受け渡し方法(モジュール間の依存関係を減らしつつ、データの伝達のタイムロスがない方法)
書籍でも、ここらへんのことに触れている本は少ないので、
OSSを読んで勉強するのがいいのでは?と考えています。
同じような悩みを持っているかたの意見もお聞かせください。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
こんにちは。
40万行もの大規模プログラムが対象なら、Linuxのカーネルは比較的条件を満たすかも知れません。
・通常制御と異常制御をどのように切り替えれば、時間制約を満たしたうえでソフトの構造が綺麗になるのか
しかし、すいません。イキナリこれは該当しないかも。カーネルの「制御対象」はユーザ・プロセスやデバイス・ドライバであって、drao0113さんが知りたいのは、ユーザ・プロセスやデバイス・ドライバが制御する装置の異常発生時の制御でしょうから。
個人的な経験では、正常系を分かりやすくすると異常系の制御は難しくなります。
私は、基本的にはスレッドで制御し、異常発生時はC言語を使ってたころはlong jumpを使って一足飛びに戻ってました。C++なら例外ですね。C++の例外は遅いという問題があります。サブmSecの応答性が必要な場合は厳しいかも。ファンクショナル・フォンで昔良く使われていた Symbian OSでは独自の例外機構を導入して高速化を図ってました。
他によく使われる手法としては、状態マシンです。正常系が鬼のようにメンテンナンスし辛くなりますが、異常系も一緒くたに処理できるので、ある意味「スマート」かも知れません。
・ROM,RAMの使用量,CPUの実行時間を抑えて、かつ設計変更時のミスを減らせるようなデータ構造の考え方
・モジュール間の依存関係をできるだけ少なくするための設計方法
・モジュール間のデータの受け渡し方法(モジュール間の依存関係を減らしつつ、データの伝達のタイムロスがない方法)
これらはどんぴしゃ該当しなそうな気がします。カーネルの軽さは最重要課題の一つです。またLinuxのモジュール構造は結構凄いですよ。
それだけ大規模なプログラムなら、モンタビスタのような組込み用Linuxを採用し、そのサポートをばりっと利用するのも手かも知れません。
投稿2018/04/27 14:29
総合スコア23272
0
ベストアンサー
drao0113 さん、
IPA 情報処理推進機構のページ https://www.ipa.go.jp/ で、検索してみると、いろいろ面白い資料がでてくると思います。
たとえば、"組込み アーキテクチャ" で検索すると、
組込みソフトウェアのアーキテクチャ設計の可視化という資料がでてきますが、5ページ目。こころに、グっ.. と、きますね。(笑
組込みソフトといっても、
- どのようなハードウェアを使用しているか(ちっちゃなマイコン~RTOSのボード(MMUなし)~Linuxが動くボード(MMUあり)~Windowsが動作するボード)、
- どのくらいのリアルタイム応答が要求されるか(50kHz~1kHz~1秒~)、
- 人材・スケジュール・予算(!!!)... カスタマーからのプレッシャー
など、様々なプラットフォーム・環境・境遇があるので、書籍やオープンソースから、ジブンのところにあったものを見つける、となると結構時間がかかってしまんじゃないかな、と。
業務でやるのであれば、ソフトウェア開発関係ののコンサルタント会社を探して、相談してみる、というのが、費用も掛かりますが、実績・経験からの話がきけるので、実際、いいんじゃないかと思います。
ところで、↓のような話をきくと、どんなものか見てみたくなりますねぇ。
OSレスでソースコードの行数は40万行くらい。
変数はすべてグローバル変数で、モジュール分割・隠蔽化の概念がまったくないソースコードです。
複数のモータや電動弁を制御するのが主なタスクです。
とのことなので、大きなメインループで処理のディスパッチとか、タイマーや外部の割り込みで、イベント(のような?)処理、というような作りで、また、モータ使用なので、動作中の電源周りのこまかい処理(コンシューマー危機にあるような電力セーブ・スリープなど)は、あまり気にしなくてよい、という感じでしょうかね。
制御するものしては、
- モータ制御 (PWM, GPIO出力)
- 電動弁(アクチュエータ制御?) (PWM, GPIO出力)
- センサー (ADC, GPIO入力)
で、システム全体をみるものが、シーケンスデータやらセンサーの状況を見て、上のものを制御していく、というものだとして(もっといろいろあると思います..)、話しをすすめてしまいますが、
現在、特にレイヤーわけもなく、コードが書かれてるのであれば、
o LowLevelのドライバl類
a-1. PWM
a-2, GPIO-IN/OUT
a-3, ADC
o ドライバの上のモジュール類
b-1 モーターを駆動させるモジュール
b-2 アクチュエータ制御モジュール
b-3 センサーモジュール
o システム制御のアプリケーション
というような形でレイヤー分けをして、まずは、コード整理ですかね。
で、システム全体を見て、タスク分けを検討して、RTOS導入。
また、システム制御部分は、Matlabなどを使って、モデルベース、というかたちで、コードは書かない(書けない?)そのスジの専門家が設計。
Cのコード生成して、それを統合する、って感じだと、制御まわりのアルゴリズムも分離できて、メンテナンスもよくなるんじゃないかな、、と。
こういったメンテナンス性を上げることって、すごく大事なんですけど、まわりの知らない人(特に身分の高い方)からみると、機能・動作もかわらないのに、時間もお金も人もかけて・・・って思われることもありますからね。
しかも、移行直後は、バグが多発して、デグレってる!!、、って。
その辺をわかってる立場のツヨイ人も味方につけとく必要もありますね(笑
投稿2018/04/28 06:37
総合スコア1825
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ちと質問と外れますが、
40万行ですべてグローバル変数、ということですが、おそらく、動作させるコードのコピペを繰り返してこういう規模になっていると推察されます
こういうコードは、それぞれの動作単位で関数化、モジュール化して、共通化していくと、機械的に変換していったとしてもコード規模的には数分の一以下になると思われます
既存のコードをどうにかしていこう、という場合には、いきなりリアルタイムOSの導入とかは考えず、まずは関数化、モジュール化していき、全体の見通しを良くしておいて、必要であるならそれから考えていく、というのがいいと思われます
一口にリアルタイムOSとはいいますが、上記のようなプログラム構造に慣れたアタマからすればそれこそ考え方がまるっきり変わってしまうんで、それに対応できるかどうかってのも心配なところではあります
投稿2018/04/28 23:06
総合スコア87749
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
回答になってなくて申し訳ないですが、
組込みでそんな便利な参考書は見たことが無いです。(組込みでなくてもですが、、)
まずは、地道にモジュール分割からかと思います。あるいは、軽い組込み用OSの導入から。
なお、OSの導入、モジュール分割などの方法は大抵の場合、パフォーマンスの低下となる場合が多いのも事実。巷にあふれる成功談も大半は半分以上、誇張と考えるべき。 (モジュール化でバグった事も過去にあり)
その一方で、メンテナンスコストが下がるのも事実。これらのバランスを取る事が重要。パフォーマンスの低下は、CPUなどを高性能なものにする事で容易に補う事ができます。その辺を考慮した提案かと。
あと、OSSですが、玉石混合。昔、Unixのソースを見た事がありますが、お手本と言うには程遠かった。綺麗だから、効率が良いという事は無く、見た目、綺麗だけど、動かないコードにも出会ってます。(もっとも、汚いとメンテナンスが大変ですが)
投稿2018/04/27 14:17
編集2018/04/27 14:22総合スコア6383
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/27 23:48
2018/04/28 14:50
2018/04/28 14:59
2018/04/28 15:23 編集
0
組込みソフトのアーキテクチャを一新し、フレームワーク構造にしようとしているのですが、
参考になるような書籍はありませんでしょうか?
私は見たこと、読んだことはありません。
OSレスでソースコードの行数は40万行くらい。
変数はすべてグローバル変数で、モジュール分割・隠蔽化の概念がまったくないソースコードです。
μTRONも考慮にいれてみてください。
ただ、既存ソースコード量が多いようですので
かなりのリファクタリングとメモリマップ再構築避けられないかと。。
OOA、OODでの切り口で全体像を客観的に見直すのもありだと思います。
※ソースコード修正はすぐに着手せず。じっくり検討、思考し取り組む事をお勧めします。
投稿2018/04/27 19:56
総合スコア187
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/27 23:37
2018/04/28 03:52
0
参考になるコードですが...
qemu関連は面白いですが規模がでかすぎるし、Qtも規模が...
linuxのネットワークスタック関連(TCP/UDP)が洗練されすぎてて訳が分かりませんが、すごいです。
NASAのソースコード(https://github.com/nasa)はどうかな?と思ったのですが、肝心の制御関連はUS Onlyだったり、VxWorksや上位アプリケーションばかりでした。
小規模なら、arduino-librariesなら気軽に読めると思いますが、異常系が弱そうでした。
以下、ポエムです。
リアルタイム性を担保しつつ、モジュール間の依存関係を整理するというのはOSレスとなるとかなり苦労します。
想像ですが、割り込みでの処理がほとんどなのではないでしょうか。
※RTOSを導入してタスク分けできたとしてもディスパッチ待ちを考慮した設計が待ってます
どの設計においてもデバイスとデバイスへ制御するという役割を明確にするというのが変更にも強く、バグも起こりにくい認識です。
誰が親なのかを考えて設計します。
子と子が依存するのはNGで、親を経由しなくてはならないという制約を持ちます。
※こうなると親(マネージャ)が肥大化して役割分割まで発生したのでCファイルのincludeでの分断という衝撃は忘れられませんが、これがうまくいっててすごかった。
なので、linux等のopen/close/read/writeでドライバへ指示を出すというのは非常に良い設計なのかなと思っています。
他の方が述べられているように、デバイスにかかわるところはドライバ、制御は上位レイヤにする形で分けていくことから始める、特に変更のあったところから始めるのが良いかと思います。
※制御を出すところでレジスタを直接叩くとか、もうお察しのパターンになること請け合いです。(本当に、本当にやりたくなる)
※SDKを使っていて、その上でやるのは苦労がすごかった(特に割り込み設計)
投稿2018/04/28 17:48
総合スコア221
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/27 23:57
2018/04/28 01:26
2018/04/28 15:14 編集
2018/04/28 15:21
2018/04/28 15:54 編集