Почему xilinx использует указатель для хранения данных в виде массива? - PullRequest
0 голосов
/ 21 мая 2019

Я смотрю на пример AXI-DMA от xilinx, и я застреваю в этом месте в XAxiDma_SimplePollExample

for(Index = 0; Index < MAX_PKT_LEN; Index ++) {
        TxBufferPtr[Index] = Value;

        Value = (Value + 1) & 0xFF;
}

Переменная TxBufferPtr является указателем,указывая на адрес памяти TX_BUFFER_BASE

u8 *TxBufferPtr;
TxBufferPtr = (u8 *)TX_BUFFER_BASE ;

Почему они используют указатель для хранения данных с циклом?Я узнал, что я должен использовать массив для инициализации памяти и использовать начальный адрес этого массива.Таким образом, мой пример будет выглядеть так:

u8 TxBufferPtr[MAX_PKT_LEN];
for(Index = 0; Index < MAX_PKT_LEN; Index ++) {
        TxBufferPtr[Index] = Value;

        Value = (Value + 1) & 0xFF;

Как xilinx позволяет избежать размещения других данных в диапазоне адреса указателя + диапазона цикла, чтобы цикл перезаписывал эти данные?Есть ли хитрость, когда я использую это, или это просто "плохой" код и использование указателя?

1 Ответ

1 голос
/ 21 мая 2019

Существует огромная разница между двумя примерами кода.

Ваш код, т.е.

u8 TxBufferPtr[MAX_PKT_LEN];

выделит память для массива. Это будет MAX_PKT_LEN u8, обычно зарезервированный в стеке.

Этот код:

u8 *TxBufferPtr;
TxBufferPtr = (u8 *)TX_BUFFER_BASE ;

не не выделяет память для массива. Код предполагает, что TX_BUFFER_BASE является адресом некоторой памяти, которая уже была выделена / зарезервирована для программы.

Если вы находитесь на какой-то встроенной системе без MMU, это может быть область прямого отображения памяти для некоторого компонента HW внутри FPGA. В небольших простых встроенных системах это нормально для отображения компонентов HW с помощью указателей на фиксированные адреса. Дизайнер FPGA даст вам значение TX_BUFFER_BASE, поскольку именно дизайнер FPGA решает, как будет использоваться пространство памяти.

...