アダムローゼンフェルドが指摘するように、あなたは正確に正しい場所に位置していますあなたのための1つまたは複数のシンボルを定義するために、リンカ制御ファイルを使用する必要があります。
gccとbinutilsについては、ldのリンカスクリプト構文を使用します。私がここで省略しているすべての詳細については、ldのマニュアルを参照してください。それは不透明ですが、埋め込まれた世界で多大な労力を費やすつもりなら、しばらく時間を費やすべきです。それはあなたのために報われるでしょう。
リンカースクリプトでは、.textセグメントの前と1つ後にシンボルを定義する必要があります。
アダムはPROVIDE()
の構文を使用しています。しかし、あなたの名前が一意であることを保証できるなら、PROVIDEで定義をラップする必要はありません。これは、あなたができることが保証されているか、後で多くの混乱を招く恐れがあることに注意してください。私たちは、SDRAMコントローラは、SDRAMメモリをマッピングすることを決めた場所に(この場合は)意味し、一定のアドレスにシンボルを定義するために
__SDRAM_CS1 = 0x10000000;
:私のスクリプトで
、私は同じようなものを使用しますCIでは、次のように宣言します。
したがって、SDRAMが実際にどこにあるかを知る必要があるコードで使用できるように宣言します。
の.textセグメントの終わりを見つけるのシンボルに対しては、リンカスクリプトで次の
SECTIONS
{
...
.text {
_start_text = .;
*(.text);
...
_end_text = .;
}
...
}
のようなものを持っているでしょうし、中
extern unsigned char _start_text[];
extern unsigned char _end_text[];
として開始と終了のシンボルを宣言しますその後、開始アドレスは単に_start_text
であり、テキストセグメントのバイト長は_end_text - _start_text
です。
私は多くの細部を省いたことに注意してください。 .text以外の名前のセクションは、テキストセグメント内にあるかのように扱わなければならないでしょう。主な例は、読み取り専用のデータです。これは、テキスト部分に安全に置かれることがあります。その理由は、const
であることが知られています。組み込みシステムでは、必要がない場合は貴重なRAMにコピーしないでください。また、データセグメントの初期化子、およびグローバルに生成されたオブジェクトのコンストラクタの内部生成リストは、すべてテキストセグメントの近くに配置されます。
画像サイズにこのようなものを含めるかどうかは、それらが使用されていることを理解した後に行う必要がある設計上の決定です。
あなたはLinuxを使用していますか? – toto
可能性があります埋め込み – Gerhard