Сколько памяти использует выравнивание в C? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть эта программа:

__attribute__((section(".graph"))) __attribute__((aligned(16)))
uint16_t FLASH_BUFFER2[FLASH_SECTOR_SIZE];

int main ()
{
  printf("Hallo World"\n);
}

Когда я запускаю ее, резервирует ли она FLASH_SECTOR_SIZE * 16 байтов в памяти?

Редактировать: Технически правильный вопрос: "Резервирует ли она FLASH_SECTOR_SIZE * 2 * 16 байт в памяти? (2 для uint16_t и 16 для выравнивания) "

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Когда я запускаю его, резервирует ли он FLASH_SECTOR_SIZE * 16 байт в памяти?

Нет.Тип uint16_t имеет ширину 16 бит , а не 16 байт .Память действительно зарезервирована для массива, но ее размер составляет FLASH_SECTOR_SIZE * 2 байт.

Синтаксис __attribute__, который вы представляете, не является частью стандартного C, поэтому его значение зависит от вашего компилятора, но я не вижучто бы ни было причиной, чтобы подумать, что массив фактически не имеет зарезервированной памяти для него или что он изменяет объем зарезервированной памяти.Вероятно, __attribute__((aligned(16))) просто гарантирует, что начальный адрес массива выровнен по 16-байтовой границе.

0 голосов
/ 21 ноября 2018

Нет.__attribute__((aligned(16))) просто гарантирует, что FLASH_BUFFER2 помещается в 16-байтовую границу.Он по-прежнему зарезервирует FLASH_SECTOR_SIZE * sizeof(uint16_t) байтов.

Когда я использовал этот атрибут в прошлом, это было из-за того, что контроллер DMA или механизм, используемый для записи во внутреннюю флэш-память и из нее, требовали, чтобы расположение ОЗУ былона 16-байтовой границе.Поскольку вы делаете это во встроенной системе, вы можете иметь дело с тем же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...