2017-01-10 14 views
0

私はzynqデバイスを使用して、スタンドアローンプログラム(OSなし)でDRAMから周辺機器にデータを転送しようとしています。このコード例では、トランザクションの送信元アドレスと宛先アドレスを記述するためのコードが見つかりました。組み込みアームプロセッサの特定の物理メモリからメモリを割り当てるにはどうすればよいですか?

volatile static u8 SrcBuffer[BUFFER_BYTESIZE] __attribute__ ((aligned (64))); 
volatile static u8 DestBuffer[BUFFER_BYTESIZE] __attribute__ ((aligned (64))); 

OSはないので、アドレスの値は何ですか?どうすれば変更できますか?

+2

RAMの特定の領域を特別な目的で使用する場合は、予約するようにリンカースクリプトを設定することをお勧めしますそのエリアは他には使われていません。次に、メモリの先頭へのポインタを使用します。 –

+0

DMAを使用した例がありますか? – Lundin

+0

はい、DMAを使用します。 srcBufferとDestBufferはDMAトランザクション用です –

答えて

3

あなたはリンカファイルのセクションaを定義し、(GCC用)を使用して、その中にデータを配置する必要があります。リンカファイルで

__attribute__ ((section ("your_section")))

(すでにとして、それに他のものを持っています以下のようなウェル)何か:情報の一片を見て

MEMORY 
{ 
    ....will be other stuff here 
    .... 
    YOUR_MEMORY_NAME : ORIGIN = 0xWhatever, Length = a_length // Creates a memory region 
} 

SECTIONS 
{ 
    ... 
    ... 

    .something_data : 
    { 
     *(your_data) 
    } > YOUR_MEMORY_NAME 

    ... 

} 
+0

それは動作します!ありがとうございました! –

+0

ニット。私は "your_data"と "your_section"は同じ単語である必要があると思いますか?また、誰かが 'YOUR_MEMORY_NAME'に他のセクションを潜在的に追加する可能性があるので、' .something_data'を64バイトに整列させるのは良いでしょう。私は、リンカがこれらのことを実行するためのより良いツールであることに同意しますが、OPのために何が解決されたのか分かりません。多分、彼はメモリのコンパイル時アドレスを望んでいるでしょうか? –

+0

あなたは正しい "your_data"と "your_section"は同じ単語でなければなりません。おそらくアラインメントも賢明です。 –

0

は、コードは、およびマイクロコントローラの周辺の特定のハードウェア・バッファ・レジスタへのDRAMからのDMAを行っていると思われました。

SBUFやI2C_DATA_REGなどのハードウェアペリフェラルレジスタアドレスが使用されるコードがあります。 両方のバッファのアドレスを知りたい場合は、両方のアレイのアドレスを表示するために使用するデバッガが必要な場合や、UARTが動作している場合は、コンソールでそのバッファを印刷できます。 両方のバッファのメモリを修正する場合は、@ Realtime Rikの提案に従う必要があります

関連する問題