Цитата(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 бита, но ограничиваются возможности адресации РОН (большая часть команд не могут адресовать старшие регистры).
А этот мл.бит адреса имеет такой функционал только при
выборке команд, к
выборке данных это никак не относится.