ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
268246 Топик полностью
мохоноги (21.08.2011 00:01 - 00:37, просмотров: 79) ответил мохоноги на Выравнивание в ARMv7-M, или почему ALIGN(4)?Я начинаю работать с LPC1766, использую GCC и пытаюсь разобраться в необходимости выравнивания секций кода/данных/стека. На данный момент пришёл к следующему выводу:код выравнивать по слову,данные --
Всем -- спасибо за комментарии. Пользуясь возможностями зарегистрированного пользователя, сохраню на будущее читабельную версию первого поста в теме. 
В архитектуре 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): a >= 128, 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.