Объявите массив так, чтобы адрес был выровнен по 16-байтовым границам - PullRequest
1 голос
/ 07 апреля 2020

У меня есть массив uint8, и мне нужно передать указатель этого массива в DMA, который передает 16 байтов одновременно. Итак, требование состоит в том, чтобы адрес массива был выровнен на 16 байтов, как 32'hxxxxxx00 - последние два числа адреса равны 0. Я объявляю глобальный массив следующим образом:

u8 R00_PRO_ADDR[0x64000]    __attribute__ ((aligned(16)));// 16 bytes address aligned

однако во время выполнения Я вижу, что адрес массива - 32'hxxxxxxx0. Я также пытался сделать (выровненный (128)), но получить тот же результат.

Это конкретно c для Vivado SDK Cortex A53

1 Ответ

3 голосов
/ 07 апреля 2020

Объявить массив так, чтобы адрес был выровнен по 16-байтовым границам

Вы можете использовать стандартное ключевое слово alignas. Нет необходимости использовать расширение языка:

alignas(16) u8 R00_PRO_ADDR[0x64000];

Таким образом, требуется, чтобы адрес массива был выровнен на 16 байтов, как 32'hxxxxxx00 - последние два номера адреса должны быть 0.

Ваши требования смешаны. Если вам это нужно, то адрес должен быть выровнен по границе 256 байт:

alignas(256) u8 R00_PRO_ADDR[0x64000];

Обратите внимание, что реализация языка не обязательно поддерживает произвольно строгие выравнивания. Если это не так, он должен сказать вам об этом.

...