Upload
vokiet
View
214
Download
0
Embed Size (px)
Citation preview
A1B14MIS Mikroprocesory pro výkonové systémy 07 1
České vysoké učení technické Fakulta elektrotechnická
MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY
Ver.1.10 J. Zděnek, 2017
Stručný úvod do programování v jazyce „C“
2.díl
A1B14MIS Mikroprocesory pro výkonové systémy 07 2
Programovací jazyk „C“ - proměnné
• Proměnné:
• Pro realizaci určitého algoritmu potřebujeme nejen příkazy pro určenícesty výpočtu ale i data, která algoritmus zpracovává. Datům která se mohou měnit během realizace algoritmu se nezívají proměnné.
• Obyčejné proměnné které neovládají žádný hardware leží v paměti dat mikropočítače, programátor těmto proměnným zvolí symbolická jména a linker (na základě linker skriptu) sám zvolí místo kde budou proměnné v paměti dat uloženy.
• Programátor pak proměnné osloví pouze jejich symbolickým jménem
• Pro volbu symbolických jmen platí jednoduchá pravidla:• Jméno proměnné se smí skládat z velkých a malých písmen, číslic a
podtržítka („_“).• Jméno proměnné nesmí začínat číslicí
• Pro každou proměnnou musí programátor udat její typ tj. jaké hodnoty do proměnné budou ukládány
• Proměnnou nutno nejdříve deklarovat (tj. zvolit její jméno a typ), teprve pak ji lze použít pro uložení dat.
A1B14MIS Mikroprocesory pro výkonové systémy 07 3
Programovací jazyk „C“ - proměnné
• Proměnné:
• Typ proměnné: nejčastěji používané typy proměnných:• int – pro celá čísla se znaménkem
• unsigned int (nebo stačí unsigned) – pro celá čísla kladná
• double – pro čísla racionální (necelá)• Viz příklady deklarace a použití na dalších snímcích
• Doba života je další důležitou vlastností proměnných tj. zda existují po celou dobu běhu programu (jsou statické) nebo existují jen po dobu běhu programu danou funkcí (nebo vnitřním blokem funkce) říká se jim automatické.
• Statické proměnné:
• lze deklarovat tak aby deklarace ležela mimo všechny funkce, např. int prumerKruhu
• Nebo na začátku funkce nebo bloku doplněním typu o slovo static např. static int stavReseni
A1B14MIS Mikroprocesory pro výkonové systémy 07 4
Programovací jazyk „C“ - proměnné
• Proměnné:
• Doba života (pokračování):• Automatické proměnné: lze deklarovat na začátku funkce nebo bloku
bez slova static. Existují jen po dobu běhu funkce a vždy při dalším běhu se zakládají znovu (leží na zásobníku). Nelze tedy v těchto proměnných uchovat hodnotu mezi jednotlivým volám funkce.
• Formální parametry: stejné pravidlo jako pro automatické proměnné(tj. deklarované na začátku funkce nebo bloku) platí pro formálníparametry funkce (tj. pro parametry v kulatých závorkách hlavičky funkce). Formální parametry se při volání funkce zakládají vždy znovu a kopíruje se do nich skutečná hodnota uvedená v daném volánífunkce.
A1B14MIS Mikroprocesory pro výkonové systémy 07 5
Programovací jazyk „C“ - proměnné
• Proměnné:
• Viditelnost proměnných: vlastnost proměnné, která říká z jaké části programu jsou dané proměnné známé (viditelné).
• Globální proměnné: jsou viditelné z libovolné části programu. Globálníproměnné se zakládají mimo všechny funkce a jsou zároveň statické. Pokud má být globální proměnná známá v jiném souboru programu (pokud je program členěný do více souborů) než je deklarována, tak v tomto souboru musí být označena slovem extern tedy extern int x
• Lokální proměnné: jsou viditelné pouze v bloku kde jsou deklarovány. Mezi lokální proměnné patří statické deklarované na začátku bloku (např. static int x) a automatické proměnné.
• Všechny dosud uvedené druhy proměnných musí být deklarovány před vlastním překladem kompilátorem. Existují ještě proměnné, které lze vyžádat při běhu programu, těm se říká dynamické. Těmi se zatím nebudeme zabývat.
A1B14MIS Mikroprocesory pro výkonové systémy 07 6
Programovací jazyk „C“ - proměnné
• Proměnné:
• Volba jmen proměnných:• Pokud programátor dodrží pravidla o povolených znacích ve jménu
proměnných je volba jména na něm.• Dohoda o volbě jmen proměnných - je vhodné dodržovat dohodu
mezi programátory a jméno volit mnemotechnicky (tedy tak, aby se ze jména poznalo jakých dat se obsah proměnné týká – podstatně to zvyšuje čitelnost programu). Jedna často dodržovaná dohoda je shodná s volbou jmen funkcí. Tedy první mnemotechnická část jména začíná malým písmenem a každá další velkým. Např: prumerOsyKola.
• Zcela nevhodná volba jmen proměnných:
• Např. x1, x2, x3, y104, w, a, pokus, něco, nazdar atp.
A1B14MIS Mikroprocesory pro výkonové systémy 07 7
Programovací jazyk „C“– statické proměnné
Staticképroměnnéznámé v celém programu (globální)
Staticképroměnnéznámé jen uvnitřfunkce (bloku)(lokální), zde v „main“
A1B14MIS Mikroprocesory pro výkonové systémy 07 8
Programovací jazyk „C“– viditelnost proměnných (visibility)
Viditelné(známé) v celém programu (globální)
Vidilelné(známé) jen ve funkci (bloku), kde jsou deklarovány) (lokální), zde v „main“
A1B14MIS Mikroprocesory pro výkonové systémy 07 9
Programovací jazyk „C“– automatické proměnné a formální parametry
Automaticképroměnné se zakládají při každém volánífce znovu a na konci fcezanikají
Formálníparametry se zakládají při každém volánífce znovu a na konci fcezanikají
A1B14MIS Mikroprocesory pro výkonové systémy 07 10
Programovací jazyk „C“– viditelnost proměnných (visibility)
Viditelné(známé) pouze uvnitř funkce (bloku), jsou lokální
Viditelné(známé) pouze uvnitř funkce (bloku), jsou lokální
A1B14MIS Mikroprocesory pro výkonové systémy 07 11
Programovací jazyk „C“ – proměnné – KRITICKÁ POZNÁMKA
• Proměnné:• Správný programátorský přístup skrývá výpočetní proměnné funkcí před
neautorizovaným přístupem z dalších funkcí (např. chybou programátora), tak aby výpočet nebyl zkreslen (použitím automatických proměnných). Dále pro předáváníparametrů do funkcí používá formální a skutečné parametry.
• Výše řečené však NEPLATÍ pro v laboratoři použitý mikrokontrolér PIC18F87J11.• Proč?• Automatické proměnné (tj.lokální) a formální parametry se zakládají (a ruší) na
zásobníku (stack). Platforma PIC18 má speciální zásobník s rychlým přístupem (tzv. hardware stack), ale zásobník je poměrně málo hluboký (31 položek). Pokud se kompilátor domnívá, že by mohlo dojít k přetečení zásobníku (a havárii programu) vloží automaticky dodatečný kód (ten programátor nevidí), který přesune obsah zásobníku do hlavní paměti a pak teprve zavolá funkci a na konci funkce přesune vše zpět. Program pak z logického pohledu pracuje správně, přesun zásobníku ale trvá nějaký dodatečný čas a velmi zpomalí např. reakci na žádost o přerušení.
• Co z toho plyne pro nás?
• Používejte globální nebo statické proměnné, které se nevytvářejína zásobníku. Nepoužívejte automatické (lokální) proměnné a omezte použití formálních parametrů.
A1B14MIS Mikroprocesory pro výkonové systémy 07 12
Programovací jazyk „C“ - konstanty
• Konstanty:• Číselné:
• 12 (desítková), 0xF4 (šestnáctková), 345.76 (reálná)• 0b11001001 (binární) – specialita našeho překladače
• Symbolické:• #define UHEL_ALFA 456• Nekončí středníkem, je zvykem jméno psát velkými písmeny a
mnemotechnické části oddělovat podtržítkem• Výčtové:
• enum {FALSE, TRUE};• enum {ALFA, BETA, GAMA, DELTA}Symbolickým jménům se přiřazují celá čísla počínaje nulou. Tedy pozor FALSE
musí být v enum první, aby se přiřadila nula (což v „C“ znamená false) a truepak druhé, tomu se přířadí jedna což v „C“ znamená true (tedy něco jiného než nula)
• Řetězcové (literál):• Těmi se zatím nebudeme zabývat.• Např. „Nazdar“• V „C“ nemají speciální proměnnou, nutno použit pole
A1B14MIS Mikroprocesory pro výkonové systémy 07 13
Programovací jazyk „C“– konstanty
Symbolickákonstanta
Výčtovákonstanta
Binárníkonstanta
A1B14MIS Mikroprocesory pro výkonové systémy 07 14
Programovací jazyk „C“ - výraz
• Výraz:
• „Výraz“ je programová konstrukce pro výpočet hodnoty• Může se skládat z:
• Proměnných
• Konstant• Operátorů (aritmetických, logických, bitových)
• Dvojic kulatých závorek (pro označení priority částí výpočtu)
• Dvojic kulatých závorek může být více dle potřeby• Používejte kulaté závorky pro označení priority výpočtu, pak není
třeba znát (a učit se) jakou vzájemnou prioritu mají operátory.• Příklady výrazů:
• (x / y) * 3.14 // deleni a nasobeni
• z || w // logicke OR• r >> 8 // bitovy operator posunu vpravo
A1B14MIS Mikroprocesory pro výkonové systémy 07 15
Programovací jazyk „C“ – příkaz přiřazení
• Příkaz přiřazení :
• Příkaz přiřazení (přiřazovací příkaz) používá znak „=“• Přiřazuje hodnotu vypočtenou na pravé straně znaku „=“ do proměnné
uvedené na levé straně• Na levé straně musí být proměnná reprezentovaná pozicí v paměti dat. Často se říká, že na levé straně musí být tzv. „lvalue“ neboli „locationvalue“ což značí, že to musí být proměnná.
• Pokud je na pravé i levé straně shodná proměnná, tak se nejprve vypočítá výraz na pravé straně do dočasné proměnné (tu programátor nevidí) s použití původní hodnoty a pak se teprve nová hodnota přiřadí na levou stranu.
• Příklady přiřazení:• x = (x / y) * 3.14 // x je na obou stranách „=“, to je ok
• u = z || w
• m = r >> 8
A1B14MIS Mikroprocesory pro výkonové systémy 07 16
Programovací jazyk „C“ – operátory
• Operatory (výběr):
• Aritmetické:• +, -, *, /, %
• „/“ – dělení. Pozor pokud jsou obě hodnoty okolo „/” celočíselné jednáse o celočíselné dělení (např. 2 / 3 = 0), pokud je alespoň jednahodnota okolo „/” reálná jedná se o běžné dělení.
• „%“ – zbytek po dělení (např. 5 % 3 = 2).
• Logické:• „!” - logické NOT. (Pozor !0 = 1; !234 = 0, atp.)
• „ ||” - logické OR (např. 0 || 45 = 1)
• „&&” - logické AND (např. 33 && 45 = 1)• “!= „ - logické XOR (např. 33 != 45 = 1)
A1B14MIS Mikroprocesory pro výkonové systémy 07 17
Programovací jazyk „C“– operátory aritmetické
Celočíselnédělení
Zbytek po dělení
Normální dělení
A1B14MIS Mikroprocesory pro výkonové systémy 07 18
Programovací jazyk „C“– operátory logické
Program jde sem
Program jde sem
Program jde sem
Program jde sem
A1B14MIS Mikroprocesory pro výkonové systémy 07 19
Programovací jazyk „C“ – operátory (pokračování)
• Operatory (výběr):
• Bitové:• „~” (vlnovka) – bitové NOT (Např. ~0xFF00 = 0x00FF atp.)
• „|“ - bitové OR (např. 0xFF00 | 0x00FF = 0xFFFF)
• „&“ – bitové AND (např. 0xFF00 & 0x 0x00FF = 0x0000)• „^“ (stříška) – bitové XOR (např. 0xFF00 ^ 0xFFFF = 0x00FF)
• „>>“ – bitový posun vpravo (logický nikoliv aritmetický) (0x00FF >> 4 = 0x000F)
• „<< “ – bitový posun vlevo (např. 0x00FF << 8 = 0xFF00)
A1B14MIS Mikroprocesory pro výkonové systémy 07 20
Programovací jazyk „C“– operátory bitové
Bitové NOT
Bitové OR
Bitové AND
Bitové XOR
Bitový posun vpravo
Bitový posun vlevo
A1B14MIS Mikroprocesory pro výkonové systémy 07 21
Programovací jazyk „C“ – operátory (pokračování)
• Operatory (výběr):
• Relační (porovnávací):• „== “ – rovná se (např. 75 == 75 = 1)
• „!= “ – nerovná se (např. 21 != 13 = 1)
• „> “ – větší než (např. 27 > 21 = 1)• „>= “ – větší nebo rovno (34 >= 34 = 1)
• „< “ – menšíí než (14 < 23 = 1)
• „<= “ – menší nebo rovno (57 <= 57 = 1)
A1B14MIS Mikroprocesory pro výkonové systémy 07 22
Programovací jazyk „C“– operátory relační
Program jde sem
Program jde sem
Program jde sem
Program jde sem
Program jde sem
A1B14MIS Mikroprocesory pro výkonové systémy 07 23
Programovací jazyk „C“ – ovládání hardware PIC18F87J11
• Ovládání (programování) hardware PIC18F87J11 z pohledu „C“ je velmi jednoduché.
• Každý blok hardware má určitý počet ovládacích a stavových registrů• Všechny registry jsou osmibitové• Každý registr má jméno, některé registry lze programovat jednotlivě po bitech,
pak i každý bit má svoje jméno.• Jména registrů i bitů jsou uvedena v dokumentaci „PIC18FJ87J11 Family
Data Sheet“. Číslo dokumentace je DS39778. Dokumentaci najdete na webu předmětu MIS nebo na webové stránce firmy Microchip.
• Aby bylo možné z „C“ adresovat ovládací registry jejich jmény z dokumentace, je nutné dodefinovat do „C“ určité proměnné. To učinil výrobce software (Microchip) a definice uložil do hlavičkového souboru p18f87j11.h, který je třeba do našeho programu zatáhnout příkazem #include (viz příklady v této presentaci). Dodefinované proměnné jsou typu struktura a union.
• Adresování ovládacích registrů používá metodu „Namapování registrů do paměti dat“ (Memory Mapped Input/Output), pak se registry osloví (jejich jménem z dokumentace) jako každá jiná obyčejná proměnná (která neovládážádný hardware)
A1B14MIS Mikroprocesory pro výkonové systémy 07 24
Programovací jazyk „C“ – ovládání hardware PIC18F87J11
• Ukázka dodefinování jmen ovládacích registrů dle dokumentace. Programátor nic v souboru p18f87j11 nemění, pouze ho zatáhne do svého programu příkazem #include. Ukázka níže zahrnuje dodefinování jmen ovládacího registru časovače 0 a jeho bitů..
A1B14MIS Mikroprocesory pro výkonové systémy 07 25
Programovací jazyk „C“ – ovládání hardware PIC18F87J11
A1B14MIS Mikroprocesory pro výkonové systémy 07 26
Programovací jazyk „C“– ovládání hardware PIC18F87J11
Nastavení všech bitů ovládacího registru najednou
Nastaveníovládacího bitu odděleně (za jméno registru se přidá „bits“ a tečka)
A1B14MIS Mikroprocesory pro výkonové systémy 07 27
Programovací jazyk „C“ – oživení systému přerušení
• U mikrokontroleru PIC18F87J11 lze použít buď jednoúrovňový (neprioritní) systém přerušení nebo dvouúrovňový systém (nižší a vyšší priorita).
• V laboratoři budeme používat dvouúrovňový systém (viz následující snímek)• Tento mikrokontroler má mnoho zdrojů přerušení, ale jen dvě hladiny priority.
Libovolný zdroj přerušení (např. časovač) lze připojit do libovolné z těchto dvou hladin priority. Pokud je do jedné hladiny připojeno více zdrojů přerušenív obsluze přerušení (ISR – Interrupt Service Routine) je nutné programovětestovat, který z připojených zdrojů žádá o obsluhu.
• IPEN - Dvouhladinový systém přerušení se zvolí nastavením bitu IPEN = 1 (viz. též následující snímek).
• xIF - Každý zdroj přerušení má (v některém ovládacím registru) bit žádosti o přerušení. Jméno tohoto bitu končí na IF (Interrupt flag), bit se nastavuje harwareově, ale nulovat v ISR ho musí program.
• xIP – Tímto bitem se voli připojení do jedné ze dvou hladin priority• xIE – (Interrupt Enable) – povoluje přerušení od určitého zdroje• GIEL, GIEH – připojují povolené zdroje přerušení do prioritního kodéru. Oba
bity musí být aktivní (tj. = 1)
A1B14MIS Mikroprocesory pro výkonové systémy 07 28
Programovací jazyk „C“– oživení systému přerušení
Interrupt Enable
Interrupt Flag (Request)
Interrupt Priority
Low Priority Enable
Priority System On
High Priority Enable
A1B14MIS Mikroprocesory pro výkonové systémy 07 29
Programovací jazyk „C“ – příklad – přerušení od TIMER0
• Příklad na následujících snímcích demonstruje:
• Přerušení od TIMER0• Aktivní vyšší priorita
• Způsob vyplnění tabulky vektorů přerušení (1), (2). Vyplnění nelze použít přímo v „C“, provede se použitím tzv „Inline assembleru“ kterému kompilátor „C“ rozumí viz _asm…_endasm
• Způsob deklarace ISR tj funkcí, které jsou volány pomocí přerušení (3) (4)
• Naprogramování zvoleného módu TIMER0• Připojení TIMER0 do vyšší hladiny přerušení
• Aktivace systému přerušení (GIEL, GIEH). Nastavení t ěchto dvou bit ůmusí být vždy poslední po nastavení všech ostatních parametrů
• Program na pozadí (background loop) je v tomto případě prázdný (main) a procesor čeká na žádost o přerušení od TIMER0 a v čase mezi tím nedělá nic (točí se v prázdné smyčce)
• Příznaky žádosti o přerušení se nastaví v hardware, nulovat se musíprogramově (viz ISR)
A1B14MIS Mikroprocesory pro výkonové systémy 07 30
Programovací jazyk „C“– příklad – přerušení od TIMER0
Příklad – 1 část
A1B14MIS Mikroprocesory pro výkonové systémy 07 31
Programovací jazyk „C“– příklad – přerušení od TIMER0
Příklad – 2 částPříklad – 2 část
A1B14MIS Mikroprocesory pro výkonové systémy 07 32
Programovací jazyk „C“– příklad – přerušení od TIMER0
Příklad – 3 část
Tabulka vektorůpřerušení
ISR pro vyšší a nižší prioritu přerušení
ISR pro vyšší a nižší prioritu přerušení