Aktualna wersja: 1.0.1 (06.12.2009)
URL: tAvrLib.wasilczyk.pl
Autor: Tomasz Wasilczyk
Biblioteka tAvrLib jest zbiorem funkcji przeznaczonych dla mikrokontrolerów AVR, z nastawieniem na obsługę urządzeń peryferyjnych. Kod jest udostępniany na zasadach licencji GNU LGPL v3 (szczegóły w dokumentacji).
Aktualnie biblioteka tAvrLib obsługuje następujące peryferia:
Ponadto tAvrLib zawiera funkcje ogólnego przeznaczenia:
Założenia projektu:
W kolejnych wersjach biblioteki planuję wprowadzenie następujących zmian:
Biblioteka ta została napisana w taki sposób, aby kompilator mógł sam, automatycznie usunąć zbędny kod. Dzięki temu w skompilowanym projekcie nieużywane funkcje nie powodują absolutnie żadnego narzutu pamięciowego.
Jest to niestety pewien kompromis. Przygotowując założenia projektu rozważałem trzy rozwiązania:
Pierwsze dwa rozwiązania nie pozwalają jednak na konfigurację biblioteki za pomocą makr z zewnątrz. Proszę zwrócić uwagę, że dołączane pliki nagłówkowe są częścią biblioteki, a nie jej konfiguracji (i nie powinny być modyfikowane przez użytkownika). Na komputerach PC konfiguracja przebiega przez inicjowanie w pamięci RAM, której jednak na mikrokontrolerach brakuje. Drugie rozwiązanie, mimo że jest lepsze (pozwala w prosty sposób decydować, które fragmenty biblioteki dołączyć), jednak wymaga umieszczenia fragmentów konfigurowalnych w plikach nagłówkowych (np. w avr-libc, funkcja _delay_ms() z pliku util/delay.h). Takie rozwiązanie sprawdza się w przypadku biblioteki standardowej, jednak jeżeli przychodzi do obsługi peryferiów, konfigurowany kod zaczyna mieć znaczny udział w pliku nagłówkowym – możemy wtedy otrzymać kod przypominający trzecie rozwiązanie, jednak odznaczający się znacznym bałaganem (część funkcji będzie zaimplementowana w jednym pliku, część w drugim).
Część nazwy oczywiście hermetyzacji nie gwarantuje – dostarcza jedynie informacji użytkownikowi. Ponadto takie funkcje nie zaśmiecają dokumentacji (ale oczywiście są opisane w kodzie źródłowym). Niestety użycie słowa static nie rozwiąże problemu, z powodu konstrukcji biblioteki (patrz pytanie o dołączanie plików źródłowych razem z nagłówkami).
Pliki nagłówkowe są częścią biblioteki, a nie projektu użytkownika. Umieszczenie konfiguracji w kodzie źródłowym użytkownika pozwala na separację projektu od biblioteki – dzięki temu projekt nie jest obciążany implementacją biblioteki (która przy późniejszej jego analizie może być traktowana jako zamknięte pudełko), a biblioteka nie jest zanieczyszczana stałymi z programu (i może być wykorzystana bez modyfikacji w innym projekcie). Inną zaletą jest możliwość praktycznie bezproblemowej aktualizacji biblioteki (modulo kompatybilność między jej wersjami). Proszę też zauważyć, że avr-libc nie konfigurujemy we wspomniany w pytaniu sposób.
Biblioteka tAvrLib nie powstała, aby konkurować na tym polu z innymi, implementującymi podobne funkcje (których jest zresztą dużo w Internecie). Jest to raczej odpowiedź na niedosyt kodu dobrej jakości (patrz założenia projektu). Przekłada się to bezpośrednio na koszty zarządzania projektem – w małych, amatorskich aplikacjach, typu "napisz i zapomnij" problem nie ma takiej wagi. Jednak gdy mówimy o dużych projektach, w których znacznie częściej się modyfikuje już napisany (często przez kogoś innego) kod, niż pisze nowy, podejście "pisania po swojemu" mogło by doprowadzić do wykładniczego wzrostu kosztów projektu względem jego rozmiarów.
(opóźnienie 100ms między wyrazami dodano celowo)