La vérification au moment de la configuration / compilation des fonctionnalités dont dépend votre code est la voie à suivre. La vérification de périphériques spécifiques est problématique car éviter les faux positifs est pratiquement impossible (quelqu'un pourrait vous mentir délibérément même avec peu d'effort) et le but de ces vérifications est de répondre à la question: "puis-je construire ici? Si oui, quel chemin de code doit J'utilise? " , pas "est-ce un appareil dont j'aime le nom?"
Selon cette référence (une excellente source d'informations sur les macros prédéfinies en général), vous pouvez utiliser la macro:
__arm__
Pour détecter la combinaison GCC / Arm.
J'ai vérifié cela sur le mien avec:
#include <stdio.h>
int main() {
#ifdef __arm__
printf("Why yes it is, thank you\n");
#endif
return 0;
}
Ce qui a effectivement imprimé le message.
Notez que cela interceptera également tous les appareils Arm, donc ma recommandation serait d'utiliser une partie de votre outil de construction (par exemple cmake/autoconf
) pour vérifier la présence de /opt/vc/include/bcm_host.h
.
Par exemple avec
AC_CHECK_HEADERS
en autoconf:
AC_CHECK_HEADERS(/opt/vc/include/bcm_host.h)
provoque:
HAVE__OPT_VC_INCLUDE_BCM_HOST_H
à définir dans config.h
Ou pour CMake:
include(CheckIncludeFile)
CHECK_INCLUDE_FILE(/opt/vc/include/bcm_host.h BCMHOST)
Je ne pense pas qu'il y ait vraiment une meilleure façon de détecter cela - vous pourriez avoir configurer / CMake chercher des choses spécifiques au matériel, mais il y aura d'autres plates-formes avec le même SoC donc même ce n'est pas vraiment fiable et ce qui vous intéresse réellement est l'existence de ce fichier d'en-tête, car cela vous informe sur la façon de construire pour la cible donnée. Même si vous pouvez prouver qu'il s'agit d'un Raspberry Pi mais que vous ne trouvez pas le bon fichier d'en-tête, vous êtes toujours bloqué et une erreur au début vaut mieux qu'une erreur de construction.
Si vous voulez vraiment vérifier qu'il s'agit d'un Pi (ou suffisamment similaire), vous pouvez recourir à quelque chose de simple comme:
grep -o BCM2708 /proc/cpuinfo
ou (pour raspberrypi 2 et 3):
grep -o BCM2709 /proc/cpuinfo
au moment de la configuration, qui correspondra au SoC sur lequel le Raspberry Pi est basé.
Vous pouvez lancer quelques tests supplémentaires (par exemple, l'USB vous aidera à comprendre un peu plus et même à indiquer s'il s'agit d'un appareil de modèle A ou B), mais rien ne suffit pour le dire avec certitude.
Vous pouvez vérifier les hachages des fichiers dans / boot par rapport à une liste connue, mais vous ne pourrez pas créer s'il y a une mise à jour du micrologiciel ou non officielle que vous ne connaissiez pas. (Ou d'autres appareils non Pi similaires avec la même configuration de démarrage)
__ARMEL__
façon de définir est exactement comme la vôtre__arm__
. Je n'ai tout simplement pas pris la peine de trouver la meilleure macro pour le moment./opt/vc/include/bcm_host.h
- comment cela fonctionne-t-il pour la compilation croisée car le fichier est peu susceptible d'être à cet endroit sur la machine hôte (de compilation)? De même,grep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfo
va détecter l'hôte de compilation pas la cible ...?