Raspberry Pi için derlediğimi nasıl tespit edebilirim?


24

Raspberry Pi'nin C/C++bazı donanım özelliklerine (örneğin bir çağrı yapmak bcm_host_init()) erişmek için biraz özel kod gerektirdiğinden (bahsediyorum ). Bunu otomatik olarak tespit etmek için güvenilir ve zarif bir yol arıyorum. Ben herhangi bir derleyici vardır sanmıyorum #definesgibi _WIN32öylesine onu tespit, ben kötüye olabilir CMakeyeterli olacaktır (kabuk komut dosyalarını yürütmek olabilir). Ayrıca tüm dağıtımlar yapılmadığında, yöntemin çoğunda çalışmasını da istiyorum.

Aklıma gelen bir yolu ben mesela bakmak olabilir ki /opt/vc/include/bcm_host.h(zor değil) dosyası ve ayrıca (olduğu gibi derleme zamanında kolaydır hangi mimari ARM olduğunu kontrol #define, örneğin bunun için makro __arm__arasında __ARMEL__). Bu fazladan kemer kontrolü, başka bir makinede çapraz derleme ortamına sahip, ancak şu anda çapraz derleme yapılmadığında yanlış pozitifleri önlemek içindir. Bundan daha farklı, daha iyi bir yolu var mı?

Yanıtlar:


20

Kodunuzun dayandığı özellikler için yapılandırma / derleme zamanında kontrol etme yoludur. Belirli cihazları kontrol etmek sorunludur çünkü yanlış-pozitiflerden kaçınmak neredeyse imkansızdır (birisi çok az çabayla bile size kasıtlı olarak yalan söyleyebilir) ve bu gibi kontrollerin amacı şu soruyu cevaplamaktır: "burada yapabilir miyim? Kullanıyor muyum? " , "Bu, adını sevdiğim bir cihaz mı?"


Bu referansa göre (genel olarak önceden tanımlanmış makrolar hakkında harika bir bilgi kaynağı) makroyu kullanabilirsiniz:

__arm__

GCC / Kol kombinasyonunu tespit etmek.

Bunu benim ile kontrol ettim:

#include <stdio.h>

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

Hangi gerçekten mesajı yazdırdı.

Bunun tüm Arm cihazlarını da yakalayacağına dikkat edin, bu yüzden benim tavsiyem yapım aracınızın bir bölümünü de (örneğin cmake/autoconf) kullanıp kullanmadığınızı kontrol etmek olacaktır /opt/vc/include/bcm_host.h.

Örneğin

AC_CHECK_HEADERS
autoconf'ta:

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

neden:

HAVE__OPT_VC_INCLUDE_BCM_HOST_H

config.h dosyasında tanımlanacak

Veya CMake için:

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

Bunu gerçekten tespit etmenin daha iyi bir yolu olduğunu sanmıyorum - yapılandırmaya / CMake’ye donanıma özgü şeyler arayabilirdiniz, ama aynı SoC’da başka platformlar da olacak, bu yüzden gerçekten güvenilir değil ve aslında ne umurunda Bu başlık dosyasının varlığı, çünkü verilen hedef için nasıl oluşturulacağı konusunda sizi bilgilendirir. Bir Ahududu Pi olduğunu kanıtlayabilseniz bile, ancak hala sıkışmış olduğunuz doğru başlık dosyasını bulamıyorsanız ve bir hata baştan sona özledim.

Gerçekten bir Pi (veya yeterince benzer) olduğunu kontrol etmek istiyorsanız, aşağıdaki gibi basit bir şeye başvurabilirsiniz:

grep -o BCM2708 /proc/cpuinfo

veya (ahududu 2 ve 3 için):

grep -o BCM2709 /proc/cpuinfo

Raspberry Pi'nin dayandığı SoC ile uyuşacak olan yapılandırma zamanında.

Birkaç test daha yapabilirsiniz (örneğin USB, biraz daha fazla anlamanıza yardımcı olur ve hatta bir Model A veya B cihazı ise ipucu verir), ancak kesin olarak söyleyecek hiçbir şey yeterli değildir.

Dosyaların önyüklemesini / önyüklemesini bilinen bir listeye göre kontrol edebilirsiniz, ancak daha sonra bir firmware güncellemesi veya bilmediğiniz resmi olmayan bir yazılım olup olmadığını oluşturamazsınız. (Veya aynı önyükleme kurulumuna sahip diğer benzer Pi olmayan aygıtlar)


Belki fikrimin tanımı yeterince açık değildi, ama __ARMEL__tanımlamanın yolu aynen seninki __arm__. Henüz en iyi makroyu bulmak için uğraşmadım.
Tapio

Fikir tanımlamamı ayrıca dosyayı aramanın sorun olmadığını açıklığa kavuşturmak için değiştirdim - Sunulan fikri nasıl uygulayacağımı değil, bunu yapmanın farklı, daha iyi yollarını arıyorum.
Tapio

@Tapio - Bunun doğru bir problem olduğunu sanmıyorum - Pi olduğunu kanıtlasanız bile, Pi'nin kendi kodunu oluşturmak için ihtiyaç duyduğunuz başlık dosyaları olmadan faydasız olduğunu. Pi olmayan bir BCM cihazı bulsanız bile, Pi için yazdığınız kod, muhtemelen aynı SoC’ya dayanıyorsa, tam olarak çalışacaktır.
Flexo

Haklısın. Bu düşünce aklımdan geçti, ama yeterince düşünmedim. Her neyse, düzenlemeleriniz bunu kabullenmeye değer mükemmel bir cevap haline getiriyor.
Tapio

2
Onay /opt/vc/include/bcm_host.h- nasıl olur dosyası (derleme) ana makinede o yerde olması muhtemel olduğu gibi çapraz derleme için uygun mu? Benzer şekilde grep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfo, derleme ana bilgisayarını hedef değil tespit edecek ...?
SlySven
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.