|
|
  |
Выравнивание переменных в Cortex-M, Не могу понять какие операции разрешены |
|
|
|
May 3 2016, 16:55
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Изучаю документацию на STM32F0 и никак не могу из нее понять, какое выравнивание поддерживают ядра Cortex M0 и M3 В Programming manual Cortex-M0 сказано: Цитата 3.3.4 Address alignment An aligned access is an operation where a word-aligned address is used for a word, or multiple word access, or where a halfword-aligned address is used for a halfword access. Byte accesses are always aligned. There is no support for unaligned accesses on the Cortex-M0 processor. Any attempt to perform an unaligned memory access operation results in a HardFault exception. и в описании команд LDR and STR: Цитата The computed memory address must be divisible by the number of bytes in the load or store так вот совсем непонятно, если байтовый доступ всегда выровненный и есть команды загрузки байта LDRB and STRB, то как они работают? Наглядных картинок с примерами, которые обычно видел при изучении других архитектур, чего-то не нашел. Ядро Cortex-M3 вроде позволяет кое-какой невыровненный доступ, но опять, какой именно, мне не понятно. Может есть еще документы, где это подробно расписано?
|
|
|
|
|
May 4 2016, 20:12
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Почитал посоветованного Джозефа Ю, у него описано несколько подробней, стало понятней. Остались неясности работы ядер Cortex-M0 и M3 с 8-и битными данными. Для обоих ядер сказано, что такие данные всегда выровненные. Правильно ли я понимаю, что команды LDRB и STRB в регистры ядра загружают байт данных всегда в младший байт регистра, при этом в оперативной или флеш памяти могут читать/писать любой байт из 4-х из 32-разрядного машинного слова. И при этом не портить другие байты слова. Т.е. выборка нужного байта из слова в памяти и сдвиг его в младший байт в регистре происходит автоматически внутри ядра? И запись в обратном порядке также? Все это несколько непонятно из-за того, что в ARMе команды могут быть или 16 или 32 разрядными и младший бит адреса используется для задания длины команды. А при работе с байтами он вроде бы нужен, и происходит нестыковка в моей голове
|
|
|
|
|
May 5 2016, 04:50
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Baser @ May 5 2016, 02:12)  Правильно ли я понимаю, что команды LDRB и STRB в регистры ядра загружают байт данных всегда в младший байт регистра, при этом в оперативной или флеш памяти могут читать/писать любой байт из 4-х из 32-разрядного машинного слова. И при этом не портить другие байты слова. Т.е. выборка нужного байта из слова в памяти и сдвиг его в младший байт в регистре происходит автоматически внутри ядра? И запись в обратном порядке также? Вы хотя-бы разок откройте любой листинг файл, сгенерённый компилятором и посмотрите что получается при операциях с байтовыми данными. Многие вопросы сразу отпадут. Есть разница между LDRB и LDRSB. Во втором случае происходит знаковое расширение байта до 32-бит. В первом - беззнаковое. Цитата(Baser @ May 5 2016, 02:12)  Все это несколько непонятно из-за того, что в ARMе команды могут быть или 16 или 32 разрядными и младший бит адреса используется для задания длины команды. А при работе с байтами он вроде бы нужен, и происходит нестыковка в моей голове  " Смешались в кучу люди, кони..." Во-первых - мл.бит адреса команд в Cortex-M всегда ==1. Хоть для команд работающих с байтами, хоть для всех остальных. Он может быть 0 или 1 в классических ARM7/9. И зависит от него не разрядность обрабатываемых данных, а всего лишь длина команд - 16 или 32 бита (в ARM7/9 все команды или 16 или 32 бита). И переключается это переключением режима CPU. А Cortex-M одновременно декодирует и 16- и 32-битные команды в одном потоке. Но к разрядности считываемых/обрабатываемых/записываемых данных это вообще никакого отношения не имеет. В ARM7/9 в режиме Thumb разрядность РОН всё равно остаётся ==32 бита, но ограничиваются возможности адресации РОН (большая часть команд не могут адресовать старшие регистры). А этот мл.бит адреса имеет такой функционал только при выборке команд, к выборке данных это никак не относится.
|
|
|
|
|
May 5 2016, 06:07
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(jcxz @ May 5 2016, 08:50)  ... "Смешались в кучу люди, кони..." ... Знакомые слова.
|
|
|
|
|
May 5 2016, 08:44
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(aaarrr @ May 5 2016, 00:09)  Правильно. Спасибо за подтверждение  Цитата(jcxz @ May 5 2016, 07:50)  Вы хотя-бы разок откройте любой листинг файл, сгенерённый компилятором и посмотрите что получается при операциях с байтовыми данными. Многие вопросы сразу отпадут. Ну таки могли бы сказать, прав я в своих рассуждениях или нет.  До листинга обязательно доберусь, а пока читаю документацию. Хотел в официальных доках найти описание этих моментов, но пока не нашел - приходится догадываться и спрашивать. Цитата(jcxz @ May 5 2016, 07:50)  А этот мл.бит адреса имеет такой функционал только при выборке команд, к выборке данных это никак не относится. Вот за это разъяснение спасибо. Так примерно и предполагал, хотелось подтверждения. Еще вопрос: А компиляторам (IAR или gcc) в проектах с включенным режимом работы для Cortex-M0 нужно в явном виде задавать выравнивание short и long при объявлении глобальных переменных, или они это сами автоматом делают также как и для структур? Типа: Код char a; #pragma data_alignment=2 short b; char c; #pragma data_alignment=4 long d; указание выравнивания b и d избыточно?
|
|
|
|
|
May 6 2016, 15:56
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(Baser @ May 5 2016, 11:44)  Хотел в официальных доках найти описание этих моментов, но пока не нашел... Вот еще полезный документ: ARMv6-M_Architecture_Reference_Manual (DDI0419C) Это для Cortex-M0. В нем хотя бы опкоды команд приведены и поля опкодов расписаны - гораздо наглядней, чем просто описание словами в документе от STM. Но про выравнивание, так как я спрашивал, для начинающих, тоже не пишут. Считают, что это общеизвестно. Вот еще цитата из Джозефа Ю для Cortex-M3, который поддерживает невыровненный доступ: Цитата Любое обращение к невыровненным данным преобразуется интерфейсом шины в последовательность из нескольких выровненных пересылок, причём это преобразование является абсолютно прозрачным для пользователя. Поскольку при любом обращении к невыровненным данным в действительности осуществляется несколько пересылок, то для выполнения такой операции требуется большее число тактов, что в ряде случаев может оказаться нежелательным. Следовательно, для достижения максимальной производительности лучше всё же выpaвнивать данные соответствующим образом.
|
|
|
|
|
May 6 2016, 18:36
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Baser @ May 6 2016, 21:56)  ARMv6-M_Architecture_Reference_Manual (DDI0419C) Это для Cortex-M0. В нем хотя бы опкоды команд приведены и поля опкодов расписаны - гораздо наглядней, чем просто описание словами в документе от STM. Но про выравнивание, так как я спрашивал, для начинающих, тоже не пишут. Считают, что это общеизвестно. В смысле не пишут? Читать пробовали? Cortex-M0/M1: "ARMv6-M Architecture Reference Manual" параграф A3.2 "Alignment support": ARMv6-M always generates a fault when an unaligned access occurs.Cortex-M3: "ARMv7-M Architecture Reference Manual" параграф тот же. Инфа по всем ядрам есть на http://infocenter.arm.com/help/index.jsp Официальная инфа, а не вольные изложения.
|
|
|
|
|
May 6 2016, 19:38
|

Просто Che
    
Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881

|
Цитата(jcxz @ May 6 2016, 21:36)  В смысле не пишут? Читать пробовали? Пробовал. Не пишут То, что я конкретно выше спрашивал: Цитата(Baser @ May 4 2016, 23:12)  команды LDRB и STRB <...> в оперативной или флеш памяти могут читать/писать любой байт из 4-х из 32-разрядного машинного слова. И при этом не портить другие байты слова. Т.е. выборка нужного байта из слова в памяти и сдвиг его в младший байт в регистре происходит автоматически внутри ядра. И запись в обратном порядке также. У разработчиков АРМ считается само собой разумеющимся и разъяснению не подлежащим Есть там описание функционирования команд на псевдокоде, но правильная интерпретация нюансов псевдокода еще та задачка...
|
|
|
|
|
May 6 2016, 21:13
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Baser @ May 7 2016, 01:38)  То, что я конкретно выше спрашивал: У разработчиков АРМ считается само собой разумеющимся и разъяснению не подлежащим  Честно говоря не понимаю, как можно прочитать, что команда сохраняет байт и думать, что она почему-то портит соседние 3 байта??? Из чего можно вывести такое предположение? Ведь в описании STRB явно говорится сохранение байта что тут ещё может быть неясно?? Адресация памяти в ARM побайтная, а не пословная. Прочитайте описание конкретных команд. Там для некоторых явно указывается на какие операции чтения/записи распадается операция невыровненного доступа к памяти.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|