8

C の典型的な組み込みソフトウェアのファイル構造に関する適切な提案を見つけることができません。SO に関するそのような質問と回答は多数ありますが、私が提示する懸念をカバーするものや、C の組み込みシステムに適合していると思われるものはありません。

特効薬がないことは理解しています。それが提案を絞り込むのに役立つ場合、私の典型的なアプリケーションは、8 ~ 32 kB のフラッシュと数 kB の RAM を備えたターゲットに適合する必要があります。4 ~ 20 MHz 範囲のクロック。


1.レイヤー

ソースコードがレイヤーに編成されており、各レイヤーには独自のディレクトリがあります。

  • 応用
  • トランスポート層
  • ハードウェア抽象化レイヤー

問題は、モジュールがこれらすべての層にファイルを持っていることが多いため、ディレクトリで層を分離すると、1 つのモジュールのファイルがあちこちに散らばることになります。カプセル化が悪い。


2. ディレクトリ内のモジュール、$ROOT/includes/ 内の h ファイル

モジュールごとに 1 つのディレクトリ。良いことは、実際のカプセル化です。モジュールの API を公開する方法がよくわかりません。オープンソース PC アプリケーション SW のようです:

  • モジュールディレクトリにすべてのソースコードがあります(モジュール内でのみ使用されることを意図したすべてのCファイルとすべてのヘッダーファイル)
  • API ヘッダー ファイルをモジュール ディレクトリの外にある に公開します$PROJ_ROOT/includes

そうすれば-I$PROJ_ROOT/includes、コンパイラ コマンドに (または同等のものを) 含めることができ、#includeステートメントに検索パスを含めることができなくなります。

問題は、API がモジュール ディレクトリの外にあるため、カプセル化が壊れていることです。たとえば、モジュールを VCS でスタンドアロンとして維持することは困難です。


3. ディレクトリに API を持つモジュール

上記と同じですが、モジュール ディレクトリに API ヘッダー ファイルがあります。適切にカプセル化され、モジュールのバージョン管理が容易になりますが、API ヘッダー ファイルは、プライベートであることを意図した他のモジュール ヘッダー ファイルと同じレベルにあります。このような「プライベート」ヘッダー ファイルをモジュールの外部にインクルードする誘惑は、将来の開発者にとっては大きすぎるかもしれません。


4. ディレクトリに API を含むモジュール、サブディレクトリにプライベート構造

API ヘッダー ファイルのみをモジュール ディレクトリに直接配置し、他のすべてのファイルを 1 つまたは複数のサブディレクトリに配置します。これはうまくいくかもしれませんが、構造がますます複雑になっているように感じます。これはあまり好きではありません。


私は2つか4つに行くべきだと感じていますが、洞察を大いに感謝します. 私が説明する関連する欠点に対処するにはどうすればよいですか? 他の選択肢は?

この種の規模の成功したオープンソース SW へのリンクもよいでしょう。文学的なアドバイスも大歓迎です。

4

1 に答える 1

3

このようにメモリ量が限られているため、アプリケーション + OS はかなり小さくなります。私は、数ギガバイトのソース コード、数千のモジュール、および「ギガバイト」範囲のインストール可能なバイナリを構築するプロジェクトに取り組んできました。そのサイズに達したら、ヘッダーファイルなどを適切な場所に配置する必要があります。

ただし、以下はかなりまともな概念だと思います。

  1. モジュールごとのソース ファイル。モジュールは、「用途」(「ベース/OS」、「グラフィックス」、「オーディオ」、「ネットワーク」、「UI」、「アプリ」など) によって、より大きなグループに分けることができます。
  2. 各モジュールには、「エクスポートされたインクルード」(ゼロからかなり大きい) のリストがあり、モジュールのビルド時に、一般的な「${ROOT}/includes」タイプのディレクトリにコピーされます。これは EXTERNAL インターフェイスを提供しますが、モジュール自体として生成されたオブジェクト ファイルは、API のユーザーに対して「パブリック」ではなく、プライベートな宣言と定義がある「${module}/includes」も使用する場合があります。

これは、ほとんどの大規模なプロジェクトがどのように機能するかです。大規模なプロジェクトで機能する場合は、小規模なプロジェクトでも問題ありません。ただし、ソース ファイルの数が 12 ~ 2 の場合、分割する意味がまったくわかりません。「src」と「includes」、必要に応じて「include/private」にすることもできます。 API がクリーンであることを確認します。シンプルに保つことには大きな利点があります!

実際のモジュールがコンパイルされる前に「エクスポート」部分をビルドする必要があることに注意してください。そうしないと、モジュール間の相互通信がまったくないことを確認する必要があります[または、少なくとも「初期の」モジュールが「後で」モジュールのヘッダー ファイル - システムが大きくなると非常に難しくなります]。

また、公開する方法と内容に関する一連のルールを用意し、コード レビュー中にこれらのルールが守られていることを確認する必要があります。

于 2013-06-17T10:39:53.027 に答える