Programování MCU ve vyšších programovacích jazycích

Podobné dokumenty
IMTEE Přednáška č. 11

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

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

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

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

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

Opakování programování

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

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

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

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

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

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

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

Úvod do mobilní robotiky AIL028

Algoritmizace a programování

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

- tzv. standardní vstupní a výstupní proud (input / output stream)

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

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

MSP 430F1611. Jiří Kašpar. Charakteristika

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

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

RISC a CISC architektura

Úvod do mobilní robotiky NAIL028

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

Základy programování (IZP)

IUJCE Přednáška č. 1. programování v C na vyšší úrovni základy objektově orientovaného programovaní v (C++, C#)

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Vstup a výstup datové proudy v C

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Programovací jazyk C++ Hodina 1

Základy programování v C

Základy programování v C

Část I. Část 1 Základy programování v C. Přehled témat. Základy programování v C. Jazyk C

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

Jazyk C++, některá rozšíření oproti C

Provádění instrukcí. procesorem. Základní model

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

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Struktura programu v době běhu

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

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

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

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY


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

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Lekce 9 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

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

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

10 Práce s řetězci - pokračování

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

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

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

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

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

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

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

Zápis programu v jazyce C#

Práce se soubory. Základy programování 2 Tomáš Kühr

Šifrování/Dešifrování s použitím hesla

Formátové specifikace formátovací řetězce

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Výrazy, operace, příkazy

ADT/ADS = abstraktní datové typy / struktury

Jazyk symbolických adres

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.

Operační systémy. Cvičení 3: Programování v C pod Unixem

Kubatova Y36SAP procesor - control unit obvodový a mikroprogramový řadič RISC Y36SAP-control unit 1

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

Odvozené a strukturované typy dat

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

MPASM a IDE pro vývoj aplikací MCU (Microchip)

Data, výrazy, příkazy

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

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Ústav radioelektroniky

Základy programování (IZP)

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

vstup a výstupv jazyce C

Technické prostředky počítačové techniky

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

Výuková laboratorní sestava seminář pro učitele

Operační systémy. Cvičení 4: Programování v C pod Unixem

Paralelní programování

.include "m32def.inc" // Konstanty.equ N = 5 // Počet prvků v poli.equ PRVNI = 3 // První číslo v poli

Ústav radioelektroniky

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

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

x86 assembler and inline assembler in GCC

Základy programování (IZP)

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787

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

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

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

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Akademický rok: 2004/05 Datum: Příjmení: Křestní jméno: Osobní číslo: Obor:

Transkript:

Programování MCU ve vyšších programovacích jazycích Úvod vyšší programovací jazyk = High Level Language (HLL) Dříve nemyslitelné, důvody: nedostatek RAM, ROM, malý výkon CPU dnes poměrně běžné, používané jazyky: o C absolutně nejčastěji o C++ (EC++ Embedded C++) jen větší typy (16 bit a výše) o Pascal, Basic, atd také, ale Důvody: o rychlost vývoje o lehčí přenositelnost na jiné typy CPU (MCU) ideální stav: o architektura MCU je přizpůsobena požadavkům překladače o kód je stejně efektivní jako Assembler skutečnost použití HLL = nárůst kódu (code overhead): o nepřizpůsobená architektura 100ky % o přizpůsobená 50 100% (závisí na programátorovi) dále HLL = C Požadavky HLL na architekturu CPU vlastnost komentář podpora AVR podpora 8051 několik akumulátorů žádné přesuny operátorů při ALU operacích ano (32 GPR) ne (pouze Acc) podpora pointerů dobré nejméně 4 nezávislé (SP, data, cíl, zdroj) bitové adresování pro bitové proměnné (bool) přemístitelný zásobník podpora polí efektivní výpočet adres SP pro plný adresový prostor efektivní přístup na pole přes pointer na začátek pole a offsetu (displacement), podpora ++ a -- podpora +- operací s šířkou = šířce adresy ano (SP, X, Y, Z) ne velmi chabá (@R0,1) ano ano (16b SP) omezeně (8b SP) ano ne ano (ADIW, MOVW) jen INC/ DEC DPTR dostatek zdrojů RAM pro operace RISC, paměti omezeně 1

Kompilátory pro MCU s čísly > šířka ALU ROM code overhead výkon CPU nejznámější kompilátory o komerční 8051 Keil, IAR AVR Keil, IAR o free 8051 SDCC AVR AVR GCC dle typu (externí paměti, CISC) moderní klony lepší Kompilátor HLL a non-pc aplikace nutné omezení specifikace HLL (např. dle ANSI C): o práce s obrazovkou a klávesnicí (printf(), scanf() atd.) rozšíření specifikace HLL o non-pc hardware (porty, periferie) o nové datové typy o harvardská architektura (program je odděleně od dat) o přerušení (obsluha, povolení/zakázání) program v assembleru = pouze výkonný kód program v HLL = o výkonný kód o inicializace CPU pro běh programu (Run time Environment, Start-up code) pro ATmega a AVR GCC je to cca 150-200 B kódu Kompilátor AVR GCC velmi kvalitní C kompilátor, GPL licence možnost snadno a plně integrovat do AVR studia vyhovuje ANSI C (= obsahuje všechny knihovny) Přístup k HW AVR nutno #include <avr/io.h> v něm pomocí #include definovány jména a adresy registrů v SFR lze je používat jako běžné proměnné bytový přístup na porty: unsigned char MujPort; DDRA = 0xff; // port A = vystupy PORTA = 0x03; // zapis Bytu na port A (= bity 0,1 do Log 1) // lepší by bylo PORTA = (1<<PA1) (1<<PA0) MujPort = PINA; // cteni Bytu z portu A, pozor nikoli PORTA! 2

zápis bitů na porty o nahození bitů do 1 (a zbytek do 0) PORTA = (1<<PA0) (1<<PA3); o nahození bitů do 1 (a zbytek ponechán stávající stav) PORTA = (1<<PA0) (1<<PA3); o shození bitů do 0 (a zbytek do 1) DDRA = ~((1<<PA0) (1<<PA3)); o shození bitů do 0 (a zbytek ponechán stávající stav) DDRA &= ~((1<<PA0) (1<<PA3)); větvení na základě stavu bitu BIT na adrese ADR o využívá se maskování a použitím int jako datového typu pro bool v C (0 FALSE;!= 0 TRUE) if (ADR & (1<<BIT)) // if (BIT == 1) // akce if (!(ADR & (1<<BIT)) // if (BIT == 0) // akce o pro cykly stejné příklad funkce pro odeslání bytu na UART pro ATmega 16 (přes polling dotazování na stav vysílacího registru bit UDRE v registru UCSR) void USART_Transmit(uint8_t c) // cekani na prazdny buffer while (!(UCSR & (1<<UDRE))); // prazdny while UDR1 = c; // odeslani dat o jak překladač přeloží while (!(UCSR & (1<<UDRE))); SBIS 0x0B,5 Skip if bit in I/O register set RJMP PC-0x0001 Relative jump // další prikaz po while Práce s velkými datovými typy celočíselné většinou bez problémů u 8b překladačů platí: o char 8b o int 16b o long 32b příklad int main (void) long Prom1, Prom2, Vysl; Prom1 = 12345678; Prom2 = 87654321; Vysl = Prom1 + Prom2; 3

4: Prom1 = 12345678; LDI R24,0x4E Load immediate LDI R25,0x61 Load immediate LDI R26,0xBC Load immediate LDI R27,0x00 Load immediate STD Y+1,R24 Store indirect with displacement STD Y+2,R25 Store indirect with displacement STD Y+3,R26 Store indirect with displacement STD Y+4,R27 Store indirect with displacement 5: Prom2 = 87654321; LDI R24,0xB1 Load immediate LDI R25,0x7F Load immediate LDI R26,0x39 Load immediate LDI R27,0x05 Load immediate STD Y+5,R24 Store indirect with displacement STD Y+6,R25 Store indirect with displacement STD Y+7,R26 Store indirect with displacement STD Y+8,R27 Store indirect with displacement 7: Vysl = Prom1 + Prom2; LDD R18,Y+1 Load indirect with displacement LDD R19,Y+2 Load indirect with displacement LDD R20,Y+3 Load indirect with displacement LDD R21,Y+4 Load indirect with displacement LDD R24,Y+5 Load indirect with displacement LDD R25,Y+6 Load indirect with displacement LDD R26,Y+7 Load indirect with displacement LDD R27,Y+8 Load indirect with displacement ADD R24,R18 Add without carry ADC R25,R19 Add with carry ADC R26,R20 Add with carry ADC R27,R21 Add with carry STD Y+9,R24 Store indirect with displacement STD Y+10,R25 Store indirect with displacement STD Y+11,R26 Store indirect with displacement STD Y+12,R27 Store indirect with displacement o zde již se začíná objevovat výhoda 32 GPR o pro ATmega32 kód 224B ale co toto: int main (void) double Prom1, Prom2, Vysl; Prom1 = 12345678; Prom2 = 87654321; Vysl = Prom1 + Prom2; o pro ATmega32 kód 1638 B nebo toto: #include <math.h> int main (void) double Uhel = 30, SinUhlu; SinUhlu = sin(uhel*3.141592/180); 4

o pro ATmega32 kód 2742 B Optimalizace překladače AVR Libc stdint.h u MCU nutné u AVR GCC 5 úrovní: o O0 optimalizace vypnuta o O1 O3 optimalizace (vyšší číslo = vyšší stupeň opt.) o Os opt. na velikost kódu (= O2 které nezvětšují velikost kódu + něco navíc) Nelze paušalizovat, vždy nutno vyzkoušet = část C standardních knihoven (ANSI C) pro AVR Budou zmíněny jen některé, podrobně viz. http://www.nongnu.org/avr-libc/usermanual/modules.html Libc definuje vlastní datové typy typedef signed char int8_t typedef unsigned char uint8_t typedef signed int int16_t typedef unsigned int uint16_t pgmspace.h typedef signed long int int32_t typedef unsigned long int uint32_t typedef signed long long int int64_t typedef unsigned long long int uint64_t o long long = double word int dle ISO C99 64b pozor: double taktéž 32b! Při práci s konstantními daty v ROM (paměť programu - flash u AVR) pokud např. v programu napíšeme char *Text = "Dobry den, jak se mate"; o proměnná je inicializovaná text musí být v ROM o leží v RAM po resetu je obsah z ROM kopírován do RAM text 2x zabírá zbytečně RAM řešení MCU mají instrukce pro čtení z ROM (LPM) data uložíme pouze do ROM rozšíření jazyka C (u AVR GCC nutno #include <avr/pgmspace.h>) o datové typy pro proměnné v ROM typedef void PROGMEM prog_void typedef char PROGMEM prog_char typedef unsigned char PROGMEM prog_uchar typedef int8_t PROGMEM prog_int8_t typedef uint8_t PROGMEM prog_uint8_t typedef int16_t PROGMEM prog_int16_t typedef uint16_t PROGMEM prog_uint16_t 5

typedef int32_t PROGMEM typedef uint32_t PROGMEM prog_int32_t prog_uint32_t // pointer pro řetězce #define PGM_P const prog_char * // obecný pointer do ROM #define PGM_VOID_P const prog_void * o funkce pro práci s ROM void *memcpy_p (void *, PGM_VOID_P, size_t) char *strcpy_p (char *, PGM_P) // a několik dalších (ekv. k ANSI C funkcím, ale s _P) příklad pgm_read_byte_near() pgm_read_byte_far() řetězec v ROM #include <avr/io.h> #include <avr/pgmspace.h> // cteni 1B z ROM (do 64KB) // cteni 1B z ROM (nad 64KB) math.h const char TextROM[] PROGMEM = "Dobry den, jak se mate"; int main (void) char TextRAM[32]; // kopie textu z ROM do RAM strcpy_p(textram, TextROM); o poznámka: const char TextROM[] PROGMEM = " "; tento formát nutno dodržet, např. const char *TextROM PROGMEM = " " již vede ke kopii řetězce do RAM vždy je nutno se podívat do dokumentace k překladači jako v ANSI C nutno přilinkovat matematickou knihovnu libm.a stdio.h 6

AVR nemá vstupní a zobrazovací zařízení o stdin = klávesnice o stdout = obrazovka o stderr = obrazovka Základem je princip: o printf() apod. používá putchar() o scanf() apod. používá getchar() nutno přesměrovat např. LCD displej, UART, #include <stdio.h> #include <avr/io.h> static int uart_putchar(char c, FILE *stream); void init_uart(); nelze otevřít standardní proudy static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); static int uart_putchar(char c, FILE *stream) while(!(ucsra, (1<<UDRE))); UDR = c; int main(void) init_uart(); stdout = &mystdout; printf("10 = %d", 10); stdlib.h delay.h void init_uart() // priklad zakladniho nastaveni UBRRH = 0; UBRRL = 25; UCSRC = (1<<URSEL) (1<<UCSZ1) (1<<UCSZ0); pozor: zabírá hodně ROM příklad výše cca 2kB dynamickou paměť nepoužívat příliš náročné na zdroje MCU generování čekacích smyček void _delay_loop_1 (uint8_t count) void _delay_loop_2 (uint16_t count) čekají count počet strojových cyklů void _delay_us (double us) void _delay_ms (double ms) 7

čekají us ( ms) počet μs (ms) o nutno definovat makro F_CPU f CLK MCU v Hz: ručně #define F_CPU 16000000 v AVR studiu _delay_ms() využívá _delay_loop_2() _delay_us() využívá _delay_loop_1() příklad: #include <util/delay.h> max interval je 262.14 ms / F_CPU v MHz max interval je 768 us / F_CPU v MHz #define F_CPU 16000000 int main(void) _delay_ms(12); // 16 MHz // 12 ms string.h standardní fce pozn.: manipulace s řetězci v ROM je v pgmspace.h 8