/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Podobne dokumenty
Podstawy programowania w języku C i C++

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Język C zajęcia nr 11. Funkcje

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Programowanie strukturalne i obiektowe

Podstawy programowania skrót z wykładów:

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Mikrokontroler ATmega32. Język symboliczny

Przeciążanie operatorów

Język C - podstawowe informacje

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Język ludzki kod maszynowy

( wykł. dr Marek Piasecki )

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

1 Podstawy c++ w pigułce.

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania C. dr. Krystyna Łapin

1 Podstawy c++ w pigułce.

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

2 Przygotował: mgr inż. Maciej Lasota

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Programowanie w elektronice: Podstawy C

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

Zadanie 04 Ktory z ponizszych typow danych w jezyku ANSI C jest typem zmiennoprzecinkowym pojedynczej precyzji?

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Odczyt danych z klawiatury Operatory w Javie

Komentarze w PHP (niewykonywane fragmenty tekstowe, będące informacją dla programisty)

Wstęp do programowania 1

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Wstęp do wskaźników w języku ANSI C

Słowa kluczowe i nazwy

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Podstawy i języki programowania

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

MATERIAŁY DO ZAJĘĆ II

Wprowadzenie do podstaw programowania AVR (na przykładzie mikrokontrolera ATmega 16 / 32)

Podstawy programowania w języku C

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Powtórka algorytmów. Wprowadzenie do języka Java.

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

KURS C/C++ WYKŁAD 7. struct Punkt { int x, y; int kolor; };

Zmienne, stałe i operatory

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

ROZDZIAŁ 2. Operatory

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Inż. Kamil Kujawski Inż. Krzysztof Krefta. Wykład w ramach zajęć Akademia ETI

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Język C, tablice i funkcje (laboratorium, EE1-DI)

Programowanie Proceduralne

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Programowanie komputerowe. Zajęcia 1

Operatory cd. Relacyjne: ==!= < > <= >= bool b; int i =10, j =20; dzielenie całkowitych wynik jest całkowity! Łączenie tekstu: + string s = "Ala ma ";

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia:

Wykład 2 Składnia języka C# (cz. 1)

Programowanie obiektowe

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Programowanie Komputerów

dr inż. Jarosław Forenc

Języki i paradygmaty programowania

Część 4 życie programu

Podstawy Programowania Podstawowa składnia języka C++

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

KURS C/C++ WYKŁAD 6. Wskaźniki

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

nowe operatory &. (kropka) * operator rzutowy ->, (przecinek) sizeof

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Arytmetyka liczb binarnych

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Podstawy Programowania C++

Program w C. wer. 10 z drobnymi modyfikacjami! Wojciech Myszka :28:

IX. Wskaźniki.(3 godz.)

Języki i metodyka programowania. Wprowadzenie do języka C

Lab 9 Podstawy Programowania

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

Wskaźniki w C. Anna Gogolińska

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 4. Karol Tarnowski A-1 p.

I - Microsoft Visual Studio C++

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Transkrypt:

Szablon programu: /* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h> /* opcjonalne: deklaracja typów o rozmiarze jednego i dwóch bajtów */ typedef unsigned char uint8_t; typedef unsigned int uint16_t; int main(void) /* kod programu */ return 0; W języku C nie jest możliwe zapisanie wartości wprost w postaci binarnej (czasem umożliwiają to niestandardowe rozszerzenia kompilatora). Jednak znając pozycje jedynek w pożądanej liczbie binarnej możemy utworzyć ją korzystając z operacji przesunięć bitowych. Przesunięcie bitowe oznacza przesunięcie cyfr zapisu binarnego danej liczby o n pozycji w lewo lub prawo. Operator przesunięcia bitowego w lewo to "<<", przesunięcia bitowego w prawo to ">>". Na przykład zapis binarny (100) 2 odpowiada zapisowi 1<<2. Sumując wartości przedstawione w taki sposób z wykorzystaniem operatora sumy (alternatywy) bitowej " " możemy uzyskać np. (100100) 2 == (1<<5) (1<<2). Operacje bitowe w języku C: "~" negacja, NOT ( ~01010 == 10101 ) " " alternatywa, OR "&" koniunkcja, AND "^" alternatywa wykluczająca, XOR ( 0^1 = 1, 0^0 = 0, 1^1 = 0 ) Należy pamiętać, że zapis skrócony x = y odpowiada zapisowi x = x y, dlatego np. x = y odpowiada x = x y. Wobec tego możliwe są (między innymi) następujące operacje: /* sprawdzenie, czy bit 3 w REJESTR jest jedynką */ if ( REJESTR & (1<<3) ) /* sprawdzenie, czy bit 5 w REJESTR jest zerem */ if (!(REJESTR & (1<<5)) ) /* ustawienie TYLKO bitów 5 i 3 w REJESTR */ REJESTR = (1<<5) (1<<3); /* ustawienie REJESTR na 0b00101000 */ REJESTR = (1<<5) (1<<3); /* wyzerowanie TYLKO bitów 7 i 1 w REJESTR */ REJESTR &= ~((1<<7) (1<<1)); /* REJESTR xxxx xxxx & ~((1<<7) (1<<1)) 0111 1101 ------------------------ wynik 0xxx xx0x */ 1/5

Wartości szesnastkowe zapisujemy z przedrostkiem 0x, np. 0xFD Realizacja pętli nieskończonej: while (1) for (;;) W standardach języka C poprzedzających standard C99 (kompilatory C Keil'a bazują na standardzie C90 http://www.keil.com/support/docs/1893.htm) określone są m.in. następujące zasady: - zmienne muszą być zadeklarowane na początku bloku, w którym występują, tj. przed kodem wykonywanym w tym bloku (np. na początku funkcji, na początku pętli); - komentarze nie mogą być oznaczane ukośnikami, tj. "//", a tylko znakami "/* */" #define <SYMBOL> <wartość> Definicja symboli dla preprocesora (symbole będą zamienione przez preprocesor na ich wartości przed kompilacją kodu): #define STALA 6 #define DLUGOSC 22 Symbole zwyczajowo pisze się wielkimi literami. Wartość może być stałą bądź wyrażeniem. volatile <deklaracja zmiennej> Słowo kluczowe volatile (ang. ulotny, nietrwały) oznacza, że zmienna ma być przez kompilator w procesie optymalizacji traktowana tak, jak gdyby jej wartość mogła ulec zmianie w dowolnym miejscu programu, niezależnie od wykonywanych instrukcji. Dotyczy to m.in. sytuacji, gdy (1) wartość zmiennej jest modyfikowana w procedurze obsługi przerwania, a także, gdy (2) zmienna przypisana jest do rejestru mikrokontrolera, który ulega modyfikacji sprzętowej (np. rejestr flag zmienianych sprzętowo). Przy braku słowa kluczowego volatile kompilator może dokonać na przykład takiej optymalizacji wykorzystania zmiennej tmp: kod programu odpowiednik kodu programu po optymalizacji int tmp; void wait_for_tmp (void) tmp = 0; while (tmp == 0); int tmp; void wait_for_tmp_opt (void) tmp = 0; while (1); Z programu nie wynika bowiem, że wartość tmp może ulec zmianie. Jeżeli jednak zmienna tmp byłaby rejestrem zawierającym flagę ustawianą sprzętowo, oczywiście zmiana taka stałaby się możliwa, a optymalizacja spowodowałaby niezgodne z intencją programisty działanie programu. Żeby uniknąć tej optymalizacji, zmienną należałoby zadeklarować jako volatile int tmp. Deklaracja funkcji: <typ zwracany> <nazwa funkcji> (<typ arg.1> <nazwa arg.1>,..., <typ arg.n> nazwa arg.n>) <ciało funkcji> Funkcje, które nie zwracają danych, powinny zwracać typ void. 2/5

Wskaźnik jest zmienną przechowującą adres pamięci. Deklaracja: Odwołanie do zmiennej wskazywanej: Operator pobrania adresu zmiennej: <typ> *<nazwa zmiennej> *<nazwa wskaźnika> &<nazwa zmiennej> Przykładowe deklaracje Odwołanie do zmiennej wskazywanej Pobranie adresu zmiennej /* deklaracja wskaźnika t na zmienną typu char */ char *t; /* deklaracja wskaźników a i b na zmienne typu int */ int *a,*b; /* dodanie dwóch wartości wskazywanych */ char suma = *x + *y; /* przypisanie wskaźnikowi V adresu zmiennej U */ V = &U; Jeżeli posługujemy się wskaźnikiem do struktury, to dostęp do jej elementów możliwy jest na kilka sposobów: Sposób 1 /* ustawienie wartości zmiennej A należącej do struktury Stmp */ (*Stmp).A = 4; Sposób 2 /* ustawienie wartości zmiennej A należącej do struktury Stmp */ Stmp->A = 4; Struktura to typ złożony grupujący dane różnego typu w jednym obszarze pamięci. Deklaracja struktury: struct <nazwa struktury> <ciało struktury> ; Dostęp do składnika struktury: <nazwa struktury>.<nazwa składnika> Instrukcja wyboru switch Pozwala wykonać różny kod w zależności od wartości przekazanego argumentu. Składnia instrukcji jest następująca: switch(<argument typu całkowitoliczbowego (integer)>) case wyrażenie stałe 1: <kod dla przypadku, gdy wartość argumentu == wyrażenie stałe 1>; break; <...> case wyrażenie stałe N: <kod dla przypadku, gdy wartość argumentu == wyrażenie stałe N>; break; [opcjonalnie] default: <kod dla przypadku, gdy żadne wyrażenie stałe nie było równe argumentowi>; break; Uwaga: słowo kluczowe break pozwala na przerwanie dowolnej spośród instrukcji switch, for, while, do i przejście do instrukcji następnej. 3/5

Następstwo i łączność (precedence and associativity) operatorów w C Następstwo operatorów i ich łączność informują o tym, w jakiej kolejności są one stosowane do operandów (argumentów) podczas określania wartości wyrażenia. Następstwo jest istotne w sytuacji, gdy w wyrażeniu występują operatory wyżej i niżej usytuowane w hierarchii. Operatory położone wyżej w hierarchii następstwa są wyznaczane jako pierwsze. Łączność operatorów dotyczy sytuacji, gdy w wyrażeniu jest zgrupowanych wiele operatorów z tego samego poziomu hierachii następstwa. Wtedy stosowane są one zgodnie z ich zasadą łączości (od lewej do prawej bądź od prawej do lewej). Następstwo i łączność operatorów przedstawiono w tabeli. Operatory są wymienione w kolejności od najwyżej do najniżej usytuowanego w hierarchii następstwa. Operatory Opis Łączność [] (). -> przyrostek ++ przyrostek -- operatory unarne: sizeof & * + - ~! ( rzutowanie typu ) przedrostek ++ przedrostek -- indeksowanie tablicy, wywołanie funkcji 1, wybór elementu przez nazwę, wybór elementu przez wskaźnik, przyrostki inkrementacji/dekrementacji rozmiar w bajtach, adres operandu, dereferencja, unarne +/-, bitowa/logiczna negacja, rzutowanie, przyrostki inkrementacji/dekrementacji * / % mnożenie, dzielenie, moduł + - dodawanie, odejmowanie << >> przesunięcie bitowe w lewo/w prawo < > <= >= porównania (operatory relacji) ==!= porównania (operatory relacji) & ^ bitowe AND bitowe XOR bitowe OR && logiczne AND logiczne OR od lewej do prawej od prawej do lewej od lewej do prawej?: trójargumentowe wyrażenie warunkowe od prawej do lewej = *= /= %= += -= <<= >>= &= ^= = przypisania od prawej do lewej, przecinek (comma operator) od lewej do prawej 1 Nawiasy są stosowane również do grupowania wyrażeń, żeby wymusić ich odpowiednie następstwo. Wyrażenia w nawiasach mogą być zagnieżdżone i wyznaczane są od wewnętrznych do zewnętrznych. 4/5

Typ wyliczeniowy enum Typ wyliczeniowy (ang. enumeration) definiowany jest przez listę stałych całkowitych, którym nadano nazwy. Definicja bez jawnego przypisania wartości stałych: enum <nazwa wyliczenia> <1 element listy>, <2 element listy>,..., <n-ty element listy> ; np.: enum directions left, right, up, down ; Wartości stałe przydzielane są do elementów listy automatycznie. Możliwe jest jednak jawne przypisanie konkretnej wartości stałej do danego elementu listy przez zastosowanie zapisu <dowolny element listy> = <wyrażenie stałe> np.: enum directions left = 10, right, up, down = 30 ; Należy jednak mieć na uwadze, że do elementów, którym nie przypisano wartości w sposób jawny, wartości te przydzielane są automatycznie zgodnie z dwiema zasadami: 1. jeżeli pierwszy element wyliczenia nie ma przypisanej jawnie wartości, to ma on wartość 0; 2. każdy (oprócz pierwszego) element wyliczenia bez przypisanej jawnie wartości ma wartość równą wartości elementu poprzedniego powiększonej o 1. Wobec tego istnieje możliwość powtarzania się tych samych wartości stałych w różnych elementach, jak ma to miejsce w definicji zapisanej poniżej: enum directions left = 10, right, up = 9, down ; /* przypisane wartości: left := 10, right := 11, up := 9, down := 10 */ Możliwe jest jawne duplikowanie wartości stałych, np.: enum change down = 0, decrease = 0, up = 1, increase = 1 ; Deklaracja wyliczenia: np.: enum <nazwa wyliczenia> <nazwa zmiennej>; enum directions selected_direction; selected_direction = left; W języku C wyrażenia definiujące stałą wartość elementu listy są zawsze typu całkowitego. Wartości typu enum mogą być używane wszędzie tam, gdzie język C zezwala na wykorzystanie liczby całkowitej. Typ wyliczeniowy jest przydatny np. przy nazywaniu przypadków instrukcji wyboru switch. 5/5