Как я могу выделить часть памяти из определенной физической памяти во встроенном процессоре 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