私は現在、で遊んでいて、CSR 1000 chip
メモリを割り当てたいと思っていました。使用してみmalloc
ましたが、コンパイラから次のように表示されます。
`malloc'への未定義の参照
パラメータgcc
で実行されているためだと思います-nostdlib
では、CSR uEnergy SDK
経験のある人に、なぜメモリを割り当てられないのか、代わりにどのように割り当てればよいのか教えてください。
そのチップにバンドルされているSDKがあり、メモリ割り当ての基本的なルーチンを提供している場合は、それらを使用します。または、独自のアロケータを作成するか、Webから既存のアロケータを使用することもできます(多少の手間がかかります)。
簡単な解決策として、変更されたリンカースクリプトを使用するか、gcc'section'属性(詳細はこちら)を使用してメモリ内の領域をマークし、それをmallocアロケータのヒープアリーナとして使用できます。
非常に単純なアロケータは、ヘッダー/フッターなどのアカウンティング情報を保持せず、領域を次々に線形に割り当てます(この場合、フリーイングは基本的にノーオペレーションになります)。簡単なプログラムを実行することができます。
より洗練されたものが必要な場合は、ある種のメモリプールまたは標準の割り当てアルゴリズムの実装を検討することもできます。
DennisRitchieとBrianKernighanによる古典的な本TheCProgramming Languageは、私が正しく再呼び出しした場合、単純なメモリアロケータを提供します。あなたはそれを見てみたいと思うかもしれません。
私はこのチップで3ヶ月の経験があります。
malloc関数は、標準Cライブラリにあります。これは通常、デスクトップソフトウェア開発または組み込みLinuxで使用できます。しかし、これは小さくてリソースが限られた組み込みチップです。標準Cライブラリはありません。
uEnergy SDKのインストールディレクトリを参照する場合は、C:\ uEnergy_SDK-2.0.0 \ doc \ reference \ html\index.htmlのようになります。上部の[モジュール]タグをクリックします。「C標準ライブラリAPI」のセクションで、CSRは標準Cライブラリのサブセットを模倣するいくつかの関数を提供していることがわかります。残念ながら、mallocのようなメソッドはありません。
一般に、小さな組み込みシステムで作業する場合、動的メモリ割り当てがないことがよくあります。ただし、通常はイベント駆動型のRFアプリケーションの場合、通常、単純な動的メモリ割り当て機能が提供されているため、OSからアプリケーションに着信パケットを渡すことができます。TIのCC2430とそのZigbeeスタックを使用しました。これらは、mallocを模倣し、標準Cライブラリで無料の関数osal_mem_allocおよびosal_mem_freeを提供します。
両方のチップを使用した経験から、iOSとAndroidの場合と同じように、CSRはTIよりもはるかに保護的であることがわかりました。16ビットRISCであると言われる以外は、どのMCUを使用しているかはわかりません。
内部に動的メモリ割り当てがあると思いますが、アプリケーションはこれらの関数を使用できません。RFパケットは、AppProcessLmEvent関数でOSから渡され、そこからp_event_dataポインターを介してデータを取得します。そのイベントの処理が完了すると、OSが自動的に割り当てるため、割り当てを解除する必要はありません。
質問に戻りますが、メモリを割り当てることができるので、メモリのブロックをグローバル配列として予約して作業するだけです。
お役に立てれば。
#include <malloc.h>
ファイルの先頭に追加します