Портируем проект с пальмы на поцкет. На пальмах включая всякие сони и тунгстены на армах/моторолах все прекрасно работает. Собирается кодевориером. Сейчас перегнали все на evc++ ver.3. В емуляторе все замечательно работает, а вот на девайсе нет ;( Смотрю где валится ldr r1, [r0] в r0 нечетный адрес, читается само собой лонг. Если делать выравнивание больше чем один, то не работает уже сразу вся апликуха. Причем грабли на каждом шагу. Кода очень много (почти 3мб) и перелопачивать его весь нет времени. Какие есть идеи?
Здравствуйте, pashtet_, Вы писали:
_>Портируем проект с пальмы на поцкет. На пальмах включая всякие сони и тунгстены на армах/моторолах все прекрасно работает. Собирается кодевориером. Сейчас перегнали все на evc++ ver.3. В емуляторе все замечательно работает, а вот на девайсе нет ;( Смотрю где валится ldr r1, [r0] в r0 нечетный адрес, читается само собой лонг. Если делать выравнивание больше чем один, то не работает уже сразу вся апликуха. Причем грабли на каждом шагу. Кода очень много (почти 3мб) и перелопачивать его весь нет времени. Какие есть идеи?
Наверное все-таки придется "перелопачивать" и выравнивать ручками
насколько я помню на Palm (на мотороловских процах) должно быть выравнивание по 2, на армах = 4, тк эмулятор не эмулирует процессор, то там будет работать при обращении по любому (чет/нечет, по фигу) адресу, но так как у вас работает на армовских палмах, сдается мне, что проблема где-то в коде специфичном для ppc
>Кода очень много (почти 3мб)
сочувствую, как на Palm-то влезло?
Здравствуйте, AlexZu, Вы писали:
AZ>Наверное все-таки придется "перелопачивать" и выравнивать ручками AZ>насколько я помню на Palm (на мотороловских процах) должно быть выравнивание по 2, на армах = 4, тк эмулятор не эмулирует процессор, то там будет работать при обращении по любому (чет/нечет, по фигу) адресу, но так как у вас работает на армовских палмах, сдается мне, что проблема где-то в коде специфичном для ppc
вот этим и занимаюсь точнее пробую некоторые структуры сделать так, что бы не выравнивал.
>>Кода очень много (почти 3мб) AZ>сочувствую, как на Palm-то влезло?
_>вот этим и занимаюсь точнее пробую некоторые структуры сделать так, что бы не выравнивал.
Может вы не в курсе, но сильно могут помочь макросы, за которыми сокрыты pragma для выравнивания для соотв. платформ (и EVC и CodeWarrior имеют их в наличии), применяя их к структурам можно значительно облегчить себе жизнь.
для xscale (и arm тоже) с выравниванием в 16байт ты имеешь ввиду? memcpy это как вариант, но для структур запросто, да и удобнее использовать #pragma pack(). memcpy использовал тоже, но в структуру же ты целиком все равно не скопируешь? а вот "натянуть" упакованную структуру запросто.
MS>для девайса с процессором arm помогло тока memcpy.
_>>ну вообще-то #pragma pack() рулит в таком случае, что бы код портируемый не переделывать
Как раз вчера решал данную проблему Вспоминал всех разработчиков железа: "Ну кто так строит" (с)...
Открываешь хелп к 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 модификатор, он говорит копилятору, что даные не выровнены и надо обращаться к этим данным особым способом(в доке описано каким именно).