मुझे पीडब्लूएम लहर के कर्तव्य चक्र में बदलाव के समय 1 स्तर के स्तर पर सटीक समय करने की आवश्यकता है।सटीक लिनक्स समय - घड़ी_gettime() के संकल्प को निर्धारित करता है?
पृष्ठभूमि
मैं एक Gumstix से अधिक जल कॉम उपयोग कर रहा हूँ (https://www.gumstix.com/store/app.php/products/265/) एक सिंगल कोर एआरएम कॉर्टेक्स ए 8 प्रोसेसर-499.92 BogoMIPS पर चल रहे है (Gumstix पृष्ठ 800Mhz साथ 1Ghz का दावा करता है अनुशंसित) के अनुसार/proc/cpuinfo। ओएस कर्नेल संस्करण 2.6.34 के आधार पर लिनक्स का एंगस्ट्रॉम छवि संस्करण है और यह गमस्टिक्स वाटर COM पर स्टॉक है।
समस्या
मैं लिनक्स में सटीक समय के बारे में पढ़ भी पर्याप्त मात्रा में किया है (और इसमें से अधिकांश की कोशिश की है) और आम सहमति है कि clock_gettime का उपयोग कर() और CLOCK_MONOTONIC संदर्भित सबसे अच्छा है लगता है ऐसा करने का तरीका (मुझे समय के लिए आरडीटीएससी रजिस्टर का उपयोग करना अच्छा लगेगा क्योंकि मेरे पास न्यूनतम पावर सेविंग क्षमताओं वाला एक कोर है लेकिन यह इंटेल प्रोसेसर नहीं है।) तो यहां अजीब हिस्सा है, जबकि clock_getres() 1 लौटाता है, 1 एनएस पर रिज़ॉल्यूशन का सुझाव देता है , वास्तविक समय परीक्षण 325768 किलोहर्ट्ज़ घड़ी टिकों के बीच वास्तव में 30517ns का न्यूनतम संकल्प सुझाता है (या यह संयोग नहीं हो सकता है)। यहाँ मैं क्या मतलब है:
gcc soExample.c -o runSOExample -lrt
साथ भागो:
// Stackoverflow example
#include <stdio.h>
#include <time.h>
#define SEC2NANOSEC 1000000000
int main(int argc, const char* argv[])
{
// //////////////// Min resolution test //////////////////////
struct timespec resStart, resEnd, ts;
ts.tv_sec = 0; // s
ts.tv_nsec = 1; // ns
int iters = 100;
double resTime,sum = 0;
int i;
for (i = 0; i<iters; i++)
{
clock_gettime(CLOCK_MONOTONIC, &resStart); // start timer
// clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts);
clock_gettime(CLOCK_MONOTONIC, &resEnd); // end timer
resTime = ((double)resEnd.tv_sec*SEC2NANOSEC + (double)resEnd.tv_nsec
- ((double)resStart.tv_sec*SEC2NANOSEC + (double)resStart.tv_nsec);
sum = sum + resTime;
printf("resTime = %f\n",resTime);
}
printf("Average = %f\n",sum/(double)iters);
}
संकलित साथ (डबल कास्टिंग से अधिक, tv_sec एक टाइम_टी में चिंता नहीं करें और tv_nsec एक लंबा है।):
./runSOExample
नैनोस्लीप के साथ दिखाए गए अनुसार टिप्पणी की गई, परिणाम 0ns या 30517ns है जो बहुमत 0ns है। इससे मुझे विश्वास होता है कि CLOCK_MONOTONIC को 32.768kHz पर अपडेट किया गया है और अधिकांश घड़ी घड़ी को दूसरी घड़ी_gettime() कॉल से पहले अपडेट नहीं किया गया है और ऐसे मामलों में जहां परिणाम 30517ns है, कॉल को कॉल के बीच अपडेट किया गया है।
जब मैं अपने विकास कंप्यूटर (एएमडी एफएक्स (टीएम) -6100 छह-कोर प्रोसेसर 1.4 गीगाहर्ट्ज पर चल रहा हूं) पर एक ही चीज़ करता हूं तो न्यूनतम देरी 14 शून्य-151ns अधिक शून्य के साथ होती है।
तो, चलिए उन परिणामों की तुलना सीपीयू गति से करें। गमस्टिक्स के लिए, यह 30517ns (32.768kHz) 49 9.9 3 मेगाहट्र्ज सीपीयू के 15298 चक्रों के बराबर है। मेरे देव कंप्यूटर के लिए 150ns 1.4 गीगा सीपीयू के 210 चक्र के बराबर है।
clock_nanosleep() कॉल के साथuncommented औसत परिणाम ये हैं: Gumstix: औसत मूल्य = 213,623 और परिणाम भिन्न होता है, ऊपर और नीचे, 30517ns देव कंप्यूटर की कि न्यूनतम संकल्प के गुणकों द्वारा: साथ 57,710-68,065 एनएस कोई स्पष्ट प्रवृत्ति नहीं। देव कंप्यूटर के मामले में मैं उम्मीद करता हूं कि संकल्प वास्तव में 1 एनएस स्तर पर होगा और मापित ~ 150ns वास्तव में दो घड़ी_gettime() कॉल के बीच समाप्त हो गया है।
तो, मेरे प्रश्न ये हैं: न्यूनतम संकल्प क्या निर्धारित करता है? प्रो कंप्यूटर केवल ~ 2.6X तेज चल रहा है जब देव कंप्यूटर 30000X Gumstix से बेहतर क्यों है? क्या यह बदलने का कोई तरीका है कि कितनी बार CLOCK_MONOTONIC अद्यतन किया जाता है और कहां? कर्नेल में?
धन्यवाद! अगर आपको अधिक जानकारी या स्पष्टीकरण की आवश्यकता है तो पूछें।
: लिनक्स कर्नेल कोड में, इन स्रोत फ़ाइलों और प्रलेखन के लिए देखो बस सोच रहा। सीपीयू घड़ी से चक्र पकड़ने के लिए कुछ प्रकार के हार्डवेयर की आवश्यकता नहीं होगी? कम से कम परिशुद्धता के उस स्तर पर। शायद गमस्टिक्स में ऐसा नहीं है? (मैं सिर्फ एक रजिस्टर के बारे में बात कर रहा हूं जो टिकों को गिन सकता है और रोलिंग से पहले उन्हें पकड़ सकता है।) – Jiminion
आपके द्वारा किए गए सभी पढ़ने के साथ, आपने पहले ही देखा होगा *** [यह लिंक] (http: // gallinazo.flightgear.org/technology/gumstix-overo-rc-servos-and-pwm-signal-generation/)***, लेकिन किसी भी मामले में वैसे भी पोस्टिंग। कुछ सामग्री प्रासंगिक है। – ryyker
एक ही समस्या होने के साथ। 30517ns के गुणक। मैं ओवरो टाइड का उपयोग कर रहा हूँ। क्या आपने कभी इस मुद्दे को हल किया है? – Ryan