Родные компоненты, armeabi-v7a и thumb?

Когда APP_ABI включает armeabi-v7a, система сборки Android будет включать -mthumb в качестве опции компиляции.

ARMv7-a — это семейство 32-разрядных процессоров. Почему Android использует -mthumb, а не -marm?

Должны ли собственные компоненты, скомпилированные с помощью NDK, использовать -mthumb? Или можно использовать -marm?

Если -marm в порядке, должны ли присутствовать какие-либо параметры взаимодействия?


person jww    schedule 08.09.2014    source источник


Ответы (1)


Android использует -mthumb, потому что он создает более компактный код. Разрядность процессора тут ни при чем.

В обычном наборе инструкций ARM каждая инструкция является 32-битной, и каждая инструкция довольно выразительна (существуют разные инструкции для выполнения множества разных действий). К сожалению, это также означает, что код может быть немного большим, так как каждая отдельная инструкция занимает 4 байта.

Набор инструкций большого пальца был введен для решения этой проблемы - здесь каждая инструкция имеет длину всего 16 бит, поэтому вы можете разместить в два раза больше инструкций в одном и том же пространстве, но, поскольку инструкции короче, различных инструкций не так много. Каждая инструкция по-прежнему работает с 32-битными регистрами и в остальном ведет себя точно так же, как инструкции ARM, поэтому это просто другой, более компактный способ записи (в основном) подмножества инструкций ARM. Из-за ограниченного количества инструкций для большинства вещей требуется немного больше инструкций, чем в режиме ARM. Таким образом, в зависимости от того, что на самом деле делает код, фактическое уменьшение размера кода не составляет ровно 50%. Кроме того, поскольку может быть больше инструкций, чем раньше, он может работать медленнее, чем раньше. (Но поскольку он меньше, он использует меньше кеша инструкций, что, с другой стороны, может повысить производительность.)

На практике код Thumb, как правило, медленнее, чем код ARM, но более компактен, поэтому для кода, где размер имеет большее значение, чем скорость, вы должны использовать Thumb.

Начиная с Thumb2 (который доступен в ARMv7), в наборе инструкций Thumb немного больше выразительности, поэтому разница в производительности меньше — поэтому он включен по умолчанию в Android — почти во всех случаях он уменьшает размер кода без существенного влияния представление. Если у вас есть действительно критичный к производительности код, вы можете протестировать его, чтобы увидеть, вредит ли он вам или помогает. (Для сборки с помощью ndk-build и Android.mk проверьте переменную LOCAL_ARM_MODE.)

Если вы создаете код вручную, вы можете выбрать, добавить ли вы -mthumb или -marm, и, насколько мне известно, вам не нужны дополнительные параметры взаимодействия, независимо от того, какой из них вы выберете.

person mstorsjo    schedule 08.09.2014
comment
Подводя итоги последней пары вопросов: Android API обычно не имеет значения. Однако есть некоторые предостережения. (1) API должен обеспечивать поддержку ABI. Например, armeabi и arm-eabi-v7a требуется API 3; а x86 и mips требуется API 9. (2) Родной код общего назначения; и не зависит от специализированных функций платформы, датчиков ссылок. Очевидно, что уровень API имел бы значение, если бы я занимался специфическими для платформы вещами, такими как программирование датчиков. Это правильно? - person jww; 08.09.2014
comment
Да, это звучит правильно. Я сам не использовал датчики, поэтому я не знаю деталей этого API, но в целом да, уровень API имеет значение только в том случае, если вы используете реальные API из системы. Если вы делаете чистую вычислительную библиотеку, которая выполняет весь ввод/вывод через, например. буферы памяти, вы можете построить его для минимального уровня API. - person mstorsjo; 08.09.2014
comment
Кроме того, вы можете смешивать уровни API, используемые для построения разных архитектур. Если у вас есть target=android-3 в project.properties, ndk-build фактически будет использовать android-9 для x86 и mips (если эти архитектуры включены). Полученный APK будет работать на всех устройствах с уровнем API 3 и выше. Поскольку нет официальных устройств Android с x86 или mips, работающих на уровне API ниже 9, не повредит то, что они созданы с более высоким уровнем API. И для всех устройств ARM он будет построен с уровнем API 3. Таким образом, он работает на всех устройствах с уровнем API ›= 3. - person mstorsjo; 08.09.2014