Home

avr-libc Reference Manual

image

Contents

1. SIG_SPM_READY Store program memory ready SIG_SUSPEND_RESUME SIG_TDMAC SIG_UARTO SIG_UARTO_DATA gl ART 0 Data Register Empty Interrupt SIG_UARTO_RECV a ART 0 Receive Complete Interrupt SIG_UARTO_TRANS t ART 0 Transmit Complete Interrupt SIG_UART1 SIG_UART1_DATA ART 1 Data Register Empty Interrupt SIG_UARTI_RECV ART 1 Receive Complete Interrupt SIG_UARTI_TRANS ART 1 Transmit Complete Interrupt SIG_UART_DATA ART Data Register Empty Interrupt SIG_UART_RECV ART Receive Complete Interrupt SIG_UART_TRANS ART Transmit Complete Interrupt SIG_USARTO_DATA SART 0 Data Register Empty Interrupt SIG_USARTO_RECV SART 0 Receive Complete Interrupt SIG_USARTO_TRANS ajaja a a a ala la SART 0 Transmit Complete Interrupt Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 9 Interrupts and Signals 31 Signal Name Description SIG_USART1_DATA USART 1 Data Register Empty Interrupt SIG_USARTI_RECV USART 1 Receive Complete Interrupt SIG_USARTI_TRANS USART 1 Transmit Complete Interrupt SIG_USB_HW Global manipulation of the interrupt flag e define sei _asm__ _volatile__ sei e define cli _asm__ __volatile__ cli Macros for writing interrupt handler functions e define SIGNAL signame e define INTERRUPT signame Allowing specific
2. Mnemonic Constraints Mnemonic Constraints adc LI add LI adiw w I and LI andi d M asr r belr I bld LI brbc Llabel brbs Llabel bset I bst LI cbi LI cbr dI com r cp LI cpc LI cpi d M cpse rr dec r elpm tz eor LI in LI inc r ld re ldd r b ldi d M lds r label lpm LZ Is r Isr r mov rr mul rr neg r or LI ori d M out Lr DOD r push r rol r ror r sbc LI sbci d M sbi LI sbic LI sbiw WI sbr d M sbrc LI sbrs LI ser d st er std br sts labeLr sub LI subi d M swap r Constraint characters may be prepended by a single constraint modifier Contraints without a modifier specify read only operands Modifiers are Modifier Specifies Write only operand usually used for all output operands Read write operand not supported by inline assembler amp Register should be used for output only Output operands must be write only and the C expression result must be an lvalue which means that the operands must be valid on the left side of assignments Note that the compiler will not check if the operands are of reasonable type for the kind of operation used in the assembler instructions Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 3 Inline Asm 52 Input operands are you guessed it read only But what if you need the same operand for input and output As stated above read write operands are not supported in inline assembler code But there is another solution For inpu
3. Note This discussion was taken directly from Rich Neswold s document See Ac knowledgments Note This discussion is Unix specific FIXME troth 2002 08 13 we need a volunteer to add windows specific notes to these instructions This chapter shows how to build and install a complete development environment for the AVR processors using the GNU toolset The default behaviour for most of these tools is to install every thing under the usr local directory In order to keep the AVR tools separate from the base Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 5 Installing the GNU Tool Chain 63 system it is usually better to install everything into usr local avr If the usr local avr directory does not exist you should create it before trying to install anything You will need root access to install there If you don t have root access to the system you can alternatively install in your home directory for exam ple in SHOME local avr Where you install is a completely arbitrary decision but should be consistent for all the tools You specify the installation directory by using the prefix dir option with the configure script It is important to install all the AVR tools in the same directory or some of the tools will not work correctly To ensure consistency and simplify the discussion we will use PREF IX to refer to whatever directory you wish to install in You can set this as an environment
4. a The itoa function returns the pointer passed as s 5 7 4 12 long labs long _i The labs function computes the absolute value of the long integer i Note The abs and labs functions are builtins of gcc Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 7 General utilities 18 5 74 13 Idiv_t Idiv long _num long _denom The Idiv function computes the value num denom and returns the quotient and re mainder in a structure named 1div_t that contains two long integer members named quot and rem 5 7 4 14 char Itoa long int _ val char x _s int _radix The function Itoa converts the long integer value from val into an ASCII represen tation that will be stored under s The caller is responsible for providing sufficient storage in s Conversion is done using the radix as base which may be a number between 2 binary conversion and up to 36 If radix is greater than 10 the next digit after 9 will be the letter a The ltoa function returns the pointer passed as s 5 7 4 15 void malloc size_t __size The malloc function allocates size bytes of memory If malloc fails a NULL pointer is returned Note that malloc does not initialize the returned memory to zero bytes 5 7 4 16 void qsort void x __base size_t _nmemb size_t __size _compar_fn_t _ compar The qsort function is a modified partition exchange sort or quicksort The qsort function sort
5. 7 3 Inline Asm 56 Another problem with reused macros arises if you are using labels In such cases you may make use of the special pattern which is replaced by a unique number on each asm statement The following code had been taken from avr include iomacros h define loop_until_bit_is_clear port bit __asm__ __volatile_ L_ sbic 30 1 n t rjmp L_ no outputs X I uint8 t portlj X I uint8_t bit N When used for the first time L_ may be translated to L 1404 the next usage might create L_1405 or whatever In any case the labels became unique too 7 3 6 C Stub Functions Macro definitions will include the same assembler code whenever they are referenced This may not be acceptable for larger routines In this case you may define a C stub function containing nothing other than your assembler code void delay uint8_t ms uint16_t cnt asm volatile ip L dalis lt TARVET mov SA0 A2 Ant mov B0 B2 An L dl Ant sbiw A0 1 n t brne L_dl2 n t dec 1 n t brne L d11 n t amp w cnt ms me r delay_count i The purpose of this function is to delay the program execution by a specified number of milliseconds using a counting loop The global 16 bit variable delay_count must contain the CPU clock frequency in Hertz divided by 4000 and must have been set before calling this routine for the first time As d
6. 12 handle error main processing loop which calls foo some where void foo void blah blah blah if err longjmp env 1 Functions e int setjmp jmp_buf _ jmpb e void longjmp jmp_buf _jmpb int _ret _ATTR_NORETURN_ 5 6 2 Function Documentation 5 6 2 1 void longjmp jmp_buf _jmpb int _ret Non local jump to a saved stack context include lt set jmp h gt longjmp restores the environment saved by the last call of setimp with the corre sponding _jmpb argument After longjmp is completed program execution contin ues as if the corresponding call of setimp had just returned the value __ret Note longjmp cannot cause 0 to be returned If longjmp is invoked with a second argument of 0 1 will be returned instead Parameters _jmpb Information saved by a previous call to setjmp ret Value to return to the caller of setjmp Returns This function never returns Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 7 General utilities 13 5 6 2 2 int setjmp jmp buf _jmpb Save stack context for non local goto include lt set jmp h gt setjmp saves the stack context environment in __jmpb for later use by longjmp The stack context will be invalidated if the function which called setjmp returns Parameters _jmpb Variable of type jmp_buf which holds the stack information such that the environment can be restored Returns
7. 512 Demme Documentation lt e s a 3 4 444 spas anas 15 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen CONTENTS 3 7 3 Typedef Documentation oe s esre cevre DM R 15 5 7 4 Function Documentation 2 2 4 34 4 22644840444 15 5 75 Variable Documentation cs ce spp editie sue 20 38 SONES eda ea der e 21 58 1 Detailed Description oia a eee eu k 21 5 8 2 Function Documentation 22 59 Interr pts and Signals oes s cese ok a RR 28 391 Detailed Description lt e o ka ee k 8444 28 392 Delme Documentation i poe yp k ds 4 4 sk k 31 5 9 3 Function Documentation 22 2 32 5 10 Special function registers ee ee 32 5 10 1 Detailed Description e comes RR RR KA E 8 8 44 32 310 2 Defne Documentation ea 1 vK k k dou HOH 34 6 avr libc Data Structure Documentation 37 61 diyt Struct Reference ea ous a EE eS 37 6 11 Detailed Description osc ecc sioaren erau k 45 37 62 ivt Set Reterence 211 22 o al mb i EE 4 3 37 6 21 Detailed Description 1 21 e Lun eek de buste 37 7 avr libc Page Documentation 38 7 1 A knowledsments 1 k 2 k ka mb sok s k LU rasa 38 2 Prequently Asked Questions cocos GSA R 38 tal PAQO THEE Diese dt a e a ed de sake 38 7 2 2 My program doesn t recognize a variable updated within an interrupt FOULING soon rra 39 7 2 3 I get undefined reference to for functions like sin 39 7 2 4 How to p
8. These all are subparts of the text section The finiN sections are executed in descending order from 9 to 0 finit9 Unused User definable This is effectively where _exit starts fini8 Unused User definable fini7 Unused User definable fini6 Unused for C programs but used for destructors in C programs fini5 Unused User definable fini4 Unused User definable fini3 Unused User definable fini2 Unused User definable finil Unused User definable fini0 Goes into an infinite loop after program termination and completion of any _exit code execution of code in the fini9 gt finil sections Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 5 Installing the GNU Tool Chain 62 74 8 Using Sections in Assembler Code Example include lt avr io h gt section initl ax fprogbits Idi r0 Oxff out _SFR_IO_ADDR PORTB r0 out _SFR_IO_ADDR DDRB r0 Note The ax progbits tells the assembler that the section is allocatable a executable x and contains data progbits For more detailed information on the section directive see the gas user manual 7 4 9 Using Sections in C Code Example include lt avr io h gt void my_init_portb void __attribute__ naked __attribute__ section init1 void my_init_portb void outb PORTB Oxff outb DDRB Oxff 7 5 Installing the GNU Tool Chain
9. avrprog 2 1 0 http www bsdhome com avrprog Installation GDB 5 2 1 http sources redhat com gdb Installation Simulavr 0 1 0 http savannah gnu org projects simulavr Installation AVaRice 1 5 http avarice sourceforge net Installation 7 5 3 GNU Binutils for the AVR target The binutils package provides all the low level utilities needed in building and ma nipulating object files Once installed your environment will have an AVR assembler avr as linker avr 1d and librarian avr ar and avr ranlib In addi tion you get tools which extract data from object files avr objcopy dissassem ble object file information avr objdump and strip information from object files avr strip Before we can build the C compiler these tools need to be in place Download and unpack the source files Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 5 Installing the GNU Tool Chain bunzip2 c binutils lt version gt tar bz2 tar xf cd binutils lt version gt Note Replace lt version gt with the version of the package you downloaded Note If you obtained a gzip compressed file gz use gunzip instead of bunzip2 It is usually a good idea to configure and build binutils in a subdirectory so as not to pollute the source with the compiled files This is recommended by the binutils developers mkdir obj avr cd obj avr The next step is to configure and build the too
10. e int rem The documentation for this struct was generated from the following file e stdlib h 6 2 Idiv t Struct Reference 6 2 1 Detailed Description Result type for function Idiv Data Fields e long quot e long rem The documentation for this struct was generated from the following file e stdlib h Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 avr libc Page Documentation 38 7 avr libc Page Documentation 7 1 Acknowledgments This document tries to tie together the labors of a large group of people Without these individuals efforts we wouldn t have a terrific free set of tools to develop AVR projects We all owe thanks to 7 2 7 2 1 The GCC Team which produced a very capable set of development tools for an amazing number of platforms and processors Denis Chertykov denisc overta ru for making the AVR specific changes to the GNU tools Denis Chertykov and Marek Michalkiewicz marekm linux org pl for developing the standard libraries and startup code for AVR GCC Theodore A Roth troth verinet com for setting up avr libc s CVS repository bootstrapping the documentation project using doxygen and continued maintenance of the project on http savannah gnu org projects avr libc Uros Platise for developing the AVR programmer tool uisp Joerg Wunsch joerg FreeBSD ORG for adding all the AVR development tools to the FreeBSD http www freebsd org ports
11. mkdir obj avr cd obj avr configure prefix PREFIX make make install Ur Ur ZA Ue VE vr UY Note If you have obtained the latest avr libc from cvs you will have to run the reconf script before using either of the above build methods 7 5 6 UISP Uisp also uses the configure system so to build and install gunzip c uisp lt version gt tar gz tar xf cd uisp lt version gt mkdir obj avr cd obj avr configure prefix PREFIX make make install ZA OF Ur Ure UF UE 7 5 7 Avrprog Note This is currently a FreeBSD only program although adaptation to other systems should not be hard avrprog is part of the FreeBSD ports system To install it simply do the following cd usr ports devel avrprog make install Note Installation into the default location usually requires root permissions However running the program only requires access permissions to the appropriate ppi 4 device 7 5 8 GDB for the AVR target Gdb also uses the configure system so to build and install Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 5 Installing the GNU Tool Chain 68 bunzip2 c gdb lt version gt tar bz2 tar xf cd gdb lt version gt mkdir obj avr cd obj avr configure prefix PREFIX target avr make make install TI 17 V ZB B Ur UY Note If you are planning on using avr gdb you will probably want to install either simulavr or avarice since avr gdb needs one
12. to match or be greater than s2 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 8 Strings 27 5 8 2 19 char x strncpy char x dest const char src size_t len Copy a string The strncpy function is similar to strcpy except that not more than n bytes of src are copied Thus if there is no null byte among the first n bytes of src the result will not be null terminated In the case where the length of src is less than that of n the remainder of dest will be padded with nulls Returns The strncpy function returns a pointer to the destination string dest 5 8 2 20 size_t strnlen const char x src size_t len Determine the length of a fixed size string The strnlen function returns the number of characters in the string pointed to by src not including the terminating 0 character but at most len In doing this strnlen looks only at the first len characters at src and never beyond src len Returns The strnlen function returns strlen src if that is less than len or len if there is no 0 character among the first len characters pointed to by src 5 8 2 21 char x strrchr const char x src int val Locate character in string The strrchr function returns a pointer to the last occurrence of the character val in the string src Here character means byte these functions do not work with wide or multi byte characters Returns The strrchr function returns a
13. 22 memcpy avr string 23 memcpy_P avr_pgmspace 7 memmove avr string 23 memset avr string 23 outb avr_sfr 36 outp avr_sfr 36 outw avr_sfr 36 PGM_P avr_pgmspace 6 PGM_VOID_P Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen INDEX 72 avr_pgmspace 6 Program Space String Utilities 5 PSTR avr_pgmspace 6 qsort avr_stdlib 18 quot div t 37 Idiv_t 37 RAND_MAX avr_stdlib 14 rem div_t 37 ldiv_t 37 sbi avr_sfr 36 sei avr_interrupts 31 setjmp longjmp 12 setimp 12 Setjmp and Longjmp 11 SIGNAL avr_interrupts 32 Special function registers 32 strcasecmp avr_string 23 strcasecmp_P avr_pgmspace 7 strcat avr_string 24 strcat_P avr_pgmspace 7 strchr avr_string 24 stremp avr_string 24 stremp_P avr_pgmspace 7 strcpy avr string 24 strcpy P avr_pgmspace 8 Strings 21 stricat avr string 25 strlcpy avr_string 25 strlen avr_string 25 strlen_P avr_pgmspace 8 strlwr avr string 25 strncasecmp avr string 26 strncasecmp_P avr_pgmspace 8 strncat avr string 26 strncmp avr_string 26 strncmp_P avr_pgmspace 8 strncpy avr_string 26 strncpy_P avr_pgmspace 9 strnlen avr_string 27 strrchr avr_string 27 strrev avr_string 27 strstr avr_string 27 strtod avr_stdlib 18 strtol avr_stdlib 19 strtoul avr_stdlib 19 strupr avr_string 28 supported devices timer_enable_int avr_
14. 5 5 1 Detailed Description include lt inttypes h gt Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 6 Setjmp and Longjmp 11 Use ulintN_t if you need exactly N bits Note These should probably not be used if avr gcc s mint8 option is used Typedefs typedef signed char int8_t typedef unsigned char uint8 t typedef int intl6_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 5 6 Setjmp and Longjmp 5 6 1 Detailed Description While the C language has the dreaded goto statement it can only be used to jump to a label in the same local function In order to jump directly to another non local function the C library provides the setjmp and longjmp functions setjmp and longjmp are useful for dealing with errors and interrupts encountered in a low level subroutine of a program Note setjmp and longjmp make programs hard to understand and maintain If possi ble an alternative should be used For a very detailed discussion of setimp longjmp see Chapter 7 of Advanced Pro gramming in the UNIX Environment by W Richard Stevens Example include lt set jmp h gt jmp_buf env int main void if setjmp env Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 6 Setjmp and Longjmp
15. a number only References to these labels consist of the number followed by the letter b for a backward reference or f for a forward reference These local labels may be re used within the source file references will pick the closest label with the same number and given direction Example myfunc push r16 push r17 push Y push YL push YH eor rl6 16 Start loop tai YL 108 sometable ldi YH hi8 sometable rjmp 2f jump to loop test at end Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 3 Inline Asm 46 Ls ld rl7 Y loop continues here breg 1f return from myfunc prematurely inc r16 23 cmp r16 r18 brlo 1b Jump back to top of loop Ls pop YH pop YL pop r18 pop r17 pop r16 ret Back to FAQ Index 7 3 Inline Asm AVR GCC Inline Assembler Cookbook About this Document The GNU C compiler for Atmel AVR RISC processors offers to embed assembly language code into C programs This cool feature may be used for manually optimizing time critical parts of the software or to use specific processor instruction which are not available in the C language Because of a lack of documentation especially for the AVR version of the compiler it may take some time to figure out the implementation details by studying the compiler and assembler source code There are also a few sample programs available in the net Hopefully this document will help to increase their number It s assumed that you are
16. can use the same assembler instruction mnemonics as you d use with any other AVR assembler And you can write as many assembler statements into one code string as you like and your flash memory is able to hold Note The available assembler directives vary from one assembler to another Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 3 Inline Asm To make it more readable you should put each statement on a seperate line asm volatile nop n t nop n t nop n vt aopinkt Dt The linefeed and tab characters will make the assembler listing generated by the com piler more readable It may look a bit odd for the first time but that s the way the compiler creates it s own assembler code You may also make use of some special registers Symbol Register SREG__ Status register at address 0x3F SPA Stack pointer high byte at address 0x3E SPAT Stack pointer low byte at address 0x3D _ tmp_reg__ Register r0 used for temporary storage _ Zero_reg__ Register rl always zero Register rO may be freely used by your assembler code and need not be restored at the end of your code It s a good idea to use _tmp_reg__ and _zero_reg_ instead of x0 or r1 just in case a new compiler version changes the register usage definitions 7 3 3 Input and Output Operands Each input and output operand is described by a constraint string followed by a C expression in parantheses AVR GCC 3 3
17. const char x const char x size_t char x strncpy char x const char x size_t size_t strnlen const char x size_t _ATTR PURE__ char x strrchr const char x int _ATTR PURE__ char x strrev char x char x strstr const char x const char x _ATTR PURE __ char x strupr char x 5 8 2 Function Documentation 5 8 2 1 void x memccpy void x dest const void x src int val size_t len Copy memory area The memccpy function copies no more than len bytes from memory area src to mem ory area dest stopping when the character val is found Returns The memccpy function returns a pointer to the next character in dest after val or NULL if val was not found in the first len characters of src 5 8 2 2 void x memchr const void x src int val size_t len Scan memory for a character The memchr function scans the first len bytes of the memory area pointed to by src for the character val The first byte to match val interpreted as an unsigned character stops the operation Returns The memchr function returns a pointer to the matching byte or NULL if the character does not occur in the given memory area Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 8 Strings 23 5 8 2 3 int memcmp const void s1 const void s2 size_t len Compare memory areas The memcmp function compares the first len bytes of the memory areas sl and s2 Returns The mememp function returns an integ
18. constant in an asm statement So you tried this asm volatile sbi 0x18 0x07 Which works When you do the same thing but replace the address of the port by its macro name like this asm volatile sbi PORTB 0x07 you get a compilation error Error constant value required PORTB is a precompiler definition included in the processor specific file included in avr io h As you may know the precompiler will not touch strings and PORTB instead of 0x18 gets passed to the assembler One way to avoid this problem is asm volatile sbi 0 0x07 I PORTB Note avr io h already provides a sbi macro definition which can be used in C programs Back to FAQ Index 7 2 11 When single stepping through my program in avr gdb the PC jumps around When compiling a program with both optimization O and debug information g which is fortunately possible in avr gcc the code watched in the debugger is opti mized code While it is not guaranteed very often this code runs with the exact same optimizations as it would run without the g switch This can have unwanted side effects Since the compiler is free in reordering code execution as long as the semantics do not change code is often rearranged in order to make it possible to use a single branch instruction for conditional operations Branch instructions can only cover a short range for the target PC 63 through 64 words from the current PC If a branch ins
19. familiar with writing AVR assembler programs because this is not an AVR assembler programming tutorial It s not a C language tutorial either Copyright C 2001 2002 by egnite Software GmbH Permission is granted to copy and distribute verbatim copies of this manual provided that the copyright notice and this permission notice are preserved on all copies Permis sion is granted to copy and distribute modified versions of this manual provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one This document describes version 3 3 of the compiler There may be some parts which hadn t been completely understood by the author himself and not all samples had been tested so far Because the author is German and not familiar with the English language there are definitely some typos and syntax errors in the text As a programmer the author knows that a wrong documentation sometimes might be worse than none Any Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 3 Inline Asm 47 way he decided to offer his little knowledge to the public in the hope to get enough response to improve this document Feel free to contact the author via e mail For the latest release check http www ethernut de Herne 17th of May 2002 Harald Kipp harald kipp egnite de Note As of 26th of July 2002 this document has been merged into the documentation for avr libc The late
20. files this 1s deprecated for system libraries Back to FAQ Index 7 2 4 How to permanently bind a variable to a register This can be done with register unsigned char counter asm r3 See C Names Used in Assembler Code for more details Back to FAQ Index 7 2 5 How to modify MCUCR or WDTCR early The method of early initialization MCUCR WDTCR or anything else is different and more flexible in the current version Basically write a small assembler file which looks like this begin xram S include lt avr io h gt section initl ax fprogbits idi r16 _BV SRE _BV SRW out _SFR_IO_ADDR MCUCR r16 end xram S Assemble it link the resulting xram o with other files in your program and this piece of code will be inserted in initialization code which is run right after reset See the linker script for comments about the new initN sections which one to use etc The advantage of this method is that you can insert any initialization code you want just remember that this is very early startup no stack and no __zero_reg yet and no program memory space is wasted 1f this feature is not used There should be no need to modify linker scripts anymore except for some very spe cial cases It is best to leave __stack at its default value end of internal SRAM faster and required on some devices like ATmegal61 because of errata and add W1 Tdata 0x801100 to start the data section above the sta
21. foo __attribute__ section noinit will not be initialized to zero during startup as would normal bss data Only uninitialized variables can be placed in the noinit section Thus the following code will cause avr gcc to issue an error int bar __attribute__ section noinit Oxaa It is possible to tell the linker explicitly where to place the noinit section by adding W1 section start noinit 0x802000 to the avr gcc command line at the linking stage For example suppose you wish to place the noinit section at SRAM address 0x2000 avr gcc Wl section start noinit 0x802000 Note Because of the Harvard architecture of the AVR devices you must manually add 0x800000 to the address you pass to the linker as the start of the section Oth erwise the linker thinks you want to put the noinit section into the text section instead of data bss and will complain Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 4 Memory Sections 60 Alternatively you can write your own linker script to automate this FIXME need an example or ref to dox for writing linker scripts 7 4 6 The initN Sections These sections are used to define the startup code from reset up through the start of main These all are subparts of the text section The purpose of these sections is to allow for more specific placement of code within your program Note Sometimes it is convenient to th
22. n bytes from EEPROM address addr to buf 5 1 3 3 unsigned int eeprom_rw unsigned int addr read one 16 bit word little endian from EEPROM address addr Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 2 AVR device specific IO definitions 5 1 3 4 void eeprom_wb unsigned int addr unsigned char val write a byte val to EEPROM address addr 5 2 AVR device specific IO definitions include lt avr io h gt This header file includes the apropriate IO definitions for the device that has been specified by the mmcu compiler command line switch Note that each of these files always includes include lt avr sfr_defs h gt See Special function registers for the details Included are definitions of the IO register set and their respective bit values as specified in the Atmel documentation Note that Atmel is not very consistent in its naming conventions so even identical functions sometimes get different names on different devices Also included are the specific names useable for interrupt function definitions as docu mented here Finally the following macros are defined e RAMEND A constant describing the last on chip RAM location e XRAMEND A constant describing the last possible location in RAM This is equal to RAMEND for devices that do not allow for external RAM e E2END A constant describing the address of the last EEPROM cell e FLASHEND A constant describing the last byte address in fla
23. of these to run as a a remote target 7 5 9 Simulavr Simulavr also uses the configure system so to build and install gunzip c simulavr lt version gt tar gz tar xf cd simulavr lt version gt mkdir obj avr cd obj avr configure prefix SPREFIX make make install LB ZB Un ZD ZB T Un Note You might want to have already installed avr binutils avr gcc and avr libc if you want to have the test programs built in the simulavr source 7 5 10 AVaRice Note These install notes are specific to avarice 1 5 You will have to edit prog avarice Makefile for avarice in order to install into a directory other than usr local avr bin Edit the line which looks like this INSTALL_DIR usr local avr bin such that INSTALL_DIR is now set to whatever you decided on PREFIX bin to be gunzip c avarice 1 5 tar gz tar xf cd avarice 1 5 prog avarice make make install nn WM Ur Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen Index PATH 63 PREFIX 63 prefix 63 BV avr_sfr 34 _EEGET avr_eeprom 4 EEPUT avr_eeprom 4 _ compar_fn_t avr_stdlib 15 __elpm inline avr_pgmspace 7 malloc_heap_end avr_stdlib 20 __malloc heap start avr_stdlib 21 _ malloc_margin avr_stdlib 21 abort avr_stdlib 15 abs avr_stdlib 15 Additional notes from lt avr sfr defs h gt 9 atoi avr_stdlib 15 atol avr_stdlib 15 AVR device specific IO definitions 5 avr_eeprom _EEGET 4 _EE
24. pointer to the matched character or NULL if the character is not found 5 8 2 22 char strrev char x string Reverse a string The strrev function reverses the order of the string Returns The strrev function returns a pointer to the beginning of the reversed string Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 9 Interrupts and Signals 28 5 8 2 23 char x strstr const char x s1 const char x s2 Locate a substring The strstr function finds the first occurrence of the substring s2 in the string s1 The terminating 10 characters are not compared Returns The strstr function returns a pointer to the beginning of the substring or NULL if the substring is not found 5 8 2 24 char strupr char string Convert a string to upper case The strupr function will convert a string to upper case Only the lower case alphabetic characters a z are converted Non alphabetic characters will not be changed Returns The strupr function returns a pointer to the converted string The pointer is the same as that passed in since the operation is perform in place 5 9 Interrupts and Signals 5 9 1 Detailed Description Note This discussion of interrupts and signals was taken from Rich Neswold s docu ment See Acknowledgments It s nearly impossible to find compilers that agree on how to handle interrupt code Since the C language tries to stay away from machine dependent detai
25. ptr and the compiler selects register Z r30 r31 then A0 refers to r 30 and BO refers to r31 But both versions will fail during the assembly stage of the compiler if you explicitely need Z like in ld r24 Z If you write ld r24 a0 with a lower case a following the percent sign then the compiler will create the proper assembler line 7 3 4 Clobbers As stated previously the last part of the asm statement the list of clobbers may be omitted including the colon seperator However if you are using registers which had not been passed as operands you need to inform the compiler about this The following example will do an atomic increment It increments an 8 bit value pointed to by a pointer variable in one go without being interrupted by an interrupt routine or another thread in a multithreaded environment Note that we must use a pointer because the incremented value needs to be stored before interrupts are enabled Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 3 Inline Asm asm volatile olim n t ld r24 a0 n t minesr24 miki st a0 r24 mat sei n t e ptr r24 The compiler might produce the following code ELI ld r24 Z inc r24 st Z r24 sei One easy solution to avoid clobbering register r24 is to make use of the special tem porary register __tmp_reg__ defined by the compiler asm volatile tela NE ld _ tmp_reg__ a0 MAMA Y in
26. segment The default is set to 32 _malloc_margin should be changed before the very first call to malloc within the application All this is only relevant in situations where the heap is allocated below the stack For devices with external memory the heap can be located in external memory while the stack is usually located in internal SRAM so no special guard area is needed between both 5 8 Strings 5 8 1 Detailed Description include lt string h gt The string functions perform string operations on NULL terminated strings Functions void x memccpy void const void x int size_t void x memchr const void x int size_t _ATTR_PURE_ int memcmp const void x const void x size_t _ATTR PURE__ void x memcpy void x const void x size_t Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 8 Strings 22 void x memmove void x const void x size_t void x memset void x int size_t int strcasecmp const char x const char x _ATTR PURE__ char x strcat char const char x char x strchr const char x int _ATTR_PURE_ int strcmp const char const char x _ATTR_PURE__ char x strcpy char const char x size_t strlcat char x const char x size_t size_t strlcpy char x const char size_t size_t strlen const char x _ATTR_PURE_ char x strlwr char x int strncasecmp const char x const char x size_t _ATTR PURE__ char x strncat char x const char x size_t int strncmp
27. setimp returns O if returning directly and non zero when returning from longjmp using the saved context 5 7 General utilities 5 7 1 Detailed Description include lt stdlib h gt This file declares some basic C macros and functions as defined by the ISO standard plus some AVR specific extensions Data Structures e struct div_t e struct Idiv_t Conversion functions for double arguments define DTOSTR_ALWAYS_SIGN 0x01 define DTOSTR_PLUS_SIGN 0x02 define DTOSTR_UPPERCASE 0x04 char x dtostre double __val char x__s unsigned char __prec unsigned char __ flags e char dtostrf double __val char __width char __prec char __s Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 7 General utilities 14 Non standard i e non ISO C functions char x itoa int __val char __s int __radix char x Itoa long int __val char __s int __radix char x utoa unsigned int __val char __s int __radix char ultoa unsigned long int __val char x__s int __radix Defines define RAND_MAX 0x7FFFFFFF Typedefs typedef int _ compar_fn_t const void x const void Functions _inline__ void abort void _ ATTR_NORETURN _ int abs int _i _ATTR CONST__ long labs long _i _ATTR_CONST_ void x bsearch const void __key const void __base size_t _nmemb size_t size int x__compar const void const void e div_t div int _ num int _denom __asm__ __divmodhi4 _ATT
28. system wide interrupts e void enable_external_int unsigned char ints e void timer enable int unsigned char ints 5 9 2 Define Documentation 5 9 2 1 define cli _asm__ __volatile__ cli include lt avr interrupt h gt Disables all interrupts by clearing the global interrupt mask This function actually compiles into a single line of assembly so there is no function call overhead 5 9 2 2 define INTERRUPT signame Value void signame void __attribute__ interrupt void signame void include lt avr signal h gt Introduces an interrupt handler function that runs with global interrupts initially en abled This allows interrupt handlers to be interrupted Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 10 Special function registers 32 5 9 2 3 define sei _asm__ _volatile__ sei include lt avr interrupt h gt Enables interrupts by clearing the global interrupt mask This function actually com piles into a single line of assembly so there is no function call overhead 5 9 2 4 define SIGNAL signame Value void signame void __attribute__ signal void signame void include lt avr signal h gt Introduces an interrupt handler function that runs with global interrupts initially dis abled 5 9 3 Function Documentation 5 9 3 1 void enable_external int unsigned char ints include lt avr interrupt h gt This function gives access to th
29. the register may be re used But the compiler 1s not able to check wether this register usage conflicts with any predefined register If you reserve too many registers in this way the compiler may even run out of registers during code generation In order to change the name of a function you need a prototype declaration because the compiler will not accept the asm keyword in the function definition Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 4 Memory Sections 58 extern long Calc void asm CALCULATE Calling the function Calc will create assembler instructions to call the function CALCULATE 7 3 8 Links A GNU Development Environment for the AVR Microcontroller covers the details of the GNU Tools that are specific to the AVR family of processors By Rich Neswold http www enteract com rneswold avr For a more thorough discussion of inline assembly usage see the gcc user manual The latest version of the gcc manual is always available here http gcc gnu org onlinedocs 7 4 Memory Sections Remarks Need to list all the sections which are available to the avr Weak Bindings FIXME need to discuss the weak directive The following describes the various sections available 7 4 1 The text Section The text section contains the actual machine instructions which make up your program This section is further subdivided by the initN and finiN sections dicussed below Note The av
30. tree and for pro viding the demo project in FIXME hasn t been merged yet put ref here Brian Dean bsd bsdhome com for developing avrprog an alternate to uisp and for contributing FIXME need to merge section on avrprog which describes how to use it All the people you have submitted suggestions patches and bug reports See the AUTHORS files of the various tools And lastly all the users who use the software If nobody used the software we would probably not be very motivated to continue to develop it Keep those bug reports coming Frequently Asked Questions FAQ Index My program doesn t recognize a variable updated within an interrupt routine Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 2 Frequently Asked Questions 39 2 I get undefined reference to for functions like sin wW How to permanently bind a variable to a register How to modify MCUCR or WDTCR early What is all this _BV stuff about Can I use C on the AVR J A Nn Shouldn t I better initialize all my variables o Why do some 16 bit timer registers sometimes get trashed 9 How do I use a define d constant in an asm statement 10 When single stepping through my program in avr gdb the PC jumps around 11 How do I trace an assembler file in avr gdb 7 2 2 My program doesn t recognize a variable updated within an interrupt rou tine When using the optimi
31. variable if you wish as such using a Bourne like shell PREFIX HOME local avr export PREFIX Note Be sure that you have your PATH environment variable set to search the direc tory you install everything in before you start installing anything For example if you use prefix PREFIX you must have SPREFIX bin in your exported PATH As such PATH SPATH PREFIX bin export PATH Note The versions for the packages listed below are known to work together If you mix and match different versions you may have problems 7 5 1 Required Tools e GNU Binutils 2 14 http sources redhat com binutils Installation e GCC 3 3 RES S J gue au ora Installation e AVR Libc 20020816 cvs http savannah gnu org projects avr libc Installation Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 5 Installing the GNU Tool Chain Note As of 2002 08 15 the versions mentioned above are still considered experimental and must be obtained from cvs Instructions for obtaining the latest cvs versions are available at the URLs noted above Significant changes have been made which are not compatible with previous stable releases These incompatilities should be noted in the documentation 7 5 2 Optional Tools You can develop programs for AVR devices without the following tools They may or may not be of use for you uisp 20020626 http savannah gnu org projects uisp Installation
32. 20 S i n avr_stdlib 15 E DTOSTR PLUS SIGN memccpy 22 S hr 22 avr_stdlib 15 G DTOSTR_UPPERCASE memcmp 22 2 memcpy 23 avr_stdlib 15 memmove 23 RARES memset 23 avr_stdlib 16 res 23 dtostrt e p avr_stdlib 17 strchr 24 EEPROM handling 3 stremp 24 eeprom_is_ready stropy 24 avr_eeprom 4 strlcat 25 eeprom_rb strlcpy 25 avr_eeprom 4 strlen 25 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen INDEX 71 eeprom read_block avr_eeprom 4 eeprom_rw avr_eeprom 4 eeprom_wb avr_eeprom 4 enable_external_int avr_interrupts 32 exit avr_stdlib 17 FAQ 38 free avr_stdlib 17 General utilities 13 inb avr_sfr 35 inp avr_sfr 35 installation 62 installation avarice 68 installation avr libc 66 installation avrprog 67 installation binutils 64 installation gcc 66 Installation gdb 67 installation simulavr 68 installation uisp 67 intl6_t avr inttypes 11 int32 t avr_inttypes 11 int64_t avr_inttypes 11 int8_t avr_inttypes 11 Integer Types 10 INTERRUPT avr_interrupts 31 Interrupts and Signals 28 intptr_t avr_inttypes 11 inw avr_sfr 35 itoa avr_stdlib 17 labs avr_stdlib 17 Idiv avr_stdlib 17 Idiv_t 37 quot 37 rem 37 longjmp setjmp 12 loop_until_bit_is_clear avr_sfr 35 loop_until_bit_is_set avr_sfr 36 Itoa avr_stdlib 18 malloc avr_stdlib 18 memccpy avr string 22 memchr avr_string 22 memcmp avr_string
33. Doxygen 5 9 Interrupts and Signals 30 Signal Name Description SIG_FPGA_INTERRUPT6 SIG_FPGA_INTERRUPT7 SIG_FPGA_INTERRUPT8 SIG_FPGA_INTERRUPT9 SIG_FPGA_INTERRUPT10 SIG_FPGA_INTERRUPT11 SIG_FPGA_INTERRUPT12 SIG_FPGA_INTERRUPT13 SIG_FPGA INTERRUPT14 SIG _FPGA_INTERRUPT15 SIG_INPUT_CAPTURE1 Input Capture1 Interrupt SIG_INPUT_CAPTURE3 Input Capture3 Interrupt SIG_INTERRUPTO External Interrupt0 SIG_INTERRUPT1 External Interrupt SIG_INTERRUPT2 External Interrupt2 SIG_INTERRUPT3 External Interrupt3 SIG_INTERRUPT4 External Interrupt4 SIG_INTERRUPTS5 External Interrupt5 SIG _INTERRUPT6 External Interrupt6 SIG_INTERRUPT7 External Interrupt7 SIG_OUTPUT_COMPAREO Output Compare0 Interrupt SIG_OUTPUT_COMPARE1A Output Compare1 A Interrupt SIG_OUTPUT_COMPARE1B Output Compare1 B Interrupt SIG_OUTPUT_COMPARE1C Output Compare l C Interrupt SIG_OUTPUT_COMPARE2 Output Compare2 Interrupt SIG_OUTPUT_COMPARE3A Output Compare3 A Interrupt SIG_OUTPUT_COMPARE3B Output Compare3 B Interrupt SIG_OUTPUT_COMPARE3C Output Compare3 C Interrupt SIG_OVERFLOWO Overflow0 Interrupt SIG_OVERFLOW1 Overflow 1 Interrupt SIG_OVERFLOW2 Overflow2 Interrupt SIG_OVERFLOW3 Overflow3 Interrupt SIG_PIN SIG_PIN CHANGEO SIG_PIN_CHANGE1 SIG_RDMAC SIG_SPI SPI Interrupt
34. PUT 4 eeprom_is ready 4 eeprom rb 4 eeprom read block 4 eeprom_rw 4 eeprom_wb 4 avr_interrupts cli 31 enable_external_int 32 INTERRUPT 31 sei 31 SIGNAL 32 timer_enable_int 32 avr_inttypes intl6_t 11 int32 t 11 int64_t 11 int8 t 11 intptr_t 11 uintl6_t 11 uint32 t 11 uint64 t 11 uint8_t 11 uintptr_t 11 avr_pgmspace __elpm inline 7 memcpy_P 7 PGM P 6 PGM_VOID P 6 PSTR 6 strcasecmp_P 7 strcat_P 7 stremp_P 7 strcpy_P 8 strlen_P 8 strncasecmp_P 8 strncmp_P 8 strncpy_P 9 avr_sfr BV 34 bit is_clear 34 bit is_ set 35 BV 35 cbi 35 inb 35 inp 35 inw 35 loop_until_bit_is_clear 35 loop_until_bit_is_set 36 outb 36 outp 36 outw 36 INDEX 70 sbi 36 strlwr 25 avr_stdlib strncasecmp 26 _compar_fn_t 15 strncat 26 malloc_heap_end 20 strncmp 26 __malloc _heap start 21 strncpy 26 _malloc_margin 21 strnlen 27 abort 15 strrchr 27 abs 15 strrev 27 atoi 15 strstr 27 atol 15 strupr 28 bsearch 16 div 16 bit_is_clear DTOSTR_ALWAYS_SIGN 15 avr_sfr 34 DTOSTR_PLUS_SIGN 15 bit_is_set DTOSTR_UPPERCASE 15 avr_sfr 35 dtostre 16 bsearch dtostrf 17 avr_stdlib 16 exit 17 BV free 17 avr_sfr 35 itoa 17 labs 17 cbi Idiv 17 avr_sfr 35 Itoa 18 cli malloc 18 avr_interrupts 31 gsort 18 div RAND MAX 14 sirtod 18 avr_stdlib 16 M div_t 37 strtol 19 1 37 strtoul 19 quos rem 37 ultoa 20 DTOSTR_ALWAYS_SIGN utoa
35. R_CONST__ e Idivt Idiv long _num long _denom _asm__ __divmodsi4 _ATTR_ CONST__ 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 x__nptr char xx__endptr int __base _inline__ long atol const char xnptr _ATTR_PURE__ _inline__ int atoi const char __nptr _ATTR_PURE_ void exit int _ status _ ATTR NORETURN__ void x malloc size_t _ size _ATTR_MALLOC__ void free void _ ptr double strtod const char s char x endptr Variables size_t _malloc_margin char x __malloc_heap start char __malloc_heap_end Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 7 General utilities 15 5 7 2 Define Documentation 5 7 2 1 define DTOSTR_ ALWAYS SIGN 0x01 Bit value that can be passed in flags to dtostre 5 7 2 2 define DTOSTR PLUS SIGN 0x02 Bit value that can be passed in flags to dtostre 5 7 2 3 define DTOSTR_UPPERCASE 0x04 Bit value that can be passed in flags to dtostre 5 7 3 Typedef Documentation 5 7 3 1 typedef int _ compar_fn_t const void x const void x Comparision function type for qsort just for convenience 5 7 4 Function Documentation 5 7 4 1 _inline__ void abort void The abort function causes abnormal program termination to occur In the limited AVR environment execution is effectively halted by entering an infinite loo
36. __ 530 ANNE amp r s e ptr memory The special clobber memory informs the compiler that the assembler code may mod ify any memory location It forces the compiler to update all variables for which the contents are currently held in a register before executing the assembler code And of course everything has to be reloaded again after this code In most situations a much better solution would be to declare the pointer destination itself volatile volatile uint8_t ptr This way the compiler expects the value pointed to by ptr to be changed and will load it whenever used and store it whenever modified Situations in which you need clobbers are very rare In most cases there will be better ways Clobbered registers will force the compiler to store their values before and reload them after your assembler code Avoiding clobbers gives the compiler more freedom while optimizing your code 7 3 5 Assembler Macros In order to reuse your assembler language parts it is useful to define them as macros and put them into include files AVR Libc comes with a bunch of them which could be found in the directory avr include Using such include files may produce com piler warnings if they are used in modules which are compiled in strict ANSI mode To avoid that you can write __asm__ instead of asm and _volatile__ instead of volatile These are equivalent aliases Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen
37. able to the AVR instruction they are used with The C compiler doesn t check any line of your assembler code But it is able to check the constraint against your C expression However if you specify the wrong constraints then the compiler may silently pass wrong code to the assem bler And of course the assembler will fail with some cryptic output or internal errors For example if you specify the constraint r and you are using this register with an ori instruction in your assembler code then the compiler may select any register This will fail if the compiler chooses r2 to r15 It will never choose r0 or r1 because these are uses for special purposes That s why the correct constraint in that case is d On the other hand if you use the constraint M the compiler will make sure that you don t pass anything else but an 8 bit value Later on we will see how to pass multibyte expression results to the assembler code The following table shows all AVR assembler mnemonics which require operands and the related contraints Because of the improper constraint definitions in version 3 3 they aren t strict enough There is for example no constraint which restricts integer Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 3 Inline Asm 51 constants to the range 0 to 7 for bit set and bit clear operations
38. an array of nmemb objects the initial member of which is pointed to by base The size of each object is specified by size The contents of the array base are sorted in ascending order according to a comparison function pointed to by compar which requires two arguments pointing to the objects being compared The comparison function must return an integer less than equal to or greater than zero if the first argument is considered to be respectively less than equal to or greater than the second 5 7 4 17 double strtod const char _nptr char xx __endptr The strtod function converts the initial portion of the string pointed to by nptr to double representation The expected form of the string is an optional plus or minus sign followed by a sequence of digits optionally containing a decimal point character optionally followed by an exponent An exponent con sists of an E or e followed by an optional plus or minus sign followed by a sequence of digits Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 7 General utilities 19 Leading white space characters in the string are skipped The strtod function returns the converted value if any If endpt r is not NULL a pointer to the character after the last character used in the conversion is stored in the location referenced by endpt r If no conversion is performed zero is returned and the value of npt r is stored in the loc
39. at is a pointer to a string in program space 5 3 2 2 define PGM_VOID P const prog _void Used to declare a generic pointer to an object in program space Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 3 Program Space String Utilities 5 3 2 3 define PSTR s static char __c PROGMEM s __c Used to declare a static pointer to a string in program space 5 3 3 Function Documentation 5 3 3 1 unsigned char _ elpm_inline unsigned long _addr static Use this for access to gt 64K program memory ATmegal03 ATmegal28 addr RAMPZ r31 r30 Note If possible put your constant tables in the lower 64K and use lpm since it is more efficient that way and you can still use the upper 64K for executable code 5 3 3 2 void x memcpy P void dest PGM_VOID P src size_t n The memcpy_P function is similar to memcpy except the src string resides in pro gram space Returns The memcpy_P function returns a pointer to dest 5 3 3 3 int strcasecmp_P const char x s1 PGM _P s2 Compare two strings ignoring case The strcasecmp_P function compares the two strings s1 and s2 ignoring the case of the characters Parameters si A pointer to a string in the devices SRAM s2 A pointer to a string in the devices Flash Returns The strcasecmp_P function returns an integer less than equal to or greater than zero if sl is found respectively to be less than to match or be greate
40. ath is set properly before in stalling avr gcc The steps to build avr gcc are essentially same as for binutils bunzip2 c gcc lt version gt tar bz2 tar xf cd gcc lt version gt mkdir obj avr cd obj avr configure prefix PREFIX target avr enable languages c c disable nls make make install mn UV To save your self some download time you can alternatively download only the gcc core lt version gt tar bz2 and gcc c lt version gt tar bz2 parts of the gcc Also if you don t need C support you only need the core part and should only enable the C language support Note Early versions of these tools did not support C Note The stdc libs are not included with C for AVR due to the size limitations of the devices 7 5 5 AVR Libc Warning You must install avr binutils avr gcc and make sure your path is set properly before installing avr libc To build and install avr libc gunzip c avr libc lt version gt tar gz cd avr libc lt version gt doconf domake cd build make install Note The doconf script will automatically use the PREF IX environment variable if you have set and exported it Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 5 Installing the GNU Tool Chain 67 Alternatively you could do this shown for consistency with binutils and gcc gunzip c avr libc lt version gt tar gz tar xf cd avr libc lt version gt
41. ation referenced by endpt r If the correct value would cause overflow plus or minus HUGE_VAL is returned ac cording to the sign of the value and ERANGE is stored in errno If the correct value would cause underflow zero is returned and ERANGE is stored in errno FIXME HUGE_VAL needs to be defined somewhere The bit pattern is Ox 7f fffff but what number would this be 5 7 4 18 long strtol const char __nptr char xx __endptr int __base The strtol function convers the string in nptr to a long value The conversion is done according to the given base which must be between 2 and 36 inclusive or be the special value 0 The string may begin with an arbitrary amount of white space as determined by iss pace followed by a single optional or sign If base is zero or 16 the string may then include a Ox prefix and the number will be read in base 16 otherwise a zero base is taken as 10 decimal unless the next character is 0 in which case it is taken as 8 octal The remainder of the string is converted to a long value in the obvious manner stopping at the first character which is not a valid digit in the given base In bases above 10 the letter A in either upper or lower case represents 10 B represents 11 and so forth with Z representing 35 If endptr is not NULL strtol stores the address of the first invalid character in endptr If there were no digit
42. avr libc Reference Manual 20020910 cvs Generated by Doxygen 1 2 17 Tue Sep 10 09 24 22 2002 CONTENTS Contents 1 AVR Libe 1 1 1 Supported Devices gt o o 4 0 R o kd RR nl and H gs amp 1 2 avr libc Module Index 2 21 svrbe Modules coca A A e a A 2 3 avr libc Data Structure Index 3 3 1 avr libc Data Structures 3 4 avr libc Page Index 3 4 1 ayrlbe Related Pages 1 3 5 4 ni cs Sa SS khe sets 3 5 avr libc Module Documentation 3 5 1 EEPROM handling lt e 4 44 44 sun ddr es Du 3 SLI Detailed Description e ss cesi nesre r a e 3 5 1 2 Define Documentation s m sesa apart kk kk 4 513 Function Documentation 4 44 sp bin o ewe 4 5 2 AVR device specific IO definitions 5 5 3 Program Space String Utilities 6 5 31 Detailed Description gt lt e cs ederi bakka San 6 332 Delme Documentation 1 34 24 5 val KR ads e wa 6 533 3 Function Documentation 1 ge esp 642 544 pee amp 7 5 4 Additional notes from lt avr sfr defs b gt 9 3a teger Ipes aeaa Lie Les Hu 4 ina BES Den 10 HAL Detailed Description o gt 444 Se ek ee 3 4 10 3 6 Setjmpand Longymp es esere seet u epte teate 11 356 1 Detailed Description 141 10242 Lu sms ben 11 56 2 Funcion Documentation 12 1 ce 24 44 dur vastes 12 3 7 General utilitiE e 4 4 ek e ane kau goes GE V R eS 13 3 7 1 Detailed Description o o 14442 02565 eo 13
43. ay not overlap and the destination string dest must be large enough to receive the copy Returns The strcpy function returns a pointer to the destination string dest Note If the destination string of a strcpy is not large enough that is if the programmer was stupid lazy and failed to check the size before copying then anything might happen Overflowing fixed length strings is a favourite cracker technique 5 8 2 12 size_t strlcat char x dst const char x src size_t siz Concatenate two strings Appends src to string dst of size siz unlike strncat siz is the full size of dst not space left At most siz 1 characters will be copied Always NULL terminates unless siz lt strlen dst Returns The strlcat function returns strlen src MIN siz strlen initial dst If retval gt siz truncation occurred 5 8 2 13 size t strlcpy char x dst const char x src size_t siz Copy a string Copy src to string dst of size siz At most siz 1 characters will be copied Always NULL terminates unless siz 0 Returns The strlcpy function returns strlen src If retval gt siz truncation occurred 5 8 2 14 size_t strlen const char x src Calculate the length of a string The strlen function calculates the length of the string src not including the terminat ing 0 character Returns The strlen function returns the number of characters in src Generated on Tue Sep 10 09 24 23 2002 for av
44. b001 toggle OC2 output on compare match COM2x 0b01 and clear timer on compare match CTC2 1 Make OC2 PD7 an output TCCR2 _BV COM20 _BV CTC2 _BV CS20 DDRD _BV PD7 Back to FAQ Index 7 2 7 Can I use C on the AVR Basically yes C is supported assuming your compiler has been configured and compiled to support it of course Source files ending in cc cpp or C will automat ically cause the compiler frontend to invoke the C compiler Alternatively the C compiler could be explicitly called by the name avr c However there s currently no support for libstdc the standard support library needed for a complete C implementation This imposes a number of restrictions on the C programs that can be compiled Among them are e Obviously none of the C related standard functions classes and template classes are available Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 2 Frequently Asked Questions 42 e The operators new and delete are not implemented attempting to use them will cause the linker to complain about undefined external references This could perhaps be fixed e Some of the supplied include files are not C safe i e they need to be wrapped into extern MC x This could certainly be fixed too e Exceptions are not supported Since exceptions are enabled by default in the C frontend they explicitly need to be turned off using fno exce
45. c __tmp_reg__ In E st a0 __tmp_reg__ Mn VET sei Mane e ptr The compiler is prepared to reload this register next time it uses it Another problem with the above code is that it should not be called in code sections where interrupts are disabled and should be kept disabled because it will enable interrupts at the end We may store the current status but then we need another register Again we can solve this without clobbering a fixed but let the compiler select it This could be done with the help of a local C variable uint8_t s asm volatile in 0 _SREG_ NONE Velur n t ld _ tmp_reg__ al ANNE inc __tmp_reg__ Ane st Sal __tmp_reg__ NONE out __SREG__ 0 n t amp r s e ptr Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 3 Inline Asm 55 Now every thing seems correct but it isn t really The assembler code modifies the variable that ptr points to The compiler will not recognize this and may keep its value in any of the other registers Not only does the compiler work with the wrong value but the assembler code does too The C program may have modified the value too but the compiler didn t update the memory location for optimization reasons The worst thing you can do in this case is uint8_t s asm volatile in 0 _ SREG__ ANNE neri TN ET ld _ tmp_reg__ al TANTI inc tmp r g T EXE st Sal __tmp_reg__ RAE out __SREG
46. ck Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 2 Frequently Asked Questions 41 For more information on using sections including how to use them from C code see Memory Sections Back to FAQ Index 7 2 6 What is all this _BV stuff about When performing low level output work which is a very central point in microcon troller programming it is quite common that a particular bit needs to be set or cleared in some IO register While the device documentation provides mnemonic names for the various bits in the IO registers and the AVR device specific IO definitions reflect these names in definitions for numerical constants a way is needed to convert a bit number usually within a byte register into a byte value that can be assigned directly to the register However sometimes the direct bit numbers are needed as well e g in an sbi call so the definitions cannot usefully be made as byte values in the first place So in order to access a particular bit number as a byte value use the BV macro Of course the implementation of this macro is just the usual bit shift which is done by the compiler anyway thus doesn t impose any run time penalty so the following applies _BV 3 gt 1 lt lt 3 gt 0x08 However using the macro often makes the program better readable BV stands for bit value in case someone might ask you Example clock timer 2 with full IO clock CS2x 0
47. cter in this case 5 7 4 8 char dtostrf double __val char __width char __prec char x _s The dtostrf function converts the double value passed in val into an ASCII repre sentationthat will be stored under s The caller is responsible for providing sufficient storage in s Conversion is done into in the style d ddd The minimum field width of the output string including the and the possible sign for negative values is given in width and prec determines the number of digits after the decimal sign 5 7 4 9 void exit int _ status The exit function terminates the application Since there is no environment to re turn to status is ignored and code execution will eventually reach an infinite loop thereby effectively halting all code processing In a C context global destructors will be called before halting execution 5 7 4 10 void free void x __ptr The free function causes the allocated memory referenced by ptr to be made avail able for future allocations If ptr is NULL no action occurs 5 7 4 11 charx itoa int _ val char x _s int _radix The function itoa converts the integer value from val into an ASCII representation that will be stored under s The caller is responsible for providing sufficient storage in s Conversion is done using the radix as base which may be a number between 2 binary conversion and up to 36 If radix is greater than 10 the next digit after 9 will be the letter
48. despite the fact that two separate 8 bit IO transfers are required to actually move the data Typically this includes access to the current timer counter value register TCNTn the input capture register ICRn and write access to the output compare registers OCRnM Refer to the actual datasheet for each device s set of registers that involves the TEMP register When accessing one of the registers that use TEMP from the main application and possibly any other one from within an interrupt routine care must be taken that no access from within an interrupt context could clobber the TEMP register data of an in progress transaction that has just started elsewhere To protect interrupt routines against other interrupt routines it s usually best to use the SIGNAL macro when declaring the interrupt function and to ensure that interrupts are still disabled when accessing those 16 bit timer registers Within the main program access to those registers could be encapsulated in calls to the cli and sei macros If the status of the global interrupt flag before accessing one of those registers is uncertain something like the following example code can be used uint16_t read_timerl void uint8_t sreg uint16_t val sreg SREG cli val TCNT1 SREG sreg return val Back to FAQ Index Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 2 Frequently Asked Questions 7 2 10 How do use a define d
49. e Note The bit shift is performed by the compiler which then inserts the result into the code Thus there is no run time overhead when using _BV Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 10 Special function registers 35 5 10 2 2 define bit is_clear sfr bit inb sfr amp BV bit include lt avr io h gt Test whether bit bit in IO register s fr is clear 5 10 2 3 define bit _is_set sfr bit inb sfr amp _BV bit include lt avr io h gt Test whether bit bit in IO register sfr is set 5 10 2 4 define BV bit BV bit Deprecated For backwards compatibility only This macro will evetually be removed Use _BV in new programs 5 10 2 5 define cbi sfr bit SFR_BYTE sfr amp _BV bit include lt avr io h gt Clear bit bit in IO register sfr 5 10 2 6 define inb sfr SFR BYTE sfr include lt avr io h gt Read a byte from IO register sfr 5 10 2 7 define inp sfr inb sfr Deprecated For backwards compatibility only This macro will evetually be removed Use inb in new programs 5 10 2 8 define inw sfr SFR WORD sfr include lt avr io h gt Read a 16 bit word from IO register pair sfr Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 10 Special function registers 36 5 10 2 9 define loop until bit is clear sfr bit do while bit_ is set sfr bit include lt avr io h gt Wait until bit bit in IO regist
50. e This section simply records the size of the variable but otherwise doesn t consume space neither within the object file nor within flash memory Of course being a variable it will consume space in the target s RAM In contrast global and static variables that have an initializer go into the data section of the file This will cause them to consume space in the file in order to record the initializing value and in the flash ROM of the target device The latter is needed since the flash ROM is the only way how the compiler can tell the target device the value this variable is going to be initialized to Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 2 Frequently Asked Questions 43 Now if some programmer wants to make doubly sure their variables really get a 0 at program startup and adds an initializer just containing 0 on the right hand side they waste space While this waste of space applies to virtually any platform C is implemented on it s usually not noticeable on larger machines like PCs while the waste of flash ROM storage can be very painful on a small microcontroller like the AVR So in general initializers should only be written if they are non zero Back to FAQ Index 7 2 9 Why do some 16 bit timer registers sometimes get trashed Some of the timer related 16 bit IO registers use a temporary register called TEMP in the Atmel datasheet to guarantee an atomic access to the register
51. e array member The bsearch function returns a pointer to a matching member of the array or a null pointer if no match is found If two members compare as equal which member is matched is unspecified 5 7 4 6 div_t div int _num int _denom The div function computes the value num denom and returns the quotient and re mainder in a structure named div_t that contains two int members named quot and rem 5 7 4 7 charr dtostre double __val char x _s unsigned char _prec unsigned char _ flags The dtostre function converts the double value passed in val into an ASCII repre sentation that will be stored under s The caller is responsible for providing sufficient storage in s Conversion is done into in the style d dddedd where there is one digit before the decimal point character and the number of digits after it is equal to the precision prec if the precision is Zero no decimal point character appears If flags has the DTOSTRE_UPPERCASE bit set the letter E rather than e will be used to in troduce the exponent The exponent always contains two digits if the value is zero the exponent is 00 If flags has the DTOSTRE_ALWAYS _SIGN bit set a space character will be placed into the leading position for positive numbers Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 7 General utilities 17 If flags has the DTOSTRE PLUS SIGN bit set a plus sign will be used instead of a space chara
52. e gimsk register or eimsk register if using an AVR Mega device Although this function is essentially the same as using the outb func tion it does adapt slightly to the type of device being used 5 9 3 2 void timer_enable_int unsigned char ints include lt avr interrupt h gt This function modifies the timsk register using the outb function The value you pass via ints is device specific 5 10 Special function registers 5 10 1 Detailed Description When working with microcontrollers many of the tasks usually consist of controlling the peripherals that are connected to the device respectively programming the subsys tems that are contained in the controller which by itself communicate with the circuitry connected to the controller Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 10 Special function registers 33 The AVR series of microcontrollers offers two different paradigms to perform this task There s a separate IO address space available as it is known from some high level CISC CPUs that can be addressed with specific IO instructions that are applicable to some or all of the IO address space in out sbi etc The entire IO address space is also made available as memory mapped 10 i e it can be accessed using all the MCU instructions that are applicable to normal data memory The IO register space is mapped into the data memory address space with an offset of 0x20 since the bottom of th
53. equire interrupt controlled EEPROM access to ensure that no time will be wasted in spinloops will have to deploy their own implementation Note All of the read write functions first make sure the EEPROM is ready to be ac cessed Since this may cause long delays if a write operation is still pending time Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 1 EEPROM handling critical applications should first poll the EEPROM e g using eeprom_is_ready before attempting any actual I O avr libc declarations define eeprom is ready bit_is_clear EECR EEWE unsigned char eeprom_rb unsigned int addr unsigned int eeprom_rw unsigned int addr void eeprom_wb unsigned int addr unsigned char val void eeprom read block void buf unsigned int addr size_t n IAR C compatibility defines e define EEPUT addr val eeprom_wb addr val e define EEGET var addr var eeprom_rb addr 5 12 Define Documentation 5 1 2 1 define EEGET var addr var eeprom_rb addr read a byte from EEPROM 5 1 2 2 define EEPUT addr val eeprom_wb adadr val write a byte to EEPROM 5 1 2 3 define eeprom_is_ready bit is_clear EECR EEWE return if EEPROM is ready for a new read write operation 0 if not 5 13 Function Documentation 5 1 3 1 unsigned char eeprom_rb unsigned int addr read one byte from EEPROM address addr 5 1 3 2 void eeprom_read_block void x buf unsigned int addr size_t n read a block of
54. er less than equal to or greater than zero if the first len bytes of s1 is found respectively to be less than to match or be greater than the first len bytes of s2 5 8 2 4 void x memcpy void dest const void x src size_t len Copy a memory area The memcpy function copies len bytes from memory area src to memory area dest The memory areas may not overlap Use memmove if the memory areas do overlap Returns The memcpy function returns a pointer to dest 5 8 2 5 void memmove void dest const void x src size_t len Copy memory area The memmove function copies len bytes from memory area src to memory area dest The memory areas may overlap Returns The memmove function returns a pointer to dest 5 8 2 6 void x memset void x dest int val size_t len Fill memory with a constant byte The memset function fills the first len bytes of the memory area pointed to by dest with the constant byte val Returns The memset function returns a pointer to the memory area dest Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 8 Strings 24 5 8 2 7 int strcasecmp const char sI const char x s2 Compare two strings ignoring case The strcasecmp function compares the two strings s1 and s2 ignoring the case of the characters Returns The strcasecmp function returns an integer less than equal to or greater than zero if s1 is found respectively to be less than to match o
55. er s fr is clear 5 10 2 10 define loop_until_bit_is_set sfr bit do while bit_is_clear sfr bit include lt avr io h gt Wait until bit bit in IO register sfr is set 5 10 2 11 define outb sfr val SFR_BYTE sfr val include lt avr io h gt Write val to IO register sfr Note The order of the arguments was switched in older versions of avr libc versions lt 20020203 5 10 2 12 define outp val sfr outb sfr val Deprecated For backwards compatibility only This macro will evetually be removed Use outb in new programs 5 10 2 13 define outw sfr val SFR_WORD sfr val include lt avr io h gt Write the 16 bit value val to IO register pair sfr Care will be taken to write the lower register first When used to update 16 bit registers where the timing is critical and the operation can be interrupted the programmer is the responsible for disabling interrupts before accessing the register pair Note The order of the arguments was switched in older versions of avr libc versions lt 20020203 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 6 avr libc Data Structure Documentation 37 5 10 2 14 define sbi sfr bit SFR_BYTE sfr BV bit include lt avr io h gt Set bit bit in IO register sfr 6 avr libc Data Structure Documentation 6 1 div t Struct Reference 6 1 1 Detailed Description Result type for function div Data Fields e int quot
56. ermanently bind a variable to a register 40 7 2 5 How to modify MCUCR or WDTCR early 40 7 2 6 What is all this BVO stuff about 41 7 2 7 Canluse C onthe AVR 41 7 2 8 Shouldn t I better initialize all my variables 42 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen CONTENTS iii Ta 74 Ti 7 2 9 Why do some 16 bit timer registers sometimes get trashed 7 2 10 How do I use a define d constant in an asm statement 7 2 11 When single stepping through my program in avr gdb the PC RLE r ACUM ke bk ka kx ee ns 7 2 12 How do I trace an assembler file in avr gdb Fal GUC gem Statement oense 0 Ge ro a hi a F E a A ki 604 ee A A ne dent G 7 3 3 Input and Output Operands LA T pan eee 7 35 Assemble Macros serora iea be ee cu he pas Pa CSD e ee nv Lt De se Re 7 3 7 C Names Used in Assembler Code Ta LAKE a eee Memory SECONS 2 2 4 c LE eu A nue uw FAL The text e 8 05 b klk aks vu i o taz The Section V 8 dk avui dA ane a A N TAS The DSi Section sx xV ue dun Kie k kd i E TAA The eeprom SECO s oe k k nk k bass k k 64 TES THE MOMIE Sechon 2 244 sss vas k bk di E A me 74 6 The initN Sections TA The fimiN Sects 25 R ki sn lt a dore pate 7 4 8 Using Sections in Assembler Code 749 Using Sechons
57. escribed in the clobber section the routine uses a local variable to hold a temporary value Another use for a local variable is a return value The following function returns a 16 bit value read from two successive port addresses Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 3 Inline Asm 57 uint16_t inw uint8_t port uint16_t result asm volatile in SAD SI ot in BO 1 1 r result I port i return result Note inw is supplied by avr libc 7 3 7 C Names Used in Assembler Code By default AVR GCC uses the same symbolic names of functions or variables in C and assembler code You can specify a different name for the assembler code by using a special form of the asm statement unsigned long value asm clock 3686400 This statement instructs the compiler to use the symbol name clock rather than value This makes sense only for external or static variables because local variables do not have symbolic names in the assembler code However local variables may be held in registers With AVR GCC you can specify the use of a specific register void Count void register unsigned char counter asm r3 some code asm volatile clr r3 more code The assembler instruction clr r3 will clear the variable counter AVR GCC will not completely reserve the specified register If the optimizer recognizes that the vari able will not be referenced any longer
58. ge in s Conversion is done using the radix as base which may be a number between 2 binary conversion and up to 36 If radix is greater than 10 the next digit after 9 will be the letter a The utoa function returns the pointer passed as s 5 7 5 Variable Documentation 5 7 5 1 char _malloc_heap_end Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 8 Strings 21 The variables _malloc heap start and _ malloc heap end can be used to re strict the malloc function to a certain memory region These variables are statically initialized to point to _heap_start and _heap_end respectively where _heap_ start is filled in by the linker and _heap_end is set to O which makes malloc assume the heap is below the stack Any changes need to be made before the very first call to malloc In case of a device with external SRAM where the heap is going to be allocated in exter nal RAM it s good practice to already define those symbols from the linker command line 5 7 5 2 char _malloc_heap start See _malloc_heap end 5 7 5 3 size_t _malloc_margin When extending the data segment in malloc the allocator will not try to go beyond the current stack limit decreased by _malloc margin bytes Thus all possible stack frames of interrupt routines that could interrupt the current function plus all further nested function calls must not require more stack space or they ll risk to collide with the data
59. he devices Flash n The maximum number of bytes to compare Returns The strcasecmp_P function returns an integer less than equal to or greater than zero if sl or the first n bytes thereof is found respectively to be less than to match or be greater than s2 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 4 Additional notes from lt avr sfr_defs h gt 5 3 3 9 int strncmp P const char x s1 PGM P s2 size_t n The strncmp_P function is similar to stremp_P except it only compares the first at most n characters of s1 and s2 Returns The strncmp_P function returns an integer less than equal to or greater than zero if sl or the first n bytes thereof is found respectively to be less than to match or be greater than s2 5 3 3 10 char x strncpy_P char x dest PGM P src size_t n The strncpy_P function is similar to strepy_P except that not more than n bytes of src are copied Thus if there is no null byte among the first n bytes of src the result will not be null terminated In the case where the length of src is less than that of n the remainder of dest will be padded with nulls Returns The strncpy PO function returns a pointer to the destination string dest 5 4 Additional notes from lt avr sfr_defs h gt The lt avr sfr_defs h gt file is included by all of the lt avr ioXXXX h gt files which use macros defined here to make the special function register definition
60. imt Code lt lt g s sa bk Sud BEA es Installing the GNU Tool Chain 1514 Requited Toole cor oco eres epa dk a bes TZ Opuotal Tool o oe eee dki dk k N 4 eS 7 5 3 GNU Binutils for the AVR target 754 GCC for the AVR target oos 0 4 bm d u T ANREDE 23306 a a a elu a mue b t UDP nc en eae Re Gad ve k 4 dus k s 3 43 44 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 1 AVR Libc EN M ee 67 T8 GDB forthe AVE Met Es 230 44 mx Be eae aps 67 SOO T T ess ros a A AR 68 Fa AMARIG ooo Lau do ea ee e A 68 1 AVR Libc The latest version of this document is always available from http www freesoftware fsf org avr libc The AVR Libc package provides a subset of the standard C library for Atmel AVR 8 bit RISC microcontrollers There s a lot of work to be done on this This file will produce the index html for html output or the first chapter in BTEX output 1 1 Supported Devices AT90S Type Devices e at90s1200 1 at90s2313 at90s2323 at90s2333 at90s2343 at90s4414 at90s4433 at90s4434 at90s8515 at90s8534 at90s8535 ATmega Type Devices atmega atmega103 atmega128 atmegal61 atmega162 atmega163 atmega 169 atmega323 ATtiny Type Devices e attiny10 1 e attiny11 1 e attiny12 1 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 2 avr libc Module Index e attiny15 1 e attiny22 e atti
61. ink of the initN and finiN sections as functions but in reality they are just symbolic names the tell the linker where to stick a chunk of code which is nor a function Notice that the examples for asm and C can not be called as functions and should not be jumped into The initN sections are executed in order from 0 to 9 init0 Weakly bound to _init If user defines __init it will be jumped into immediately after a reset initl Unused User definable init2 In C programs weakly bound to initialize the stack init3 Unused User definable init4 Copies the data section from flash to SRAM Also sets up and zeros out the bss section In Unix like targets data is normally initialized by the OS directly from the executable file Since this is impossible in an MCU environment avr gcc instead takes care of appending the data variables after text in the flash ROM image init4 then defines the code weakly bound which takes care of copying the contents of data from the flash to SRAM init5 Unused User definable init6 Unused for C programs but used for constructors in C programs Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 4 Memory Sections 61 init7 Unused User definable init8 Unused User definable init9 Jumps into main 7 4 7 The finiN Sections These sections are used to define the exit code executed after return from main or a call to exit
62. interrupts 32 tools optional 64 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen INDEX 73 tools required 63 uint16_t avr_inttypes 11 uint32_t avr_inttypes 11 uint64_t avr_inttypes 11 uint8_t avr_inttypes 11 uintptr_t avr_inttypes 11 ultoa avr_stdlib 20 utoa avr_stdlib 20 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen
63. is space is reserved for direct access to the MCU registers Actual SRAM is available only behind the IO register area starting at either address 0x60 or 0x100 depending on the device AVR Libc supports both these paradigms While by default the implementation uses memory mapped IO access this is hidden from the programmer So the programmer can access IO registers either with a special function like outb include lt avr io h gt outb PORTA 0x33 or they can assign a value directly to the symbolic address PORTA 0x33 The compiler s choice of which method to use when actually accessing the IO port is completely independent of the way the programmer chooses to write the code So even 1f the programmer uses the memory mapped paradigm and writes PORTA 0x40 the compiler can optimize this into the use of an sbi instruction of course provided the target address is within the allowable range for this instruction and the right hand side of the expression is a constant value known at compile time The advantage of using the memory mapped paradigm in C programs is that it makes the programs more portable to other C compilers for the AVR platform Some people might also feel that this is more readable For example the following two statements would be equivalent outb DDRD inb DDRD amp LCDBITS DDRD amp LCDBITS The generated code is identical for both Whitout optimization the compiler strictly genera
64. knows the following constraint characters Note The most up to date and detailed information on contraints for the avr can be found in the gcc manual Note The x register is r27 r26 the y register is r29 r28 and the z register is r31 r30 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 3 Inline Asm 50 Constraint Used for Range a Simple upper registers r16 to r23 b Base pointer registers y Z pairs d Upper register rl6tor31 e Pointer register pairs X y Z G Floating point constant 0 0 I 6 bit positive integer 0 to 63 constant J 6 bit negative integer 63 to 0 constant K Integer constant 2 L Integer constant 0 1 Lower registers rO to r15 M 8 bit integer constant 0 to 255 N Integer constant 1 O Integer constant 8 16 24 P Integer constant 1 q Stack pointer register SPH SPL r Any register rO to 131 t Temporary register rU W Special upper register r24 r26 r28 r30 pairs X Pointer register pair X x r27 126 y Pointer register pair Y y r29 128 Z Pointer register pair Z z r31 r30 These definitions seem not to fit properly to the AVR instruction set The author s as sumption is that this part of the compiler has never been really finished in this version but that assumption may be wrong The selection of the proper contraint depends on the range of the constants or registers which must be accept
65. ls This is done by supplying arguments to the configure script that enable the AVR specific options configure prefix PREFIX target avr disable nls If you don t specify the prefix option the tools will get installed in the usr local hierarchy i e the binaries will get installed in usr local bin the info pages get installed in usr local info etc Since these tools are chang ing frequently It is preferrable to put them in a location that is easily removed When configure is run it generates a lot of messages while it determines what is available on your operating system When it finishes it will have created several Makefiles that are custom tailored to your platform At this point you can build the project make Note BSD users should note that the projects Makefile uses GNU make syntax This means FreeBSD users may need to build the tools by using gmake If the tools compiled cleanly you re ready to install them If you specified a destination that isn t owned by your account you ll need root access to install them To install make install You should now have the programs from binutils installed into SPREFIX bin Don t forget to set your PATH environment variable before going to build avr gcc Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 5 Installing the GNU Tool Chain 66 7 5 4 GCC for the AVR target Warning You must install avr binutils and make sure your p
66. ls each compiler writer is forced to design their method of support In the AVR GCC environment the vector table is predefined to point to interrupt rou tines with predetermined names By using the appropriate name your routine will be called when the corresponding interrupt occurs The device library provides a set of default interrupt routines which will get used if you don t define your own Patching into the vector table is only one part of the problem The compiler uses by convention a set of registers when it s normally executing compiler generated code It s important that these registers as well as the status register get saved and restored The extra code needed to do this is enabled by tagging the interrupt function with _ attribute__ interrupt These details seem to make interrupt routines a little messy but all these details are handled by the Interrupt API An interrupt routine is defined with one of two macros Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 9 Interrupts and Signals 29 INTERRUPTO and SIGNAL These macros register and mark the routine as an in terrupt handler for the specified peripheral The following is an example definition of a handler for the ADC interrupt include lt avr signal h gt INTERRUPT SIG_ADC user code here FIXME should there be a discussion of writing an interrupt handler in asm If an unexpected interrupt occurs interru
67. ny28 1 Misc Devices e at94K e at76c711 FIXME troth 2002 09 02 How do the at94 and at76 devices fit into the grand scheme of all things AVR Note 1 Assembly only There is no support for these devices to be programmed in C since they do not have a ram based stack 2 avr libc Module Index 2 1 avr libc Modules Here is a list of all modules EEPROM handling AVR device specific IO definitions Program Space String Utilities Integer Types Setjmp and Longjmp General utilities Strings Interrupts and Signals Special function registers Additional notes from lt avr sfr_defs h gt 10 11 13 21 28 32 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 3 avr libc Data Structure Index 3 avr libc Data Structure Index 3 1 avr libc Data Structures Here are the data structures with brief descriptions div_t 37 Idiv_t 37 4 avr libc Page Index 4 1 avr libc Related Pages Here is a list of all related documentation pages Acknowledgments 38 Frequently Asked Questions 38 Inline Asm 46 Memory Sections 58 Installing the GNU Tool Chain 62 5 avr libc Module Documentation 5 1 EEPROM handling 5 1 1 Detailed Description include lt avr eeprom h gt This header file declares the interface to some simple library routines suitable for han dling the data EEPROM contained in the AVR microcontrollers The implementation uses a simple polled mode interface Applications that r
68. o longer necessary and can be removed Real example this code could be used in a boot loader that is portable between devices with SPMCR at different addresses lt avr iom163 h gt define SPMCR _SFR_IO8 0x37 lt avr iomi28 h gt define SPMCR _SFR_MEM8 0x68 if _SFR_IO_REG_P SPMCR out _SFR_IO_ADDR SPMCR r24 else sts _SFR_MEM_ADDR SPMCR r24 endif You can use the in out cbi sbi sbic sbis instructions without the _SFR_ IO_REG_P test if you know that the register is in the I O space as with SREG for example If it isn t the assembler will complain I O address out of range 0 0x3f so this should be fairly safe If you do not define __SFR_OFF SET so it will be 0x20 by default all special register addresses are defined as memory addresses so SREG is 0x5f and if code size and speed are not important and you don t like the ugly if above you can always use Ids sts to access them But this will not work if __SFR_OFF SET 0x20 so use a different macro defined only if __SFR_OFF SET 0x20 for safety sts _SFR_ADDR SPMCR r24 In C programs all 3 combinations of _SFR_ASM_COMPAT and __SFR_OFFSET are supported the SFR_ADDR SPMCR macro can be used to get the address of the SPMCR register 0x57 or 0x68 depending on device The old inp outp macros are still supported but not recommended to use in new code The order of outp arguments is confusing 5 5 Integer Types
69. p 5 7 4 2 int abs int i The abs function computes the absolute value of the integer i Note The abs and labs functions are builtins of gcc 5 7 4 3 _inline__ int atoi const char __nptr The atoi function converts the initial portion of the string pointed to by nptr to integer representation It is equivalent to int strtol nptr char NULL 10 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 7 General utilities 5 7 4 4 _ inline long atol const char x nptr The atol function converts the initial portion of the string pointed to by npt r to long integer representation It is equivalent to strtol nptr char NULL 10 5 7 4 5 void bsearch const void _ key const void x _ base size_t _nmemb size_t size int x _compar const void x const void x The bsearch function searches an array of nmemb objects the initial member of which is pointed to by base for a member that matches the object pointed to by key The size of each member of the array is specified by size The contents of the array should be in ascending sorted order according to the compar ison function referenced by compar The compar routine is expected to have two arguments which point to the key object and to an array member in that order and should return an integer less than equal to or greater than zero if the key object is found respectively to be less than to match or be greater than th
70. pt is enabled and no handler is installed which usually indicates a bug then the default action is to reset the device by jumping to the reset vector You can override this by supplying a function named __vector_ default which should be defined with either SIGNALO or INTERRUPTO as such include lt avr signal h gt SIGNAL __vector_ default user code here The interrupt is chosen by supplying one of the symbols in following table Note that every AVR device has a different interrupt vector table so some signals might not be available Check the data sheet for the device you are using FIXME Fill in the blanks Gotta read those durn data sheets Note The SIGNALO and INTERRUPTO macros currently cannot spell check the argu ment passed to them Thus by misspelling one of the names below in a call to SIGNALO or INTERRUPTO a function will be created that while possibly being usable as an interrupt function is not actually wired into the interrupt vector table No warning will be given about this situation Signal Name Description SIG_2WIRE_SERIAL 2 wire serial interface aka IC tm SIG_ADC ADC Conversion complete SIG_COMPARATOR Analog Comparator Interrupt SIG_EEPROM_READY Eeprom ready SIG_FPGA_INTERRUPTO SIG_FPGA_INTERRUPT1 SIG_FPGA_INTERRUPT2 SIG_FPGA_INTERRUPT3 SIG_FPGA_INTERRUPT4 SIG_FPGA_INTERRUPTS Generated on Tue Sep 10 09 24 23 2002 for avr libc by
71. ptions in the compiler options Failing this the linker will complain about an undefined external reference to _gxx_personality_sj0 Constructors and destructors are supported though including global ones When programming C in space and runtime sensitive environments like microcon trollers extra care should be taken to avoid unwanted side effects of the C calling conventions like implied copy constructors that could be called upon function invo cation etc These things could easily add up into a considerable amount of time and program memory wasted Thus casual inspection of the generated assembler code using the S compiler option seems to be warranted Back to FAQ Index 7 2 8 Shouldn t I better initialize all my variables Global and static variables are guaranteed to be initialized to O by the C standard avr gcc does this by placing the appropriate code into section init 4 see The init N Sections With respect to the standard this sentence is somewhat simplified because the standard would allow for machines where the actual bit pattern used differs from all bits 0 but for the AVR target in effect all integer type variables are set to 0 all pointers to a NULL pointer and all floating point variables to 0 0 As long as these variables are not initialized 1 e they don t have an equal sign and an initialization expression to the right within the definition of the variable they go into the bss section of the fil
72. r be greater than s2 5 8 2 8 char x strcat char x dest const char x src Concatenate two strings The strcat function appends the src string to the dest string overwriting the 10 char acter at the end of dest and then adds a terminating 10 character The strings may not overlap and the dest string must have enough space for the result Returns The strcat function returns a pointer to the resulting string dest 5 8 2 9 char x strchr const char src int val Locate character in string The strchr function returns a pointer to the first occurrence of the character val in the string src Here character means byte these functions do not work with wide or multi byte characters Returns The strchr function returns a pointer to the matched character or NULL if the character is not found 5 8 2 10 int stremp const char s1 const char x s2 Compare two strings The stremp function compares the two strings sl and s2 Returns The stremp function returns an integer less than equal to or greater than zero if sl is found respectively to be less than to match or be greater than s2 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 8 Strings 25 5 8 2 11 char x strepy char x dest const char x src Copy a string The strcpy function copies the string pointed to by src including the terminating 0 character to the array pointed to by dest The strings m
73. r libc by Doxygen 5 8 Strings 26 5 8 2 15 char strlwr char x string Convert a string to lower case The strlwr function will convert a string to lower case Only the upper case alphabetic characters A Z are converted Non alphabetic characters will not be changed Returns The strlwr function returns a pointer to the converted string 5 8 2 16 int strncasecmp const char x sZ const char x s2 size_t len Compare two strings ignoring case The strncasecmp function is similar to strcasecmp except it only compares the first n characters of sl Returns The strncasecmp function returns an integer less than equal to or greater than zero if sl or the first n bytes thereof is found respectively to be less than to match or be greater than s2 5 8 2 17 char x strncat char x dest const char x src size_t len Concatenate two strings The strncat function is similar to strcat except that only the first n characters of src are appended to dest Returns The strncat function returns a pointer to the resulting string dest 5 8 2 18 int strncmp const char s1 const char s2 size_t len Compare two strings The strncmp function is similar to stremp except it only compares the first at most n characters of s1 and s2 Returns The strncmp function returns an integer less than equal to or greater than zero if sl or the first n bytes thereof is found respectively to be less than
74. r size program part of binutils coming from a Unix background doesn t account for the data initialization space added to the text section so in order to know how much flash the final program will consume one needs to add the values for both text and data but not bss while the amount of pre allocated SRAM is the sum of data and bss 74 2 The data Section This section contains static data which was defined in your code Things like the fol lowing would end up in data Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 4 Memory Sections 59 char err_str Your program has died a horrible death struct point pt 1 1 It is possible to tell the linker the SRAM address of the beginning of the data section This is accomplished by adding W1 Tdata addr to the avr gcc command used to the link your program Not that addr must be offset by adding 0x800000 the to real SRAM address so that the linker knows that the address is in the SRAM memory space Thus if you want the data section to start at 0x1100 pass 0x801100 at the address to the linker offset explained 7 4 3 The bss Section Uninitialized global or static variables end up in the bss section 7 4 4 The eeprom Section This is where eeprom variables are stored 7 4 5 The noinit Section This sections is a part of the bss section What makes the noinit section special is that variables which are defined as such int
75. r than s2 5 3 3 4 char x strcat_P char x dest PGM P src The strcat_P function is similar to strcat except that the src string must be located in program space flash Returns The strcat function returns a pointer to the resulting string dest Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 3 Program Space String Utilities 5 3 3 5 int stremp P const char s1 PGM P s2 The stremp_P function is similar to stremp except that s2 is pointer to a string in program space Returns The stremp_P function returns an integer less than equal to or greater than zero if sl is found respectively to be less than to match or be greater than s2 5 3 3 6 char x strcpy_P char x dest PGM_P src The strcpy_P function is similar to strcpy except that src is a pointer to a string in program space Returns The strcpy_P function returns a pointer to the destination string dest 5 3 3 7 size t strlen_P PGM P src The strlen P function is similar to strlen except that src is a pointer to a string in program space Returns The strlen function returns the number of characters in src 5 3 3 8 int strncasecmp_P const char x s1 PGM _P s2 size_t n Compare two strings ignoring case The strncasecmp_P function is similar to strcasecmp_P except it only compares the first n characters of sl Parameters si A pointer to a string in the devices SRAM s2 A pointer to a string in t
76. rand list will be explained soon Let us first examine the part of a compiler listing which may have been generated from our example lds r24 value APP in r24 12 NOAPP sts value r24 The comments have been added by the compiler to inform the assembler that the in cluded code was not generated by the compilation of C statements but by inline as sembler statements The compiler selected register r24 for storage of the value read from PORTD The compiler could have selected any other register though It may not explicitely load or store the value and it may even decide not to include your assembler code at all All these decisions are part of the compiler s optimization strategy For example if you never use the variable value in the remaining part of the C program the compiler will most likely remove your code unless you switched off optimization To avoid this you can add the volatile attribute to the asm statement asm volatile in 0 1 r value I PORTD The last part of the asm instruction the clobber list is mainly used to tell the compiler about modifications done by the assembler code This part may be omitted all other parts are required but may be left empty If your assembler routine won t use any input or output operand two colons must still follow the assembler code string A good example is a simple statement to disable interrupts asm volatile cli 7 3 2 Assembler Code You
77. represents 10 B represents 11 and so forth with Z representing 35 If endptr is not NULL strtol stores the address of the first invalid character in endptr If there were no digits at all however strtol stores the original value of nptr in endptr Thus if xnptr is not 10 but xxendptr is 10 on return the entire string was valid The strtoul function return either the result of the conversion or if there was a lead ing minus sign the negation of the result of the conversion unless the original non negated value would overflow in the latter case strtoul returns ULONG_MAX and errno is set to ERANGE If no conversion could be performed 0 is returned 5 7420 char ultoa unsigned long int _ val char _s int _radix The function ultoa converts the unsigned long integer value from val into an ASCII representation that will be stored under s The caller is responsible for providing suf ficient storage in s Conversion is done using the radix as base which may be a number between 2 binary conversion and up to 36 If radix is greater than 10 the next digit after 9 will be the letter a The i ultoa function returns the pointer passed as s 5 7 4 21 char utoa unsigned int _val char x __s int _radix The function utoa converts the unsigned integer value from val into an ASCII repre sentation that will be stored under s The caller is responsible for providing sufficient stora
78. s at all however strtol stores the original value of nptr in endptr Thus if xnptr is not 10 but xxendptr is 0 on return the entire string was valid The strtol function returns the result of the conversion unless the value would under flow or overflow If no conversion could be performed 0 is returned If an overflow or underflow occurs errno is set to ERANGE and the function return value is clamped to LONG_MIN or LONG_MAX respectively 5 7 4 19 unsigned long strtoul const char x _nptr char xx __endptr int _base The strtoul function converts the string in npt r to an unsigned long value The con version is done according to the given base which must be between 2 and 36 inclusive or be the special value 0 Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 7 General utilities 20 The string may begin with an arbitrary amount of white space as determined by iss pace followed by a single optional or sign If base is zero or 16 the string may then include a Ox prefix and the number will be read in base 16 otherwise a zero base is taken as 10 decimal unless the next character is 0 in which case it is taken as 8 octal The remainder of the string is converted to an unsigned long value in the obvious manner stopping at the first character which is not a valid digit in the given base In bases above 10 the letter A in either upper or lower case
79. s look like C variables or simple constants depending on the _SFR_ASM_COMPAT define Some examples from lt avr iom128 h gt to show how to define such macros define PORTA _SFR_IO8 0x1b define TCNT1 _SFR_IC16 0x2c define PORTE _SFR_MEM8 0x61 define TCNT3 _SFR_MEM16 0x88 If _SFR_ASM_COMPAT is not defined C programs can use names like PORTA directly in C expressions also on the left side of assignment operators and GCC will do the right thing use short I O instructions if possible The _SFR_OFFSET definition is not used in any way in this case Define SFR_ASM_COMPAT as 1 to make these names work as simple constants ad dresses of the I O registers This is necessary when included in preprocessed assem bler S source files so it is done automatically if _ASSEMBLER__is defined By default all addresses are defined as if they were memory addresses used in lds sts instructions To use these addresses in in out instructions you must subtract 0x20 from them Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 5 Integer Types 10 For more backwards compatibility insert the following at the start of your old assem bler source file define __SFR_OFFSET 0 This automatically subtracts 0x20 from I O space addresses but it s a hack so it is recommended to change your source wrap such addresses in macros defined here as shown below After this is done the _SFR_OFFSET definition is n
80. sh ROM Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 3 Program Space String Utilities 5 3 Program Space String Utilities 5 3 1 Detailed Description include lt avr pgmspace h gt The functions in this module provide interfaces for a program to access data stored in program space flash memory of the device In order to use these functions the target device must support either the LPM or ELPM instructions Note These function are an attempt to provide some compatibility with header files that come with IAR C to make porting applications between different compilers eas ier This is not 100 compatibility though GCC does not have full support for multiple address spaces yet Defines e define PSTR s static char __c PROGMEM s _ c e define PGM_P const prog_char x e define PGM_VOID_P const prog_void x Functions unsigned char __elpm_inline unsigned long _addr _ATTR_CONST__ void x memcpy_P void x PGM_VOID P size_t int strcasecmp_P const char x PGM_P _ATTR PURE __ char x strcat_P char x PGM_P int stremp_P const char x PGM _P _ATTR PURE char x strcpy_P char x PGM_P size_t strlen_P PGM_P _ATTR_CONST__ int strncasecmp_P const char x PGM_P size_t _ATTR PURE__ int strncmp P const char x POM P size_t _ATTR PURE char strncpy_P char x PGM _P size_t 5 3 2 Define Documentation 5 3 2 1 define PGM P const prog_char x Used to declare a variable th
81. st version is now available at http www freesoftware fsf org avr libc 7 3 1 GCC asm Statement Let s start with a simple example of reading a value from port D asm in 0 1 r value I PORTD Each asm statement is devided by colons into four parts 1 The assembler instructions defined as a single string constant in 0 1 2 A list of output operands separated by commas Our example uses just one r value 3 A comma separated list of input operands Again our example uses one operand only I PORTD 4 Clobbered registers left empty in our example You can write assembler instructions in much the same way as you would write assem bler programs However registers and constants are used in a different way if they refer to expressions of your C program The connection between registers and C operands is specified in the second and third part of the asm instruction the list of input and output operands respectively The general form is asm code output operand list input operand list clobber list Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 3 Inline Asm 48 In the code section operands are referenced by a percent sign followed by a single digit 0 refers to the first 1 to the second operand and so forth From the above example 0 refers to r value and 1 refers to I PORTD This may still look a little odd now but the syntax of an ope
82. t operators it is possible to use a single digit in the constraint string Using digit n tells the compiler to use the same register as for the n th operand starting with zero Here is an example asm volatile swap 0 r value 0 value This statement will swap the nibbles of an 8 bit variable named value Constraint 0 tells the compiler to use the same input register as for the first operand Note however that this doesn t automatically imply the reverse case The compiler may choose the same registers for input and output even if not told to do so This is not a problem in most cases but may be fatal if the output operator is modified by the assembler code before the input operator is used In the situation where your code depends on different registers used for input and output operands you must add the amp constraint modifier to your output operand The following example demonstrates this problem asm volatile in 0 1 NANE Tout Sl 32 imc amp r input I port r output In this example an input value is read from a port and then an output value is written to the same port If the compiler would have choosen the same register for input and out put then the output value would have been destroyed on the first assembler instruction Fortunately this example uses the amp constraint modifier to instruct the compiler not to select any register for the output value which is used for any of the inp
83. tes code following the memory mapped paradigm while with optimization turned on code is generated using the faster and smaller in out MCU instructions Note that special care must be taken when accessing some of the 16 bit timer IO reg isters where access from both the main program and within an interrupt context can happen See Why do some 16 bit timer registers sometimes get trashed Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 5 10 Special function registers 34 Modules e Additional notes from lt avr sfr_defs h gt Bit manipulation e define BV bit 1 lt lt bit IO operations define inb sfr SFR_BYTE sfr define inw sfr SFR WORD sfr define outb sfr val SFR BYTE sfr val define outw sfr val SFR_WORD sfr val IO register bit manipulation define cbi sfr bit SFR BYTE sfr amp _BV bit define sbi sfr bit SFR_ BYTE sfr _BV bit define bit_is_set sfr bit inb sfr amp BV bit define bit_is_clear sfr bit inb sfr amp _BV bit define loop_until_bit_is_set sfr bit do while bit_is_clear sfr bit define loop_until_bit_is_clear sfr bit do while bit_is_set sfr bit Deprecated Macros e define outp val sfr outb sfr val e define inp sfr inb sfr e define BV bit BV bit 5 10 2 Define Documentation 5 10 2 1 define BV bit 1 lt lt bit include lt avr io h gt Converts a bit number into a byte valu
84. truction cannot be used directly the compiler needs to work around it by combining a skip instruction together with a relative jump r jmp instruction which will need one additional word of ROM Other side effects of optimzation are that variable usage is restricted to the area of code where it is actually used So if a variable was placed in a register at the beginning of some function this same register can be re used later on if the compiler notices that the first variable is no longer used inside that function even though the function is still in lexical scope When trying to examine the variable in avr gdb the displayed result will then look garbled Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 2 Frequently Asked Questions 45 So in order to avoid these side effects optimization can be turned off while debugging However some of these optimizations might also have the side effect of uncovering bugs that would otherwise not be obvious so it must be noted that turning off opti mization can easily change the bug pattern Back to FAQ Index 7 2 12 How do I trace an assembler file in avr gdb When using the g compiler option avr gcc only generates line number and other debug information for C and C files that pass the compiler Functions that don t have line number information will be completely skipped by a single step command in gdb This includes functions linked from a standard library but b
85. ut operands Back to swapping Here is the code to swap high and low byte of a 16 bit value asm volatile mov tmp_reg__ A0O n t mov A0 BO nye mov B0 __tmp_reg__ n t r value 0 value First you will notice the usage of register _tmp_reg__ which we listed among other special registers in the Assembler Code section You can use this register without saving its contents Completely new are those letters A and Bin SAO and B0 In fact they refer to two different 8 bit registers both containing a part of value Another example to swap bytes of a 32 bit value asm volatile mov __tmp_reg__ A0 Ant mov A0 D0 n t mov D0 __tmp_reg__ n t Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 3 Inline Asm 53 mov __tmp_reg__ B0 n t mov BO C0 Anite mov C0 _ tmp_reg__ n t r value 0 value If operands do not fit into a single register the compiler will automatically assign enough registers to hold the entire operand In the assembler code you use A0 to refer to the lowest byte of the first operand A1 to the lowest byte of the second operand and so on The next byte of the first operand will be B0 the next byte C0 and so on This also implies that it is often neccessary to cast the type of an input operand to the desired size A final problem may arise while using pointer register pairs If you define an input operand e
86. y default also functions defined in an assembler source file since the g compiler switch does not apply to the assembler So in order to debug an assembler input file possibly one that has to be passed through the C preprocessor it s the assembler that needs to be told to include line number information into the output file Other debug information like data types and variable allocation cannot be generated since unlike a compiler the assembler basically doesn t know about this This is done using the GNU assembler option gstabs When the assembler is not called directly but through the C compiler frontend either implicitly by passing a source file ending in S or explicitly using x assembler with cpp the compiler frontend needs to be told to pass the gstabs option down to the assembler This is done using Wa gstabs Please take care to only pass this option when compiling an assembler input file Oth erwise the assembler code that results from the C compilation stage will also get line number information which greatly confuses the debugger Also note that the debugger might get confused when entering a piece of code that has a non local label before since it then takes this label as the name of a new function that appears to has been entered Thus the best practice to avoid this confusion is to only use non local labels when declaring a new function and restrict anything else to local labels Local labels consist just of
87. zer in a loop like the following one uint8_t flag while flag 0 the compiler will typically optimize the access to flag completely away since its code path analysis shows that nothing inside the loop could change the value of flag anyway To tell the compiler that this variable could be changed outside the scope of its code path analysis e g from within an interrupt routine the variable needs to be declared like volatile uint8_t flag Back to FAQ Index 7 2 3 I get undefined reference to for functions like sin In order to access the mathematical functions that are declared in lt math h gt the linker needs to be told to also link the mathematical library 1ibm a Typically system libraries like 1ibm a are given to the final C compiler command line that performs the linking step by adding a flag 1m at the end That is the initial Generated on Tue Sep 10 09 24 23 2002 for avr libc by Doxygen 7 2 Frequently Asked Questions 40 lib and the filename suffix from the library are written immediately after a flag So for a libfoo a library 1foo needs to be provided This will make the linker search the library in a path known to the system An alternative would be to specify the full path to the 1ibm a file at the same place on the command line i e after all the object files o However since this re quires knowledge of where the build system will exactly find those library

Download Pdf Manuals

image

Related Search

Related Contents

Origo Arc 256/406/456  Indica che si verificheranno gravi lesioni personali o morte  QUICK GUIDE - MY VOLVO LIBRARY  LE MANUEL DE L`UTILISATEUR  Calendrier Municipal - Ville de Courrières  Xpert HD 7125 Xpert HD 7125 X Xpert HD 7140 Xpert HD 7140 X  User Manual Draco tera Model: 480 Series  Software User Manual  Installation & Operating Instructions  

Copyright © All rights reserved.
Failed to retrieve file