cz6

cz6



Programowanie

Wuj/yjjJUY/yjjly jj/uca^jj^uw

w dmqq©    c*

harddef.h makra.h

am, gdzie 3 wyprowa-

■U.'xXl ;M|pcf859 1 .eep| gcw»

i <PCF8591J*s) (PCmłl.mnp) <P

Rysunek 27 - przebieg kompilacji dzisiejszego programu


Podczas rozmowy o dalszych losach kursu, który właśnie czytasz, przypomniano mi, że na płytce z kursu BASCOM istnieje jeszcze element, którego do tej pory unikałem. Pojawiła się propozycja pełnego wyczerpania możliwości płytki przed publikacją nowego układu. Myślę, że idea powtórzenia wszystkich ćwiczeń z kursu BASCOM-a mogłaby nie wszystkim przypaść do gustu. Jednak zabawa istniejącym na płytce przetwornikiem analogowo-cyfrowym i cyfrowo-analogowym będzie bardzo pożytecznym zajęciem. Zajmiemy się więc dzisiaj magistralą I2C na przykładzie obsługi układu PCF8591. Ponadto chcę, abyśmy dziś dokonali przełomowej zmiany w sposobie pisania programu - o tym już w poniższym śródtytule.

Dzielenie kodu programu

Do tej pory cały kod naszego programu umieszczaliśmy w jednym pliku. Podejście takie jest uzasadnione w przypadku pisania niewielkich aplikacji. W praktyce jednak im program bardziej skomplikowany, tym bardziej opłacalne staje się jego podzielenie na pewne funkcjonalne bloki. Znacznie pomaga to w utrzymaniu porządku. Mógłbym uraczyć Cię niepotrzebną dawką teorii, zamiast tego zaczniemy jednak pisać nowy „podzielony” program. Umożliwi to samodzielne przekonanie się, o co w tym wszystkim chodzi i dlaczego jest takie genialne.

Na rysunku 27 pokazałem, w jaki sposób będzie przebiegać kompilacja naszego dzisiejszego programu. Podobne, tylko bardziej ogólne, obrazki znajdziesz także w innych kursach języka C. Przyjrzyj się teraz wspomnianemu rysunkowi. Umówmy się teraz, że każdy element, który poddawany będzie oddzielnemu procesowi kompilacji, nazwiemy modułem. Na nasze dzisiejsze potrzeby stworzymy moduły o nazwach: led, i2c oraz delay. Jak łatwo się domyślić, zostanąw nich umieszczone elementy niezbędne do obsługi wyświetlacza, magistrali I2C oraz podprogramy opóźnień. Dodatkowo pojawiają się dwa pliki nagłówkowe, które nie są elementem żadnego modułu. W pliku harddef.h zostaną umieszczone wszystkie informacje dotyczące konfiguracji sprzętowej części naszego urządzenia - będą to głównie przypisania symbolicznych oznaczeń odpowiednim wyprowadzeniom. Nietrudno się domyślić, co znajdzie się w pliku makra.h. Wprowadzimy tutaj przede wszystkim poznane w poprzedniej części makra upraszcza-jące dostęp do portów.

Pliki hardder.h oraz makra.h dołączamy wszędzie informacje dzeniach wiednie makra potrzebne. Dzięki takiemu podejściu wszystkie niezbędne makra napiszemy tylko raz - nie będziemy musieli kopiować ich wszędzie, gdzie będą one konieczne jeśli postanowimy w jakiś sposób je ulepszyć, zmiany pojawią się natychmiast we wszystkich modułach. Definicja części sprzętowej w oddzielnym pliku, poza powyższymi zaletami, ma jeszcze jedną - jest czytelna. Jeśli zmienimy coś w połączeniach na płytce, zawsze wiemy, gdzie szukać linijek wymagających modyfikacji.

Zauważ, że nagłówków harddef.h oraz makra.h nie dołączamy do modułu delay. Moduł ten nie potrzebuje dostępu do portów, nie korzysta więc z zawartych tam informacji. W związku z tym dołączanie wymienionych plików jest zbędne.

Wspomniane moduły nie będą w stanie działać same z siebie. Będą one tylko zbiorem odpowiednich funkcji które trzeba jeszcze wywołać w odpowiedniej kolejności oraz z odpowiednimi parametrami. Tym zajmie się moduł nazwany main. Zauważ, że nie ma on przypisanego pliku nagłówkowego. Jest to związane z tym, że nie udostępniamy żadnych funkcji z modułu main na zewnątrz. To stąd będziemy wywoływać wszystkie zewnętrzne funkcje, nie na odwrót.

Tylko w jednym pliku źródłowym może znaleźć się tylko jedna funkcja o nazwie main. To od niej zacznie się wykonywanie programu. Dla kompilatora nie ma znaczenia, w którym module zostanie ona umieszczona. Dla własnej wygody oraz czytelności kodu umieszczamy ją w module głównym programu.

Kompilacja programu w C przebiega w trzech fazach. Na samym początku następuje łączenie ze sobą odpowiednich plików nagłówkowych z plikiem źródłowymi. Makra oraz stałe symboliczne są zamieniane na zdefiniowane formy (rozwijane). Usuwane są tak zwane białe znaki (spacje, tabulatory, znaki końca linii). Działania te wykonuje preprocesor. Następnie tak obrobiony plik jest kompilowany. Jeśli działanie to przebiegło bezbłędnie, jego wynikiem jest przynajmniej plik z rozszerzeniem *.o. Kompilator umieszcza w nim relokowalny kod maszynowy. Jest to już praktycznie kod programu, jednak zapisany w taki sposób, że funkcje nie mają przyporządkowanych miejsc w pamięci. W pliku zawarte są dodatkowo informacje o tym, jakie funkcje on zawiera - umożliwia to ich wywołanie za pomocą nazwy z poziomu innych modułów' tego samego projektu.

Jeśli wybrana została odpowiednia opcja, kompilator utworzy dodatkowo plik zawierający listing modułu w kodzie asemblera. Jeśli zachowałeś kody programów z poprzednich części, możesz podejrzeć teraz odpowiednie pliki o rozszerzeniach *.lst.

Poprzednie dwie fazy odbywają się oddzielnie dla każdego pliku źródłowego projektu. Ostatnim krokiem, dzielącym kod programu od jego postaci umożliwiającej zaprogramowanie mikrokontrolera, jest linkowa-nie. W procesie tym podejmowana jest decyzja, w jakim dokładnie miejscu umieszczone mają być zmienne, gdzie umieszczone mają być funkcje, uzupełniane są wymagające tego instrukcje skoków. Efektem pracy linkera są obrazy pamięci programu oraz danych EEP-ROM. Dodatkowo, jeśli odpowiednie opcje zostały wybrane, pojawią się pliki *.lss zawierające listing całego programu, *.map z opisem, pod jakimi adresami w pamięci zostały umieszczone poszczególne elementy,

Elektronika dla Wszystkich Grudzień 2005 37


Wyszukiwarka

Podobne podstrony:
cz7 Programowanie wyjj/yjjjuwuifla jj/uaaau/uww ] wM©    «■ ts(„HeTlo v Rys. 37 Zmia
cz6 ProgramowanieABC... C Co I Jak umieścić w nagłówku Pliki nagłówkowe możemy, dla własnych potrze
cz6 Programowanie dodawanie przed nazwą funkcji nazwy pliku oraz znaku podkreślenia. Mogą być to za
cz6 Programowanie Programowanie Przy tw orzeniu wyrażeń warunkowych dla dyrek- ratorów
cz6 Programowanie lif opóźnienie > 2‘. ABC... C Generowanie własnych błędów i ostrzeżeń Gdy
cz6 ProgramowanieABC... C Funkcje statlc i inllne Funkcja statyczna Umieszczenie przed nazwą jiunkc
cz6 Programowanie wyglądać jak w ramce obok: Pole SRC powinno za- wierać
Zdjęcie0806 1 zfbłnie S/aęka 0~l—J—J Zuchn» )♦!— J—J Pełne utdHcmc w Micha JO aM. Mlccxn&g
Autor programu: dr haK AriamPiirVn Prowadzący; mgr Anna Nowotnik Instytut ftychologii U AM PSYC
SPEDYCJA program wykładu 01. dr Adam Salomon, Katedra Transportu i Logistyki (WN AM w Gdyni) Spedycj
SPEDYCJA program wykładu 09. dr Adam Salomon, Katedra Transportu i Logistyki (WN AM w Gdyni) • Sposo
mechanizmy Program gniazda VDI, adapteryPlexo™ IP55 JC-Jb JJ r+)
Jan Kniat□ JJ □ JJJ Programowanie w języku□ □ JJJ ■□ ■ m □ luj uum
[JJ 0    C* : NARZĘDZIA GŁÓWNE [q Z programu Access [o Z sieci Web ^

więcej podobnych podstron