void foo()
{
...
#if TARGET_REAL_CPU
...
#endif
...
}
:
bool some_func(
int index,
#if SOME_DEFINE
bool flag,
#else
struct exception* ex,
#endif
void* buffer,
size_t size,
)
{
...
}
上記のコードは、任意のプロジェクトをリードしますトータルクラスターファック!
ここで、どのように行われることになっていますか。
抽象化はあなたの友人です!ハードウェア、プラットフォーム、コンパイラ/ツールチェーンの3つの主なものの一般的な分離。コンパイルとプラットフォームを混乱させる人もいます。
私はプロジェクトのダミーの例を作成しました。ディレクトリ構造は次のようになります。それはあなたの分離がどのように行われるか明確なアイデアを与える必要があります。できるだけ多くのイン依存コード
firmware/
├── bin
│ ├── arm
│ ├── windows_x64
│ └── windows_x86
├── build
│ ├── gcc
│ │ └── arm
│ ├── keil5
│ │ └── arm
│ └── vs2017
│ └── windows
├── include
│ └── firmware
│ └── frm.h
├── src
│ ├── arm
│ │ ├── frm_init_impl.c
│ │ └── frm_platform.h
│ ├── frm_idle.c
│ ├── frm_init.c
│ ├── frm_state.c
│ └── windows
│ ├── frm_init_impl.c
│ └── frm_platform.h
└── test
└── firmware_test
├── build
│ └── vs2017
│ └── windows
└── src
1.書き込みプラットフォームを!ほとんどの場合、開発とデバッグが容易になります。例えば、Visual Studioのような便利な環境で&のデバッグをできるだけ簡単に書くと、viやgdb、さらにはKeilを使用する方がはるかに簡単で簡単です。私の個人的な意見は高価なごみです!すぐに、それはこの場合_platform.h
ファイル
FrmStatus frm_init()
{
// Platform in-depended code
...
status = frm_init_impl(...);
if(FAILED(status))
{
...
}
// Platform in-depended code
...
}
に_impl.c
ファイルとすべてのプラットフォーム固有の定義に移動させなければならないプラットフォームに依存する機能を持っているよう
2.あなたがfrm_init_impl
の異なる実装を持っていますさまざまなフォルダとファイルの機能をWindowsのシミュレーションコードと実際のチップ固有のものとしましょう。しかし、あなたのプラットフォームに依存するfrm_init
関数は、何が関係なく常に同じままです!
3。build
ディレクトリの異なるフォルダを使用してコンパイラとツールチェーンを区切ります。これらのプロジェクトファイルには、src
の対応するサブフォルダからの特定の.c
と.h
ファイルが含まれています。
この手法は、WindowsのシミュレーションやKeilのエミュレーションを使用してファームウェアのテストスイートを簡単に開発するのに役立ちます。そして、実際のハードウェア用のテストプロジェクトを作成することができます。
私が何かを忘れてしまった場合は、そのプロセスで編集し、コミュニティの開発者が助けてくれるでしょう。