Überprüfen Sie zum Zeitpunkt der Konfiguration / Kompilierung, von welchen Funktionen Ihr Code abhängt. Das Überprüfen auf bestimmte Geräte ist problematisch, da das Vermeiden von Fehlalarmen praktisch unmöglich ist (jemand könnte Sie auch mit geringem Aufwand absichtlich anlügen) und das Ziel solcher Überprüfungen darin besteht, die Frage zu beantworten: "Kann ich hier bauen? Wenn ja, welcher Codepfad soll Ich benutze? " , nicht "Ist dies ein Gerät, dessen Namen mir gefällt?"
Entsprechend dieser Referenz (eine großartige Informationsquelle zu vordefinierten Makros im Allgemeinen) können Sie das Makro verwenden:
__arm__
Zum Erkennen der GCC / Arm-Kombination.
Ich überprüfte dies auf meinem mit:
#include <stdio.h>
int main() {
#ifdef __arm__
printf("Why yes it is, thank you\n");
#endif
return 0;
}
Welche hat in der Tat die Nachricht gedruckt.
Beachten Sie, dass dies auch alle Arm-Geräte erfasst. Daher empfehle ich, einen Teil Ihres Build-Tools zu verwenden (z. B. cmake/autoconf
), um zu prüfen, ob auch Arm-Geräte vorhanden sind /opt/vc/include/bcm_host.h
.
Zum Beispiel mit
AC_CHECK_HEADERS
in autoconf:
AC_CHECK_HEADERS(/opt/vc/include/bcm_host.h)
Ursachen:
HAVE__OPT_VC_INCLUDE_BCM_HOST_H
zu definieren in config.h
Oder für CMake:
include(CheckIncludeFile)
CHECK_INCLUDE_FILE(/opt/vc/include/bcm_host.h BCMHOST)
Ich glaube nicht, dass es einen besseren Weg gibt, dies wirklich zu erkennen - Sie könnten konfigurieren / CMake nach hardwarespezifischen Dingen suchen lassen, aber es wird andere Plattformen mit demselben SoC geben, auch wenn dies nicht wirklich zuverlässig ist und was Sie wirklich interessiert ist das Vorhandensein dieser Header-Datei, da diese Sie darüber informiert, wie Sie für das angegebene Ziel erstellen. Auch wenn Sie nachweisen können, dass es sich um einen Raspberry Pi handelt, Sie aber nicht die richtige Header-Datei finden können, stecken Sie immer noch fest, und ein früher Fehler ist besser als eine Fehlkonstruktion.
Wenn Sie wirklich überprüfen möchten, ob es sich um einen Pi (oder einen ausreichend ähnlichen) handelt, können Sie auf Folgendes zurückgreifen:
grep -o BCM2708 /proc/cpuinfo
oder (für raspberrypi 2 und 3):
grep -o BCM2709 /proc/cpuinfo
zum Zeitpunkt der Konfiguration, die mit dem SoC übereinstimmt, auf dem der Raspberry Pi basiert.
Sie könnten ein paar weitere Tests durchführen (z. B. USB hilft Ihnen dabei, es ein bisschen besser zu verstehen und gibt sogar einen Hinweis darauf, ob es sich um ein Gerät des Modells A oder B handelt), aber nichts ist ausreichend, um es mit Sicherheit zu sagen.
Sie könnten die Hashes von Dateien in / boot anhand einer bekannten Liste überprüfen, aber dann können Sie keine Dateien erstellen, wenn es ein Firmware-Update oder ein inoffizielles gibt, von dem Sie nichts wissen. (Oder andere ähnliche Nicht-Pi-Geräte mit demselben Start-Setup)
__ARMEL__
definierte Weg ist genau wie bei Ihnen__arm__
. Ich habe mich einfach nicht darum gekümmert, das beste Makro zu finden./opt/vc/include/bcm_host.h
- wie funktioniert das bei der Cross-Kompilierung, da die Datei wahrscheinlich nicht an dieser Stelle auf dem (kompilierenden) Hostcomputer gespeichert ist? Ebensogrep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfo
wird der Compilation-Host nicht das Ziel erkennen ...?