Как я могу обнаружить, что я собираю для Малины Пи?

Как для Raspberry Pi требуется немного специального кода (я говорю о C/C++) для доступа к некоторым аппаратным функциям (например, вызов bcm_host_init()) , Я ищу надежный и элегантный способ обнаружить это автоматически. Я не думаю, что есть компилятор #defines, такой как _WIN32, я мог бы злоупотреблять, поэтому обнаружил его из CMake (который может выполнять сценарии оболочки ) было бы достаточно. Мне также хотелось бы, чтобы этот метод работал в большинстве, если не во всех дистрибутивах.

Один из способов, о котором я могу думать, это то, что я мог бы искать, например. /opt/vc/include/bcm_host.h (что не сложно), а также проверить, что архитектура ARM (что легко во время компиляции, так как есть #define для этого, например __arm__ of __ARMEL__). Эта дополнительная проверка арка должна предотвращать ложные срабатывания, когда у вас есть среда кросс-компиляции на другом компьютере, но в настоящее время она не перекрестно компилируется. Есть ли другой, лучший способ, чем это?

23 голоса | спросил Tapio 27 J0000006Europe/Moscow 2012, 00:03:34

1 ответ


20

Проверка на время настройки /компиляции для функций зависит от вашего кода. Проверка определенных устройств проблематична, потому что избежать ложных срабатываний практически невозможно (кто-то может лгать вам преднамеренно даже с небольшими усилиями) и Цель таких проверок - ответить на вопрос: "может Я создаю здесь? Если да, то какой путь кода я должен использовать? , а не "- это устройство, которому мне нравится имя?"


В соответствии с этой ссылкой (отличный источник информации о предопределенных макросах в целом), вы можете использовать макрос:

__arm__

Чтобы обнаружить комбинацию GCC /Arm.

Я проверил это на своем:

 #include <stdio.h>

int main() {
  #ifdef __arm__
  printf("Why yes it is, thank you\n");
  #endif
  return 0;
}

Что действительно напечатало сообщение.

Обратите внимание, что это также поймает устройства all Arm, поэтому моя рекомендация будет заключаться в использовании части вашего инструмента построения (например, cmake/autoconf)), чтобы проверить наличие из /opt/vc/include/bcm_host.h.

Например,

 AC_CHECK_HEADERS 
в autoconf:
AC_CHECK_HEADERS(/opt/vc/include/bcm_host.h)

причины:

HAVE__OPT_VC_INCLUDE_BCM_HOST_H

определяется в config.h

Или для CMake:

include(CheckIncludeFile)
CHECK_INCLUDE_FILE(/opt/vc/include/bcm_host.h BCMHOST)

Я не думаю, что есть лучший способ обнаружить это на самом деле - вы могли бы настроить /CMake искать аппаратные функции, но там будут другие платформы с тем же SoC, поэтому даже это не очень надежно и что вы на самом деле забота о существовании этого заголовочного файла, поскольку это сообщает вам, как построить для данной цели. Даже если вы можете доказать, что это малина Pi, но не можете найти правильный файл заголовка, который вы все еще застреваете, а ошибка на ранней стадии лучше, чем промаха.

Если вы действительно хотите проверить, что это Pi (или достаточно похожий), вы можете прибегнуть к чему-то простому:

grep -o BCM2708 /proc/cpuinfo

или (для raspberrypi 2 и 3):

grep -o BCM2709 /proc/cpuinfo

во время настройки, которое будет соответствовать SoC, на основе малины Pi.

Вы можете выполнить еще несколько тестов (например, USB поможет вам понять это немного больше и даже намекнуть, если это устройство модели A или B), но ничего не достаточно, чтобы сказать наверняка.

Вы можете проверить хэши файлов в /boot в известном списке, но тогда вы не сможете построить, если есть обновление прошивки или неофициальный, о котором вы не знали. (Или другие аналогичные устройства, не поддерживающие Pi, с той же настройкой загрузки)

ответил Flexo 27 J0000006Europe/Moscow 2012, 00:26:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132