Массив не пересекает границу 256 байт - PullRequest
5 голосов
/ 13 октября 2010

Можно ли создать массив, который не пересекает 256-байтовую границу?То есть адреса отдельных элементов массива отличаются только младшим байтом.Это более слабое требование, чем поддержание выравнивания массива в 256 байтов.Единственное решение, о котором я мог подумать, это выравнивание по next_power_of_two(sizeof(array)), но я не уверен насчет пробелов, которые могли бы появиться таким образом.

Это для библиотеки для микроконтроллеров AVR, и это спасло бы меняНесколько ценных инструкций в обработчике прерываний. Массив, который должен иметь это свойство, имеет длину 54 байта из 80 байтов общей статической памяти, используемой библиотекой.Я ищу способ, который не увеличивает требования к памяти.

Я использую ассемблер gnu avr-as и компоновщик avr-ld.

Пример: если массив начинается садрес 0x00f0, тогда старшее слово изменится с 0x00 на 0x01 при обходе массива.

Мне все равно, начинается ли оно с адреса 0x0100 или 0x0101, если оно не пересекает границу.

Ответы [ 2 ]

1 голос
/ 13 октября 2010

Для выполнения этого требования требуется только 64 байта, например, это должно работать:

uint8_t a[54] __attribute__ ((aligned(64)));
0 голосов
/ 29 октября 2010

Я ничего не знаю о микроконтроллерах AVR, но, вообще говоря, статические переменные обычно помещаются в раздел данных исполняемого файла, и, поскольку ваши требования к статической памяти низки, все, что вам нужно, это убедиться, что данныесекция выровнена по 256 байтам.(Это может быть по умолчанию. На x86 это обычно так.) Проверьте параметры компоновщика ...

...