почему мой код плохо работает при сборке с помощью Realview tools, но лучше с Codesourcery?

#embedded #arm #realview

#встроенный #arm #realview

Вопрос:

У меня есть проект на C, который ранее создавался с помощью цепочки инструментов gnu Codesourcery. Недавно он был преобразован для использования компилятора armcc от Realview, но производительность, которую мы получаем с помощью Realview tools, очень низкая по сравнению с тем, когда он скомпилирован с помощью gnu tools. Не должно ли быть наоборот, т. Е. он должен обеспечивать лучшую производительность при компиляции с помощью инструментов Realview? Чего мне здесь не хватает. Как я могу улучшить производительность с помощью инструментов Realview?

Также я заметил, что если я запускаю двоичный файл, созданный Realview Tools с помощью Lauterbach, он выходит из строя, но если я запускаю его с помощью Realview ICE, он работает нормально.

ОБНОВЛЕНИЕ 1

Командная строка Realview:

armcc -c —diag_style=ide —depend_format=unix_escaped —no_depend_system_headers —no_unaligned_access —c99 —arm_only —debug —gnu —cpu= ARM1136J-S —fpu= SoftVFP —apcs =/nointerwork -O3 -Otime

Командная строка GNU GCC:

arm-none-eabi-gcc -mcpu=arm1136jf-s -mlittle-endian -msoft-float -O3 -Wall

Я использую Realview Tools версии 4.1 и GCC версии 4.4.1

ОБНОВЛЕНИЕ 2

Проблема Лаутербаха решена. Это было вызвано из-за полуохостинга, поскольку SWI с полуохостингом не обрабатывался в среде Lauterbach. Перенастройка библиотеки C, чтобы избежать полухостинга, сделала свое дело, и теперь моя программа успешно работает с Lauterbach, а также с Realview ICE. Но проблема с производительностью остается такой, какая она есть.

Комментарии:

1. Какова цель? Какие версии RealView и Code Sourcery задействованы? Есть ли у вас какая-либо профилирующая информация о конкретной области, которая, по-видимому, имеет большую разницу в производительности>

2. @Micahel-Burr: Целью является процессор iMX31, то есть 1136JF-S. Realview Tools версии 4.1 и GCC версии 4.4.1. Информация о профилировании конкретной области недоступна.

3. Вы используете плавающую точку? И если да, то правильно ли вы настроили параметры компилятора для использования аппаратных средств с плавающей запятой. Также, если вы используете sqrt (), возможно, что библиотека использует программную конвергенцию, а не аппаратную инструкцию SQRT. Вам нужно правильно настроить параметры компилятора / компоновщика, чтобы избежать этого. Например, смотрите это: keil.com/support/docs/3293.htm . Вам нужно, по крайней мере, опубликовать параметры, которые вы используете для каждого компилятора, и, если возможно, какой-нибудь пример кода, демонстрирующий различную производительность.

4. @Clifford: Я не использую аппаратное обеспечение FPU, поэтому все операции с плавающей запятой основаны на программном обеспечении в обеих сборках, то есть GNU и Realview.

5. @binW: Интересный выбор для цели с FPU! VFP может в 5 раз ускорить операции FP без векторизации и в 10 раз, если ваш компилятор выполняет векторизацию или использует библиотеку, оптимизированную для векторизации.

Ответ №1:

Поскольку у вас включена оптимизация, и в некоторых средах происходит сбой, возможно, ваш код использует неопределенное поведение или другую скрытую ошибку. Такое поведение может измениться при оптимизации или даже полностью прерваться.

Я предлагаю вам попробовать обе цепочки инструментов без оптимизации и убедиться, что уровень предупреждения установлен высокий, и вы исправите их все. GCC намного лучше armcc при проверке ошибок, поэтому это разумная проверка статическим анализом. Если код собран чистым, он с большей вероятностью сработает, и оптимизатору может быть проще с ним справиться.

Ответ №2:

Вы пробовали удалить ‘—no_unaligned_access’? ARM11s обычно может выполнять нерегулируемый доступ (если включен в коде запуска), и принуждение компилятора / библиотеки не выполнять их может замедлять ваш код.

Ответ №3:

В текущей версии RVCT указано ‘—fpu =SoftVFP’:

В предыдущих выпусках RVCT, если вы указали —fpu =softvfp и процессор с неявным оборудованием VFP, компоновщик выбирал библиотеку, которая реализовывала программные вызовы с плавающей запятой с использованием инструкций VFP. Это больше не так. Если вам требуется это устаревшее поведение, используйте —fpu = softvfp vfp.

Это наводит меня на мысль, что если у вас, возможно, старая версия RVCT, поведение будет заключаться в использовании программной плавающей точки независимо от наличия аппаратной плавающей точки. Хотя в версии GNU msoft-float будет использовать аппаратные инструкции с плавающей запятой, когда доступен FPU.

Итак, какую версию RVCT вы используете?

В любом случае я предлагаю вам удалить --fpu опцию, поскольку компилятор сделает неявный соответствующий выбор на основе выбранной --cpu опции. Вам также необходимо исправить выбор процессора, в вашем параметре RVCT указано --cpu=ARM1136J-S , что это не ARM1136FJ-S, как вы сказали GCC. Это, несомненно, помешает компилятору генерировать инструкции VFP, поскольку вы сказали ему, что у него нет VFP.

Комментарии:

1. Как я упоминал выше, я использую RVDS версии 4.1, которая, по-моему, является последней.

2. Хорошо, тогда, вероятно, проблема вызвана ошибкой в спецификации процессора, поскольку вы сообщили компилятору RV, что у вас нет оборудования с плавающей запятой, но разрешили GCC использовать h / w fp.

Ответ №4:

Один и тот же исходный код может создавать совершенно разные двоичные файлы из-за таких факторов, как. Разные компиляторы (llvm против gcc, gcc 4 против gcc3 и т.д.). Разные версии одного и того же компилятора. Разные параметры компилятора, если используется один и тот же компилятор. Оптимизация (на любом компиляторе). Скомпилирован для выпуска или отладки (или любых других терминов, которые вы хотите использовать, двоичные файлы совершенно разные). При внедрении вы добавляете усложнение в виде загрузчика или монитора пзу (отладчика) и тому подобных вещей. Затем добавьте к этому инструменты на стороне хоста, которые взаимодействуют с монитором rom или компилируются в debugger. Несмотря на то, что компилятор arm намного лучше, чем gcc, компиляторы arm были заражены предположением, что двоичные файлы всегда будут выполняться поверх их монитора rom. Я хочу помнить, что к тому времени, когда rvct стал их основным компилятором, это предположение было на исходе, но с тех пор я действительно не использовал их инструменты.

Суть в том, что существует несколько основных факторов, которые могут повлиять на различия между двоичными файлами, которые могут и приведут к другому взаимодействию. Предполагать, что вы получите одинаковую производительность или результаты, является неправильным предположением, ожидается, что результаты будут отличаться. Аналогично, в той же среде вы должны иметь возможность создавать двоичные файлы, которые дают резко отличающиеся результаты производительности. Все из того же исходного кода.

Комментарии:

1. Я не предполагаю, что получу такую же производительность. Предполагается, что я должен добиться лучшей производительности с помощью компилятора Realview, чем GNU, потому что этот компилятор создается ARM самостоятельно.

2. У меня больше нет большого доступа к инструментам arm, когда я это делал, инструменты arm создавали гораздо более сжатый и быстрый код, чем gcc. Значительно лучше. с тех пор gcc стал лучше, но не намного, и gcc 4 не обязательно лучше gcc 3 по производительности. Поэтому с осторожностью я бы сказал, что да, вам следует ожидать лучшего кода от инструментов arm. Вам нужно убедиться, что вы экспериментируете с параметрами компилятора. Используя отладчик с отлаживаемым кодом, вы, вероятно, не в полной мере используете преимущества оптимизатора. Использование отладчика только для загрузки и запуска — это совсем другая история.

Ответ №5:

Включена ли оптимизация компилятора в вашей сборке CodeSourcery, но не в сборке Realview?