Programowanie
Programowanie
Rys. 13 Wybór pliku do symulacji
z rysunkiem 10, zajrzyj do ramki mówiącej o formatach liczb.
C zwarty jest przez niektórych asemblerem wysokiego poziomu. Jest w tym stwierdzeniu sporo racji. Zauważ, że brak tutaj funkcji znanych z BASCOM-a automatycznie ustawiających część sprzętową. Tutaj musisz wiedzieć co nieco O procesorze, którego używasz, a wszelką konfigurację będziesz musiał przeprowadzić niejako ręcznie.
Pętlę typu for powinieneś już znać choćby z BASCOM-a. W C pętla taka.bez podania jakichkolwiek warunków (w nawiasie) jest przeznaczona specjalnie do tworzenia pętli nieskończonych. Nawiasy klamrowe pod instrukcją for wyznaczają ciało pętli (patrz też ramka o instrukcjach złożonych). W pętli zapisujemy kolejno do portu wyjściowego jedynki i zero. Między tymi instrukcjami odczekujcmy pewien czas.
Funkcja _delay_loop_2 nie jest standardową instrukcją C. Jest to dodatkowa funkcja zewnętrzna, z której możemy' skorzystać dzięki dołączeniu nagłówka <avfolelay.h>. Zauważ tutaj, że parametr wywoływanej funkcji podany jest w zapisie szesnastkowym. Dzięki temu łatwo można określić maksymalną, możliwą do uzyskania wartość opóźnienia. Jest to chyba bardziej intuicyjne niż zapis dziesiętny: 65535.
Program kończy się instrukcją return 0. Instrukcja ta powoduje opuszczenie funkcji i zwrócenie przez nią podanej wartości. Zauważ, że nie ma sensu kończenie funkcji main. Zapis taki jest w' naszym przypadku w zasadzie tylko formalnością. Standard tego wymaga. Kompilator doskonale zdaje sobie sprawę, że nie ma dokąd wracać. Instrukcja return spowoduje więc utworzenie tak zwanej martwej pętli i program się zatrzyma. Jeśli jednak jest to zbędne, to instrukcja ta nie zmarnuje cennych zasobów. Wyjaśnienie znajdziesz w ramce .Jak len GCC to robi”.
Jak ten GCC to robi
GCC stara się oszczędzać pamięć procesora jak to tylko możliwe. Mimo tego, że w przykładowym programie instrukcja return istnieje, nie zostanie ona uwzględniona w kodzie wynikowym. Kompilator po prostu „zauważył”, że wyżej znajduje się pętla nieskończona i program nigdy nie wydostanie się poza nią.
Odłóżmy na chwalę C jako taki i powróćmy do naszych narzędzi. Często możliwość przeprowadzenia symulacji działania programu okazuje się niezbędna do jego uruchomienia. Do lego celu przyda się wygenerowany plik hello.elf.
Uruchom teraz AVRStudio. Jeśli nic nie zmieniałeś w jego ustawieniach, pojawi się okienko pozwalające Ci na utworzenie nowego projektu lub też wybranie jakiegoś wcześniej otw-artego. Znajdziesz przycisk Open. Kliknij go. Jeśli jednak wspomniane okienko nie jest dostępne, nie przejmuj się. Otw'orzyć wybrany plik możesz także nieśmiertelną sekwencją File->Open File... W każdym przypadku pojawi się okienko wyboru pliku. Wybierz plik hello.elf.
Uważaj! Jeśli otwierasz plik za pomocą menu, okienko wyboru pliku będzie troszkę bardziej skomplikowane. Zalecane wienia możesz zobaczyć na rysunku 13. Po otwarciu wybranego pliku program automatycznie rozpozna, że zawiera on dane dla symulatora. Powinno pojawić się okienko takie jak na rysunku 14.
Rysunek ten pokazuje też ustawienia, jakie powinieneś wprowadzić dla naszego kodu. Chwilę po wybraniu przycisku Finish symulator zostanie zainicjowany.
Powinno zostać otwarte okno z podglądem głównego pliku kodu źródłowego. Zauważ teraz, że z lewej strony znajduje się żółta strzałka. Zapewne pamiętasz podobną strzałkę z emulatora BASCOM-a. Wskazuje ona punkt programu, w którym aktualnie znajduje się nasz wirtualny procesor. Symulator już nadaje się do pracy. Pozostaje jeszcze mała formalność którą dobrze jest wypełnić. Wybierz z menu Debug->AVR Simulator Options lub leż szybciej: skorzystaj ze skrótu klawiaturowego ALT+O. Okienka, które się pojawi, nie prezentuję. W tej chwili zawiera ono tylko dwie opcje. Ustaw częstotliwość pracy układu na 4MHz. Dzięki temu czas symulacji wyliczany przez AVRStudio będzie prawidłowy.
Zanim zajmiemy się symulowanym wykonywaniem naszego programu, przyjrzyj się zakładce po lewej stronie. Nosi ona nazwę „Workspace”. Jeśli nic posiadasz takiego okienka - spróbuj je uruchomić, włączając opcję View->Worlcspace. Na rysunku 15 przedstawiłem Ci najbardziej interesujące nas informacje dostępne z poziomu wspomnianego panelu. Pod zakładką Project znajdziesz wszystkie pliki naszego programu, do jakich symulatorowi udało się dotrzeć. Dwukrotne kliknięcie na którymś z nich powoduje jego otwarcie. Z punktu widzenia symulacji dużo ciekawsza jest zakładka l/O. Umożliwia ona podgląd oraz wpływ na stan wszystkich rejestrów
Rys. 14 Wybór symulatora programowego
instrukcje proste, instrukcje złożone
O instrukcji prostej już pisałem. Każda taka instrukcja kończy się znakiem średnika i wyznacza pewną elementarną czynność, jaką możesz wykonać. Czasami jednak zdarza się, że w miejscu, gdzie formalnie można umieścić jedną instrukcję, my chcielibyśmy umieścić ich więcej. Między innymi do takiego celu zostały stworzone instrukcje złożone. Instrukcję taką tworzy się, biorąc w klamerki {} ciąg instrukcji prostych. Przykład widzisz w naszym programie. Dla pętli nieskończonej instrukcja for ma składnię: for (;;) instrukcja Jak widzisz, w przykładowym programie zamiast instrukcji pojedynczej skorzystaliśmy z instrukcji /.łożonej.
Elektronika dla Wszystkich Maj 2005 47