ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
267090
мохоноги (15.08.2011 05:39, просмотров: 7686)
Выравнивание в ARMv7-M, или почему ALIGN(4)?Я начинаю работать с LPC1766, использую GCC и пытаюсь разобраться в необходимости выравнивания секций кода/данных/стека. На данный момент пришёл к следующему выводу:код выравнивать по слову,данные -- также по слову,адрес начала стека устанавливать кратным 8-ми байтам.Прошу прокомментировать, исходя из опыта работы. Теоретический минимум я уже прошёл:В архитектуре ARM-v7M размер слова (word) равен 4-ём байтам (32-м битам).Соответственно:- размер полуслова (halfword): 2 байта (16 бит),- размер двойного слова (doubleword): 8 байт (64 бита).Примем, что термин "выровненный по N" описывает данные/инструкции,располагающиеся по адресу, значение которого делится без остатка наколичество байт в N.Например, "выровненный по слову" (т.е. выровненный по 4-ём байтам) означает"располагающийся по адресу, делящемуся без остатка на 4".Примем, что "выровненный доступ к данным" или "доступ к выровненным данным"(под доступом понимается считывание/запись) -- это:- доступ к байту, выровненному по байту (т.о. доступ к байту всегда выровнен),- доступ к полуслову, выровненному по полуслову,- доступ к слову, выровненному по слову,- доступ к двойному слову, выровненному по слову,- доступ к нескольким словам, выровненным по слову.Описание архитектуры ARM-v7M (ARMv7-M Architecture Reference Manual,выпуск "Derrata 2010_Q3" от ноября 2010г.) содержит следующие утверждения овыравнивании (в скобках приведены соответствуюшие номера глав описания):- инструкция [программного кода] должна быть выровнена по полуслову (A3.2.1, A4.1, A5.1),- допускается невыровненный доступ к данным в памяти, но: - доступ к выровненным данным более оптимален/быстр (т.к. доступ к невыровненным данным выполняется в несколько шагов, преобразуясь в итоге в доступ к выровненным данным), - для некоторых инструкций доступа данные _должны_ быть выровнены (по полуслову/слову, в зависимости от инструкции) (A3.2.1), - считывание в регистр PC данных, не выровненных по слову, вызовет непредсказуемое поведение процессора (A3.2.1), - доступ к невыровненным данным в некоторых областях памяти вызовет непредсказуемое поведение процессора (A3.5.7),- адрес начала таблицы векторов исключений (прерываний) должен быть равен степени двойки: a = (2**x); степень x вычисляется, исходя из следующих требований (B1.5.3): 1. a >= 128, 2. a >= (n * 4), где n -- количество поддерживаемых исключений,- начало стека настоятельно рекомендуется выравнивать по двойному слову (B1.5.7, C.1.1) -- рекомендация проистекает из требований стандарта архитектуры ARM по вызову процедур (AAPCS).Инструкции считываются и декодируются по полуслову (A3.1, A3.2.1). 32-битныеинструкции получаются из последовательного чтения 2-х полуслов. Отсюда: коддолжен быть выровнен по полуслову.Но чуть оптимальнее (по скорости чтения) выравнивать код не по полу-, а поцелому слову. Это не нарушает требования выравнивания по полуслову (т.к.адрес, делящийся без остатка на 4, также делится без остатка на 2) иучитывает особенности функционирования подсистемы чтения инструкций:- модуль упреждающей выборки инструкций (Prefetch Unit, PFU) выбирает инструкции пословно и исключительно с адресов, кратных слову. Если, к примеру, первая исполняемая инструкция будет 32-битной, располагаясь при этом по адресу 0x302, то PFU должен будет выполнить два действия для полного считывания этой инструкции: чтение слова по адресу 0x300 и чтение слова по адресу 0x304.