การตรวจสอบเวลาที่กำหนดค่า / คอมไพล์เวลาสำหรับคุณลักษณะรหัสของคุณขึ้นอยู่กับวิธีการไป การตรวจสอบอุปกรณ์ที่เฉพาะเจาะจงนั้นเป็นปัญหาเพราะการหลีกเลี่ยง false-positives นั้นเป็นไปไม่ได้จริง ๆ (ใครบางคนอาจโกหกคุณอย่างจงใจแม้จะมีความพยายามน้อย) และจุดประสงค์ของการตรวจสอบดังกล่าวคือการตอบคำถาม: " ฉันจะใช้? " ไม่ใช่"นี่คืออุปกรณ์ที่ฉันชอบชื่อใช่หรือไม่"
ตามการอ้างอิงนี้ (แหล่งข้อมูลที่ดีเกี่ยวกับมาโครที่กำหนดไว้ล่วงหน้าโดยทั่วไป) คุณสามารถใช้มาโคร:
__arm__
เพื่อตรวจจับการรวม GCC / แขน
ฉันตรวจสอบสิ่งนี้กับฉันด้วย:
#include <stdio.h>
int main() {
#ifdef __arm__
printf("Why yes it is, thank you\n");
#endif
return 0;
}
ซึ่งแน่นอนพิมพ์ข้อความ
โปรดทราบว่าสิ่งนี้จะจับอุปกรณ์แขนทั้งหมดดังนั้นคำแนะนำของฉันจะใช้เป็นส่วนหนึ่งของเครื่องมือสร้างของคุณ (เช่น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 เดียวกันดังนั้นแม้ว่ามันจะไม่น่าเชื่อถือจริง ๆ คือการมีอยู่ของไฟล์ส่วนหัวนั้นเนื่องจากจะแจ้งให้คุณทราบถึงวิธีการสร้างสำหรับเป้าหมายที่กำหนด แม้ว่าคุณจะสามารถพิสูจน์ได้ว่ามันเป็น Raspberry Pi แต่ไม่สามารถหาไฟล์ส่วนหัวที่ถูกต้องที่คุณยังติดอยู่และข้อผิดพลาดในช่วงต้นจะดีกว่าการสร้าง
หากคุณต้องการตรวจสอบว่าเป็น Pi (หรือคล้ายกันมากพอ) คุณสามารถใช้วิธีง่ายๆเช่น:
grep -o BCM2708 /proc/cpuinfo
หรือ (สำหรับ raspberrypi 2 และ 3):
grep -o BCM2709 /proc/cpuinfo
ในเวลาที่กำหนดซึ่งจะตรงกับ SoC Raspberry Pi จะขึ้นอยู่กับ
คุณสามารถทดสอบเพิ่มเติมได้อีกเล็กน้อย (เช่น USB จะช่วยให้คุณเข้าใจได้มากขึ้นและเป็นนัยว่าเป็นอุปกรณ์รุ่น A หรือ B) แต่ไม่มีอะไรเพียงพอที่จะพูดได้อย่างแน่นอน
คุณสามารถตรวจสอบความยุ่งเหยิงของไฟล์ใน / boot กับรายการที่ทราบ แต่คุณจะไม่สามารถสร้างได้หากมีการอัปเดตเฟิร์มแวร์หรือไม่เป็นทางการที่คุณไม่รู้ (หรืออุปกรณ์อื่นที่ไม่ใช่ Pi ที่คล้ายกันที่มีการตั้งค่าการบูตเดียวกัน)
__ARMEL__
__arm__
ฉันไม่ได้สนใจที่จะหามาโครที่ดีที่สุด