The GNU Ansi C compiler for AVR
--- AVR libc function reference --- 2001/09/17
This file gives an overview of the C library functions implemented in the
avr-libc standard library for the Atmel AVR microcontroller family. As of the writing of this reference, the current version of avr-libc was
20010821. avr-libc is maintained by Marek Michalkiewicz <marekm@linux.org.pl>.
This document is written by Enno Luebbers
<luebbers@users.sourceforge.net>. I do not take any responsibility about
what happens if you use the information in this reference. You are on your own.
:) Formally that means: This document is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY DISCLAIMED.
This includes but is not limited to warranties of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. Documentation for most of the functions that are not hardware specific to the
AVR architecture (like I/O ports or interrupt handlers) can be found in the
Linux manpages. Thanks go to Jörg Wunsch for pointing me to several errors in previous
versions of this reference and for including it in the FreeBSD Port of the
avr-libc. Also thanks to Jochen Pernsteiner for his explanation of strlwr() and
to Peter N Lewis for his help about SIGNAL() and INTERRUPT().
Function list by Header files
Alphabetical function list
void |
abort(); |
double |
acos( double
x ); |
double |
asin( double
x ); |
double |
atan( double
x ); |
long |
atoi( char
*p ); |
long |
atol( char
*p ); |
|
bit_is_clear(
port, bit ); |
|
bit_is_set(
port, bit ); |
void |
bsearch(const
void *key, const void *base, size_t nmemb, |
|
BV( x
); |
|
cbi( port,
bit ); |
double |
ceil(
doublce x ); |
|
cli(); |
double |
cos( double x
); |
double |
cosh( double
x ); |
div_t |
div( int x,
int y ); |
int |
eeprom_is_ready() |
unsigned char |
eeprom_rb(unsigned
int addr); |
void |
eeprom_read_block(void
*buf, unsigned int addr, size_t n); |
unsigned int |
eeprom_rw(unsigned
int addr); |
void |
eeprom_wb(unsigned
int addr, unsigned char val); |
void |
enable_external_int(
unsigned char ints ); |
int |
errno(); |
double |
exp( double x
); |
double |
fabs( double
x ); |
double |
floor(
double x ); |
double |
fmod( double
x, double y ); |
void |
free( void
*ptr ); |
double |
frexp(
double x, int *exp ); |
|
inp( port
); |
|
INTERRUPT(
signame ); |
double |
inverse(
double x ); |
int |
isalnum(int
__c); |
int |
isalpha(int
__c); |
int |
isascii(int
__c); |
int |
iscntrl(int
__c); |
int |
isdigit(int
__c); |
int |
isgraph(int
__c); |
int |
islower(int
__c); |
int |
isprint(int
__c); |
int |
ispunct(int
__c); |
int |
isspace(int
__c); |
int |
isupper(int
__c); |
int |
isxdigit(int
__c); |
char |
itoa( int
value, char *string, int radix ) { |
long |
labs( long x
); |
double |
ldexp(
double x, int exp ); |
ldiv_t |
ldiv( lomg
x, long y ); |
double |
log( double x
); |
double |
log10(
double x ); |
void |
longjmp(
jmp_buf env, int val ); |
|
loop_until_bit_is_clear(
port, bit ); |
|
loop_until_bit_ist_set(
port, bit ); |
void |
malloc(
size_t size ); |
void |
memchr(
void *s, char c, size_t n ); |
int |
memcmp(
const void *s1, const void *s2, size_t n ); |
void |
memcpy(
void *to, void *from, size_t n ); |
void |
memmove(
void *to, void *from, size_t n ); |
void |
memset(
void *s, int c, size_t n ); |
double |
modf( double
x, double *iptr ); |
|
outp( value,
port ); |
|
parity_even_bit(
val ); |
double |
pow( double
x, double y ); |
void |
qsort(void
*base, size_t nmemb, size_t size, __compar_fn_t compar); |
|
sbi( port,
bit ); |
|
sei(); |
int |
setjmp(
jmp_buf env ); |
|
SIG_ADC( |
|
SIG_COMPARATOR( |
|
SIG_EEPROM( |
|
SIG_INPUT_CAPTURE1( |
|
SIG_INTERRUPT0
through SIG_INTERRUPT7 |
|
SIG_OUTPUT_COMPARE0 |
|
SIG_OUTPUT_COMPARE1A |
|
SIG_OUTPUT_COMPARE1B |
|
SIG_OUTPUT_COMPARE2 |
|
SIG_OVERFLOW0 |
|
SIG_OVERFLOW1 |
|
SIG_OVERFLOW2 |
|
SIG_SPI |
|
SIG_UART1_DATA |
|
SIG_UART1_RECV |
|
SIG_UART1_TRANS |
|
SIG_UART_DATA |
|
SIG_UART_RECV |
|
SIG_UART_TRANS |
|
SIGNAL(
signame ); |
double |
sin( double x
); |
double |
sinh( double
x ); |
double |
sqrt( double
x ); |
double |
square(
double x ); |
extern int |
strcasecmp(const
char *s1, const char *s2); |
char |
strcat(
char *dest, char *src ); |
char |
strchr(
const char *s, int c ); |
int |
strcmp(
const char *s1, const char* s2 ); |
char |
strcpy(
char *dest, char *src ); |
|
strdupa(
s ); |
size_t |
strlen(
char *s ); |
extern char |
strlwr(char
*); |
extern int |
strncasecmp(const
char *, const char *, size_t); |
char |
strncat(
char *dest, char *src, size_t n ); |
int |
strncmp(
const char *s1, const char* s2, size_t n ); |
char |
strncpy(
char *dest, char *src, size_t n ); |
|
strndupa(
s, n ); |
size_t |
strnlen(
const char *s, size_t maxlen ); |
char |
strrchr(
const char *s, int c ); |
extern char |
strrev(char
*s1); |
extern char |
strstr(const
char *haystack, const char *needle); |
double |
strtod(
char *, char ** ); |
double |
strtod(
const char *s, char **endptr ); |
long |
strtol(const
char *nptr, char **endptr, int base); |
unsigned long |
strtoul(const
char *nptr, char **endptr, int base); |
extern char |
strupr(char
*); |
double |
tan( double x
); |
double |
tanh( double
x ); |
void |
timer0_source(
unsigned int src ); |
coid |
timer0_start(); |
void |
timer0_stop(); |
void |
timer_enable_int(
unsigned char ints ); |
int |
toascii(int
__c); |
int |
tolower(int
__c); |
int |
toupper(int
__c); |
|
wdt_disable(); |
|
wdt_enable(
timeout ); |
|
wdt_reset(); |
int isalnum(int
__c); |
Returns 1 of c is alphanumeric, otherwise 0. |
int isalpha(int __c); |
Returns 1 of c is alphabetic, otherwise 0. |
int isascii(int __c); |
Returns 1 of c is contained in the 7bit ASCII,
otherwise 0. |
int iscntrl(int __c); |
Returns 1 of c is a control character, otherwise
0. |
int isdigit(int __c); |
Returns 1 of c is a digit, otherwise 0. |
int isgraph(int __c); |
Returns 1 of c is printable (excluding space),
otherwise 0. |
int islower(int __c); |
Returns 1 of c is a lower case alphabetic character,
otherwise 0. |
int isprint(int __c); |
Returns 1 of c is printable (including space),
otherwise 0. |
int ispunct(int __c); |
Returns 1 of c is a puntuation character, otherwise
0. |
int isspace(int __c); |
Returns 1 of c is one of space, '\n', '\f', '\r',
'\t', '\v', otherwise 0. |
int isupper(int __c); |
Returns 1 of c is an upper case alphabetic character,
otherwise 0. |
int isxdigit(int __c); |
Returns 1 of c is a hexadecimal digit (0-9 or A-F),
otherwise 0. |
int toascii(int __c); |
Converts c to a 7bit ASCII character. |
int tolower(int __c); |
Converts c to lower case. |
int toupper(int __c); |
Converts c to upper case. |
int
eeprom_is_ready() /* Macro */ |
Returns != 0 if the EEPROM is ready (bit EEWE in
register EECR is 0). |
unsigned char
eeprom_rb(unsigned int addr); |
Read one byte from EEPROM address 'addr'. |
unsigned int eeprom_rw(unsigned
int addr); |
Read one 16-bit word (little endian) from EEPROM
address 'addr'. |
void eeprom_wb(unsigned int
addr, unsigned char val); |
Write a byte 'val' to EEPROM address 'addr'. |
void
eeprom_read_block(void *buf, unsigned int addr, size_t n); |
Read a block of 'size' bytes from EEPROM address
'addr' to 'buf'. |
_EEPUT(addr, val) eeprom_wb(addr,
val) _EEGET(var, addr) (var) = eeprom_rb(addr) |
Compatibility macros for IAR C
compatibility. |
int errno; |
Holds the system-wide error code. |
This header file contains some compatibility functions and macros to
make porting applications from the IAR C compiler to avr-gcc easier. Since
you wouldn't use it for writing new applications, there's no need for
documentation here (lazy me).
sei(); |
Enable Interrupts. Macro. |
cli(); |
Disable Interrupts. Macro. |
void
enable_external_int( unsigned char ints ); |
Write 'ints' to the EIMSK or GIMSK register,
depending on whether EIMSK or GIMSK is defined. |
void timer_enable_int(
unsigned char ints ); |
Write 'ints' to the TIMSK register, if TIMSK is
defined. |
Defines the following types: typedef signed char
int8_t; typedef unsigned char uint8_t;
typedef int
int16_t; typedef unsigned int uint16_t;
typedef long
int32_t; typedef unsigned long uint32_t;
typedef long long
int64_t; typedef unsigned long long uint64_t;
typedef int16_t
intptr_t; typedef uint16_t uintptr_t;
Be careful with the -mint8 option, though.
Automagically includes the ioXXX.h
header file for the target AVR microcontroller.
Just includes both io-avr.h
and iomacros.h.
I/O-register definitions for the XXX MCU. Refer to the specific
datasheet for a description of the registers and their functions.
BV( x ); |
Returns the value of bit x (BitValue). Essentially an
(1 << x). Macro. |
inp( port ); |
Read byte from port 'port'. Macro. Automagically
distinguishes between constant and non-constant memory I/O addresses
and calls the macros __inb or __mmio, respectively. |
outp( value, port ); |
Write 'value' to 'port'. Macro. Similar black magic
as inp( port ). |
cbi( port, bit ); |
Clear bit 'bit' in port 'port'. Macro. Slowly the
black magic here is getting the better of me. |
sbi( port, bit ); |
Set bit 'bit' in port 'port'. Macro. Don't ask. |
bit_is_set( port, bit ); |
Returns something != 0, if bit 'bit' in 'port' is
set, otherwise 0. Macro. |
bit_is_clear( port, bit
); |
Returns something != 0, if bit 'bit' in 'port' is
clear, otherwise 0. Macro. |
loop_until_bit_ist_set( port, bit
); |
Loops until bit 'bit' in port 'port' is set.
Macro. |
loop_until_bit_is_clear( port, bit
); |
Loops until bit 'bit' in port 'port' is clear.
Macro. |
parity_even_bit( val
); |
I have no idea what this macro does. Any
suggestions? Marek? |
Constants: M_PI =
3.141592653589793238462643 Pi. M_SQRT2 =
1.4142135623730950488016887 The square root of two.
double cos( double x
); |
Returns the cosine of x. |
double fabs( double x ); |
Returns the absolute value of x. |
double fmod( double x, double y
); |
Returns the floating point remainder of x/y. |
double modf( double x, double
*iptr ); |
Returns the fractional part of x and stores the
integral part in *iptr. |
double sin( double x ); |
Returns the sine of x. |
double sqrt( double x ); |
Returns the square root of x. |
double tan( double x ); |
Returns the tangens of x. |
double floor( double x ); |
Returns the biggest integer smaller than x. |
double ceil( doublce x ); |
Returns the smallest integer bigger than x. |
double frexp( double x, int *exp
); |
Splits x into a normalized fraction, which is
returned, and an exponent, which is stored in *exp. |
double ldexp( double x, int exp
); |
Returns the result of x*2^exp. |
double exp( double x ); |
Returns e^x; |
double cosh( double x ); |
Returns the hyperbolic cosine of x. |
double sinh( double x ); |
Returns the hyperbolic sine of x. |
double tanh( double x ); |
Returns the hyperbolc tangens of x. |
double acos( double x ); |
Returns the arc cosine of x. |
double asin( double x ); |
Returns the arc sine of x. |
double atan( double x ); |
Returns the arc tangens of x. Output between -PI/2
and PI/2 (inclusive). |
double atan2( double x, double y
); |
Returns the arc tangens of x/y. Also takes the signs
of both arguments into account when determinig the quadrant. Output
between -PI and PI (inclusive). |
double log( double x ); |
Returns the natural logarithm of x. |
double log10( double x ); |
Returns the logarithm of x to the base 10. |
double pow( double x, double y
); |
Returns x^y. |
double strtod( const char *s, char
**endptr ); |
Converts an ASCII string to a double. |
double square( double x ); |
Returns x^2; |
double inverse( double x ); |
Returns 1/x; |
Another compatibility header file for the IAR C compiler. Contains (or
is suposed to contain) things like memcpy_P, strcat_P, printf_P etc.
Since it's a compatibility header file, I chose not to document it.
Yet.
Includes pgmspace.h.
int setjmp( jmp_buf
env ); |
Declares a longjmp-Target to be jumped at with
longjmp (see below.). |
void longjmp( jmp_buf env, int
val ); |
Executes a long jump to the position previously
defined with setjmp( 'env' ), which will return
'val'. |
Defines symbols for the interrupt vectors that are stored at the
begining of the flash memory. Defined are:
SIG_INTERRUPT0
through SIG_INTERRUPT7 |
Handler function name for the external interrupts 0
through 7. Interrupts > 1 are only available on certain ATmega
AVRs. |
SIG_OUTPUT_COMPARE2 |
Handler function name for the Compare2 interrupt
(Analog Comparator). |
SIG_OVERFLOW2 |
Handler function name for the Overflow2
interrupt. |
SIG_INPUT_CAPTURE1 |
Handler function name for the Capture1
interrupt. |
SIG_OUTPUT_COMPARE1A |
Handler function name for the Compare1(A)
interrupt. |
SIG_OUTPUT_COMPARE1B |
Handler function name for the Compare1(B)
interrupt. |
SIG_OVERFLOW1 |
Handler function name for the Overflow1
interrupt. |
SIG_OUTPUT_COMPARE0 |
Handler function name for the Compare0
interrupt. |
SIG_OVERFLOW0 |
Handler function name for the Overflow0
interrupt. |
SIG_SPI |
Handler function name for the SPI interrupt. |
SIG_UART_RECV |
Handler function name for the UART(0) Receive
Complete interrupt. |
SIG_UART1_RECV |
Handler function name for the UART1 Receive
Complete interrupt. UART1 is only available on the ATmega161. |
SIG_UART_DATA |
Handler function name for the UART(0) Data Register
Empty interrupt. |
SIG_UART1_DATA |
Handler function name for the UART1 Data Register
Empty interrupt. UART1 is only available on the ATmega161. |
SIG_UART_TRANS |
Handler function name for the UART(0) Transmit
Complete interrupt. |
SIG_UART1_TRANS |
Handler function name for the UART1 Transmit
Complete interrupt. UART1 is only available on the ATmega161. |
SIG_ADC |
Handler function name for the ADC Comversion Complete
interrupt. |
SIG_EEPROM |
Handler function name for the EEPROM Ready
interrupt. |
SIG_COMPARATOR |
Handler function name for the Analog Comparator
interrupt. |
Furthermore, the following functions/macros are defined:
SIGNAL( signame ); |
Used for defining an Signal handler for the signal
'signame'. |
INTERRUPT( signame ); |
Used for defining an Interrupt handler for the
signal 'signame'. |
|
|
In a handler defined with SIGNAL(), additional interrupts are
implicitly forbidden, whereas in an INTERRUPT() handler, the first
(implicit) instruction is "sei", so that additional interrupts can
occur.
Thanks to Jörg Wunsch for correcting me there.
Includes sig-avr.h.
You should use sig-avr.h directly, because signal.h might disappear
shortly because it conflicts with the "real" ANSI C signal.h.
Defines the following types: typedef struct { int
quot; int rem; } div_t;
typedef struct { long
quot; long rem; } ldiv_t;
typedef int (*__compar_fn_t)(const
void *, const void *); Used for comparison functions, eg. qsort().
Additionally, the following functions/macros are declared:
void abort(); |
Effectively aborts the execution by putting the MCU
into an endless loop. |
long labs( long x ); |
Returns the absolute value of x. |
void *bsearch(const void *key,
const void *base, size_t nmemb, > size_t size, int
(*compar)(const void *, const void *)); |
Performs a binary search on a sorted array. |
div_t div( int x, int y ); |
Divides x by y and returns the result (quotient and
remainder) in a div_t struct (see above). |
ldiv_t ldiv( lomg x, long y ); |
Divides x by y and returns the result (quotient and
remainder) in a ldiv_t struct (see above). |
void qsort(void *base, size_t
nmemb, size_t size, __compar_fn_t compar); |
Sorts an array at 'base' with 'nmemb' elements of
size 'size', using the comparison function 'compar'. |
long strtol(const char *nptr, char
**endptr, int base); |
Converts the string at 'nptr' to a long integer
according to the base 'base'. |
unsigned long strtoul(const
char *nptr, char **endptr, int base); |
Converts the string at 'nptr' to an unsigned long
integer according to the base 'base'. |
long atol( char *p ); |
Converts the string 'p' to a long integer. |
long atoi( char *p ); |
Converts the string 'p' to an integer. |
void *malloc( size_t size ); |
Allocates 'size' bytes of memory and returns a
pointer to it. Implemented, but not tested. |
void free( void *ptr ); |
Releases the memory at 'ptr', which was previously
allocated with malloc(). Implemented, but not tested. |
double strtod( char *, char ** ); |
See math.h. |
char *itoa( int value, char
*string, int radix ); |
Converts an integer into a string. This is not ANSI
C, but nonetheless (or maybe just because of this) very
useful. |
The following functions are not yet implemented:
atexit(), atof(), calloc(), rand(), realloc(), srand();
void *memcpy( void
*to, void *from, size_t n ); |
Copy 'n' bytes from 'from' to 'to'. |
void *memmove( void *to, void
*from, size_t n ); |
Copy 'n' bytes of 'from' to 'to', guaranteeing
correct behavior for overlapping strings. |
void *memset( void *s, int c,
size_t n ); |
Set 'n' bytes of 's' to 'c'. |
int memcmp( const void *s1,
const void *s2, size_t n ); |
Compare 'n' bytes of 's1' an 's2'. |
void *memchr( void *s, char c,
size_t n ); |
Returns a pointer to the first occurence of 'c' in
the first 'n' bytes of 's'. |
size_t strlen( char *s ); |
Returns the length of 's'. |
char *strcpy( char *dest, char
*src ); |
Copies 'src' intro 'dest'. |
char *strncpy( char *dest, char
*src, size_t n ); |
Copy no more than n bytes from 'src' to
'dest'. |
char *strcat( char *dest, char
*src ); |
Append 'src' onto 'dest'. |
char *strncat( char *dest, char
*src, size_t n ); |
Append no more than 'n' bytes from 'src' onto
'dest'. |
int strcmp( const char *s1, const
char* s2 ); |
Compare 's1' and 's2'. |
int strncmp( const char *s1,
const char* s2, size_t n ); |
Compare 'n' characters from 's1' and 's2'. |
strdupa( s ); |
Duplicate 's', returning an identical allocated
string. Macro. |
strndupa( s, n ); |
Return an allocated copy of at most 'n' bytes of
's'. |
char *strchr( const char *s, int c
); |
Return a pointer to the first occurence of 'c' in
's'. |
char *strrchr( const char *s,
int c ); |
Return a pointer to the last occurence of 'c' in
's'. |
size_t strnlen( const char *s,
size_t maxlen ); |
Returns the length of 's', but at most
'maxlen'. |
extern void
*memccpy(void *dest, const void *src, int c, size_t n); |
Copy at most 'n bytes from 'src' to 'dest' until
character 'c' is found. |
extern void *memchr(const void *, int, size_t); |
See
string-avr.h. |
extern int memcmp(const void *, const void *,
size_t); |
See
string-avr.h. |
extern void *memcpy(void *, const void *,
size_t); |
See
string-avr.h. |
extern void *memmove(void *dest, const void *src,
size_t n); |
See
string-avr.h. |
extern void *memset(void *, int, size_t); |
See
string-avr.h. |
extern char *strcat(char *, const char *); |
See
string-avr.h. |
extern char *strchr(const char *, int); |
See
string-avr.h. |
extern int strcmp(const char *, const char *); |
See
string-avr.h. |
extern char *strcpy(char *, const char *); |
See
string-avr.h. |
extern int strcasecmp(const
char *s1, const char *s2); |
Compare 's1' and 's2', ignoring case. |
extern size_t strlen(const char *); |
See
string-avr.h. |
extern char *strlwr(char *s); |
Converts all upper case characters in 's' to lower
case. |
extern char *strncat(char *, const char *,
size_t); |
See
string-avr.h. |
extern int strncmp(const char *, const char *,
size_t); |
See
string-avr.h. |
extern char *strncpy(char *, const char *,
size_t); |
See
string-avr.h. |
extern int strncasecmp(const
char *, const char *, size_t); |
Compare 'n' bytes of 's1' and 's2', ignoring
case. |
extern size_t strnlen(const char *, size_t); |
See
string-avr.h. |
extern char *strrchr(const char *, int); |
See
string-avr.h. |
extern char *strrev(char
*s1); |
Probably reverses 's1'. |
extern char *strstr(const char
*haystack, const char *needle); |
Locate 'needle' in 'haystack', and return a pointer
to it. |
extern char *strupr(char *s); |
Converts all lower case characters in 's' to upper
case. |
Defines an enumeration for the Timer Control Register: enum
{ STOP = 0, CK = 1, CK8 = 2, CK64 = 3, CK256 = 4, CK1024
= 5, T0_FALLING_EDGE = 6, T0_RISING_EDGE = 7 };
And there are the following functions:
void
timer0_source( unsigned int src ); |
Writes 'src' into the TCCR0 register. |
void timer0_stop(); |
Stops Timer 0 by clearing the TCNT0 register. |
coid timer0_start(); |
Starts Timer 0 by writing a 1 into the TCNT0
register. |
Defines several constants for the ATmega163.
wdt_reset(); |
Resets the Watchdog Timer. |
wdt_enable( timeout ); |
Enables the Watchdog Timer with timeout 'timeout'.
For the actual timeout value, refer to the Atmel AVR
datasheets. |
wdt_disable(); |
Disables the Watchdog Timer. | |