ฉันจะตรวจสอบว่าฉันรวบรวม Raspberry Pi ได้อย่างไร


24

ในฐานะที่เป็น Raspberry Pi ต้องการรหัสพิเศษเล็กน้อย (ฉันกำลังพูดถึงC/C++) สำหรับการเข้าถึงคุณสมบัติฮาร์ดแวร์บางอย่าง (เช่นการเรียกbcm_host_init()) ฉันกำลังมองหาวิธีที่เชื่อถือได้และสง่างามในการตรวจจับสิ่งนี้โดยอัตโนมัติ ฉันไม่คิดว่าจะมีคอมไพเลอร์ใด ๆ#definesเช่น_WIN32ฉันสามารถละเมิดดังนั้นการตรวจสอบจากCMake(ซึ่งสามารถรันเชลล์สคริปต์) จะพอเพียง ฉันต้องการวิธีการในการทำงานมากที่สุดถ้าไม่ใช่ distros ทั้งหมด

วิธีการหนึ่งที่ฉันสามารถคิดคือว่าผมจะมองหาเช่น/opt/vc/include/bcm_host.hไฟล์ (ซึ่งไม่ยาก) และยังตรวจสอบว่าสถาปัตยกรรม ARM (ซึ่งเป็นเรื่องง่ายที่รวบรวมเวลาที่มี#defineแมโครที่เช่น__arm__ของ__ARMEL__) การตรวจสอบส่วนโค้งพิเศษนี้เป็นการป้องกันการปลอมบวกเมื่อคุณมีสภาพแวดล้อมการคอมไพล์ข้ามบนเครื่องอื่น แต่ปัจจุบันยังไม่ได้ทำการคอมไพล์ข้าม มีวิธีอื่นที่ดีกว่านี้ไหม?

คำตอบ:


20

การตรวจสอบเวลาที่กำหนดค่า / คอมไพล์เวลาสำหรับคุณลักษณะรหัสของคุณขึ้นอยู่กับวิธีการไป การตรวจสอบอุปกรณ์ที่เฉพาะเจาะจงนั้นเป็นปัญหาเพราะการหลีกเลี่ยง 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__ฉันไม่ได้สนใจที่จะหามาโครที่ดีที่สุด
Tapio

ฉันแก้ไขคำอธิบายความคิดของฉันเพื่อชี้แจงว่าการค้นหาไฟล์ไม่ใช่ปัญหา - ฉันกำลังมองหาวิธีที่แตกต่างและดีกว่าในการทำสิ่งนี้ไม่ใช่วิธีการนำแนวคิดที่ฉันนำเสนอไปใช้
Tapio

@Tapio - ฉันไม่คิดว่านั่นเป็นปัญหาที่ถูกต้อง - แม้ว่าคุณจะพิสูจน์ว่า Pi เป็นข้อมูลที่ไร้ประโยชน์หากไม่มีไฟล์ส่วนหัวคุณต้องสร้างรหัสเฉพาะ Pi ของคุณ แม้ว่าคุณจะพบอุปกรณ์ที่ไม่ใช่ BCM BCM รหัสที่คุณเขียนสำหรับ Pi อาจจะทำงานได้ดีถ้ามันใช้ SoC เดียวกัน
เฟล็กโซ

คุณพูดถูก ความคิดนั้นเกิดขึ้นในใจของฉัน แต่ฉันไม่ได้คิดมากพอ อย่างไรก็ตามการแก้ไขของคุณทำให้เป็นคำตอบที่ยอดเยี่ยมและควรค่าแก่การยอมรับ
Tapio

2
การตรวจสอบ/opt/vc/include/bcm_host.h- วิธีการทำงานสำหรับการคอมไพล์ข้ามเป็นไฟล์ไม่น่าจะอยู่ในสถานที่นั้นบนเครื่องโฮสต์ (รวบรวม)? ในทำนองเดียวกันgrep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfoจะตรวจจับโฮสต์การรวบรวมไม่ใช่เป้าหมาย ... ?
SlySven
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.