IMTEE Přednáška č. 11

Podobné dokumenty
Programování MCU ve vyšších programovacích jazycích

x86 assembler and inline assembler in GCC

IMTEE Přednáška č. 8. interrupt vector table CPU při vzniku přerušení skáče na pevně dané místo v paměti (obvykle začátek CODE seg.

Ústav radioelektroniky

Ústav radioelektroniky

8. Laboratoř: Aritmetika a řídicí struktury programu

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Jednočipové mikropočítače

LED_007.c Strana: 1/5 C:\Michal\AVR\Výukové programy\archiv\ Poslední změna: :01:48

Struktura a architektura počítačů (BI-SAP) 9

Jazyk symbolických adres

ISU Cvičení 7. Marta Čudová

Úvod do mobilní robotiky AIL028

IUJCE 07/08 Přednáška č. 6

Strojový kód k d a asembler procesoru MIPS SPIM. MIPS - prostředí NMS NMS. 32 ks 32bitových registrů ( adresa registru = 5 bitů).

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Úvod do mobilní robotiky NAIL028

Vánoční hvězda 2. Publikované: , Kategória: Blikače a optika.

Činnost CPU. IMTEE Přednáška č. 2. Několik úrovní abstrakce od obvodů CPU: Hodinový cyklus fáze strojový cyklus instrukční cyklus


Struktura a architektura počítačů (BI-SAP) 7

/*Dekodovani DFC signalu*/ // Projekt MMIA 2013 // Martin Dujicek, Milan Rejnus

Kubatova Y36SAP 8. Strojový kód Jazyk symbolických instrukcí asembler JSA pro ADOP a AVR Kubátová Y36SAP-strojový kód 1

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

PicoBlaze lekce 1: assembler, C překladač a simulační prostředí Jiří Svozil, Leoš Kafka, Jiří Kadlec svozil@utia.cas.cz

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY. Systém přerušení. České vysoké učení technické Fakulta elektrotechnická

Předmluva 13 Použité konvence 14. KAPITOLA 1 Základní číselné soustavy a pojmy Číselné soustavy a převody 15 1.

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY. Stručný úvod do programování v jazyce C 2.díl. České vysoké učení technické Fakulta elektrotechnická

Základy digitální techniky

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

Struktura programu v době běhu

RISC a CISC architektura

Algoritmizace a programování

PK Design. EVMS-mega128 v1.0. Výukové příklady. Výuková deska s mikrokontrolerem ATmega128. Verze dokumentu 1.0 ( )

Procesor z pohledu programátora

Adresovací módy paměti programu a dat

Dekódování signálu z kvadraturního enkodéru 1

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

Opakování programování

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Metody připojování periferií BI-MPP Přednáška 2

Systém přerušení. Algoritmizace a programování. Struktura počítače - pokračování. Systémová struktura počítače pokrač.

IUJCE 07/08 Přednáška č. 1

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Popis instrukční sady - procesory PIC Aritmetické a logické operace

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

ISU Cvičení 3. Marta Čudová

Petr Krajča. 26. říjen, 2012

AVR Instrukční soubor

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

PROGRAMOVÁNÍ V C++ CVIČENÍ

Assembler RISC RISC MIPS. T.Mainzer, kiv.zcu.cz

LED_006.c Strana: 1/9 C:\Michal\AVR programovani\výukové programy\ Poslední změna: :42:26

Popis instrukční sady procesoru ADOP

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Jednočipové mikropočítače (mikrokontroléry)

Historie osmibitových mikroprocesoru a mikroradicu ZILOG.

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Program "Světla" pro mikropočítač PMI-80

Ústav radioelektroniky. Mikroprocesorová technika a embedded systémy. doc. Ing. Tomáš Frýza, Ph.D.

Seznámení s mikropočítačem. Architektura mikropočítače. Instrukce. Paměť. Čítače. Porovnání s AT89C2051

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

Př. další použití pointerů

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Architektury VLIW M. Skrbek a I. Šimeček

IPA - Lab.1 Úvod do programování v ASM

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Assembler - 2.část. poslední změna této stránky: Zpět

Programování v C++ 2, 4. cvičení

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Více o konstruktorech a destruktorech

Středoškolská odborná činnost 2006/2007. Mikrokontroléry AVR, programování a praktické použití

Vysoká škola chemicko-technologická v Praze Fakulta chemicko-inženýrská Ústav počítačové a řídicí techniky. Aplikace mikroprocesorů.

Základy programování (IZP)

Další aspekty architektur CISC a RISC Aktuálnost obsahu registru

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

Programovací techniky pro práci v reálném čase

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Čtečka otisků prstů 1. POPIS 2. SPECIFIKACE. ECLIPSERA s.r.o. Distributor pro ČR. VÝROBNÍ ČÍSLO

Přednáška. Strojový kód a data. 4. Přednáška ISA J. Buček, R. Lórencz

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Ústav radioelektroniky

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

HelenOS ARM port. Pavel Jančík Michal Kebrt Petr Štěpán

Rozhraní mikrořadiče, SPI, IIC bus,..

PK Design. MB-ATmega16/32 v2.0. Uživatelský manuál. Základová deska modulárního vývojového systému MVS. Verze dokumentu 1.0 (21.12.

- jak udělat konstantu long int: L long velka = 78L;

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

AVR ovladač pro obvod STV5730A, obvod pro vkládání textu do videa

Konstruktory a destruktory

Přerušovací systém s prioritním řetězem

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Assembler - 3.část. poslední změna této stránky: Zpět

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Zápis programu v jazyce C#

Transkript:

AVR Libc pokračování interrupt.h práce s přerušením povolení / zakázání přerušení o makro sei() = instrukce sei o makro cli() = instrukce cli obslužné funkce vždy tvar ISR(JMENO_VEKTORU) // obslužný kod o jména vektorů viz. interrupt.h, např. pro ATmega16: externí přerušení 0 INT0_vect přetečení časovač 1 TIMER1_OVF_vect UART RX USART_RXC_vect atd. proměnné a přerušení přerušení je časově asynchronní událost: o nelze předávat žádné parametry o funkce nemůže vracet hodnotu o všechny proměnné používané v přerušeních by měly být deklarovány s modifikátorem volatile (pro kompilátor nelze optimalizovat) příklad: LED had na ATmega32 /* bezici had 8 LED na portu B ATmega32 perioda posunu asi 0,52s na flck = 1MHz blikani pres 16b casovac T1 s preddelickou /8 */ #include <avr/io.h> #include <avr/interrupt.h> typedef unsigned char uchar; // globalni promenne volatile uchar Had = 0x01; // deklarace funkci void Setup(void); int main (void) Setup(); for(;;); return 0; // nekonecna smycka void Setup(void) // nastaveni portu DDRB = 0xFF; // cely port jako vystupni // nastaveni casovace T1 TCCR1B = (1<<CS11); // zapnuti T1 - zdroj osc/8 1

// nastaveni preruseni TIMSK = (1<<TOIE1); sei(); // preruseni od preteceni T1 // globalni povoleni preruseni ISR(TIMER1_OVF_vect) PORTB = Had; if (Had == 0x80) Had = 0x01; else Had <<= 1; // posun hada o 1 misto doleva o jak byl celý program přeložen (optimalizace -o2, celý program 226 B, ve výpisu chybí startup code 160 B) @00000047: setup 27: DDRB = 0xFF; // cely port jako vystupni SER R24 Set Register OUT 0x17,R24 Out to I/O location 28: TCCR1B = (1<<CS11); // zapnuti T1 - zdroj osc/8 LDI R24,0x02 Load immediate OUT 0x2E,R24 Out to I/O location 30: TIMSK = (1<<TOIE1); // preruseni od preteceni T1 LDI R24,0x04 Load immediate OUT 0x39,R24 Out to I/O location 31: sei(); // globalni povoleni preruseni SEI Global Interrupt Enable RET Subroutine return @0000004F: main 17: LDI R28,0x5F Load immediate LDI R29,0x08 Load immediate OUT 0x3E,R29 Out to I/O location OUT 0x3D,R28 Out to I/O location 18: Setup(); CALL 0x00000047 Call subroutine RJMP PC-0x0000 Relative jump @00000056: vector_9 35: PUSH R1 Push register on stack PUSH R0 Push register on stack IN R0,0x3F In from I/O location PUSH R0 Push register on stack CLR R1 Clear Register PUSH R24 Push register on stack 36: PORTB = Had; LDS R24,0x0060 Load direct from data space OUT 0x18,R24 Out to I/O location 37: if (Had == 0x80) LDS R24,0x0060 Load direct from data space CPI R24,0x80 Compare with immediate BREQ PC+0x05 Branch if equal 41: Had <<= 1; // posun hada o 1 misto doleva LDS R24,0x0060 Load direct from data space LSL R24 Logical Shift Left RJMP PC+0x0002 Relative jump 38: Had = 0x01; LDI R24,0x01 Load immediate 2

krátké rutiny STS 0x0060,R24 Store direct to data space POP R24 Pop register from stack POP R0 Pop register from stack OUT 0x3F,R0 Out to I/O location POP R0 Pop register from stack POP R1 Pop register from stack RETI Interrupt return lepší napsat v asm (viz. dále) o attribute ((naked)) ISR(vector) = holé přerušení, úschovu/obnovu registrů nutno napsat ručně Run-Time model překladače = jak překladač využívá zdroje CPU AVR-GCC jen na MCU s min 128B RAM nutný stack o Všechny lokální proměnné o Volání funkcí Paměťový prostor (ROM, RAM, EEPROM) rozdělen do sekcí (sections) Nejdůležitější sekce: o.text obsahuje program, dále se dělí o.data inicializované globální a statické proměnné o.bss neinicializované globální a statické proměnné o.eeprom data umístěná do paměti EEPROM na čipu AVR Se segmenty lze ručně pracovat, příklad proměnná v paměti EEPROM int prom attribute ((section(".eeprom"))); Příklad rozložení paměti s ATmega128 Start-up code o Lze změnit Automaticky vloženo překladačem před main() inicializace prostředí (stack, atd.) 3

Lze modifikovat podrobnosti viz. doc. k překladači (section.init) Velikost dle typu AVR cca 200 B JMP 0x00000045 Jump // tabulka vektoru preruseni JMP 0x00000045 Jump CLR R1 Clear Register // start-up code OUT 0x3F,R1 Out to I/O location LDI R28,0x5F Load immediate LDI R29,0x08 Load immediate OUT 0x3E,R29 Out to I/O location OUT 0x3D,R28 Out to I/O location LDI R17,0x00 Load immediate LDI R26,0x60 Load immediate LDI R27,0x00 Load immediate LDI R30,0xF6 Load immediate LDI R31,0x00 Load immediate RJMP PC+0x0003 Relative jump LPM R0,Z+ Load program memory and postincrement ST X+,R0 Store indirect and postincrement CPI R26,0x60 Compare with immediate CPC R27,R17 Compare with carry BRNE PC-0x04 Branch if not equal LDI R17,0x00 Load immediate LDI R26,0x60 Load immediate LDI R27,0x00 Load immediate RJMP PC+0x0002 Relative jump ST X+,R1 Store indirect and postincrement CPI R26,0x60 Compare with immediate CPC R27,R17 Compare with carry BRNE PC-0x03 Branch if not equal JMP 0x00000065 Jump // volani main() JMP 0x00000000 Jump // sem by se spravny prog. nemel nikdy dostat Využití registrů Pro svůj běh využívá program jisté skupiny registrů nelze svévolně ruční manipulaci (např. v asm) R0: o Lze využít v inline assembleru (v jednom asm volatile) jako přechodné úložiště R1: o Musí být vždy 0 o Jako r0, ale nakonci nutno vynulovat (crl r1) R2 - R17, R28, R29 o May be allocated by gcc for local data. Calling C subroutines leaves them unchanged. Assembler subroutines are responsible for saving and restoring these registers, if changed. r29:r28 (Y pointer) is used as a frame pointer (points to local data on stack) if necessary r18-r27, r30-r31 o May be allocated by gcc for local data. You may use them freely in assembler subroutines. Calling C subroutines can clobber any of them - the caller is responsible for saving and restoring 4

Volání funkcí CPU nemá instrukci call s parametry nutno ručně (resp. překladač): 1) naplním dohodnutý prostor parametry 2) call funkce 3) funkce ví, kde leží parametry a pracuje s nimi 4) konec funkce návratová hodnota uložena na dohodnuté místo 5) v hlavním programu z dohodnutého místa je manipulováno s návratovou hodnotou o dohodnuté místo: registry nebo zásobník AVR GCC: Argumenty zleva doprava do registrů r25 až r8 o Proměnná = lichý počet B zaokrouhleno na sudý o Nejnižší B parametru = nejnižší registr o Pokud registry nestačí do zásobníku o Funkce s PPP (např. printf() výhradně zásobník) Návratová hodnota: o 1B do r24 (r25 zůstane volný zarovnávání) o 2B do r25:r24 (LSB první jako argumenty) o 4B do r25 r22 o 8B do r25 r18 Příklad volání funkce: int funkce(char p1, int p2) return p1+p2; // uložení parametrů (v pointeru Y) do registrů LDD R22,Y+4 // b LDD R23,Y+5 LDD R24,Y+1 // a (note: zarovnávání) CALL 0x00000047 // volání fce STD Y+3,R25 // vyzvednutí návratové hodnoty STD Y+2,R24 Kombinace AVR-GCC assembler Možnosti: o In-line assembler = instrukce přímo v C-kódu o Samostatné funkce v asm Inline assembler = využití instrukcí procesoru v C kódu Makro asm volatile(asm-template : output-operand-list : input-operand-list : clobber-list); o chová se cca jako funkce s parametry input-operand-list a vracenými hodnotami v output-operand-list funkci volá GCC. Kód je v asm-template 5

o clobber-list = seznam registrů přepisovaných (ručně programátorem) assemblerem (info pro překladač) o kromě asm-template lze ostatní vynechat U GCC překladačů velmi nepřehledné jen ukázky kód nepodléhá optimalizacím Instrukce bez parametrů asm volatile ("nop"); Složitější příklad náhrada světelného hada viz. výše ISR(TIMER1_OVF_vect) asm volatile ( "tst %0 "brne hop "sec "hop: rol %0 ); %2 "out %2, %0" : "=r" (Had) : "0" (Had), "M" (_SFR_IO_ADDR (PORTB)) o \n\t nutné v asm 1 instrukce/řádek o GCC automaticky kopíruje Had do registru %0 a zpět (=r) o Bude přeloženo jako: LDS TST BRNE SEC ROL OUT STS LDS %0 R24,0x0060 R24 PC+0x02 R24 0x18,R24 0x0060,R24 R24,0x0060 Podrobně na http://www.nongnu.org/avr-libc/user-manual/inline_asm.html Funkce v ASM volané z C kódu Nutno v samostatných souborech (musí být *.S) jsou překládány GNU-assemblerem (GAS) o výstup = standardní object file a pak připojeny k projektu linkerem Dokumentace viz. http://www.gnu.org/software/binutils/manual/gas-2.9.1/ Příklad funkce: int Secti(char p1, int p2) PORTB = p1; return p1 + p2 + 10; o Soubor neco.c extern int Secti(char p1, int p2); int main (void) char a = 15; int c; %1 // definovana v AsmFunkce.S 6

c = Secti(a, 384); for(;;); // nekonecna smycka return 0; o Soubor AsmFunkce.S #include "avr/io.h" workreg = 16 // =.def workreg = r16.global Secti.func Secti // realizuje p1(char) + p2(int) + 10, na port B zapise p1, vraci int; // p1 bude v r25 (0) a r24 // p2 bude v r23 (HIGH(p2)) a r22 (LOW(p2)) // vysledek musi byt v r24 (LOW) a r25 (HIGH) Secti: push workreg // r16 nutno uschovat, r18 az r27 nikoli // PORTB = p1 out _SFR_IO_ADDR(PORTB), 24 // p1 + p2 add adc 24, 22 // soucet nizsich B 25, 23 // soucet vyssich B // vysledek je tam, kde ma byt pro return // + 10 ldi workreg, 10 add 24, workreg adc 25, 0 pop workreg ret.endfunc // pripadne dalsi funkce //.global DalsiFunkce //.func... Přístup ke globálním proměnným o Soubor neco.c volatile unsigned char globprom; o Soubor AsmFunkce.S #include "avr/io.h".extern globprom // externe globalni promenna.global Secti.func Secti // atd, mohu použít globprom 7