реклама на сайте
подробности

 
 
> Выравнивание переменных в Cortex-M, Не могу понять какие операции разрешены
Baser
сообщение May 3 2016, 16:55
Сообщение #1


Просто 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 вроде позволяет кое-какой невыровненный доступ, но опять, какой именно, мне не понятно.
Может есть еще документы, где это подробно расписано?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Baser
сообщение May 4 2016, 20:12
Сообщение #2


Просто Che
*****

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



Почитал посоветованного Джозефа Ю, у него описано несколько подробней, стало понятней.

Остались неясности работы ядер Cortex-M0 и M3 с 8-и битными данными.
Для обоих ядер сказано, что такие данные всегда выровненные.
Правильно ли я понимаю, что команды LDRB и STRB в регистры ядра загружают байт данных всегда в младший байт регистра,
при этом в оперативной или флеш памяти могут читать/писать любой байт из 4-х из 32-разрядного машинного слова. И при этом не портить другие байты слова.
Т.е. выборка нужного байта из слова в памяти и сдвиг его в младший байт в регистре происходит автоматически внутри ядра? И запись в обратном порядке также?


Все это несколько непонятно из-за того, что в ARMе команды могут быть или 16 или 32 разрядными и младший бит адреса используется для задания длины команды. А при работе с байтами он вроде бы нужен, и происходит нестыковка в моей голове sm.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 5 2016, 04:50
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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 разрядными и младший бит адреса используется для задания длины команды. А при работе с байтами он вроде бы нужен, и происходит нестыковка в моей голове sm.gif

"Смешались в кучу люди, кони..."
Во-первых - мл.бит адреса команд в Cortex-M всегда ==1. Хоть для команд работающих с байтами, хоть для всех остальных.
Он может быть 0 или 1 в классических ARM7/9. И зависит от него не разрядность обрабатываемых данных, а всего лишь длина команд - 16 или 32 бита (в ARM7/9 все команды или 16 или 32 бита). И переключается это переключением режима CPU.
А Cortex-M одновременно декодирует и 16- и 32-битные команды в одном потоке.
Но к разрядности считываемых/обрабатываемых/записываемых данных это вообще никакого отношения не имеет. В ARM7/9 в режиме Thumb разрядность РОН всё равно остаётся ==32 бита, но ограничиваются возможности адресации РОН (большая часть команд не могут адресовать старшие регистры).
А этот мл.бит адреса имеет такой функционал только при выборке команд, к выборке данных это никак не относится.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 10:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016