скомпилировать кодек AMR-nb с помощью RVCT для WinCE / Window Mobile - PullRequest
2 голосов
/ 26 апреля 2009

Я работаю над речевым кодеком amr (портирование / оптимизация) У меня есть версия, оптимизированная для голоса (для WinCE), из Voiceage, и я использую ее в качестве эталона при тестировании производительности. Пока что бинарный файл, созданный с моей библиотекой, превосходит другой примерно на 20-30%! Я использую Vs2008, и у меня ограниченный доступ к набору команд ARM, который я могу сгенерировать с помощью компилятора Microsoft. Поэтому я попытался найти альтернативный компилятор, чтобы увидеть разницу в производительности. У меня есть компилятор RVCT, но он создает двоичные файлы / объектные файлы. Однако я запускаю тест на мобильном телефоне Wince (TyTn 2), поэтому мне нужно найти способ запуска кода, скомпилированного с помощью RVCT, на WinCE. Некоторые из вариантов 1) составить список сборок (опция -cc для armcc) и попытаться собрать с другим ассемблером, который может создать COFF (MS-ассемблер для arm) 2) скомпилировать и преобразовать сгенерированный объектный файл ELF в объект COFF (кажется, что objcopy из gnu binutils может помочь мне в этом) 3) используя утилиту fromelf, поставляемую RVCT, создайте BIN-файл и попытайтесь каким-либо образом манипулировать битами, чтобы я мог их выполнить;)

Моя первая попытка - создать простой файл c ++ с одной экспортированной функцией, скомпилировать его с помощью RVCT, а затем попытаться запустить эту функцию на смартфоне. Излучаемая сборка не может быть собрана ассемблером ms (не только они несовместимы, но и ассемблер ms отклоняет некоторые инструкции, сгенерированные с помощью компилятора RVCT; в моем случае код операции ASR) Затем я попытался преобразовать объект ELF в формат coff и не могу найти какую-либо информацию об этом. Существует порт gcc для ce, и objcopy из этого набора инструментов должен выполнять эту задачу. Тем не менее, я не могу заставить его работать. Я пробовал разные ключи, но я понятия не имею, что именно мне нужно указать в качестве bfdname для формата ввода и вывода. Так что я тоже не смог заставить его работать. Дамп с помощью fromelf и использование сгенерированного файла bin кажутся излишними, поэтому я решил спросить вас, ребята, есть ли что-то, что я должен попытаться сделать, или, может быть, кто-то уже выполнил аналогичную задачу и может мне помочь. По сути, все, что я хочу сделать, - это скомпилировать мой код с помощью компилятора RVCT и посмотреть, в чем разница в производительности. Мой код имеет нулевую зависимость от любых функций времени выполнения c.

спасибо!

Ответы [ 2 ]

0 голосов
/ 12 июня 2010

Вы упоминаете, что используете Vs2008 и " ... У меня ограниченный доступ к набору команд ARM, который я могу сгенерировать с помощью компилятора Microsoft. Поэтому я попытался найти альтернативный компилятор ..."

(при условии, что вы можете настроить таргетинг на WM7 ...) Я рекомендую вам попробовать последний CTP SDK для Windows Mobile 7 (см. здесь ).

Компилятор C ++ имеет огромных улучшений генерации кода по сравнению с предыдущими выпусками. И может предназначаться для последних архитектур ARM. Поверьте, качество генерации кода очень высокое.

PS: Возможно, тот факт, что я реализовал некоторые из этих функций, делает меня немного предвзятым. :)

0 голосов
/ 27 апреля 2009

Просто обновление ... Я собрал GNU binutils с поддержкой arm-pe и arm-elf. конвертировать армия-эльф в арм-кофф: objcopy.exe -I elf32-littlearm -O pe-arm-wince-little test.o test.obj

Теперь test.obj содержит ту же функцию: int add (int, int); проблема в том, что компилятор ms отклоняет файл test.obj: test.obj: фатальная ошибка LNK1136: неверный или поврежденный файл

Я также попробовал другой подход. Я преобразовал test.o в формат symbolsrec (я понятия не имею об этом формате, но он работает только один), а затем я преобразовал сгенерированный файл в arm-pe. В этом случае компилятор ms связан с сгенерированным test.obj, но сгенерированный машинный код недействителен. Я также скомпилировал test.cpp с gcc-ce и попытался связать его с сгенерированным файлом .obj, и в этом случае все заработало. Вот код сборки, показанный в отладчике VS:

        int X2 = add(X, Y);
00012068  ldr         r1, Y, #0x28 
0001206C  ldr         r0, X, #0x2C 
00012070  bl          00011000 

В случае, когда мне удалось связать преобразованный файл obj, это выглядело так:

        int X2 = add(X, Y);
00011068  ldr         r1, Y, #0x28 
0001106C  ldr         r0, X, #0x2C 
00011070  bl          |WinMain + 0xfffff000 ( 10000h )| 

В этой последней инструкции она переходит в какое-то случайное место, которое не имеет ничего общего с моей int add (int, int); функцией.

...