Come posso rilevare che sto compilando per Raspberry Pi?


24

Poiché Raspberry Pi ha bisogno di un po 'di codice speciale (di cui sto parlando C/C++) per accedere ad alcune funzionalità hardware (ad esempio una chiamata a bcm_host_init()). Sto cercando un modo affidabile ed elegante per rilevarlo automaticamente. Non penso che ci siano compilatori #definescome quelli _WIN32che potrei abusare, quindi rilevarlo CMake(che può eseguire script di shell) sarebbe sufficiente. Vorrei anche che il metodo funzionasse nella maggior parte se non in tutte le distribuzioni.

Un modo in cui riesco a pensare è che potrei cercare, ad esempio, il /opt/vc/include/bcm_host.hfile (che non è difficile), e anche verificare che l'architettura sia ARM (che è facile in fase di compilazione in quanto vi sono #definemacro per questo, ad esempio __arm__di __ARMEL__). Questo controllo dell'arco aggiuntivo serve a prevenire i falsi positivi quando si dispone di un ambiente di compilazione incrociata su un altro computer ma non si sta attualmente eseguendo la compilazione incrociata. C'è un modo diverso e migliore di questo?

Risposte:


20

Controllare al momento della configurazione / compilazione per le funzionalità da cui dipende il codice è la strada da percorrere. Il controllo di dispositivi specifici è problematico perché evitare falsi positivi è praticamente impossibile (qualcuno potrebbe mentirti deliberatamente anche con poco sforzo) e lo scopo di tali controlli è rispondere alla domanda: "posso costruire qui? Se sì quale percorso di codice dovrebbe Sto usando? " , non "è un dispositivo a cui mi piace il nome?"


Secondo questo riferimento (una grande fonte di informazioni sulle macro predefinite in generale) è possibile utilizzare la macro:

__arm__

Per rilevare la combinazione GCC / Arm.

Ho verificato questo sul mio con:

#include <stdio.h>

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

Che ha davvero stampato il messaggio.

Nota che questo catturerà anche tutti i dispositivi Arm, quindi la mia raccomandazione sarebbe quella di utilizzare parte del tuo strumento di costruzione (ad es. cmake/autoconf) Per verificare anche la presenza di /opt/vc/include/bcm_host.h.

Ad esempio con

AC_CHECK_HEADERS
in autoconf:

AC_CHECK_HEADERS(/opt/vc/include/bcm_host.h)

cause:

HAVE__OPT_VC_INCLUDE_BCM_HOST_H

da definire in config.h

O per CMake:

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

Non penso che ci sia un modo migliore di rilevarlo davvero: potresti avere configurato / CMake alla ricerca di cose specifiche per l'hardware, ma ci saranno altre piattaforme là fuori con lo stesso SoC, quindi anche questo non è davvero affidabile e ciò che ti interessa davvero è l'esistenza di quel file di intestazione, poiché ti informa su come costruire per il target indicato. Anche se puoi provare che è un Raspberry Pi ma non riesci a trovare il file di intestazione giusto, sei ancora bloccato e un errore all'inizio è meglio di un miss-build.

Se vuoi davvero verificare che sia un Pi (o sufficientemente simile) puoi ricorrere a qualcosa di semplice come:

grep -o BCM2708 /proc/cpuinfo

oppure (per raspberrypi 2 e 3):

grep -o BCM2709 /proc/cpuinfo

al momento della configurazione, che corrisponderà al SoC su cui si basa Raspberry Pi.

Potresti lanciare qualche altro test (ad esempio USB ti aiuterà a capirlo un po 'di più e persino suggerire se si tratta di un dispositivo Modello A o B), ma nulla è sufficiente da dire con certezza.

Potresti verificare gli hash dei file in / boot rispetto a un elenco noto, ma non sarai in grado di creare se c'è un aggiornamento del firmware o uno non ufficiale di cui non sapevi. (O altri dispositivi simili non Pi con la stessa configurazione di avvio)


Forse la descrizione della mia idea non era abbastanza chiara, ma il __ARMEL__modo definito è esattamente come il tuo __arm__. Non mi sono ancora preoccupato di trovare la migliore macro.
Tapio,

Ho modificato la descrizione della mia idea per chiarire che anche la ricerca del file non è il problema: sto cercando modi diversi e migliori per farlo, non come implementare l'idea che ho presentato.
Tapio,

@Tapio - Non penso che sia il problema giusto - anche se provi che è un Pi che le informazioni sono inutili senza i file di intestazione devi costruire il tuo codice specifico Pi. Anche se trovi un dispositivo BCM non-Pi, il codice che scrivi per il Pi probabilmente funzionerà perfettamente se è basato sullo stesso SoC.
Flexo,

Hai ragione. Quel pensiero mi è passato per la testa, ma non ci ho pensato abbastanza. Ad ogni modo, le tue modifiche rendono questa risposta eccellente che vale la pena accettare.
Tapio,

2
Il controllo per /opt/vc/include/bcm_host.h- come funziona per la compilazione incrociata poiché è improbabile che il file si trovi in ​​quel posto sulla macchina host (compilando)? Allo stesso modo grep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinforileverà l'host della compilation non l'obiettivo ...?
SlySven,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.