tAvrLib

Aktualna wersja: 1.0.1 (06.12.2009)

URL: tAvrLib.wasilczyk.pl

Autor: Tomasz Wasilczyk


O projekcie

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:

Zasoby

TODO

W kolejnych wersjach biblioteki planuję wprowadzenie następujących zmian:

Changelog

Najczęściej zadawane pytania

Dlaczego jest tu tak dużo zbędnych funkcji? Czy taka biblioteka nie zajmie dużo więcej miejsca, niż rozwiązanie dedykowane?

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.

Dołączanie kodu w plikach *.c do plików nagłówkowych jest nieprawidłowe / nieeleganckie, czy biblioteka zostanie poprawiona?

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).

Dodanie podkreślenia na początku nazwy nie gwarantuje nam hermetyzacji, dlaczego nie użyjesz słowa kluczowego static lub atrybutu visibility?

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).

Dlaczego konfiguracja nie jest zrealizowana przez edycję plików nagłówkowych? To jest wygodniejsze.

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.

Uważam, że biblioteka X jest lepsza w większości zastosowań, ponieważ zużywa kilka bajtów pamięci / taktów procesora mniej. Czy nie lepiej z niej skorzystać?

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.

Zdjęcia

Przykład obsługi wyświetlacza HD44780

(opóźnienie 100ms między wyrazami dodano celowo)