2009-10-21 14 views
10

Tôi đang tìm cách phân biệt thời gian chạy giữa các thiết bị được trang bị bộ xử lý ARM mới (như iPhone 3GS và một số iPod 3G) và các thiết bị được trang bị bộ vi xử lý ARM cũ. Tôi biết tôi có thể sử dụng uname() để xác định mô hình thiết bị, nhưng khi chỉ một số iPod touch 3G nhận được một tăng trong bộ vi xử lý ARM của họ, điều này là không đủ.Mẫu bộ xử lý phát hiện iPhone/hỗ trợ NEON

Vì vậy, tôi đang tìm một trong những:

  1. Một cách phát hiện mô hình xử lý - Tôi cho rằng có ai sánh kịp.
  2. Cách xác định xem các hướng dẫn của ARM có được hỗ trợ hay không - từ đây tôi có thể lấy được câu trả lời.
  3. Cách xác định tổng dung lượng lưu trữ của thiết bị - kết hợp điều này với kiểu thiết bị đã biết trước đó có thể dẫn tôi đến câu trả lời.
  4. < ENTER IDEA RANDOM>

Cảm ơn trước :)

+0

Câu hỏi hay! Tôi vừa kiểm tra hướng dẫn tham khảo Omap3 và các bit hỗ trợ thiết lập hướng dẫn trong các thanh ghi đồng bộ không thể truy cập được từ chế độ người dùng ... –

+0

Để kết thúc điều gì? Nó có vẻ như bất kỳ quyết định nào bạn đang cố gắng thực hiện trong ứng dụng của bạn, có lẽ là một khả năng mà bạn có thể kiểm tra, thay vì đi ngang qua bởi mô hình xử lý. –

+1

Tôi đang tính toán chuyên sâu. Tôi không chắc tôi có thể kiểm tra khả năng nào. Tôi có thể đo lường hiệu suất và thích ứng với điều đó, nghe có vẻ như cách tiếp cận tốt, nhưng tôi e rằng nó khá khó khăn đối với tôi trong hoàn cảnh của tôi. Tôi cảm thấy khó tin rằng không có cách nào để biết được hướng dẫn của neon có sẵn hay không. – yonilevy

Trả lời

5

Một workaround tôi có thể nghĩ ra, được phát hiện nếu OpenGL ES 2.0 có sẵn, vì bộ xử lý mới cho phép đó.

Có một số article at mobileorchard về cách thực hiện.

+0

Cảm ơn, đó thực sự là một cách khá tốt để thực hiện hack này. Tuy nhiên, một trong những nhược điểm là cách duy nhất để tìm ra nếu OpenGL ES 2.0 có sẵn bằng cách gọi EAGLContext :: initWithAPI và kiểm tra giá trị trả về, có nghĩa là giới thiệu OpenGL vào dự án của tôi. Nhưng dù sao đi nữa, trừ khi tôi tìm được cách tốt hơn, tôi có thể làm điều đó. – yonilevy

+0

Vâng, tôi đồng ý đó là một sự xấu hổ, và có lẽ là một hoạt động nặng chỉ để xác định khả năng của thiết bị. – pgb

12

Không chính xác những gì bạn đang yêu cầu, nhưng một giải pháp dễ dàng là xây dựng chất béo ứng dụng của bạn, để nó chứa mã thực thi cho cả ARMv6 và ARMv7. Nếu bạn làm điều này, mã thích hợp sẽ tự động chạy trên bộ xử lý và bạn không cần thực hiện bất kỳ kiểm tra thời gian chạy nào. Có hiệu quả, bạn cho phép trình tải làm phát hiện thời gian chạy cho bạn.

Để thực hiện điều này, thay đổi các thiết lập Kiến trúc trong dự án XCode của bạn từ "tiêu chuẩn (ARMv6)" thành "Tối ưu hóa (ARMv6 ARMv7)"

Sau đó, trong việc thực hiện, bạn làm như sau:

#if defined __ARM_NEON__ 
    // Code that uses NEON goes here 
#else // defined __ARM_NEON__ 
    // Fallback code without NEON goes here 
#endif // defined __ARM_NEON__ 

Có một macro tương tự mà bạn có thể sử dụng để kiểm tra các tính năng ARMv7 (không NEON) mà tôi không thể nhớ ra khỏi đầu của mình.

Nếu bạn thực sự muốn gửi công văn thời gian chạy, hãy xem hàm sysctlbyname trong libc. Cụ thể, tôi nghĩ rằng tra cứu thông số HW_MACHINE_ARCH có thể hữu ích cho bạn.

+0

Tôi cần kiểm tra xem sysctlbyname có thể cung cấp cho tôi thông tin tôi cần hay không. Unfortunatley Tôi không có một iPod với bộ vi xử lý mới ở bàn tay nên tôi không thể. Có ai thử cái này không? Nó có thể là cách tối thượng, nhưng nó thực sự phụ thuộc vào những gì được định nghĩa ở đó. – yonilevy

+0

Cũng tò mò nếu đó là một cách đáng tin cậy - ai đó plz xác nhận nếu điều này làm việc cho iPhone (3GS) cũng như trên iPod Touch (3) – Till

+2

Macro '__ARM_NEON__' sẽ được trình biên dịch xác định khi nhắm mục tiêu bộ xử lý ARMv7 có NEON (trong đó bao gồm cả 3gs và cảm ứng thế hệ thứ 3). –

0

Tôi biết điều này thật tệ, nhưng điều tốt nhất mà tôi nghĩ đến là phát hiện xem thiết bị có hỗ trợ quay video hay không. Hiện tại chỉ có các thiết bị iPhone và iPod dựa trên ARM7 hỗ trợ nó, do đó nó là một cách hợp pháp, tôi đoán vậy.

Để làm như vậy, hãy sử dụng UIImagePickerController's availableMediaTypesForSourceType kết hợp với isSourceTypeAvailable trên kUTTypeMovie.

1

EDIT: Tôi đã rút lại câu trả lời này, vì nó để lại một lỗ rõ ràng tôi nhận ra sau: phải làm gì khi chúng tôi nhận được một loại phụ không xác định trên một số phần cứng trong tương lai? ĐÂY KHÔNG PHẢI LÀ TƯƠNG LAI-PROOF. Ngoài ra, sự không chắc chắn về trạng thái được ghi lại của API đó không giúp ích gì, do không khoan nhượng của Apple về việc sử dụng các API không có giấy tờ.

Bạn nên sử dụng câu trả lời của Stephen Canon và xây dựng chất béo ứng dụng của bạn. Phát hiện thời gian chạy đáng tin cậy, trong tương lai không khả thi tại thời điểm này (để tôi mất tinh thần, tôi đảm bảo với bạn).