0

XP で MinGW GCC ツールチェーンを、XP の「民間」プロセスで許可されている仮想メモリ アドレス空間を超える高メモリ (>0xFFFF0000) にアクセスする組み込みプロジェクトのベンダー コードで使用しようとしています。

例外の次の命令で実行を続行できるようにする、つまり無視する何らかの方法でメモリアクセス例外を自分で処理したいと考えています。MinGWでそれを行う方法はありますか? またはMSツールチェーンで?

したがって、非常に単純化された図は次のとおりです。

/////////////
// MyFile.c
MyFunc(){
    VendorFunc_A();
}

/////////////////
// VendorFile.c
VendorFunc_A(){
    VendorFunc_DoSomeDesirableSideEffect();
    VendorFunc_B();
    VendorFunc_DoSomeMoreGoodStuff();
}

VendorFunc_B(){
    int *pHW_Reg = 0xFFFF0000;
    *pHW_Reg = 1;  // Mem Access EXCEPTION HERE
    return(0);     // I want to continue here
}

詳細: AVR32-gcc ツールチェーンを使用して、freeRTOS を備えた Atmel AVR32 プラットフォームで組み込みプロジェクトを開発しています。ハードウェア (および低速の avr32 シミュレーター) に依存しない高レベルのアプリケーション コードを開発/デバッグすることが望ましいです。さまざまな gcc、makefile、およびマクロ トリックにより、Avr32/freeRTOS プロジェクトを MinGW/Win32 freeRTOS ポート環境でビルドし、eclipse/gdb でデバッグできます。ただし、(ベンダーが提供する) Avr32 コードでの高メモリー HW アクセスは、MinGW exe をクラッシュさせます (メモリー アクセス例外が原因で)。

私はこれらのアプローチのいくつかの組み合わせを考えています:

1) SW でアクセス例外を管理します。理想的には一種の HW シミュレーターを作成したいのですが、それは難しく、危険なアセンブリ コードが必要になると思います。多くの例外はおそらく無視できます。

2) Avr32 ヘッダー ファイルの変更されたコピーを作成して、HW レジスタ #defines をユーザー プロセス アドレス空間に再配置します (そして、仮想メモリ空​​間のそれらの領域をコミットするいくつかの構造体とリンカー セクションを作成します)。

3) 「実際の」HW ターゲット コードでのコード クラフトを最小限に抑えるために、高メモリ/HW アクセス、または代わりにより多くのマクロ トリックをもたらす関数呼び出しの条件付きコンパイル。(このプロジェクトには他の開発者がいます。)

提案や役立つリンクをいただければ幸いです。

このページは正しい方向に進んでいますが、非常に複雑に思えます。また、避けたい C++ です。しかし、他の提案がなければ、まだ試してみるかもしれません. http://www.programmingunlimited.net/siteexec/content.cgi?page=mingw-seh

4

2 に答える 2

1

最初にベンダー コードがアドレス 0xFFFF0000 に 1 を書き込もうとしている理由を理解してから、この動作をエミュレートするカスタム VendorFunc_B() 関数を作成する必要があります。0xFFFF0000 は、書き込み時に特別な処理を行うハードウェア レジスタである可能性があります (たとえば、シリアル ポートのボー レートを変更する、レーザーの電源を入れるなど)。ターゲット ハードウェアでこのレジスタに書き込むと何が起こるかがわかっている場合は、Windows コードで適切な処理を行うようにベンダー コードを書き換えることができます (たとえば、"Starting laser" という文字列をログ ファイルに書き込みます)。Windows XP でアドレス 0xFFFF0000 に 1 を書き込むことは正しくないと想定しても問題ありません。Windows XP のメモリ保護システムがこれを検出し、プログラムを終了します。

于 2011-08-07T19:53:23.273 に答える
0

最近同様の問題がありましたが、これが解決策です。

MinGW で構築された標準の実行可能ファイル内でメモリ アクセスをトラップする

まず第一に、これらのアドレス範囲 (おそらくいくつかの undef/define コンボ) を使用可能なメモリに再マップする方法を見つける必要があります。これができない場合は、seg-fault をフックして自分で書き込みを処理できるかもしれません。

また、これを使用して、既に作成されたコードに対して、単一の実行可能ファイル内で特定のハードウェアの動作を「シミュレート」します。しかし、私の場合、すべてのレジスタ アクセス マクロを早期に再定義する方法を見つけました。

于 2019-02-28T12:46:19.760 に答える