2013-02-20 56 views
7

मैं एंड्रॉइड पर उच्च-रिज़ॉल्यूशन टाइमर (घड़ी स्रोत) प्राप्त करने का एक तरीका ढूंढ रहा हूं। यह मूल कोड में होना चाहिए, और काफी गैर पोर्टेबल हो सकता है। मैं microsecond संकल्प, या बेहतर चाहते हैं। मेरे विशेष आवेदन के लिए, संकल्प परिशुद्धता से अधिक महत्वपूर्ण है, और एक टाइमर जो monotonic है सबसे अच्छा है। मैं एंड्रॉइड 4.0.3 के साथ एक विशेष एआरएमवी 7 चिपसेट पर परीक्षण कर रहा हूं।एंड्रॉइड मूल कोड में उच्च रिज़ॉल्यूशन टाइमर कैसे प्राप्त करें?

क्या मैं अब तक की कोशिश की है:

  • clock_gettime(CLOCK_MONOTONIC): लक्ष्य हार्डवेयर (संपादित पर 1ms की इकाइयों में वेतन वृद्धि मूल रूप से मैं अपने कोड में सोचा बग के कारण 10ms, 1ms सही बहुत नहीं है, लेकिन अभी भी अच्छा)
  • gettimeofday(): clock_gettime को

समान मैं क्या प्रयास नहीं किया है:

  • System.nanoTime(): यह मूल नहीं है। मेरा मानना ​​है कि यह clock_gettime() पर आधारित है, लेकिन मैं हुड के नीचे जो कुछ भी है उसे ढूंढना और सीधे इसका उपयोग करना पसंद करूंगा।
  • /dev/rtc
  • एआरएम अनुदेश/सुविधा के कुछ प्रकार है, शायद SysTick (http://web.eecs.umich.edu/~prabal/teaching/eecs373-f10/readings/ARMv7-M_ARM.pdf) या सामान्य प्रयोजन टाइमर (GPT)।

भी (संबंधित प्रश्नों, लेकिन कोई जवाब नहीं) देखें:

+0

क्या आप डिवाइस पर रूट पहुंच मान सकते हैं? –

+0

@Maratyszcza: हाँ, यदि आवश्यक हो तो मुझे रूट हो सकता है। –

+0

यह एंड्रॉइड लेकिन लिनक्स के बारे में नहीं है, और यह संभव नहीं है। http://elinux.org/High_Resolution_Timers – auselen

उत्तर

6

आप सीपीयू चक्र काउंटर का उपयोग दो क्षणों के बीच चक्र की संख्या को मापने के लिए और फिर इसे परिवर्तित कर सकते हैं के संकल्प की जाँच करने के सकता है सेकेंड तक कि सीपीयू इसके अंकित आवृत्ति पर चलाता है की गारंटी करने के लिए, "प्रदर्शन" मोड में इसकी स्केलिंग राज्यपाल स्विच (वहाँ प्ले स्टोर में एप्लिकेशन का यह करने के लिए की एक संख्या है, लेकिन रूट पहुँच यह आवश्यक)। आप अपने डिवाइस में अच्छी तरह से शांत करने के लिए सुनिश्चित करें कि सीपीयू थ्रोटल नहीं है करना होगा (इस फोन के लिए विशेष रूप से महत्वपूर्ण है)। अंत में, आप (क्योंकि अन्य कोर प्रणाली द्वारा ऑफ़लाइन रखा जा सकता है, खासकर कोर 0) एक सिंगल कोर करने के लिए अपने कोड के लिए बाध्य किया है। लिनक्स में या सीधे CP15 सह प्रोसेसर से चक्र काउंटर पढ़कर perf_event सबसिस्टम का उपयोग कर:

वहाँ एआरएम पर चक्र काउंटर का उपयोग करने के दो तरीके हैं।perf_event विधि केवल तभी काम करेगी जब लिनक्स कर्नेल को इस सबसिस्टम (फ़ाइल/proc/sys/kernel/perf_event_paranoid मौजूद है) के लिए समर्थन के साथ संकलित किया गया है और ईवेंट काउंटर पढ़ने को प्रतिबंधित नहीं है (फ़ाइल/proc/sys/kernel/perf_event_paranoid में 0 या - 1; रूट पहुंच के साथ आप इस फ़ाइल में मान को ओवरराइट कर सकते हैं)। CP15 विधि केवल तभी काम करेगी जब उपयोगकर्ता-मोड प्रदर्शन काउंटर तक पहुंच सक्षम हो (डिफ़ॉल्ट रूप से यह हमेशा अक्षम होता है, और आपको या तो कर्नेल पैच करना होगा या इसे सक्षम करने के लिए कर्नेल ड्राइवर का उपयोग करना होगा)। Yeppp! library (मैं लेखक हूं) जब भी उपलब्ध हो, तो विधि का उपयोग करने में सक्षम है, और इसमें कर्नेल-मोड ड्राइवर शामिल है ताकि उपयोगकर्ता-मोड प्रदर्शन काउंटर तक पहुंच सक्षम हो सके। आपको this example सहायक मिल सकता है।

+0

मैंने एक ही बात का जिक्र किया, ऐसा लगता है कि किसी को मेरे सुझाव को पसंद नहीं आया ... – sgupta

0
  1. एंड्रॉयड का समर्थन नहीं करता ARMv7 एम, इसलिए सिस्टिक समीकरण से बाहर है।
  2. मैं वास्तव में एंड्रॉयड/लिनक्स में टाइमर के साथ अनुभव नहीं कर रहा हूँ, आप अपने खुद के उपकरण पर इस सॉफ्टवेयर को चलाने के लिए जा रहे हैं, तो आप पीएमयू लिनक्स में सक्षम और CPU के चक्र का उपयोग गिनती सटीकता होने जा रही नैनोसेकंड के लिए रजिस्टर कर सकते हैं। यह वास्तव में सलाह नहीं दी जाती है कि यदि आप अपने सॉफ्टवेयर को प्रकाशित करने जा रहे हैं या इसे कुछ अंतिम उपभोक्ता को पेश करते हैं क्योंकि निर्माता के पास विभिन्न उपकरणों पर अलग कर्नेल कॉन्फ़िगरेशन है और इसलिए पीएमयू सक्षम/उपलब्ध नहीं हो सकता है।

संपादित करें: आप अतिरिक्त https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/dgrqhgHWbHI और clock_getres() को देखने के clock_gettime()