2012-01-21 5 views
3

MIPS based embedded deviceの代わりにC++の代わりにCを使用してアプリケーションをビルドしようとしています。まず、hereが見えるリンクの問題がありました。この問題は修正され、アプリケーションを正常に構築できます。私のコードでは、malloc関数をメモリ割り当てに使用していますが、この関数を呼び出すと、"Segment Fault"というメッセージが表示されます。私はmallocnew演算子に置き換えましたが、結果は同じでした。詳細については、蛇腹コード参照:行3が実行され、malloc関数が呼び出されると組み込みデバイスでnewまたはmallocを使用することによってセグメントエラーが発生しました

int main(int argc, char** argv) 
    { 
      char* str = (char*)malloc(10 * sizeof(char));  //or char* str = new char[10]; 
      strcpy(str, "Hello"); 
      return 0; 
    } 

"Segment Fault"メッセージが画面に表示されます。 mipsel-elf-g++の代わりにmipsel-elf-gccを使用すると、この問題は発生しません。

ここで何が間違っていますか?

+3

(1)埋め込み型と 'malloc'は混在しません。 (2)ARM7デバイス用のコードをコンパイルするのになぜ 'mipsel-elf-g ++ 'を使用していますか? –

+0

1. '埋め込み型とmallocは混在しないでください。 2.メーカーツールチェーンではmipsel-elf-gccを使用しているため、mipsel-elf-g ++を使用することにしました。 –

+0

埋め込みコードでの動的割り当ては悪い考えです。代わりに、プールされたアロケータを使用するようにしてください。お使いのデバイスはARM7プロセッサまたはMIPSプロセッサで、ARMプロセッサ用に 'mipsel-elf-g ++ 'を使用するのは間違っています。 –

答えて

1

ターゲットプラットフォームはARMv7プロセッサですが、クロスコンパイラはmipselコンパイラです。 ARM用のツールチェーンをダウンロードする必要があります。メンター・グラフィックスのSourcery Liteツールチェーンはかなり良いです。

例えば、arm-2011.03-41でプログラムをコンパイルしようとするとよいでしょう。

1

malloc()のライブラリコードは、成熟していて正しいと思われます。 GNUツールチェーンライブラリでは、ライブラリをターゲットハードウェアやOSに接着するためのターゲット固有の移植レイヤーが必要です。 malloc()、およびC++ newの場合、関連するシステムコードはsbrk()(または再入荷の場合はsbrk_r()ですが、通常はラッパーaropund sbrk()です)です。

sbrk()のツールチェーンベンダーの実装は、一般的なスタブであり、特定のターゲットに合わせられていないようです。ランタイム環境用に実装する必要があります。

+0

私が正しく理解すれば、自分のプロジェクトで 'malloc'と' new'を自分で実装するべきです。そうですか? –

+0

@監督:あなたは完全に誤解しています。それは全く私が提案したものではありません。mallocとすべての 'new'演算子のオーバーロードを正しく実装するのは簡単な作業ではありません。あなたのツールチェーンはどのようなCライブラリを使っていますか? OSやベアメタルターゲットをターゲットにしていますか?私はこれらの質問をしますが、あなたがARM7でMIPSコンパイラを使用していると思っていて、その混乱さえ解明していないと答えた場合は、何とか疑問に思っています。例えば、Newlibの 'sbrk'実装の例が挙げられます。[here](http://wiki.osdev.org/Porting_Newlib) – Clifford

+0

@Califford:私のボードcpuはARM7だと思っています私はそれがMIPSベースのCPUだと理解しています。 私はCygwinを使用しており、libcを使用していると思います。私のデバイスには、メーカーが開発したOSがあり、標準OSではありません。 –

関連する問題