1

初期化されていない変数は、BSSセクションに含まれています。

最初の質問:彼らは割り当てられたときにそこにとどまりますか?

2番目の質問/問題:このセクションを外部SDRAMにロードしたい。変数はメモリマップに適切に配置されていますが、奇妙な値で埋められており、他の数値をに格納することはできません。この問題について考えがありますか?

/* Memory Map                                                                 */
MEMORY{
    VECTORS (X)  : origin=0x00000000 length=0x00000020
    FLASH0  (RX) : origin=0x00000020 length=0x0017FFE0
    FLASH1  (RX) : origin=0x00180000 length=0x00180000
    STACKS  (RW) : origin=0x08000000 length=0x00001500
    RAM     (RW) : origin=0x08001500 length=0x0003EB00
    SDRAM   (RW) : origin=0x80000000 length=0x00800000
}

/*----------------------------------------------------------------------------*/
/* Section Configuration                                                      */
SECTIONS{
    .intvecs : {} > VECTORS
    .text    : {} > FLASH0 | FLASH1
    .const   : {} > FLASH0 | FLASH1
    .cinit   : {} > FLASH0 | FLASH1
    .pinit   : {} > FLASH0 | FLASH1
    .bss     : {} > SDRAM
    .data    : {} > RAM
    .sysmem  : {} > RAM
}
4

4 に答える 4

2

Q2 に関して、.bss セグメントがランタイム スタートアップ コードによってゼロ初期化される前に、SDRAM メモリ コントローラがメモリ デバイスの正しいタイミングとマッピングで正しく初期化されていることを確認する必要があります。また、SDRAM にある場合、ランタイム スタートアップ コードが .bss セグメントを明示的に初期化していることを確認する必要があります。

于 2013-03-21T15:09:49.167 に答える
1

Q1 : はい、そこです。彼らはなぜ移動するのでしょうか (そして、なぜ彼らに移動してもらいたいのですか?)

http://en.wikipedia.org/wiki/.bss

Q2: 質問の意味がよくわかりませんが、SDRAM が実際に動作していると確信していますか? お使いのプラットフォームには、メモリの読み取りと書き込みを可能にするモニターがありますか?

于 2013-03-21T13:52:42.573 に答える
0

Q2: これを行う方法の詳細は、使用しているシステムによって異なります (Linux を使用していますか?)

必要な場所に .bss セクションを取得するには、リンカー スクリプトを変更する必要があります。たとえば、Linux カーネルの場合は vmlinux.lds になります。

また、Linux では、elf ファイルの情報に基づいて、Uboot などのブートローダーによって .bss セクションがすべてゼロにクリアされます。.bss がゼロにクリアされていないようです。デバッグを開始するのに適した場所は、ブートローダーです。ブートローダが SDRAM をクリアしているときに、SDRAM がメモリに適切にマップされていない可能性があります (システムの実行中に書き込みと読み取りのテストを成功させることができますか?)。または、CPU のメモリ保護によってアクセスが妨げられている可能性があります。

于 2013-03-21T14:13:10.920 に答える
0

Q1: はい、変数は.bssセクションに含まれます。

Q2: .sysmemSDRAM に移動して、値を読み書きできるかどうかを確認できますか? 必要なアクセス権がないと思われます。

于 2013-03-21T13:57:55.060 に答える