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

 
 
> Запись 16bit word по нечетному адресу
dimitryl
сообщение May 12 2006, 10:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 13-11-05
Пользователь №: 10 786



*(char*)0x20000001=0xFF;

*(short*)0x20000001=0x8888;

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

Кто нибудь может обьяснить чья это "фича" - ARMа или Кейла?
И самое главное как это обойти - массивы в памяти выделяются динамически
и гарантировать что в ходе выполнения программы адрес short будет четным
никак(((.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
sergeeff
сообщение May 12 2006, 11:06
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

Насчет Keil и прочих - не в курсе, но наверное есть что-то похожее
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 12 2006, 11:30
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
KRS
сообщение May 12 2006, 11:53
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



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

__unaligned просто будет читать по байтам и преобразовывать...
Go to the top of the page
 
+Quote Post
dimitryl
сообщение May 12 2006, 12:08
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 13-11-05
Пользователь №: 10 786



Модификатор для кейла - __packed.

большое спасибо всем ответившим.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:42
Рейтинг@Mail.ru


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