Перейти к содержанию
    

Запись 16bit word по нечетному адресу

*(char*)0x20000001=0xFF;

 

*(short*)0x20000001=0x8888;

 

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

 

Кто нибудь может обьяснить чья это "фича" - ARMа или Кейла?

И самое главное как это обойти - массивы в памяти выделяются динамически

и гарантировать что в ходе выполнения программы адрес short будет четным

никак(((.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Все memory allocator'ы выделяют "выровненные" блоки памяти. Можешь у себя это проверить выделив два блока памяти размером в байт и посмотреть на адреса соответствующих pointer'ов.

2. Если уж очень надо читать с невыровненного адреса существует специальный модификатор (по крайней мере в EVC++) - __unaligned, например - WORD __unaligned *pwD. Он нормально (только медленнее) читает с любого адреса.

 

Насчет Keil и прочих - не в курсе, но наверное есть что-то похожее

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто нибудь может обьяснить чья это "фича" - ARMа или Кейла?

ARM.

И самое главное как это обойти - массивы в памяти выделяются динамически

и гарантировать что в ходе выполнения программы адрес short будет четным

никак(((.

А полученный указатель всегда будет выровнен на машинное слово и иметь размер не менее машинного слова. Делать менеджер памяти с другим поведением наверное никому еще в голову не пришло :-)

ввиду абсолютно ненужных хлопот и ненужных проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

минимальный блок памяти у malloc намного больше чем 2 байта, так что выделенная память будет выравнена как минимум байт на 8.

ARM не умеет читать HALF WORD (16 бит) и WORD (32 бит) с невыравненных адресов, вернее младшие биты просто игнорируются.

 

__unaligned просто будет читать по байтам и преобразовывать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...