Здравствуйте, гость ( Вход | Регистрация )
igor_bogomolov | Дата 30.8.2012, 10:09 |
Ссылок, к сожалению, нет. И на этом спасибо. На самом деле очень помог, что бы объяснить происходящее.Я вот такую вот ссылочку (тык) нашел описывающую данную ситуацию. Может еще кому-нибудь интересно будет. |
|
iReset | Дата 30.8.2012, 9:58 |
Если у тебя есть ссылка на какую-нибудь оф. документацию, где описано такое поведение, было бы очень здорово. Ссылок, к сожалению, нет. Быстрый Google-поиск по фразе "unaligned pointer ARM" дал в результате ссылку на оф.сайт ARM - Unaligned pointers. Надеюсь, поможет. |
|
igor_bogomolov | Дата 30.8.2012, 8:26 |
Для выяснения берем и выводим на печать на обоих платформах sizeof(unsigned short) Это я конечно же делал. sizeof(unsigned short) одинаков на обоих платформах и равен 2.Дело в выравнивании адресов на ARM. Т.е. каждый тип должен лежать по адресу, кратному его размеру. При невыровненном доступе будут ошибки чтения. При преобразовании char* к ushort* получается именно такая ситуация. Ок, спасибо. Если тебе действительно нужно такое преобразование, используй memcpy для копирования 2 байт во временную переменную, как бы странно это ни звучало. Просто получилась такая ситуация. Разработали некую железку для заказчика с arm'овским процессором на борту. У них есть некий код, который они давно используют и который, якобы (по их мнению), хорошо работает. А на нашей железке этот код не работает, из-за таких вот преобразований, показанных выше. Мне теперь нужно грамотно обосновать, из-за чего такое различие. Иначе считается, что наше оборудование не работает. Если у тебя есть ссылка на какую-нибудь оф. документацию, где описано такое поведение, было бы очень здорово. |
|
iReset | Дата 30.8.2012, 6:38 |
Дело в выравнивании адресов на ARM. Т.е. каждый тип должен лежать по адресу, кратному его размеру. При невыровненном доступе будут ошибки чтения. При преобразовании char* к ushort* получается именно такая ситуация. Если тебе действительно нужно такое преобразование, используй memcpy для копирования 2 байт во временную переменную, как бы странно это ни звучало. |
|
maint | Дата 30.8.2012, 3:57 |
Для выяснения берем и выводим на печать на обоих платформах sizeof(unsigned short). | |
igor_bogomolov | Дата 29.8.2012, 20:31 |
Всем привет. Понимаю, что название темы кажется странным, но тем не менее... Имеем такой код (синтетический тест воспроизводящий проблему) Компилируем для платформы x86, получаем вполне ожидаемый выводЦитата 01:00:02:00:03:00:04:00:05:00: Компилирую для arm (-mcpu=arm926ej-s -march=armv5te), получаю следущее0001:0002:0003:0004:0005: abaa:acab:01ac:0001: Цитата 01:00:02:00:03:00:04:00:05:00: 01ac:0200:0300:0400:0500: abaa:abaa:01ac:01ac: Как можно объяснить такой вывод, и, самое главное, как заставить именно этот код вести себя ожидаемо (как на x86)? * Важный момент, что размер массива нечётный. При выравнивании 1, если сразу объявить еще один такой же массив и повторить для него те же действия, вывод для него будет отличаться, но всё равно не будет правильным (т.е. таким же как на x86). |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 20.4.2024, 8:42 |