2017-01-10 51 views
0

Я использую устройство zynq, пытаясь перенести данные с DRAM на периферию ARM с помощью части автономной программы (без ОС). В примере кода я нашел этот код для указания адреса источника и адреса назначения транзакции.Как я могу выделить часть памяти из определенной физической памяти в встроенном процессоре?

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

Поскольку нет ОС, с чего стоит адрес? Как я могу его изменить?

+2

Если вы хотите, чтобы определенная область ОЗУ использовалась для чего-то особенного, я предлагаю вам настроить сценарий компоновщика для резервирования область, чтобы она не использовалась ни для чего другого. Затем просто используйте указатель на начало памяти. –

+0

Может быть, пример использовал DMA? – Lundin

+0

Да, он использует DMA. SrcBuffer и DestBuffer для транзакции DMA –

ответ

3

Вы должны определить сечение а в файле линкера, а затем поместить в нем данные с использованием (для НКУ):

__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» должны быть одним и тем же словом? Кроме того, вероятно, хорошо до 64 байт выровнять '.something_data', поскольку кто-то потенциально может добавить другие разделы в' YOUR_MEMORY_NAME'. Я согласен с тем, что компоновщик - лучший инструмент для выполнения этих задач, но я не вижу, как что-то было решено для ОП? Может быть, ему нужен адрес времени компиляции для памяти? –

+0

Вы правы: «your_data» и «your_section» должны быть одинаковыми. Выравнивание также, вероятно, разумно. –

0

Глядя на куске информации, при условии, что, кажется, что код делает DMA и из памяти DRAM для конкретного аппаратного буфера регистра периферии микроконтроллера.

Должен быть код, в котором адрес регистра периферийного устройства используется как SBUF или I2C_DATA_REG или что-то похожее на это. Если вы хотите узнать адрес обоих буферов, вам может понадобиться отладчик, с помощью которого вы можете просмотреть адрес обоих массивов или если у вас работает UART, вы можете распечатать его на консоли. Если вы хотите исправить память обоих буферов, вам необходимо следовать тому, что предлагал @Realtime Rik

Смежные вопросы