Выравнивание на PocketPC
От: pashtet_ Беларусь  
Дата: 16.10.03 12:17
Оценка:
Портируем проект с пальмы на поцкет. На пальмах включая всякие сони и тунгстены на армах/моторолах все прекрасно работает. Собирается кодевориером. Сейчас перегнали все на evc++ ver.3. В емуляторе все замечательно работает, а вот на девайсе нет ;( Смотрю где валится ldr r1, [r0] в r0 нечетный адрес, читается само собой лонг. Если делать выравнивание больше чем один, то не работает уже сразу вся апликуха. Причем грабли на каждом шагу. Кода очень много (почти 3мб) и перелопачивать его весь нет времени. Какие есть идеи?
Re: Выравнивание на PocketPC
От: AlexZu Россия  
Дата: 16.10.03 12:50
Оценка:
Здравствуйте, pashtet_, Вы писали:

_>Портируем проект с пальмы на поцкет. На пальмах включая всякие сони и тунгстены на армах/моторолах все прекрасно работает. Собирается кодевориером. Сейчас перегнали все на evc++ ver.3. В емуляторе все замечательно работает, а вот на девайсе нет ;( Смотрю где валится ldr r1, [r0] в r0 нечетный адрес, читается само собой лонг. Если делать выравнивание больше чем один, то не работает уже сразу вся апликуха. Причем грабли на каждом шагу. Кода очень много (почти 3мб) и перелопачивать его весь нет времени. Какие есть идеи?


Наверное все-таки придется "перелопачивать" и выравнивать ручками
насколько я помню на Palm (на мотороловских процах) должно быть выравнивание по 2, на армах = 4, тк эмулятор не эмулирует процессор, то там будет работать при обращении по любому (чет/нечет, по фигу) адресу, но так как у вас работает на армовских палмах, сдается мне, что проблема где-то в коде специфичном для ppc

>Кода очень много (почти 3мб)

сочувствую, как на Palm-то влезло?
Re[2]: Выравнивание на PocketPC
От: pashtet_ Беларусь  
Дата: 16.10.03 13:00
Оценка:
Здравствуйте, AlexZu, Вы писали:

AZ>Наверное все-таки придется "перелопачивать" и выравнивать ручками

AZ>насколько я помню на Palm (на мотороловских процах) должно быть выравнивание по 2, на армах = 4, тк эмулятор не эмулирует процессор, то там будет работать при обращении по любому (чет/нечет, по фигу) адресу, но так как у вас работает на армовских палмах, сдается мне, что проблема где-то в коде специфичном для ppc

вот этим и занимаюсь точнее пробую некоторые структуры сделать так, что бы не выравнивал.

>>Кода очень много (почти 3мб)

AZ>сочувствую, как на Palm-то влезло?

3мб это исходники. бинарник на 700кб.
Re[3]: Выравнивание на PocketPC
От: AlexZu Россия  
Дата: 16.10.03 13:15
Оценка:
Здравствуйте, pashtet_, Вы писали:


_>вот этим и занимаюсь точнее пробую некоторые структуры сделать так, что бы не выравнивал.

Может вы не в курсе, но сильно могут помочь макросы, за которыми сокрыты pragma для выравнивания для соотв. платформ (и EVC и CodeWarrior имеют их в наличии), применяя их к структурам можно значительно облегчить себе жизнь.

Удачи
Re: Выравнивание на PocketPC
От: MegaSharp Украина  
Дата: 03.11.03 17:33
Оценка:
функция memcpy рулит!
Re[2]: Выравнивание на PocketPC
От: pashtet_ Беларусь  
Дата: 03.11.03 18:37
Оценка:
Здравствуйте, MegaSharp, Вы писали:

MS>функция memcpy рулит!


ну вообще-то #pragma pack() рулит в таком случае, что бы код портируемый не переделывать
Re[3]: Выравнивание на PocketPC
От: MegaSharp Украина  
Дата: 03.11.03 18:46
Оценка:
для девайса с процессором arm помогло тока memcpy.



_>ну вообще-то #pragma pack() рулит в таком случае, что бы код портируемый не переделывать
Re[4]: Выравнивание на PocketPC
От: pashtet_ Беларусь  
Дата: 03.11.03 19:18
Оценка:
для xscale (и arm тоже) с выравниванием в 16байт ты имеешь ввиду? memcpy это как вариант, но для структур запросто, да и удобнее использовать #pragma pack(). memcpy использовал тоже, но в структуру же ты целиком все равно не скопируешь? а вот "натянуть" упакованную структуру запросто.

MS>для девайса с процессором arm помогло тока memcpy.


_>>ну вообще-то #pragma pack() рулит в таком случае, что бы код портируемый не переделывать
Re: Выравнивание на PocketPC
От: gwg-605 Россия  
Дата: 05.11.03 08:26
Оценка:
Как раз вчера решал данную проблему Вспоминал всех разработчиков железа: "Ну кто так строит" (с)...

Открываешь хелп к eVC++, и ищешь слово "Alignment" в "Microprocessor Reference". Там все написано.

Это пример моего кода где вылезала проблема и которая была решена.
UNALIGNED AVI_LIST* pEnd = (AVI_LIST*)(m_bufferforheader.GetPointer() + avi_header.root_list.dwDataSize) ;
...
if( pList->dwSign == AVIFORMAT_LIST ) { // без UNALIGNED здесь может вываливаться эксепшен, с UNALIGNED нет
    ...
}


Здесь главное UNALIGNED модификатор, он говорит копилятору, что даные не выровнены и надо обращаться к этим данным особым способом(в доке описано каким именно).

Удачи,
Валерий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.