Biblioteka avr-libc
Transkrypt
Biblioteka avr-libc
Programowanie
mikrokontrolerów
rodziny AVR
Narz dzia rozwojowe
1
AVR-GCC
AVR-GCC jest darmowym kompilatorem j zyka C
(licencja GNU) słu cym do pisania programów dla
mikrokontrolerów serii AVR firmy ATMEL.
Kompilator jest doł czany do rodowiska AVR
Studio, pozwalaj c na tworzenie projektów
programistycznych w j zyku C/C++
2
Programy narz dziowe - Binutils
Jest to zbiór programów pozwalaj cych na sprawne
zarz dzanie projektem.
Binutils s doł czone do rodowiska rozwojowego i wraz
z kompilatorem AVR-GCC oraz bibliotek avr-libc stanowi
kompletny ła cuch narz dzi rozwojowych
3
Programy narz dziowe - Binutils
Dost pne s nast puj ce programy narz dziowe:
avr-as - asembler
•avr-ld - linker
•avr-ar - zarz dza bibliotekami
•avr-ranlib – generuje indeksy do bibliotek
•avr-objcopy – kopiuje i tłumaczy zbiory obiektowe
•avr-objdump – wy wietla informacje z plików obiektowych
•avr-size – podaje informacj o rozmiarze sekcji i programu
•avr-nm – listuje symbole ze zboiru obiektowego
•avr-strings – listuje ła cuch znakowe ze zbiorów obiektowych
•avr-strip – usuwa symbole
•avr-readelf – wy wietla zawaro zbioru z rozszerzeniem ELF
•avr-addr2line – konwertuje adresy
•avr-c++filt – filtr symboli C++
4
Biblioteka avr-libc
•avr-libc jest standardow bibliotek C dla AVR-GCC.
•Biblioteka zawiera wiele standardowych funkcji C
i wła ciwych dla architektury procesorów rodziny AVR.
•Dodatkowo biblioteka pozwala na tworzenie kodu startowego
programu.
5
Biblioteka avr-libc
Mikrokontrolery spierane przez bibliotek avr-libc w wersji 1.4.7:
megaAVR:
atmega103
atmega128
atmega1280
atmega1281
atmega16
atmega161
atmega162
atmega163
atmega164p
atmega165
atmega165p
atmega168
atmega168p
atmega2560
atmega2561
atmega32
atmega323
atmega324p
atmega325
atmega325p
atmega3250
atmega3250p
atmega328p
atmega48
atmega48p
atmega64
atmega640
atmega644
atmega644p
atmega645
atmega6450
atmega8
atmega88
atmega88p
atmega8515
atmega8535
6
Biblioteka avr-libc
Mikrokontrolery spierane przez bibliotek avr-libc w wersji 1.4.7:
tinyAVR:
attiny11
attiny12
attiny13
attiny15
attiny22
attiny24
attiny25
attiny26
attiny261
attiny28
attiny2313
attiny43u
attiny44
attiny45
attiny461
attiny48
attiny84
attiny85
attiny861
CAN AVR:
at90can32
at90can64
at90can128
LCD AVR:
atmega169
atmega169p
atmega329
atmega329p
atmega3290
atmega3290p
atmega649
atmega6490
Lighting AVR:
at90pwm1
at90pwm2
at90pwm2b
at90pwm216
at90pwm3
at90pwm3b
at90pwm316
Smart Battery AVR:
atmega8hva
atmega16hva
atmega406
7
Biblioteka avr-libc
Mikrokontrolery spierane przez bibliotek avr-libc w wersji 1.4.7:
Standardowe AVR:
at90s1200
at90s2313
at90s2323
at90s2333
at90s2343
at90s4414
at90s4433
at90s4434
at90s8515
at90c8534
at90s8535
attiny461
attiny48
attiny84
attiny85
attiny861
USB AVR:
at90usb82
at90usb162
at90usb646
at90usb647
at90usb1286
at90usb1287
Inne:
at94K
at76c711
at43usb320
at43usb355
at86rf401
8
Biblioteka avr-libc
Moduły biblioteki avr-libc w wersji 1.4.7:
<alloca.h> - alokujacja pami ci stosu
<assert.h> - diagnostyka
<ctype.h> - operacje na znakach
<errno.h> - obsługa bł dów
<inttypes.h> - konwersje typów całkowitych
<math.h> - funkcje matematyczne
<setjmp.h> - długie skoki
<stdint.h> - definicje standardowych typów całkowitych
<stdio.h> - standardowa biblioteka wej cia/wyj cia
<stdlib.h> - funkcje standardowe
<string.h> - funkcje operuj ce na ła cuchach
<avr/boot.h> - narz dzia wspieraj ce funkcje bootloadera
<avr/eeprom.h> - funkcje dost pu do wewn trznej pami ci EEPROM
<avr/interrupt.h> - funkcje obsługi przerwa
<avr/io.h> - definicje rejestrów i bitów I/O (doł cza wła ciwe dla danego uC)
<avr/pgmspace.h> - fukncje dost pu do pami ci programu
<avr/power.h> - funkcje zarz dzania energi
<avr/sfr_defs.h> - funkcje operuj ce na rejestrach funkcyjnych
9
Biblioteka avr-libc
Moduły biblioteki avr-libc w wersji 1.4.7, cd:
<avr/sleep.h>- funkcje zarz dzania trybami energooszcz dnymi
<avr/version.h> - makra wersji
<avr/wdt.h> - funkcje obsługi Watchdoga
<util/crc16.h> - obliczanie sum CRC
<util/delay.h> - funkcje realizuj ce opó nienia
<util/delay_basic.h> - funkcje realizuj ce podstawowe opó nienia
<util/parity.h> - generowanie bitu parzystoci
<util/twi.h> - definicje masek interfejsu TWI
<compat/deprecated.h>- informacje o przestarzałych funkcjach
<compat/ina90.h> - funkcje zapewniaj ce kompatybilno z IAR EWB 3.x
Projekty przykładowe:
•kompilacja plików C i asemblerowych
•prosty projekt
•projekt bardziej zło ony
•u ywanie standardowych narz dzi I/O
•przykład u ycia interfejsu TWI
10
Biblioteka avr-libc
Przykłady funkcji modułu <ctype.h>
int isalpha (int __c ) – sprawdza, czy dana jest znakiem alfanumercznym
int isascii (int __c ) – sprawdza, czy dana jest znakiem ASCII
int isblank (int __c ) - sprawdza, czy dana jest znakiem spacji lub tabulacji
int isdigit (int __c ) - sprawdza, czy dana jest cyfr dziesi tn
int toascii (int __c ) – konwertuje dan do znaku ASCII
int tolower (int __c ) - konwertuje wielk liter do małej
int toupper (int __c ) - konwertuje liter mał do wielkiej
11
Biblioteka avr-libc
Przykłady funkcji modułu <math.h>
•Trygonometryczne:
double acos (double __x ) – arcus cosinus
double asin (double __x ) – arcus sinus
double atan (double __x ) – arcus tangens
double atan2 (double __y, double __x ) – arcus tangens x/y w danej wiartce
double cos (double __x ) - cosinus
double cosh (double __x ) – cosinus hiperboliczny
double sin (double __x ) - sinus
double sinh (double __x ) – sinus hiperboliczny
double tan (double __x ) - tangns
double tanh (double __x ) – arcus tangens
12
Biblioteka avr-libc
Przykłady funkcji modułu <math.h>
•Zaokr glenia:
double ceil (double __x ) – zaokr glenie w gór
double floor (double __x ) – zaokr glenie w dół
•Pot gi i pierwiastki:
double exp (double __x ) - eksponent
double ldexp (double __x, int __exp ) – iloczyn liczby x i pot gi exp liczby 2
double pow (double __x, double __y ) – pot ga y liczby x
double square (double __x ) – kwadrat x
double sqrt (double __x ) – pierwiastek kwadratowy x
13
Biblioteka avr-libc
Moduł <stdio.h>
W module s implementowane podstawowe operacje I/O. Ze wzgl du na brak
typowych urz dze wej cia wyj cia zakłada si kojarzenie strumieni I/O z
jednym z portów szeregowych mikrokontrolera.
Definicje:
#define FILE struct __file
#define stdin (__iob[0])
#define stdout (__iob[1])
#define stderr (__iob[2])
#define EOF (-1)
#define fdev_set_udata(stream, u) do { (stream)->udata = u; } while(0)
#define fdev_get_udata(stream) ((stream)->udata)
#define fdev_setup_stream(stream, put, get, rwflag)
14
Biblioteka avr-libc
Moduł <stdio.h>
Definicje, cd:
#define _FDEV_SETUP_READ __SRD
#define _FDEV_SETUP_WRITE __SWR
#define _FDEV_SETUP_RW (__SRD|__SWR)
#define _FDEV_ERR (-1)
#define _FDEV_EOF (-2)
#define FDEV_SETUP_STREAM(put, get, rwflag)
#define fdev_close()
#define putc(__c, __stream) fputc(__c, __stream)
#define putchar(__c) fputc(__c, stdout)
#define getc(__stream) fgetc(__stream)
#define getchar() fgetc(stdin)
15
Biblioteka avr-libc
Funkcje modułu <stdio.h>
int fclose (FILE *__stream)
int vfprintf (FILE *__stream, const char *__fmt, va_list __ap)
int vfprintf_P (FILE *__stream, const char *__fmt, va_list __ap)
int fputc (int __c, FILE *__stream)
int printf (const char *__fmt,...)
int printf_P (const char *__fmt,...)
int vprintf (const char *__fmt, va_list __ap)
int sprintf (char *__s, const char *__fmt,...)
int sprintf_P (char *__s, const char *__fmt,...)
int snprintf (char *__s, size_t __n, const char *__fmt,...)
int snprintf_P (char *__s, size_t __n, const char *__fmt,...)
int vsprintf (char *__s, const char *__fmt, va_list ap)
int vsprintf_P (char *__s, const char *__fmt, va_list ap)
int vsnprintf (char *__s, size_t __n, const char *__fmt, va_list ap)
int vsnprintf_P (char *__s, size_t __n, const char *__fmt, va_list ap)
int fprintf (FILE *__stream, const char *__fmt,...)
int fprintf_P (FILE *__stream, const char *__fmt,...)
16
Biblioteka avr-libc
Funkcje modułu <stdio.h>, cd.
int fputs (const char *__str, FILE *__stream)
int fputs_P (const char *__str, FILE *__stream)
int puts (const char *__str)
int puts_P (const char *__str)
size_t fwrite (const void *__ptr, size_t __size, size_t __nmemb, FILE *__stream)
int fgetc (FILE *__stream)
int ungetc (int __c, FILE *__stream)
char * fgets (char *__str, int __size, FILE *__stream)
char * gets (char *__str)
size_t fread (void *__ptr, size_t __size, size_t __nmemb, FILE *__stream)
void clearerr (FILE *__stream)
int feof (FILE *__stream)
int ferror (FILE *__stream)
17
Biblioteka avr-libc
Funkcje modułu <stdio.h>, cd.
int vfscanf (FILE *__stream, const char *__fmt, va_list __ap)
int vfscanf_P (FILE *__stream, const char *__fmt, va_list __ap)
int fscanf (FILE *__stream, const char *__fmt,...)
int fscanf_P (FILE *__stream, const char *__fmt,...)
int scanf (const char *__fmt,...)
int scanf_P (const char *__fmt,...)
int vscanf (const char *__fmt, va_list __ap)
int sscanf (const char *__buf, const char *__fmt,...)
int sscanf_P (const char *__buf, const char *__fmt,...)
int fflush (FILE *stream)
FILE * fdevopen (int(*put)(char, FILE *), int(*get)(FILE *))
18
Biblioteka avr-libc
Ograniczenia funkcji modułu <stdio.h>:
•Ze wzgl du na brak systemu operacyjnego nie ma faktycznej
implementacji systemu plików
•Standardowe strumienie stdin, stdout i stderr s dost pne, ale
musz by otwarte za pomoc funkcji fdevopen(), kojarz cej
strumie z urz dzeniem wysyłaj cym i odbieraj cym znaki
•Implementacja funkcji printf() i scanf() jest skomplikowana i nie
zaleca si ich u ywa (zamiast nich wskazane jest u ywa : vprintf()
i vscanf() )
19
Biblioteka avr-libc
Przykładowy program korzystaj cy z modułu <stdio.h>:
#include <stdio.h>
static int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
static int uart_putchar(char c, FILE *stream)
{
if (c == '\n') uart_putchar('\r', stream);
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c; return 0;
}
int main(void)
{
init_uart();
stdout = &mystdout;
printf("Hello, world!\n");
return 0;
}
20
Biblioteka avr-libc
Moduł <avr/io.h>
•Moduł zawiera definicje rejestrów bitów i ko cówek I/O dla mikrokontrolera
•W rzeczywistoci doł czony zostaje moduł <avr/ioXXXX.h> definiuj cy I/O
wybranego mikrokontrolra na podstawie opcji wywołania kompilatora -mmcu=
typ_mikrokontrolera
•Moduł doł cza moduły: avr/sfr_defs.h, avr/portpins.h, avr/common.h
i avr/version.h
•W module s zdefiniowane makra:
RAMEND – stała b d ca adresem ostatniej komórki pami ci RAM
XRAMEND - stała b d ca adresem ostatniej komórki zewn trznej pami ci RAM
E2END – stała b d ca adresem ostatniej komórki pami ci EEPROM
FLASHEND – stała b d ca adresem ostatniej komórki pami ci FLASH
SPM_PAGESIZE – stała okre laj ca rozmiar pami ci bootloadera w bajtach
21
Biblioteka avr-libc
Moduł <stdlib/io.h>
•Moduł zawiera definicje makr i funkcji wymaganych przez standard j zyka i
wła ciwych dla mikrokontrolerów AVR.
Struktury danych:
struct div_t, struct ldiv_t
Funkcje niestandardowe:
char * ltoa (long int __val, char *__s, int __radix)
char * utoa (unsigned int __val, char *__s, int __radix)
char * ultoa (unsigned long int __val, char *__s, int __radix)
long random (void)void srandom (unsigned long __seed)
long random_r (unsigned long *__ctx)
char * itoa (int __val, char *__s, int __radix)
22
Biblioteka avr-libc
Moduł <stdlib/io.h>
Stałe:
#define RANDOM_MAX 0x7FFFFFFF
Funkcje konwersji dla argumentów podwójnej precyzji:
(umieszczone w module ”libm.a”, doł czanej opcj wywołania kompilatora: -lm)
char * dtostre (double __val, char *__s, unsigned char __prec, unsigned char __flags)
char * dtostrf (double __val, signed char __width, unsigned char __prec, char *__s)
#define DTOSTR_ALWAYS_SIGN 0x01
#define DTOSTR_PLUS_SIGN 0x02
#define DTOSTR_UPPERCASE 0x04
23
Biblioteka avr-libc
Moduł <stdlib/io.h>
Definicje:
#define RAND_MAX 0x7FFF
typedef int(*) __compar_fn_t (const void *, const void *)
Funkcje:
void abort (void) __ATTR_NORETURN__
int abs (int __i)
long labs (long __i)
void * bsearch (const void *__key, const void *__base, size_t __nmemb, size_t
__size, int(*__compar)(const void *, const void *))
div_t div (int __num, int __denom) __asm__("__divmodhi4")
ldiv_t ldiv (long __num, long __denom) __asm__("__divmodsi4")
void qsort (void *__base, size_t __nmemb, size_t __size, __compar_fn_t __compar)
long strtol (const char *__nptr, char **__endptr, int __base)
unsigned long strtoul (const char *__nptr, char **__endptr, int __base)
long atol (const char *__s) __ATTR_PURE__
int atoi (const char *__s) __ATTR_PURE__
24
void exit (int __status) __ATTR_NORETURN__
Biblioteka avr-libc
Moduł <stdlib/io.h>
Funkcje, cd:
void * malloc (size_t __size) __ATTR_MALLOC__
void free (void *__ptr)
void * calloc (size_t __nele, size_t __size) __ATTR_MALLOC__
void * realloc (void *__ptr, size_t __size) __ATTR_MALLOC__
double strtod (const char *__nptr, char **__endptr)
double atof (const char *__nptr)
int rand (void)
void srand (unsigned int __seed)
int rand_r (unsigned long *__ctx)
Zmienne:
size_t __malloc_margin
char * __malloc_heap_start
char * __malloc_heap_end
25
Biblioteka avr-libc
Makra modułu <interrupt.h>
sei() – zał cza system przerwa
cli() – wył cza system przerwa
EMPTY_INTERRUPT (vector ) – puste przerwanie (tylko powrót)
ISR (vector ) – procedura obsługi przerwania o podanym wektorze
ISR_ALIAS (vector, target_vector ) – powtórzenie obsługi dla nowego wektora
reti() – powrót z procedury obsługi przerwania
Mo liwe kombinacje parametrów:
ISR(vector, ISR_NOBLOCK) - procedura obsługi przerwania nie blokuje
kolejnych przerwa
ISR(vector, ISR_NAKED) - procedura obsługi przerwania definiowana w pełni
przez u ytkownika (równie prolog i epilog)
26
Biblioteka avr-libc
U ycie makr modułu <interrupt.h>
Przykład:
ISR(INT0_vect)
{
PORTB = 42;
}
ISR_ALIAS(INT1_vect, INT0_vect);
27