मैंने पाया कि एक अलग टाइमर एपीआई का उपयोग मेरे लिए बेहतर काम करता है।
void timer_milliseconds_reset(unsigned index);
bool timer_milliseconds_elapsed(unsigned index, unsigned long value);
टाइमर सूचकांक भी टाइमर हेडर फाइल में परिभाषित कर रहे हैं:
#define TIMER_PRINT 0
#define TIMER_LED 1
#define MAX_MILLISECOND_TIMERS 2
मैं अपने टाइमर काउंटरों के लिए अहस्ताक्षरित लंबे int का उपयोग (32-बिट मैं एक टाइमर मॉड्यूल दो API कॉल है कि बनाया) क्योंकि यह मेरे हार्डवेयर प्लेटफ़ॉर्म पर मूल आकार का पूर्णांक है, और यह मुझे 1 एमएस से लगभग 49.7 दिनों तक समाप्त कर देता है। आपके पास टाइमर काउंटर हो सकते हैं जो कि 16-बिट हैं जो आपको 1 एमएस से लगभग 65 सेकंड तक गुजरने का समय देगा।
टाइमर काउंटर एक सरणी हैं, और हार्डवेयर टाइमर (इंटरप्ट, कार्य, या काउंटर वैल्यू के मतदान) द्वारा बढ़ाए जाते हैं। वे फ़ंक्शन में डेटाटाइप के अधिकतम मूल्य तक सीमित हो सकते हैं जो नो-रोलओवर टाइमर के लिए वृद्धि को संभालता है।
/* variable counts interrupts */
static volatile unsigned long Millisecond_Counter[MAX_MILLISECOND_TIMERS];
bool timer_milliseconds_elapsed(
unsigned index,
unsigned long value)
{
if (index < MAX_MILLISECOND_TIMERS) {
return (Millisecond_Counter[index] >= value);
}
return false;
}
void timer_milliseconds_reset(
unsigned index)
{
if (index < MAX_MILLISECOND_TIMERS) {
Millisecond_Counter[index] = 0;
}
}
फिर अपने कोड हो जाता है:
//this is a bit contrived, but it illustrates what I'm trying to do
const uint16_t print_interval = 5000; // milliseconds
if (timer_milliseconds_elapsed(TIMER_PRINT, print_interval))
{
printf("Fault!\n");
timer_milliseconds_reset(TIMER_PRINT);
}
स्रोत
2008-10-02 19:42:34
जब मैं हर गिनती के लिए मूल कोड इस पर प्रवाह बिंदु तक काम करता है और फिर प्रिंट चलाते हैं। – JeffV
मेरा अंतिम स्टैब-इन-द-डार्क, मूल व्यवहार और आपके प्रतिस्थापन समाधान को देखते हुए, यह है कि आपका एक्स वैरिएबल/ms_timer() फ़ंक्शन 16 बिट्स से अधिक int int/देता है, जो समय की गणना करते समय एक अनपेक्षित प्रकार का प्रचार करता है अंतर। – smh