W ostatnim projekcie obniżając zużycie energii dobudowałem we FreeRTOS do istniejącego portingu AVR obsługę trybu "suppress ticks" czyli usypiania MCU zamiast aktywnego trybu bezczynności.
Moja wersja wymaga kwarcu zegarkowego 32768Hz na pinach TOSC0-TOSC1 bo dla długich cykli snu używa trybu "power saving" gdzie działa tylko Timer0 w trybie asynchronicznym, budzenie zewnętrznymi przerwaniami i kilka pomniejszych bloków MCU. Przy krótkich cyklach spania, gdy ponowne włączenie i ustabilizowanie głównego kwarcu trwałoby blisko czasu spania, implementacja wybiera tryb "extended standby", dzięki czemu budzi się w 6 cykli zegara a nie w kilkaset/kilka tysięcy (kosztem mniejszej oszczędności energii) i daje dokładniejszą kontrolę nad upływającym czasem. Implementacja nakierowana jest na długie czasy spania i minimalizuje ilość wybudzeń zmieniając ustawienia prescalera, kosztem dodatkowych obliczeń a zatem mniejszej dokładności i dodatkowych małych obsunięć w tykaniu zegara RTOSa.
Kod i dodatkowy opis udostępniam jako open source, może komuś z Was ułatwi to eksperymenty.
Moja wersja wymaga kwarcu zegarkowego 32768Hz na pinach TOSC0-TOSC1 bo dla długich cykli snu używa trybu "power saving" gdzie działa tylko Timer0 w trybie asynchronicznym, budzenie zewnętrznymi przerwaniami i kilka pomniejszych bloków MCU. Przy krótkich cyklach spania, gdy ponowne włączenie i ustabilizowanie głównego kwarcu trwałoby blisko czasu spania, implementacja wybiera tryb "extended standby", dzięki czemu budzi się w 6 cykli zegara a nie w kilkaset/kilka tysięcy (kosztem mniejszej oszczędności energii) i daje dokładniejszą kontrolę nad upływającym czasem. Implementacja nakierowana jest na długie czasy spania i minimalizuje ilość wybudzeń zmieniając ustawienia prescalera, kosztem dodatkowych obliczeń a zatem mniejszej dokładności i dodatkowych małych obsunięć w tykaniu zegara RTOSa.
Kod i dodatkowy opis udostępniam jako open source, może komuś z Was ułatwi to eksperymenty.