Russian Qt Forum
Сентябрь 30, 2024, 20:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: двухбайтное число в quint16  (Прочитано 12503 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #15 : Февраль 16, 2015, 18:08 »

Есть куча армов, которые не могут обращаться по не выравненным адресам. Вместо доступа будет генерироваться прерывание.
Для правильного доступа, нужно что бы оперант в памяти был выравнен на свою длину, т.е. хотим читать 16 битное число из памяти, оно должно быть выравненно на 2 байта, если 32 битное - то на 4. Нет получи прерывание. Конечно можно самому эмулировать чтение через побайтовое, но это лишние такты.
Зная это, компиляторы генерируют правильный код, пока программист не дотягивается до ручного привидения типов, там компилятор становится бессильным и программист должен все контроллировать сам.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Февраль 16, 2015, 19:06 »

Да, действительно, juvf прав, есть такие звери. Вот нашел популярное описание
http://www.aleph1.co.uk/chapter-10-arm-structured-alignment-faq
Причем да, могут и "втихаря" неверно читать/писать. Признаю - был неправ  Улыбающийся
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #17 : Февраль 16, 2015, 19:08 »

проверил на дэсктопе код
Код:
    char ch[8] = {1,2,3,4,5,6,7,8};
   uint16_t n = *(reinterpret_cast<uint16_t*>(ch + 1));
в результате n = 770, т.е. т = 0x0302, то что доктор прописал. Процессор i7, винда7, 64х. без всяких прагм заработало.

Запустил этот код на девайсе с процессором AT91SAM7S256 (ARM архитектура) - на строке с reinterpret_cast процессор завис. печалька.

Ну да ладно.... SAM7 наверно мифический.... собрал такой код в UC-8410 (процессор Intel XScale IXP435, ARM-архитектура)

Код:
int main()
{
std::cout << "n= " << std::endl;
    char ch[8] = {1,2,3,4,5,6,7,8};
   uint16_t n = *(reinterpret_cast<uint16_t*>(ch + 1));
std::cout << "n = " << (int)n <<std::endl
Запускаю.... смотрю выхлоп
Код:
root@gp1:/home/juvf# ./test2
n=
n = 258
от куда 258? должно быть 0х0302, что есть 770.  Непонимающий .... а 258 - это есть 0х0201. Как так?! Я же указывал адрес ch + 1, и   reinterpret_cast работает строго с указанным адресом...... так так так... пробуем исправить положение прагмой..... а не вышло.... выхлоп такой же... 258 вместо 770.
 

Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #18 : Февраль 16, 2015, 19:16 »

Причем да, могут и "втихаря" неверно читать/писать. Признаю - был неправ  Улыбающийся
Да да да.... Самое печальное, что некоторые именно втихаря. Ладно сам7 сразу завис. А так втихоря уйдет в сторону.... замучаешься искать.  Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Февраль 17, 2015, 09:51 »

Запустил этот код на девайсе с процессором AT91SAM7S256 (ARM архитектура) -
..
... собрал такой код в UC-8410 (процессор Intel XScale IXP435, ARM-архитектура)
У Вас там что, тазик с процессорами ? Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 23.