Mam pewien drobny problemik, który chciałbym z Wami skonsultować. Posiadam w kodzie taką zmienną:
Kod: Zaznacz cały
volatile uint16_t TICK_Ticks;
Zmienna ta inkrementowana jest w przerwaniu tysiąc razy na sekundę i oczywiście ulega przepełnieniu co około 65 sekund. Zwróćcie uwagę na fakt, że jest 16 bitowa. Mam również napisaną prostą funkcję opóźniającą:
Kod: Zaznacz cały
void Delay(uint16_t ms)
{
uint16_t temp;
/* Disable Timer 0 overflow interrupt request */
INTCON &= ~_INTCON_TMR0IE_MASK;
/* Get ticks value (atomic access) */
temp = ms + TICK_Ticks;
/* Enable Timer 0 overflow interrupt request */
INTCON |= _INTCON_TMR0IE_MASK;
while(TICK_Ticks < temp);
}
Jak widać wyłączam na chwilę przerwanie od timera, który zarządza inkrementacją zmiennej, by pobrać jej wartość i dodać do oczekiwanego opóźnienia. Następnie włączam przerwanie i czekam w pętli, aż zmienna inkrementowana zrówna się z wartością obliczoną i przechowywaną w temp. Niestety, co około 65 sekund, czyli w okolicach przepełniania się zmiennej TICK_Ticks, funkcja opóźniająca szaleje. Mam wrażenie, że nie dopełniłem czegoś w związku z atomowym dostępem do zmiennej. Czyżbym musiał wewnątrz pętli while każdorazowo testować zmienną TICK_Ticks atomowo?
Pozdrawiam.