2

Windowsマシンで実行されているVBAで記述されたプログラムがあります。

STR9x uP で実行されているKeilIDEとコンパイラを 使用して、ANSICで記述された非常によく似たプログラムがあります。

私たちの計画は、 C#を使用して.NETでVBAコードを書き直すことでした。

両方のシステムで使用されるC++ で共有コードを作成することの実現可能性は何ですか?明らかに、.NET Frameworkは立ち入り禁止ですが、それはそれほど問題ではありません。具体的には、コンパイルプロセスがどれほど手間がかかると思いますか。

これは一種の理論的な質問です、私は知っていますが、どんな考えにも感謝します。

4

2 に答える 2

2

私はこれを一般診療として行います。「可能か」よりも良い質問は、「組み込みシステムとPCの両方で実行できるようにコードをどのように構成すればよいか」だと思います。

私はコードをCで記述し、静的変数を使用して各ファイルをc ++クラスとして構造化し、グローバル変数をモジュールに対してプライベートにすることを好みます。プライベート変数にアクセスするためのgetter関数とsetter関数を作成します。また、モジュールがモジュールの外部で呼び出す必要のあるメソッドに対して、モジュールの初期化時に設定した関数ポインターを使用します。

上記の構造化されたcコードからc#またはc++のクラスにリファクタリングすることも簡単です。

C ++を直接使用することもできますが、組み込みシステムで誤って使用すると問題が発生する可能性があります。

ハードウェアにアクセスする場合は、ハードウェア抽象化レイヤーが必要になります。私は自分のコードを2つのタイプに分けます。最初のタイプは、実行されているものを参照しないコードであり、他のコードはドライバーと呼ばれます。

このコードは、通信プロトコルなどのモジュールを再利用するために使用します。しかし、もっと重要なことに、私はそれをテストに使用します。gtestを使用してモジュールの単体テストを行うのが好きです。また、ドライバーを書き直し、PCでハードウェアをシミュレートして、PCで実行できるようにすることもできます。

于 2011-10-07T18:10:19.837 に答える
2

明らかに、.NETFrameworkは立ち入り禁止になります

必ずしも真実ではありません。十分なROMおよびRAMリソース(それぞれ256K / 64K)があれば、.NETMicroFrameworkデバイス上で実行されます。ただし、それが必ずしもそれを使用する正当な理由ではありません。組み込みターゲットとWindowsの両方で使用できる他の2つの一般的に使用されるポータブル言語、CとC++がすでにあります。CとC++の両方に必要なターゲットリソースは最小限です。C/C++ランタイム起動コードは1K未満のコードであり、実行時環境ではなく、アプリケーションコードで利用可能なリソースのほとんどすべてを利用できます。

両方のプラットフォームで共通のコードを利用する秘訣は、抽象化です。ターゲットがRTOSやスレッドライブラリなどのカーネルまたはスケジューラを使用している場合、これには少なくともハードウェアの抽象化と、場合によってはOSの抽象化が含まれます。

組み込みターゲットをレイヤーアーキテクチャで設計することをお勧めします。少なくともデバイスレイヤーアプリケーションレイヤーがあり、すでに述べたように、IPC、同期、スケジューリングを使用する場合は、システムレイヤーを使用することもできます。抽象化の恩恵を受けるネットワークやファイルシステムなど、他の上位層のインターフェースがある場合があります。BSDソケットやstdioなどの標準APIはすでに抽象化としてカウントされているため、ターゲットがこれらを使用している場合、Windowsで行う作業は少なくなります(BSDソケットとWinsockのわずかな違いでも作業が必要になる場合があります)

アプリケーション層には、デバイス層とシステム層を介してアクセスできるもの以外に、OSまたはハードウェアの依存関係はありません。次に、Windowsで利用可能なサービスまたはデバイスへのシミュレーションまたは再マッピングとして、デバイスおよびシステムレイヤーをWindowsに実装する必要があります。一部のRTOSには、テストと開発用のWindowsシミュレーターがすでに含まれていますが、多数のネイティブRTOSとGPOSの間で移植できる独自のOS APIレイヤーを定義すると、シミュレーションとリアルタイム実行の両方でアプリケーションコードをさまざまなターゲットに移植できます。早く。

プラットフォームの違いがわずかでローカライズされており、抽象化レイヤーを正当化できない場合は、ターゲット固有の条件付きコンパイルが適切な場合があります。コンパイラーは、アーキテクチャー、OS、またはコンパイラー固有のコード用に事前定義されたマクロをサポートします。これらのマクロは、このローカライズされたコードと、重要な類似性がある場合に抽象化レイヤーコード自体を共通にするために使用できます。

于 2011-10-09T12:01:32.327 に答える