2016-04-12 7 views
0

私は組み込みシステムで作業しており、リンカスクリプトを書いて外部のRAMに特定のセクションを配置しています。また、外部RAMにヒープをセットアップしようとしています。Cダイナミックアロケーションがリンカと連携してヒープの場所を定義する方法

私は「簡単に」シンボルが存在することが、彼らがポイントすべきかを予想することができる何をお知らせでしょうGNUやlibcのための任意のドキュメントを見つけるように見えることはできません。誰かが私にドキュメンテーションを指し示すことができたり、クイックランニングを与えることができればそれはすばらしいことになります。

私はラムに、代わりにだけではなく、外部RAMに.heapセクションを使用.dataセクションを拡張SBRKたの.dataのままにしたいと思います。

+0

ほとんどの 'malloc'実装は、ヒープを取得するために、OS関数àla' sbrk'を呼び出します。だから、リンカスクリプトではなく、私があなたが悩まなければならないと思うOSやmallocの実装です。 –

+0

@SteveSummit - このインスタンスにはOSがありません。 libc sbrk関数が呼び出されました。私の疑問は、sbrkがどの領域をどのように扱うべきかを知っていると思います。他のセクションについては、これはリンカにシンボルを追加して行います。私はこれを動作させるために必要な記号を見つけることを試みています。 – gettingSmarter

+0

FreeRTOSのソースコードを見てください。これは、4つまたは5つの異なるmalloc実装を持っています。 @EugeneSh。 –

答えて

0

他の誰かがこの問題に遭遇した場合のために、私はいくつかの詳細と私のソリューションを投稿しています。

私はstm32f7アーム皮質uC用に開発中です。我々は外部のラムを備えたボードを開発し、そこにヒープを貼り付ける必要があった。

stm32のRAMのアドレスは0x20000000です。 FMC(外部RAM)のアドレスは0x90000000です。

_sbrk関数のアームなし、EABI実装はヒープならびにヒープ及びスタックのcolisionをチェックして延びています。通常のビルドでは、ヒープとスタックは両方ともラムの終わりにあります。しかし、いったんヒープを外部RAM(0x90000000)に移動すると、常にスタックの終わりになり、_sbrkが失敗することになります。

_sbrk機能が弱いので、それはそれはちょうど私の割り当ては、私の定義されたヒープの場所に残っていることを確認するために再実装の問題だったリンク。リンカは欲望のヒープの場所の始まりと終わりを宣言する必要があります。また、注意すべき

。また、_endheapシンボルを追加して、ヒープを希望のメモリセクションに制限することもできました。それが本当に望ましいかどうかは議論することができます。

関連する問題