1

Keil の ARM-MDK 4.11 を使用しています。起動時にのみ使用される静的に割り当てられたメモリ ブロックがあります。スケジューラーが初期化される前に使用され、RL-RTX がヒープ管理を制御する方法が原因で、動的に割り当てることができません (そうしないと、スケジューラーの開始後の後続の割り当てによってハード フォールトが発生します)。

スケジューラが初期化された後、この静的ブロックを空きブロックとしてシステム ヒープに追加したいと考えています。__Heap_ProvideMemory()が答えを提供するように思われます。これは、初期ヒープを作成するために初期化中に呼び出されます。ただし、それにはヒープ記述子アドレスの知識が必要であり、それを取得するための文書化された方法は見つかりません。

何か案は?

これについて ARM/Keil にサポート リクエストを提出しましたが、ARM/Keil は、なぜ私がこれを行う必要があるのか​​について質問し、代替ソリューションを提供することに関心があります。私は代替案をよく知っていますが、この場合、これが実行できれば、それが最もクリーンなソリューションになります。

4

2 に答える 2

1

Rowley Crossworks コンパイラを使用していますが、同様の問題がありました。コンパイラの CRT スタートアップ コードでヒープが設定されていました。残念ながら SDRAM は main() の開始まで初期化されなかったため、ヒープが適切に設定されませんでした。SDRAM が初期化された後、main() の開始時にヒープを再初期化することで、この問題を回避しました。

コンパイラが起動時に構造を計算するために使用するアセンブラ コードを調べましたが、難しくはありませんでした。その後、Rowley から malloc/free のソース コードも入手しました。Keil にそのバージョンを問い合わせていただけないでしょうか?

于 2010-11-30T23:31:21.760 に答える
1

私が使用した 1 つの方法は、独自の単純なヒープ ルーチンを組み込み、ライブラリから // 関数malloc()を引き継ぐことです。calloc()free()

シンプルなカスタム ヒープ ルーチンには、メモリ ブロックをヒープに追加できるインターフェイスがありました。

これの欠点 (少なくとも私の場合) は、カスタム ヒープ ルーチンが組み込みライブラリ ルーチンよりもはるかに洗練されておらず、おそらく組み込みルーチンよりも断片化しやすいことでした。それは、その特定のアプリケーションでは深刻な問題ではありませんでした。ビルトイン ライブラリ ルーチンの機能が必要な場合は、malloc()ビルトイン ヒープ ルーチンが失敗を返すまで延期してから、カスタム ヒープからの割り当てを試みることができます。

もう 1 つの欠点は、カスタム ルーチンにバグがないことを確認するのが、一見すると思っていたよりもはるかに面倒だとわかったことです。割り当て時に分割でき、解放時に合体できます)。

この手法の利点の 1 つは、移植性が高く (カスタム ルーチンが移植可能である限り)、ツールチェーンが内部を変更しても壊れないことです。malloc()移植が必要な唯一の部分は、 /インターフェースを引き継ぎ、free()初期化を十分に行うことです。

于 2010-12-02T15:46:20.003 に答える