Rys. 43 Poszukiwanie źródeł bibliotek standardowych.
Wybierając odnośnik avr-libć, zostaniemy przeniesieni do strony zawierającej podsumowanie informacji na temat projektu. Możliwość pobrania nowych wersji bibliotek, dokumentacji oraz kodów źródłowych uzyskamy po przejściu na stronę domową (odnośnik Homepage w ramce Public Areas). Mniej -więcej w środku strony domowej znajdziemy linki do pobrania kodów źródłowych oraz dokumentacji. Po jego wybraniu będziesz miał możliwość dostępu do każdej wersji, jaka została utworzona.
Uważaj. W WinAVR 20050214 zaimplementowano biblioteki avr-libc 1.2.3. Nie ina Sensu pobieranie w tej chwili nowszych źródeł - wprowadzi to za dużo zamieszania.
Pobierane kody źródłowe są spakowane w pewien szczególny sposób. Są to archiwa TAR, z którymi radzi sobie dobrze na przykład popularny WinRAR. Po otwarciu archiwum okaże się jednak, że wewnątrz znajduje się plik o nazwie avr-libc-1.2.3.tar[l]. Plik ten należy wypakować na przykład na pulpit, a następnie usunąć z jego rozszerzenia cyfrę 1 razem z nawiasami kwadratowymi. Gdy rozpakujemy i to archiwum, uzyskamy dostęp do wszystkich źródeł biblioteki standardowej.
Znajdziesz tutaj siedem folderów. Aktualnie znaczenie dla nas mają dwa z nich: inclu-de oraz libc. Pierwszy zawiera pliki nagłówkowe, które możemy znaleźć w pakiecie WinAVR w folderze C:\WinAVR\avr\inclu-de\. Pliki te już znamy. W folderze libc umieszczono dalsze podfoldery grupujące funkcje różnych bibliotek. Znajdziemy tutaj „upragniony” folder sidio.
Po otwarciu folderu libc\stdio\ odkryjesz dużą liczbę plików. Okazuje się, że praktycznie każda funkcja została napisana w taki sposób, że znajduje się w oddzielnym pliku. Dla
Jak to robi GCC linker - łączenie z bibliotekami
Pamiętasz moment, gdy zaczynaliśmy tworzyć programy 7. większej liczby plików? Zrobiliśmy to w części 6 kursu. Tłumaczyłem wtedy, czym jest lin-ker. Jeśli masz' taką możliwość, zerknij na rysunek 27 znajdujący się we wspomnianej części. Jeśli w programie użyjemy teraz funkcji z jakiejś biblioteki, jej kod zostanie dodany w procesie linkowania programu. Istnieją linkery będące w stanie zrobić to w bardzo inteligentny sposób. Analizują onę możliwe, wewnętrzne odwołania i usuwają wszelki kod, który nie jest używany. AVR-GCC nie posiada, niestety, takiej możliwości.-Jeśli wykryte zostanie odwołanie do jakiejkolwiek funkcji znajdującej się
wygody nazwy plików są zgodne ze znajdującymi się w nich funkcjami. Wyjaśnienie, skąd wziął się taki podział oraz czemu on służy, znajdziesz w ramce Jak to robi GCC linker — łączenie z bibliotekami.
Teraz, gdy już wiesz, gdzie znaleźć kody źródłowe bibliotek, po przeczytaniu tego akapitu zajrzyj do ramki „Nieczyste zagranie -zastępowanie fdesopen”. Przedstawiam tam opis, jak korzystając z udostępnionych kodów źródłowych, możemy obejść wprowadzone ograniczenia. Staram się opisać w tym miejscu sposób, w jaki dochodziłem do pewnych wniosków. Jednak siłą rzeczy opis jest skrótowy. Tak naprawdę utworzenie ostatecznej wersji „nakładki” na stdio było poprzedzone kilkoma godzinami spędzonymi na forach (niestety, głównie angielskojęzycznych) oraz studiowaniu podstawowej dokumentacji z katalogu C:\WinAVR\doc\avr-libc. Pamiętaj o tym, jeśli opisany tok myślenia będzie czasami zaskakiwał. Opisane tutaj działanie jest wysoce ryzykowne. Ryzykujemy, że utworzony kod będzie niekompatybilny z przyszłą
w danym pliku relokowalnym (przypominam: pliki typu “.o), cały plik zostanie dodany do kodu wyjściowego. Nawet jeśli spośród 20 znajdujących się w takim pliku funkcji, wykorzystamy tylko jedną w pamięci mikrokontrolera znajdą się wszystkie. Nie jest to wielkim problemem, jeśli chodzi o pliki programu - tutaj bardzo rzadko piszemy funkcje, z których nie korzystamy. Bardziej uciążliwy fakt ten staje się w chwili tworzenia oraz korzystania z uniwersalnych bibliotek.
Aby zminimalizować ten efekt, biblioteki zaleca się dzielić na małe kawałki. W ten sposób właśnie stworzona została biblioteka avr-libc. Praktycznie każda funkcja umieszczona jest w oddzielnym pliku. To, że fakt ten ułatwia nam znalezienie tego, czego szukamy, jest jedynie miłym skutkiem ubocznym osiągnięcia znacznie ważniejszego celu.
wersją bibliotek avr-Iibc. Jednak jak się za chwilę przekonamy, korzyści są na tyle duże, że często warto podjąć to ryzyko. Jest to szczególnie odczuwalne, jeśli zaczynamy mieć problemy ze zmieszczeniem się z programem w pamięci FLASH procesora.
Ramka opisująca pomysł pozbycia się pamięciochłonnego wywołania fdcvopen może w jakimś miejscu wydawać się niejasna. Wiem, że może być to trudne dla osób przyzwyczajonych do BASCOM-a, gdzie takie działania absolutnie nie były konieczne (nie były też możliwe). Nie przejmuj się tym w tej chwili. Do wspomnianej ramki możesz zawsze powrócić zaraz po przykładach.
Dalej będziemy prowadzić eksperyment z programem z listingu 59. Dodamy do niego nowy plik nagłówkowy o nazwie fchealstdio.h. Pamiętaj, że dodanie nowego pliku nagłówka nie wymaga jakichkolwiek zmian w pliku mcikefde. Dla własnej wygody możemy dodać go do projektu Programmers Notepada, có sprawi, że będzie on dostępny 7. poziomu panelu Projects.
Do nowo utworzonego-pliku wprowadź kod widoczny na listingu 65. Plik main.c naszego programu zmieniamy zgodnie z listingiem 67. Skompiluj nową wersję programu. Podczas kompilacji pojawi się jedno ostrzeżenie. Jest to związane z rzutowa-
fefceat__file fileRS =
FCHEAT_STAT±C_FDEVOPENWR(rs_put, rs_get); FILE* fRS = (FlLE*)&fiIeRS;
int mai.-i(void)
{
// Koniec inicjacji
/////////////////////////////////////////
40 Marzec 2006 Elektronika dla Wszystkich