Как я могу выделить часть памяти из определенной физической памяти во встроенном процессоре arm?

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

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

Так как ОС не существует, какова ценность адреса? Как я могу это изменить?

2 ответа

Вам необходимо определить раздел 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 

   ...

}

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

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

Другие вопросы по тегам