Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись 16bit word по нечетному адресу
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
dimitryl
*(char*)0x20000001=0xFF;

*(short*)0x20000001=0x8888;

кладется по адресу 0x20000000 и 0x20000001.(((

Кто нибудь может обьяснить чья это "фича" - ARMа или Кейла?
И самое главное как это обойти - массивы в памяти выделяются динамически
и гарантировать что в ходе выполнения программы адрес short будет четным
никак(((.
sergeeff
1. Все memory allocator'ы выделяют "выровненные" блоки памяти. Можешь у себя это проверить выделив два блока памяти размером в байт и посмотреть на адреса соответствующих pointer'ов.
2. Если уж очень надо читать с невыровненного адреса существует специальный модификатор (по крайней мере в EVC++) - __unaligned, например - WORD __unaligned *pwD. Он нормально (только медленнее) читает с любого адреса.

Насчет Keil и прочих - не в курсе, но наверное есть что-то похожее
zltigo
Цитата(dimitryl @ May 12 2006, 13:17) *
Кто нибудь может обьяснить чья это "фича" - ARMа или Кейла?

ARM.
Цитата
И самое главное как это обойти - массивы в памяти выделяются динамически
и гарантировать что в ходе выполнения программы адрес short будет четным
никак(((.

А полученный указатель всегда будет выровнен на машинное слово и иметь размер не менее машинного слова. Делать менеджер памяти с другим поведением наверное никому еще в голову не пришло :-)
ввиду абсолютно ненужных хлопот и ненужных проблем.
KRS
минимальный блок памяти у malloc намного больше чем 2 байта, так что выделенная память будет выравнена как минимум байт на 8.
ARM не умеет читать HALF WORD (16 бит) и WORD (32 бит) с невыравненных адресов, вернее младшие биты просто игнорируются.

__unaligned просто будет читать по байтам и преобразовывать...
dimitryl
Модификатор для кейла - __packed.

большое спасибо всем ответившим.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.