Keil: выравнивание адреса переменных |
![]() |
Добавил(а) microsin |
В некоторых случаях бывает необходимо обеспечить условие выравнивания адреса начала в памяти какой-либо переменной или массива. Например, такое может понадобиться в случае записи данных в память 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. |