W mikrokontrolerach serii SAM-D21 Atmel wiele urządzeń peryferyjnych używa zegara, który jest asynchroniczny z zegarem głównego procesora, a dostęp do tych urządzeń peryferyjnych musi odbywać się za pomocą logiki synchronizacji; na urządzeniach peryferyjnych, których zegar jest wolny w stosunku do czasu procesora, może to spowodować naprawdę duże opóźnienia. Na przykład, jeśli RTC jest skonfigurowany do korzystania z zegara 1024Hz (jak wydaje się być celem projektu), a procesor pracuje z częstotliwością 48 MHz, odczyt rejestru „aktualny czas” spowoduje wstawienie przez logikę magistrali ponad 200 000 stanów oczekiwania (minimum pięciu cykli zegara 1024Hz). Chociaż możliwe jest, że CPU wyda żądanie odczytu, wykona jakiś inny niepowiązany kod i zwróci ponad 200 000 cykli później, aby pobrać czas, wydaje się, że nie ma sposobu, aby faktycznie odczytać czas szybciej.
W moim rozumieniu synchronizacji, jednobitowy obwód synchronizujący opóźni sygnał o 2-3 cykle docelowego zegara; synchronizacja wielobitowej ilości jest nieco trudniejsza, ale istnieje wiele podejść, które mogą zagwarantować niezawodne zachowanie w ciągu pięciu cykli zegara docelowego, jeśli jest on szybszy niż zegar źródłowy, i tylko kilka cykli więcej, jeśli nie jest. To, co robiłby Atmel SAM-D21, wymagałoby sześciu cykli w źródłowej domenie zegarowej do synchronizacji i jakie czynniki sprzyjałyby projektowi, którego opóźnienia synchronizacji są na tyle długie, że wymagają przerwania „synchronizacji wykonanej”, w porównaniu z takim, który zapewnia opóźnienia synchronizacji są wystarczająco krótkie, aby uczynić takie przerwania niepotrzebnymi?
źródło
Odpowiedzi:
To inny sposób robienia mi rzeczy. Przyzwyczaiłem się do architektur, w których moje rejestry znajdują się na moim zegarze procesora lub co najmniej 1/2 tego zegara. Więc piszesz swoje rejestry i są gotowe od razu. Może robią to w ten sposób, aby oszczędzać energię? Jeśli umieszczają rejestry peryferyjne we własnej osobnej, naprawdę wolnej domenie zegara, być może nie muszą się budzić i uruchamiać głównego oscylatora lub zegara procesora, ale mogą aktualizować wartości na urządzeniu peryferyjnym.
W takim przypadku możesz zapisać rejestr w swoim bardzo wolnym bloku peryferyjnym, a następnie wyłączyć wyspę zasilania dla całego procesora lub bramy zegarowej i pozwolić powolnemu synchronizatorowi odczytać go, aż będzie szczęśliwy, a następnie przerwać procesor, aby go wyciągnąć snu.
Ewentualnie może pozwolić ci wcisnąć maksymalną liczbę instrukcji w czas przebudzenia, zamiast obracać sześć cykli i czekać na każdy zapis.
To, dlaczego używają tak wielu cykli synchronizacji, może być paranoją lub spełniać wysokie standardy niezawodności dla jednego ze swoich klientów. Nie mogę powiedzieć na pewno, ale wiem, że widziałem klientów, którzy mają takie wymagania, jak każdy taran powinien mieć ECC i być wstępnie załadowany do określonej wartości itp.
Wydaje mi się, że nie jest to ostateczna odpowiedź, ale takie są moje przemyślenia po lekkim przejrzeniu arkusza danych.
źródło