В некоторых случаях бывает необходимо обеспечить условие выравнивания адреса начала в памяти какой-либо переменной или массива. Например, такое может понадобиться в случае записи данных в память FLASH микроконтроллера.
Для решения этой задачи существует ключевое слово __align. Оно инструктирует компилятор выровнять в памяти адрес начала переменной по указанному значению n. Т. е. адрес начала переменной в памяти будет нацело делиться на n.
Ключевое слово __align относится к классу модификаторов размещения переменных в памяти (storage class modifier). Он не влияет на тип объекта, размещение которого модифицирует.
Синтаксис:
__align(n)
Здесь n для локальных переменных может принимать значения 1, 2, 4 или 8. Для глобальных переменных n может иметь любое значение до 0x80000000, лишь бы оно было результатом степени числа 2.
Ключевое слово __align полезно использовать, когда по умолчанию используется выравнивание в памяти, меньшее необходимого n. Выравнивание на 8 байт может дать значительный прирост производительности при использовании инструкций VFP.
Пример выравнивания адреса массива на 4 байта:
__align(4) uint8_t myArray[10];
[Ограничения __align]
Из-за того, что директива __align относится к классу модификаторов хранения, она не может использоваться в следующих случаях:
• Для типов, определенных через typedef, и в определениях структур. • Для параметров функций.
Еще примеры использования __align:
__align(8) char buffer[128]; // buffer начнется с адреса, нацело делящегося на 8
void foo(void)
{
...
__align(16) int i; // это значение выравнивания недопустимо, потому что
// применено к локальной переменной
...
}
__align(16) int i; // допустимо, поскольку это глобальная переменная
[Ссылки]
1. Keil __align keyword site:keil.com. 2. Keil: ключевое слово __packed. |