sobota, 10 grudnia 2011

Nowe zastosowania dla rejestrów RTC

Chcę dzisiaj pokazać nowe zastosowanie rejestrów zegara czasu rzeczywistego, które są dostępne w niektórych (wielu?) procesorach ARM jak również jak podejrzewam we wielu innych architekturach. Fragment z dokumentacji procesora firmy NXP przedstawiłem na rysunku poniżej.
Rejestry RTC procesorów z rodziny LPC17xx
Najbardziej interesująca jest kolumna Reset Value. Można zauważyć, że wartości zaznaczone na czerwono mają wartość "NC". "NC" oznacza, że rejestry te są nienaruszone podczas resetu procesora. Ponadto, rejestry te mogą być również zasilane z alternatywnego źródła zasilania, więc są one również odporne na utratę zasilania. Do czego to się przydaj? Otóż znalazłem kilka zastosowań dla nich poza oczywistym przeznaczeniem jakim jest przechowywanie daty i czasu (dla rejestrów RTC) i zapewnienia nieulotnej pamięci przez rejestów ogólnego przeznaczenia (General Purpose Registers).

Komunikacja z Bootloaderem
Większość dzisiejszych aplikacji wbudowanych zawiera program ładujący (bootloader). Chociaż istnieje kilka sposobów uruchamiana bootloadera, to najpopularniejszym i dostępnym we większości mikrokontrolerów sposobem jest wymuszenie resetu przez watchdog. Jednak sam reset nie wystarczy. Wymagana jest zwykle jakaś komunikacja między główna aplikacją a aplikacją ładującą. Bootloader musi co najmniej wiedzieć, że został celowo uruchomiony w celu wykonania aktualizacji oprogramowania a nie zostało to spowodowane przez błąd w programie i nieprzewidziany reset przez watchdoga. Może również się zdarzyć, że wymagana będzie informacja o tym z jakiego źródła ma być pobrany nowy program. W przeszłości istniała tendencja do przekazywania tych informacji poprzez pamięć EEPROM. Teraz mając powyższe rejestry można je wykorzystać do tego celu.

Debugowanie
Jeśli borykasz się z niespodziewanymi resetami systemu, to jest to stosunkowo prostą sprawą, aby napisać kilka linii kodu, który zapisuje w tych rejestrach informacje o kontekście. Na przykład większość RTOSów zapewnia mechanizmy wywołania funkcji użytkownika przez przełączeniem zadania. W funkcji tej banalne jest zapisanie do jednego z rejestrów ID zadania. Wtedy to tylko kwestia ustawienia breakpointa na wejściu do funkcji main() i odczyt które zadanie było uruchomione w momencie resetu. Zawężenie podejrzanych bardzo ułatwia sprawę.

Podejrzewał, że można znaleźć jeszcze wile zastosowań tych rejestrów. Na prawdę chciałbym aby rejestry tego typu były powszechne i dostępne w każdej rodzinie procesorów.