Làm cách nào tôi có thể phát hiện ra rằng tôi đang biên dịch cho Raspberry Pi?


24

Vì Raspberry Pi cần một chút mã đặc biệt (tôi đang nói đến C/C++) để truy cập một số tính năng phần cứng (ví dụ như một cuộc gọi đến bcm_host_init()). Tôi đang tìm kiếm một cách đáng tin cậy và thanh lịch để phát hiện điều này tự động. Tôi không nghĩ rằng có bất kỳ trình biên dịch nào #definesnhư _WIN32tôi có thể lạm dụng, vì vậy việc phát hiện nó từ CMake(có thể thực thi các tập lệnh shell) là đủ. Tôi cũng muốn phương thức này hoạt động tốt nhất nếu không phải tất cả các bản phân phối.

Một cách tôi có thể nghĩ là tôi có thể tìm kiếm ví dụ như /opt/vc/include/bcm_host.htập tin (mà không phải là khó khăn), và cũng có thể kiểm tra xem các kiến trúc là ARM (đó là dễ dàng tại thời gian biên dịch như có #definemacro cho rằng, ví dụ như __arm__của __ARMEL__). Kiểm tra vòm bổ sung này là để ngăn chặn các lỗi giả khi bạn có môi trường biên dịch chéo trên một máy khác nhưng hiện không được biên dịch chéo. Có một cách khác, tốt hơn so với điều này?

Câu trả lời:


20

Kiểm tra thời gian cấu hình / biên dịch cho các tính năng mà mã của bạn phụ thuộc vào là cách thực hiện. Việc kiểm tra các thiết bị cụ thể là có vấn đề vì tránh được lỗi giả là hầu như không thể (ai đó có thể nói dối bạn một cách có chủ ý ngay cả với ít nỗ lực) mục đích của việc kiểm tra như vậy là để trả lời câu hỏi: "Tôi có thể xây dựng ở đây không? Tôi đang sử dụng? " , không phải "đây có phải là thiết bị tôi thích tên không?"


Theo tài liệu tham khảo này (một nguồn thông tin tuyệt vời về các macro được xác định trước nói chung), bạn có thể sử dụng macro:

__arm__

Để phát hiện sự kết hợp GCC / Arm.

Tôi đã kiểm tra cái này với tôi:

#include <stdio.h>

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

Mà thực sự đã in tin nhắn.

Lưu ý rằng điều này cũng sẽ bắt được tất cả các thiết bị Arm, vì vậy khuyến nghị của tôi là sử dụng một phần của công cụ xây dựng của bạn (ví dụ cmake/autoconf) để kiểm tra sự hiện diện của /opt/vc/include/bcm_host.hcả.

Ví dụ với

AC_CHECK_HEADERS
trong autoconf:

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

nguyên nhân:

HAVE__OPT_VC_INCLUDE_BCM_HOST_H

được định nghĩa trong config.h

Hoặc cho CMake:

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

Tôi không nghĩ có cách nào tốt hơn để phát hiện điều này thực sự - bạn có thể định cấu hình / CMake tìm kiếm những thứ cụ thể về phần cứng, nhưng sẽ có những nền tảng khác có cùng SoC nên thậm chí nó không thực sự đáng tin cậy và những gì bạn thực sự quan tâm là sự tồn tại của tệp tiêu đề đó, vì thông báo cho bạn biết cách xây dựng cho mục tiêu đã cho. Ngay cả khi bạn có thể chứng minh đó là Raspberry Pi nhưng không thể tìm thấy tệp tiêu đề phù hợp, bạn vẫn bị mắc kẹt và lỗi sớm hơn là lỗi xây dựng.

Nếu bạn thực sự muốn kiểm tra nó là một Pi (hoặc đủ tương tự), bạn có thể sử dụng một cái gì đó đơn giản như:

grep -o BCM2708 /proc/cpuinfo

hoặc (đối với raspberrypi 2 và 3):

grep -o BCM2709 /proc/cpuinfo

tại thời điểm cấu hình, sẽ khớp với SoC, Raspberry Pi dựa trên.

Bạn có thể thực hiện thêm một vài thử nghiệm (ví dụ: USB sẽ giúp bạn tìm hiểu thêm một chút và thậm chí gợi ý nếu đó là thiết bị Model A hoặc B), nhưng không có gì đủ để nói chắc chắn.

Bạn có thể kiểm tra giá trị băm của các tệp trong / boot so với danh sách đã biết, nhưng sau đó bạn sẽ không thể tạo nếu có bản cập nhật chương trình cơ sở hoặc bản không chính thức mà bạn không biết. (Hoặc các thiết bị không phải Pi tương tự khác có cùng thiết lập khởi động)


Có lẽ mô tả về ý tưởng của tôi không đủ rõ ràng, nhưng __ARMEL__cách xác định chính xác như của bạn __arm__. Tôi chỉ không bận tâm để tìm macro tốt nhất.
Tapio

Tôi đã sửa đổi mô tả ý tưởng của mình để làm rõ rằng việc tìm kiếm tệp không phải là vấn đề - tôi đang tìm kiếm những cách khác nhau, tốt hơn để làm điều này, chứ không phải cách thực hiện ý tưởng tôi đã trình bày.
Tapio

@Tapio - Tôi không nghĩ đó là vấn đề đúng - ngay cả khi bạn chứng minh rằng Pi là thông tin vô dụng nếu không có các tệp tiêu đề bạn cần để xây dựng mã cụ thể Pi của mình. Ngay cả khi bạn tìm thấy một thiết bị BCM không phải Pi, mã bạn viết cho Pi có thể sẽ chạy tốt trên đó nếu nó dựa trên cùng một SoC.
Flexo

Bạn đúng rồi. Ý nghĩ đó xuất hiện trong đầu tôi, nhưng tôi không nghĩ về nó đủ. Dù sao, chỉnh sửa của bạn làm cho điều này một câu trả lời tuyệt vời cũng đáng chấp nhận.
Tapio

2
Kiểm tra /opt/vc/include/bcm_host.h- làm thế nào mà nó hoạt động để biên dịch chéo vì tệp không có khả năng ở vị trí đó trên máy chủ (biên dịch)? Tương tự như vậy grep -o BCM2grep -o BCM2708 /proc/cpuinfo708 /proc/cpuinfosẽ phát hiện máy chủ biên dịch không phải là mục tiêu ...?
SlySven
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.