https://www.mikrocontroller.net/api.php?action=feedcontributions&user=Gjlayde&feedformat=atom
Mikrocontroller.net - Benutzerbeiträge [de]
2024-03-28T12:20:28Z
Benutzerbeiträge
MediaWiki 1.38.5
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106690
Avr-gcc Bugs
2024-03-01T09:13:17Z
<p>Gjlayde: /* Fixed */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31321 31321] || Remove PROVIDE from definition of symbol __flmap_init_label<br />
| 2.43<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR31177 31177] || Use __TEXT_REGION_ORIGIN__ as start for MEMORY region text<br />
| 2.42<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR114100 114100] || Better indirect addressing on reduced Tiny<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR113156 113156] || avr build broken: ICE: 'global_options' are modified in local context<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in Flash for Devices with FLMAP<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR113927 113927] || [avr-tiny] Sets up a stack-frame even for trivial code<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || ATA5795 in wrong multilib set<br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR113824 113824] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106638
Avr-gcc Bugs
2024-02-15T13:53:20Z
<p>Gjlayde: /* Fixed */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31321 31321] || Remove PROVIDE from definition of symbol __flmap_init_label<br />
| 2.43<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR31177 31177] || Use __TEXT_REGION_ORIGIN__ as start for MEMORY region text<br />
| 2.42<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR113156 113156] || avr build broken: ICE: 'global_options' are modified in local context<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in Flash for Devices with FLMAP<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR113927 113927] || [avr-tiny] Sets up a stack-frame even for trivial code<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || ATA5795 in wrong multilib set<br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR113824 113824] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106635
Avr-gcc Bugs
2024-02-12T17:11:35Z
<p>Gjlayde: /* Fixed */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31321 31321] || Remove PROVIDE from definition of symbol __flmap_init_label<br />
| 2.43<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR31177 31177] || Use __TEXT_REGION_ORIGIN__ as start for MEMORY region text<br />
| 2.42<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR113156 113156] || avr build broken: ICE: 'global_options' are modified in local context<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in Flash for Devices with FLMAP<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || ATA5795 in wrong multilib set<br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR113824 113824] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106634
Avr-gcc Bugs
2024-02-12T16:43:26Z
<p>Gjlayde: /* Erweiterungen */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31321 31321] || Remove PROVIDE from definition of symbol __flmap_init_label<br />
| 2.43<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR31177 31177] || Use __TEXT_REGION_ORIGIN__ as start for MEMORY region text<br />
| 2.42<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR113156 113156] || avr build broken: ICE: 'global_options' are modified in local context<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in Flash for Devices with FLMAP<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || ATA5795 in wrong multilib set<br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR113824 113824] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106620
Avr-gcc Bugs
2024-02-08T11:58:15Z
<p>Gjlayde: /* Fixed */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31321 31321] || Remove PROVIDE from definition of symbol __flmap_init_label<br />
| 2.43<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR31177 31177] || Use __TEXT_REGION_ORIGIN__ as start for MEMORY region text<br />
| 2.42<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in flash for AVR64* and AVR128* devices<br />
| avr<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR113156 113156] || avr build broken: ICE: 'global_options' are modified in local context<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in Flash for Devices with FLMAP<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || ATA5795 in wrong multilib set<br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR113824 113824] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106601
Avr-gcc Bugs
2024-02-01T17:55:26Z
<p>Gjlayde: /* Binutils / avr-libc */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31321 31321] || Remove PROVIDE from definition of symbol __flmap_init_label<br />
| 2.43<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR31177 31177] || Use __TEXT_REGION_ORIGIN__ as start for MEMORY region text<br />
| 2.42<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in flash for AVR64* and AVR128* devices<br />
| avr<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR113156 113156] || avr build broken: ICE: 'global_options' are modified in local context<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in Flash for Devices with FLMAP<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106588
Avr-gcc Bugs
2024-01-29T15:38:56Z
<p>Gjlayde: /* Binutils / avr-libc */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28 rodata-in-flash<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in flash for AVR64* and AVR128* devices<br />
| avr<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR113156 113156] || avr build broken: ICE: 'global_options' are modified in local context<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in Flash for Devices with FLMAP<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106567
Avr-gcc Bugs
2024-01-18T09:49:38Z
<p>Gjlayde: /* Fixed */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 optimization <br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in flash for AVR64* and AVR128* devices<br />
| avr<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR113156 113156] || avr build broken: ICE: 'global_options' are modified in local context<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in Flash for Devices with FLMAP<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106557
Avr-gcc Bugs
2024-01-16T12:24:52Z
<p>Gjlayde: /* Fixed */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 optimization <br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in flash for AVR64* and AVR128* devices<br />
| avr<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR113156 113156] || avr build broken: ICE: 'global_options' are modified in local context<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106556
Avr-gcc Bugs
2024-01-16T08:23:01Z
<p>Gjlayde: /* Fixed */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 optimization <br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in flash for AVR64* and AVR128* devices<br />
| avr<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106555
Avr-gcc Bugs
2024-01-16T08:21:06Z
<p>Gjlayde: </p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 optimization <br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in flash for AVR64* and AVR128* devices<br />
| avr<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| 13.3, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial&diff=106550
AVR-GCC-Tutorial
2024-01-11T08:57:35Z
<p>Gjlayde: /* Flash mit __flash und Embedded-C */</p>
<hr />
<div>Dieses Tutorial soll den Einstieg in die Programmierung von Atmel [[AVR]]-Mikrocontrollern in der Programmiersprache [[C]] mit dem freien C-Compiler [[avr-gcc]] aus der [http://gcc.gnu.org/ GNU Compiler Collection] (GCC) erleichtern.<br />
<br />
Vorausgesetzt werden Grundkenntnisse der Programmiersprache C. Diese Kenntnisse kann man sich online erarbeiten, z. B. mit dem [http://www.schellong.de/c.htm C Tutorial von Helmut Schellong] ([[C|Liste von C-Tutorials]]). Nicht erforderlich sind Vorkenntnisse in der Programmierung von Mikrocontrollern.<br />
<br />
= Vorwort =<br />
<br />
In diesem Text wird häufig auf die Standardbibliothek avr-libc verwiesen, für die es eine [http://www.nongnu.org/avr-libc/user-manual/index.html Online-Dokumentation] gibt, in der sich auch viele nützliche Informationen zum Compiler und zur Programmierung von AVR-Controllern finden. Beim Paket [[WinAVR]] gehört die avr-libc Dokumentation zum Lieferumfang und wird mitinstalliert.<br />
<br />
Der Compiler und die Standardbibliothek avr-libc werden ständig weiterentwickelt. Einige Unterschiede, die sich im Verlauf der Entwicklung ergeben haben, werden hier und im Artikel [[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen]] zwar angesprochen, Anfängern und Umsteigern sei jedoch empfohlen, eine aktuelle Versionen zu nutzen.<br />
<br />
Das ursprüngliche Tutorial stammt von Christian Schifferle, viele neue Abschnitte und aktuelle Anpassungen von Martin Thomas.<br />
<br />
Dieses Tutorial ist in [[Media:AVR-GCC-Tutorial.pdf|PDF-Form]] erhältlich (zur Zeit nur eine sehr veraltete Version).<br />
<br />
== Weiterführende Kapitel ==<br />
<br />
Um dieses riesige Tutorial etwas überschaubarer zu gestalten, wurden einige Kapitel ausgelagert, die nicht unmittelbar mit den Grundlagen von avr-gcc in Verbindung stehen. All diese Seiten gehören zur [[:Kategorie:avr-gcc Tutorial]].<br />
<br />
;UART: → Hauptartikel: ''[[AVR-GCC-Tutorial/Der UART|Der UART]]''<br />
<br />
;ADC: → Hauptartikel: ''[[AVR-GCC-Tutorial/Analoge Ein- und Ausgabe|Analoge Ein- und Ausgabe (ADC)]]''<br />
<br />
;Timer: → Hauptartikel: ''[[AVR-GCC-Tutorial/Die Timer und Zähler des AVR|Die Timer und Zähler des AVR]]''<br />
<br />
;LCD: → Hauptartikel: ''[[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Ansteuerung]]''<br />
<br />
;Watchdog: → Hauptartikel: ''[[AVR-GCC-Tutorial/Der Watchdog|Der Watchdog]]''<br />
<br />
;Assembler: → Hauptartikel: ''[[AVR-GCC-Tutorial/Assembler und Inline-Assembler|Assembler und Inline-Assembler]]''<br />
<br />
;alte Quellen anpassen: → Hauptartikel: ''[[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen anpassen]]''<br />
<br />
;Makefiles: → Hauptartikel: ''[[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]]'' sowie als Alternative für sehr kleine Projekte → Hauptartikel: ''[[C ohne Makefile]]''<br />
<br />
= Benötigte Werkzeuge =<br />
<br />
Um eigene Programme für AVRs mittels einer AVR-Toolchain zu erstellen wird folgende Hard- und Software benötigt:<br />
<br />
* Eine AVR-Toolchain bestehend aus avr-gcc, den avr-Binutils (Assembler, Linker, etc) und einer Standard-C Bibliothek. Üblich ist die AVR-LibC, die auch quasi in allen avr-gcc Distributionen enthalten ist.<br />
<br />
Hardware wird keine benötigt – bis auf einen PC natürlich, auf dem der Compiler ablaufen kann. Selbst ohne AVR-Hardware kann man also bereits C-Programme für AVRs schreiben, compiliern und sich das Look-and-Feel von avr-gcc sowie von IDEs wie [[Atmel Studio]], Eclipse oder leichtgewichtigeren Entwicklungsumbgebungen anschauen. Selbst das Debuggen und Simulieren ist mithilfe entsprechender Tools wie Debugger und Simulator in gewissen Grenzen möglich.<br />
<br />
Um Programme für AVRs mittels einer AVR-Toolchain zu testen, wird folgende Hard- und Software benötigt:<br />
<br />
* Platine oder Versuchsaufbau für die Aufnahme eines AVR-Controllers, der vom avr-gcc Compiler unterstützt wird.<ref>Für eine Liste der unterstützten COntroller siehe die Dokumentation des Compilers oder [http://www.nongnu.org/avr-libc/user-manual/index.html#supported_devices AVR-Libc: Supported Devices].</ref> Dieses Testboard kann durchaus auch selbst gelötet oder auf einem Steckbrett aufgebaut werden. Einige Registerbeschreibungen dieses Tutorials beziehen sich auf den inzwischen veralteten AT90S2313. Der weitaus größte Teil des Textes ist aber für alle Controller der AVR-Familie gültig. <br />
<br />
:Brauchbare Testplattformen sind auch das [[STK500]] und der [[AVR Butterfly]] von Atmel. Weitere Infos findet man in den Artikeln [[AVR#Starterkits|AVR Starterkits]] und [[AVR-Tutorial: Equipment]].<br />
<br />
* Programmiersoftware und -[[AVR In System Programmer |hardware]] z. B. PonyProg (siehe auch: [[Pony-Prog Tutorial]]) oder [[AVRDUDE]] mit [[STK200]]-Dongle oder die von Atmel verfügbare Hard- und Software ([[STK500]], Atmel AVRISP, [[AVR-Studio]]).<br />
<br />
* Nicht unbedingt erforderlich, aber zur Simulation und zum Debuggen unter MS-Windows recht nützlich: [[AVR-Studio]].<br />
<br />
* Wer unter Windows und Linux gleichermassen entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] ansehen. Beide sind unter Windows und Linux einfach zu installieren, siehe auch [[AVR Eclipse]]. Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks]<ref>Aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar.</ref>. Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins "AVR-Projekte" angelegt werden. Für Linux gibt es auch noch das [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=25220 KontrollerLab].<br />
<br />
= Was tun, wenn's nicht klappt? =<br />
<br />
* Herausfinden, ob es tatsächlich ein avr(-gcc) spezifisches Problem ist oder nur die eigenen C-Kenntnisse einer Auffrischung bedürfen. Allgemeine C-Fragen kann man eventuell "beim freundlichen Programmierer zwei Büro-, Zimmer- oder Haustüren weiter" loswerden. Ansonsten: [[C]]-Buch (gibt's auch "gratis" online) lesen.<br />
<br />
* Die [[AVR Checkliste]] durcharbeiten.<br />
<br />
* Die '''[http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc]''' lesen, vor allem (aber nicht nur) den Abschnitt Related Pages/'''Frequently Asked Questions''' = Oft gestellte Fragen (und Antworten dazu). Z.Zt leider nur in englischer Sprache verfügbar.<br />
<br />
* Den Artikel [[AVR-GCC]] in diesem Wiki lesen.<br />
<br />
* Das [http://www.mikrocontroller.net/forum/gcc GCC-Forum auf www.mikrocontroller.net] nach vergleichbaren Problemen absuchen.<br />
<br />
* Das avr-gcc-Forum bei [http://www.avrfreaks.net AVRfreaks] nach vergleichbaren Problemen absuchen.<br />
<br />
* Das [http://lists.gnu.org/archive/html/avr-gcc-list/ Archiv der avr-gcc Mailing-Liste] nach vergleichbaren Problemen absuchen.<br />
<br />
* Nach Beispielcode suchen. Vor allem im ''Projects''-Bereich von [http://www.avrfreaks.net AVRfreaks] (anmelden).<br />
<br />
* Google oder yahoo befragen schadet nie.<br />
<br />
* Bei Problemen mit der Ansteuerung interner AVR-Funktionen mit C-Code: das Datenblatt des Controllers lesen (ganz und am Besten zweimal). Datenblätter sind auf den [http://www.atmel.com Atmel Webseiten] als pdf-Dateien verfügbar. Das komplette Datenblatt (complete) und nicht die Kurzfassung (summary) verwenden.<br />
<br />
* Die Beispielprogramme im [[AVR-Tutorial]] sind zwar in AVR-Assembler verfasst, Erläuterungen und Vorgehensweisen sind aber auch auf C-Programme übertragbar.<br />
<br />
* Einen Beitrag in eines der Foren oder eine Mail an die Mailing-Liste schreiben. Dabei möglichst viel Information geben: Controller, Compilerversion, genutzte Bibliotheken, Ausschnitte aus dem Quellcode oder besser ein [http://www.mikrocontroller.net/topic/72767#598986 Testprojekt] mit allen notwendigen Dateien, um das Problem nachzuvollziehen, sowie genaue Fehlermeldungen bzw. Beschreibung des Fehlverhaltens. Bei Ansteuerung externer Geräte die Beschaltung beschreiben oder skizzieren (z. B. mit [http://www.tech-chat.de/ Andys ASCII Circuit]). Siehe dazu auch: '''[http://www.tty1.net/smart-questions_de.html "Wie man Fragen richtig stellt"]'''.<br />
<br />
= Erzeugen von Maschinencode =<br />
<br />
Aus dem C-Quellcode erzeugt der avr-gcc Compiler (zusammen mit Hilfsprogrammen wie z.&nbsp;B. Präprozessor, Assembler und Linker) Maschinencode für den AVR-Controller. Üblicherweise liegt dieser Code dann im Intel Hex-Format vor ("Hex-Datei"). Die Programmiersoftware (z.&nbsp;B. [[AVRDUDE]], PonyProg oder AVRStudio/STK500-plugin) liest diese Datei ein und überträgt die enthaltene Information (den Maschinencode) in den Speicher des Controllers. Im Prinzip sind also "nur" der avr-gcc-Compiler (und wenige Hilfsprogramme) mit den "richtigen" Optionen aufzurufen, um aus C-Code eine "Hex-Datei" zu erzeugen. Grundsätzlich stehen dazu drei verschiedene Ansätze zur Verfügung:<br />
<br />
* Die Verwendung einer integrierten Entwicklungsumgebung (IDE = '''I'''ntegrated '''D'''evelopment '''E'''nvironment), bei der alle Einstellungen z.&nbsp;B. in Dialogboxen durchgeführt werden können. Unter Anderem kann AVRStudio ab Version 4.12 (kostenlos auf [http://www.atmel.com/ atmel.com]) zusammen mit WinAVR als integrierte Entwicklungsumgebung für den Compiler avr-gcc genutzt werden (dazu müssen AVRStudio und WinAVR auf dem Rechner installiert sein). Weitere IDEs (ohne Anspruch auf Vollständigkeit): [http://www.eclipse.org/ Eclipse for C/C++ Developers] (d.h. inkl. CDT) und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] (für diverse Plattformen, u.a. Linux und MS Windows, IDE und Plugin kostenlos), [http://sourceforge.net/projects/kontrollerlab KontrollerLab] (Linux/KDE, kostenlos). [http://www.atmanecl.com/EnglishSite/SoftwareEnglish.htm AtmanAvr] (MS Windows, relativ günstig), KamAVR (MS-Windows, kostenlos, wird augenscheinlich nicht mehr weiterentwickelt), [http://www.amctools.com/vmlab.htm VMLab] (MS Windows, ab Version 3.12 ebenfalls kostenlos). Integrierte Entwicklungsumgebungen unterscheiden sich stark in Ihrer Bedienung und stehen auch nicht für alle Plattformen zur Verfügung, auf denen der Compiler ausführbar ist (z.&nbsp;B. AVRStudio nur für MS-Windows). Zur Anwendung des avr-gcc Compilers mit IDEs sei hier auf deren Dokumentation verwiesen. <br />
<br />
* Die Nutzung des Programms make mit passenden Makefiles. In den folgenden Abschnitten wird die Generierung von Maschinencode für einen AVR ("hex-Datei") aus C-Quellcode ("c-Dateien") anhand von "make" und den "Makefiles" näher erläutert. Viele der darin beschriebenen Optionen findet man auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio (AVRStudio generiert ein makefile in einem Unterverzeichnis des Projektverzeichnisses). <br />
<br />
* Das Generieren des Programms ohne IDE und ohne Makefile. In diesem Fall muss die Quellcodedatei durch eine vorgefertigte Kommandofolge an den Compiler übergeben werden. Der Artikel [[C ohne Makefile]] zeigt, wie das funktioniert. Diese Vorgehensweise empfiehlt sich jedoch nur für kleine Programme, die nicht auf verschiedene Quellcodedateien verteilt sind.<br />
<br />
Beim Wechsel vom makefile-Ansatz nach WinAVR-Vorlage zu AVRStudio ist darauf zu achten, dass AVRStudio (Stand: AVRStudio Version 4.13) bei einem neuen Projekt die Optimierungsoption (vgl. Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|AVR-GCC-Tutorial/Exkurs: Makefiles]], typisch: -Os) nicht einstellt und die mathematische Bibliothek der avr-libc (libm.a, Linker-Option -lm) nicht einbindet. (Hinweis: Bei Version 4.16 wird beides bereits gesetzt). Beides ist Standard bei Verwendung von makefiles nach WinAVR-Vorlage und sollte daher auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio "manuell" eingestellt werden, um auch mit AVRStudio kompakten Code zu erzeugen.<br />
<br />
= Einführungsbeispiel =<br />
<br />
Zum Einstieg ein kleines Beispiel, an dem die Nutzung des Compilers und der Hilfsprogramme (der sogenannten ''Toolchain'') demonstriert wird. Detaillierte Erläuterungen folgen in den weiteren Abschnitten dieses Tutorials.<br />
<br />
Das Programm soll auf einem AVR Mikrocontroller einige Ausgänge ein- und andere ausschalten. Das Beispiel ist für einen ATmega16 programmiert ([http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf Datenblatt]), kann aber sinngemäß für andere Controller der AVR-Familie modifiziert werden. <br />
<br />
Ein kurzes Wort zur Hardware: Bei diesem Programm werden alle Pins von PORTB auf Ausgang gesetzt, und einige davon werden auf HIGH andere auf LOW gesetzt. Das kann je nach angeschlossener Hardware an diesen Pins kritisch sein. Am ungefährlichsten ist es, wenn nichts an den Pins angeschlossen ist und man die Funktion des Programmes durch eine Spannungsmessung mit einem Multimeter kontrolliert. Die Spannung wird dabei zwischen GND-Pin und den einzelnen Pins von PORTB gemessen.<br />
<br />
Zunächst der Quellcode der Anwendung, der in einer Text-Datei mit dem Namen ''main.c'' abgespeichert wird.<br />
<br />
<syntaxhighlight lang="c"><br />
/* Alle Zeichen zwischen Schrägstrich-Stern <br />
und Stern-Schrägstrich sind Kommentare */<br />
<br />
// Zeilenkommentare sind ebenfalls möglich<br />
// alle auf die beiden Schrägstriche folgenden<br />
// Zeichen einer Zeile sind Kommentar<br />
<br />
#include <avr/io.h> // (1)<br />
<br />
int main (void) { // (2)<br />
<br />
DDRB = 0xFF; // (3)<br />
PORTB = 0x03; // (4)<br />
<br />
while(1) { // (5)<br />
/* "leere" Schleife*/ // (6)<br />
} // (7)<br />
<br />
/* wird nie erreicht */<br />
return 0; // (8)<br />
}<br />
</syntaxhighlight><br />
<br />
# In dieser Zeile wird eine sogenannte Header-Datei eingebunden. In <code>avr/io.h</code> sind die Registernamen definiert, die im späteren Verlauf genutzt werden. Auch unter Windows wird ein&nbsp;<code>/</code> zur Kennzeichnung von Unterverzeichnissen in Include-Dateinamen verwendet und kein&nbsp;<code>\</code>.<br />
# Hier beginnt das eigentliche Programm. Jedes C-Programm beginnt mit den Anweisungen in der Funktion <code>main</code>.<br />
# Die Anschlüsse eines AVR (Pins) werden zu Blöcken zusammengefasst, einen solchen Block bezeichnet man als Port. Beim ATmega16 hat jeder Port 8 Anschlüsse, bei kleineren AVRs können einem Port auch weniger als 8 Anschlüsse zugeordnet sein. Da per Definition (Datenblatt) alle gesetzten Bits in einem Datenrichtungsregister den entsprechenden Anschluss auf Ausgang schalten, werden mit DDRB=0xff alle Anschlüsse des Ports B als Ausgänge eingestellt.<br />
# Die den ersten beiden Bits des Ports zugeordneten Anschlüsse (PB0 und PB1) werden 1, alle anderen Anschlüsse des Ports B (PB2-PB7) zu 0. Aktivierte Ausgänge (logisch 1 oder "high") liegen auf Betriebsspannung (VCC, meist 5 Volt), nicht aktivierte Ausgänge führen 0 Volt (GND, Bezugspotential). Es ist sinnvoll, sich möglichst frühzeitig eine alternative Schreibweise beizubringen, die wegen der leichteren Überprüfbarkeit und Portierbarkeit oft im weiteren Tutorial und in Forenbeiträgen benutzt wird. Die Zuordnung sieht in diesem Fall so aus, Näheres dazu im Artikel [[Bitmanipulation]]:<syntaxhighlight lang="c">PORTB = (1<<PB1) | (1<<PB0);</syntaxhighlight><br />
# ist der Beginn der sogenannte ''Hauptschleife'' (main-loop). Dies ist eine Endlosschleife, welche kontinuierlich wiederkehrende Befehle enthält.<br />
# In diesem Beispiel ist die Hauptschleife leer. Der Controller durchläuft die Schleife immer wieder, ohne dass etwas passiert. Eine solche Schleife ist notwendig, da es auf dem Controller kein Betriebssystem gibt, das nach Beendigung des Programmes die Kontrolle übernehmen könnte. Ohne diese Schleife kehrt das Programm aus <code>main</code> zurück, alle Interrupts werden deaktiviert und eine Endlosschleife betreten.<br />
# Ende der Hauptschleife und Sprung zur passenden, öffnenden Klammer, also zu 5.<br />
# ist das Programmende. Die Zeile ist nur aus Gründen der C-Kompatibilität enthalten: <syntaxhighlight lang="c">int main(void)</syntaxhighlight> besagt, dass die Funktion einen int-Wert zurückgibt. Die Anweisung wird aber nicht erreicht, da das Programm die Hauptschleife nie verlässt.<br />
<br />
Um diesen Quellcode in ein lauffähiges Programm zu übersetzen, wird hier ein Makefile genutzt. Das verwendete Makefile findet sich auf der Seite [[Beispiel Makefile]] und basiert auf der Vorlage, die in WinAVR mitgeliefert wird und wurde bereits angepasst (Controllertyp ATmega16). Man kann das Makefile bearbeiten und an andere Controller anpassen oder sich mit dem Programm MFile menügesteuert ein Makefile "zusammenklicken". Das Makefile speichert man unter dem Namen <code>Makefile</code> (ohne Endung) im selben Verzeichnis, in dem auch die Datei <code>main.c</code> mit dem Programmcode abgelegt ist. Detailliertere Erklärungen zur Funktion von Makefiles finden sich im Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|Exkurs: Makefiles]].<br />
<br />
<pre><br />
D:\beispiel>dir<br />
<br />
Verzeichnis von D:\beispiel<br />
<br />
28.11.2006 22:53 <DIR> .<br />
28.11.2006 22:53 <DIR> ..<br />
28.11.2006 20:06 118 main.c<br />
28.11.2006 20:03 16.810 Makefile<br />
2 Datei(en) 16.928 Bytes<br />
</pre><br />
<br />
Nun gibt man ''make all'' ein. Falls das mit WinAVR installierte Programmers Notepad genutzt wird, gibt es dazu einen Menüpunkt im Tools Menü. Sind alle Einstellungen korrekt, entsteht eine Datei <code>main.hex</code>, in welcher der Code für den AVR enthalten ist. <br />
<pre><br />
D:\beispiel>make all<br />
<br />
-------- begin --------<br />
avr-gcc (GCC) 3.4.6<br />
Copyright (C) 2006 Free Software Foundation, Inc.<br />
This is free software; see the source for copying conditions. There is NO<br />
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.<br />
<br />
Compiling C: main.c<br />
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -f<br />
unsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef<br />
-Wa,-adhlns=obj/main.lst -std=gnu99 -Wundef -MD -MP -MF .dep/main.o.d main.c -<br />
o obj/main.o<br />
<br />
Linking: main.elf<br />
avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funs<br />
igned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -W<br />
a,-adhlns=obj/main.o -std=gnu99 -Wundef -MD -MP -MF .dep/main.elf.d obj/main.o<br />
--output main.elf -Wl,-Map=main.map,--cref -lm<br />
<br />
Creating load file for Flash: main.hex<br />
avr-objcopy -O ihex -R .eeprom main.elf main.hex<br />
</pre><br />
<br />
Der Inhalt der hex-Datei kann nun zum Controller übertragen werden. Dies kann z.&nbsp;B. über In-System-Programming ([[ISP]]) erfolgen, das im [[AVR-Tutorial: Equipment]] beschrieben ist. Makefiles nach der WinAVR/MFile-Vorlage sind für die Nutzung des Programms [[AVRDUDE]] vorbereitet. Wenn man den Typ und Anschluss des Programmiergerätes richtig eingestellt hat, kann mit ''make program'' die Übertragung mittels AVRDUDE gestartet werden. Jede andere Software, die hex-Dateien lesen und zu einem AVR übertragen kann<ref>z.&nbsp;B. [[Pony-Prog_Tutorial|Ponyprog]], yapp, AVRStudio</ref>, kann natürlich ebenfalls genutzt werden.<br />
<br />
Startet man nun den Controller (Reset-Taster oder Stromzufuhr aus/an), werden vom Programm die Anschlüsse PB0 und PB1 auf 1 gesetzt. Man kann mit einem Messgerät nun an diesem Anschluss die Betriebsspannung messen oder eine [[LED]] leuchten lassen (Anode an den Pin, Vorwiderstand nicht vergessen). An den Anschlüssen PB2-PB7 misst man 0 Volt. Eine mit der Anode mit einem dieser Anschlüsse verbundene LED leuchtet nicht.<br />
<br />
= Ganzzahlige Datentypen (Integer) =<br />
<br />
Bei der Programmierung von Mikrokontrollern ist die Definition einiger ganzzahliger Datentypen sinnvoll, an denen eindeutig die Bit-Länge abgelesen werden kann.<br />
<br />
Standardisierte Datentypen werden in der Header-Datei <code>stdint.h</code> definiert, die folgendermaßen eingebunden werden kann:<br />
<syntaxhighlight lang="c">#include <stdint.h></syntaxhighlight><br />
<br />
{| {{Tabelle}}<br />
|+ '''int-Typen aus <code>stdint.h</code> (C99)'''<br/>&nbsp;<br />
|- bgcolor="#d0d0ff"<br />
!colspan="5"| Vorzeichenbehaftete int-Typen<br />
|- bgcolor="#e8e8ff"<br />
! Typname || Bit-Breite ||colspan="2"| Wertebereich<br />
|align="center| '''C-Entsprechung''' (avr-gcc)<br />
|-<br />
|<code>int8_t</code> ||align="right"| 8 || −128 ⋯ 127 || −2<sup>7</sup> ⋯ 2<sup>7</sup>−1 || <code>signed char</code><br />
|-<br />
|<code>int16_t</code> ||align="right"| 16 || −32768 ⋯ 32767 || −2<sup>15</sup> ⋯ 2<sup>15</sup>−1 || <code>signed short</code>, <code>signed int</code><br />
|-<br />
|<code>int32_t</code> ||align="right"| 32 || −2147483648 ⋯ 2147483647 || −2<sup>31</sup> ⋯ 2<sup>31</sup>−1 || <code>signed long</code><br />
|-<br />
|<code>int64_t</code> ||align="right"| 64 || −9223372036854775808 ⋯ 9223372036854775807 || −2<sup>63</sup> ⋯ 2<sup>63</sup>−1 || <code>signed long long</code><br />
|- bgcolor="#d0d0ff"<br />
!colspan="5"| Vorzeichenlose int-Typen<br />
|- bgcolor="#e8e8ff"<br />
! Typname || Bit-Breite ||colspan="2"| Wertebereich<br />
|align="center| '''C-Entsprechung''' (avr-gcc)<br />
|-<br />
|<code>uint8_t</code> ||align="right"| 8 || 0 ⋯ 255 || 0 ⋯ 2<sup>8</sup>−1 || <code>unsigned char</code><br />
|-<br />
|<code>uint16_t</code> ||align="right"| 16 || 0 ⋯ 65535 || 0 ⋯ 2<sup>16</sup>−1 || <code>unsigned short</code>, <code>unsigned int</code><br />
|-<br />
|<code>uint32_t</code> ||align="right"| 32 || 0 ⋯ 4294967295 || 0 ⋯ 2<sup>32</sup>−1 || <code>unsigned long</code><br />
|-<br />
|<code>uint64_t</code> ||align="right"| 64 || 0 ⋯ 18446744073709551615 || 0 ⋯ 2<sup>64</sup>−1 || <code>unsigned long long</code><br />
|}<br />
<br />
Neben den Typen gibt es auch Makros für die Bereichsgrenzen wie <code>INT8_MIN</code> oder <code>UINT16_MAX</code>. Siehe dazu auch: [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdint.html Dokumentation der avr-libc: Standard Integer Types].<br />
<br />
= Grundsätzlicher Programmaufbau eines µC-Programms =<br />
<br />
Wir unterscheiden zwischen 2 verschiedenen Methoden, um ein<br />
Mikrocontroller-Programm zu schreiben, und zwar völlig unabhängig davon, in<br />
welcher Programmiersprache das Programm geschrieben wird.<br />
<br />
== Sequentieller Programmablauf ==<br />
<br />
[[Image:Sequentielle Programme.gif|left]]<br />
Bei dieser Programmiertechnik wird eine Endlosschleife programmiert, welche im<br />
Wesentlichen immer den gleichen Aufbau hat. Es wird hier nach dem sogenannten EVA-Prinzip gehandelt. EVA steht für "Eingabe, Verarbeitung, Ausgabe".<br />
{{Absatz}}<br />
<br />
== Interruptgesteuerter Programmablauf ==<br />
<br />
[[Image:Interrupt Programme.gif|left]]<br />
Bei dieser Methode werden beim Programmstart zuerst die gewünschten Interruptquellen aktiviert und dann in eine Endlosschleife gegangen, in welcher Dinge erledigt werden können, welche nicht zeitkritisch sind. Wenn ein Interrupt ausgelöst wird, so wird automatisch die zugeordnete Interruptfunktion ausgeführt.<br />
{{Absatz}}<br />
<br />
= Zugriff auf Register =<br />
<br />
Die AVR-Controller verfügen über eine Vielzahl von Registern. Die meisten<br />
davon sind sogenannte Schreib-/Leseregister. Das heißt, das Programm kann die<br />
Inhalte der Register sowohl auslesen als auch beschreiben.<br />
<br />
Register haben einen besonderen Stellenwert bei den AVR Controllern. Sie dienen dem Zugriff auf die Ports und die Schnittstellen des Controllers. Wir unterscheiden zwischen 8-Bit und 16-Bit Registern. Vorerst behandeln wir die 8-Bit Register.<br />
<br />
Einzelne Register sind bei allen AVRs vorhanden, andere wiederum nur bei bestimmten Typen. So sind beispielsweise die Register, welche für den Zugriff auf den UART notwendig sind, selbstverständlich nur bei denjenigen Modellen vorhanden, welche über einen integrierten Hardware UART bzw. USART verfügen.<br />
<br />
Die Namen der Register sind in den Headerdateien zu den entsprechenden AVR-Typen definiert. Dazu muss man den Namen der controllerspezifischen Headerdatei nicht kennen. Es reicht aus, die allgemeine Headerdatei ''avr/io.h'' einzubinden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
</syntaxhighlight><br />
<br />
Ist im Makefile der MCU-Typ z.&nbsp;B. mit dem Inhalt atmega8 definiert (und wird somit per -mmcu=atmega8 an den Compiler übergeben), wird beim Einlesen der io.h-Datei implizit ("automatisch") auch die iom8.h-Datei mit den Register-Definitionen für den ATmega8 eingelesen.<br />
<br />
<!-- Wohl besser als Anhang - spaeter... --><br />
Intern wird diese "Automatik" wie folgt realisiert: Der Controllertyp wird dem Compiler als Parameter übergeben (vgl. ''avr-gcc -c -mmcu=atmega16 [...]'' im Einführungsbeispiel). Wird ein Makefile nach der WinAVR/mfile-Vorlage verwendet, setzt man die Variable ''MCU'', der Inhalt dieser Variable wird dann an passender Stelle für die Compilerparameter verwendet. Der Compiler definiert intern eine dem mmcu-Parameter zugeordnete "Variable" (genauer: ein Makro) mit dem Namen des Controllers, vorangestelltem ''__AVR_'' und angehängten Unterstrichen (z.&nbsp;B. wird bei ''-mmcu=atmega16'' das Makro ''__AVR_ATmega16__'' definiert). Beim Einbinden der Header-Datei ''avr/io.h'' wird geprüft, ob das jeweilige Makro definiert ist und die zum Controller passende Definitionsdatei eingelesen. Zur Veranschaulichung einige Ausschnitte aus einem Makefile:<br />
<br />
<pre><br />
[...]<br />
# MCU Type ("name") setzen:<br />
MCU = atmega16<br />
[...]<br />
<br />
[...]<br />
## Verwendung des Inhalts von MCU (hier atmega16) fuer die <br />
## Compiler- und Assembler-Parameter<br />
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)<br />
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)<br />
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)<br />
[...]<br />
<br />
[...]<br />
## Aufruf des Compilers:<br />
## mit den Parametern ($(ALL_CFLAGS) ist -mmcu=$(MCU)[...] = -mmcu=atmega16[...]<br />
$(OBJDIR)/%.o : %.c<br />
@echo<br />
@echo $(MSG_COMPILING) $<<br />
$(CC) -c $(ALL_CFLAGS) $< -o $@ <br />
[...]<br />
</pre><br />
<br />
Da --mmcu=atmega16 übergeben wurde, wird __AVR_ATmega16__ definiert und kann in avr/io.h zur Fallunterscheidung genutzt werden:<br />
<br />
<syntaxhighlight lang="c"><br />
// avr/io.h <br />
// (bei WinAVR-Standardinstallation in C:\WinAVR\avr\include\avr)<br />
[...]<br />
#if defined (__AVR_AT94K__)<br />
# include <avr/ioat94k.h><br />
// [...]<br />
#elif defined (__AVR_ATmega16__)<br />
// da __AVR_ATmega16__ definiert ist, wird avr/iom16.h eingebunden:<br />
# include <avr/iom16.h><br />
// [...]<br />
#else<br />
# if !defined(__COMPILING_AVR_LIBC__)<br />
# warning "device type not defined"<br />
# endif<br />
#endif<br />
</syntaxhighlight><br />
<br />
Die Beispiele in den folgenden Abschnitten demonstrieren den Zugriff auf Register anhand der Register für I/O-Ports (PORTx, DDRx, PINx), die Vorgehensweise ist jedoch für alle Register (z.&nbsp;B. die des UART, ADC, SPI) analog.<br />
<br />
== Schreiben in Register ==<br />
<br />
Zum Schreiben kann man Register einfach wie eine Variable setzen.<ref>In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Schreibzugriff über die Funktion outp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt, outp() ist nicht mehr erforderlich.</ref><br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
int main()<br />
{<br />
/* Setzt das Richtungsregister des Ports A auf 0xff <br />
(alle Pins als Ausgang, vgl. Abschnitt Zugriff auf Ports): */<br />
DDRA = 0xff; <br />
<br />
/* Setzt PortA auf 0x03, Bit 0 und 1 "high", restliche "low": */<br />
PORTA = 0x03; <br />
<br />
// Setzen der Bits 0,1,2,3 und 4<br />
// Binär 00011111 = Hexadezimal 1F<br />
DDRB = 0x1F; /* direkte Zuweisung - unübersichtlich */<br />
<br />
/* Ausführliche Schreibweise: identische Funktionalität, mehr Tipparbeit<br />
aber übersichtlicher und selbsterklärend: */<br />
DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4);<br />
<br />
while (1);<br />
}<br />
</syntaxhighlight><br />
<br />
Die ausführliche Schreibweise sollte bevorzugt verwendet werden, da dadurch die Zuweisungen selbsterklärend sind und somit der Code leichter nachvollzogen werden kann. Atmel verwendet sie auch bei Beispielen in Datenblätten und in den allermeisten Quellcodes zu Application-Notes. Mehr zu der Schreibweise mit "|" und "<<" findet man unter [[Bitmanipulation]].<br />
<br />
Der gcc C-Compiler unterstützt ab Version 4.3.0 Konstanten im Binärformat, z.&nbsp;B. DDRB&nbsp;=&nbsp;0b00011111. Diese Schreibweise ist jedoch nur in GNU-C verfügbar und nicht in ISO-C definiert. Man sollte sie daher nicht verwenden, wenn Code mit anderen ausgetauscht oder mit anderen Compilern bzw. älteren Versionen des gcc genutzt werden soll.<br />
<br />
== Verändern von Registerinhalten ==<br />
<br />
Einzelne Bits setzt und löscht man "Standard-C-konform" mittels logischer (Bit-) Operationen. <br />
<br />
<syntaxhighlight lang="c"><br />
x |= (1 << Bitnummer); // Hiermit wird ein Bit in x gesetzt<br />
x &= ~(1 << Bitnummer); // Hiermit wird ein Bit in x geloescht<br />
</syntaxhighlight><br />
<br />
Es wird jeweils nur der Zustand des angegebenen Bits geändert, der vorherige Zustand der anderen Bits bleibt erhalten. <br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
#define MEINBIT 2<br />
...<br />
PORTA |= (1 << MEINBIT); /* setzt Bit 2 an PortA auf 1 */<br />
PORTA &= ~(1 << MEINBIT); /* loescht Bit 2 an PortA */<br />
</syntaxhighlight><br />
<br />
Mit dieser Methode lassen sich auch mehrere Bits eines Registers gleichzeitig setzen und löschen.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
DDRA &= ~( (1<<PA0) | (1<<PA3) ); /* PA0 und PA3 als Eingaenge */<br />
PORTA |= ( (1<<PA0) | (1<<PA3) ); /* Interne Pull-Up fuer beide einschalten */<br />
</syntaxhighlight><br />
<br />
Bei bestimmten AVR Registern mit Bits, die durch Beschreiben mit einer logischen 1 gelöscht werden, muss eine absolute Zuweisung benutzt werden. Ein ODER löscht in diesen Registern ALLE gesetzten Bits!<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
TIFR2 = (1<<OCF2A); // Nur Bit OCF2A löschen<br />
</syntaxhighlight><br />
<br />
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind nicht mehr erforderlich.<br />
<br />
Siehe auch:<br />
* [[Bitmanipulation]]<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers<br />
<br />
== Lesen aus Registern ==<br />
<br />
Zum Lesen kann man auf Register einfach wie auf eine Variable zugreifen. In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Lesezugriff über die Funktion inp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt und inp() ist nicht mehr erforderlich.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdint.h><br />
<br />
uint8_t foo;<br />
<br />
//...<br />
<br />
int main(void)<br />
{<br />
/* kopiert den Status der Eingabepins an PortB <br />
in die Variable foo: */<br />
foo = PINB; <br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Die Abfrage der Zustände von Bits erfolgt durch Einlesen des gesamten Registerinhalts und ausblenden der Bits deren Zustand nicht von Interesse ist. Einige Beispiele zum Prüfen ob Bits gesetzt oder gelöscht sind:<br />
<br />
<syntaxhighlight lang="c"><br />
#define MEINBIT0 0 <br />
#define MEINBIT2 2<br />
<br />
uint8_t i;<br />
<br />
extern test1();<br />
<br />
// Funkion test1 aufrufen, wenn Bit 0 in Register PINA gesetzt (1) ist<br />
i = PINA; // Inhalt in Arbeitsvariable<br />
i = i & 0x01; // alle Bits bis auf Bit 0 ausblenden (bitweise und)<br />
// falls das Bit gesetzt war, hat i den Inhalt 1<br />
if ( i != 0 ) { // Ergebnis ungleich 0 (wahr)? <br />
test1(); // dann muss Bit 0 in i gesetzt sein -> Funktion aufrufen<br />
}<br />
// verkürzt:<br />
if ( ( PINA & 0x01 ) != 0 ) {<br />
test1();<br />
}<br />
// nochmals verkürzt:<br />
if ( PINA & 0x01 ) {<br />
test1();<br />
}<br />
// mit definierter Bitnummer:<br />
if ( PINA & ( 1 << MEINBIT0 ) ) {<br />
test1();<br />
}<br />
<br />
// Funktion aufrufen, wenn Bit 0 und/oder Bit 2 gesetzt ist. (Bit 0 und 2 also Wert 5) <br />
// (Bedenke: Bit 0 hat Wert 1, Bit 1 hat Wert 2 und Bit 2 hat Wert 4)<br />
if ( PINA & 0x05 ) {<br />
test1(); // Vergleich <> 0 (wahr), also mindestens eines der Bits gesetzt<br />
}<br />
// mit definierten Bitnummern:<br />
if ( PINA & ( ( 1 << MEINBIT0 ) | ( 1 << MEINBIT2 ) ) ) {<br />
test1();<br />
}<br />
<br />
// Funktion aufrufen, wenn Bit 0 und Bit 2 gesetzt sind<br />
if ( ( PINA & 0x05 ) == 0x05 ) { // nur wahr, wenn beide Bits gesetzt<br />
test1();<br />
}<br />
<br />
// Funktion test2() aufrufen, wenn Bit 0 gelöscht (0) ist<br />
i = PINA; // einlesen in temporäre Variable<br />
i = i & 0x01; // maskieren von Bit 0<br />
if ( i == 0 ) { // Vergleich ist wahr, wenn Bit 0 nicht gesetzt ist<br />
test2();<br />
}<br />
// analog mit not-Operator<br />
if ( !i ) {<br />
test2();<br />
}<br />
// nochmals verkürzt:<br />
if ( !( PINA & 0x01 ) ) {<br />
test2();<br />
}<br />
</syntaxhighlight><br />
<br />
== Warten auf einen bestimmten Zustand ==<br />
<br />
Es gibt in der Bibliothek avr-libc Funktionen, die warten, bis ein bestimmter Zustand eines Bits erreicht ist. Es ist allerdings normalerweise eine eher unschöne Programmiertechnik, da in diesen Funktionen "blockierend" gewartet wird. Der Programmablauf bleibt also an dieser Stelle stehen, bis das maskierte Ereignis erfolgt ist. Setzt man den [[Watchdog]] ein, muss man darauf achten, dass dieser auch noch getriggert wird (Zurücksetzen des Watchdogtimers). <br />
<br />
Die Funktion '''loop_until_bit_is_set''' wartet in einer Schleife, bis das definierte Bit gesetzt ist. Wenn das Bit beim Aufruf der Funktion bereits gesetzt ist, wird die Funktion sofort wieder verlassen. Das niederwertigste Bit hat die Bitnummer 0. <br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
<br />
/* Warten bis Bit Nr. 2 (das dritte Bit) in Register PINA gesetzt (1) ist */<br />
<br />
#define WARTEPIN PINA<br />
#define WARTEBIT PA2<br />
<br />
// mit der avr-libc Funktion:<br />
loop_until_bit_is_set(WARTEPIN, WARTEBIT);<br />
<br />
// dito in "C-Standard":<br />
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN<br />
// _nicht_ ungleich 0 (also 0) ist.<br />
while ( !(WARTEPIN & (1 << WARTEBIT)) ) {}<br />
...<br />
</syntaxhighlight><br />
<br />
<br />
Die Funktion '''loop_until_bit_is_clear''' wartet in einer Schleife, bis das definierte Bit gelöscht ist. Wenn das Bit beim Aufruf der Funktion bereits gelöscht ist, wird die Funktion sofort wieder verlassen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
<br />
/* Warten bis Bit Nr. 4 (das fuenfte Bit) in Register PINB geloescht (0) ist */<br />
#define WARTEPIN PINB<br />
#define WARTEBIT PB4<br />
<br />
// avr-libc-Funktion:<br />
loop_until_bit_is_clear(WARTEPIN, WARTEBIT);<br />
<br />
// dito in "C-Standard":<br />
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN<br />
// gesetzt (1) ist <br />
while ( WARTEPIN & (1<<WARTEBIT) ) {}<br />
...<br />
</syntaxhighlight><br />
<br />
Universeller und auch auf andere Plattformen besser übertragbar ist die Verwendung von C-Standardoperationen.<br />
<br />
Siehe auch: <br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers<br />
* [[Bitmanipulation]]<br />
<br />
== 16-Bit Register (ADC, ICR1, OCR1x, TCNT1, UBRR) ==<br />
<br />
Einige der Portregister in den AVR-Controllern sind 16 Bit breit. Im Datenblatt sind diese Register üblicherweise mit dem Suffix "L" (Low-Byte) und "H" (High-Byte) versehen. Die avr-libc definiert zusätzlich die meisten dieser Variablen die Bezeichnung ohne "L" oder "H". Auf diese Register kann dann direkt zugegriffen werden. Dies ist zum Beispiel der Fall für Register wie ADC oder TCNT1.<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
uint16_t foo;<br />
<br />
/* setzt die Wort-Variable foo auf den Wert der letzten AD-Wandlung */<br />
foo = ADC; <br />
</syntaxhighlight><br />
<br />
Bei anderen Registern, wie zum Beispiel Baudraten-Register, liegen High- und Low-Teil nicht direkt nebeneinander im SFR-Bereich, so dass ein 16-Bit Zugriff nicht möglich ist und der Zugriff zusammengebastelt werden muss:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
#ifndef F_CPU<br />
#define F_CPU 3686400<br />
#endif<br />
#define UART_BAUD_RATE 9600<br />
<br />
...<br />
uint16_t baud = F_CPU / (UART_BAUD_RATE * 16L) -1;<br />
<br />
UBRRH = (uint8_t) (baud >> 8);<br />
UBRRL = (uint8_t) baud;<br />
...<br />
</syntaxhighlight><br />
<br />
Bei einigen AVR-Typen wie ATmega8 oder ATmega16 teilen sich UBRRH und UCSRC die gleiche Speicher-Adresse. Damit der AVR trotzdem zwischen den beiden Registern unterscheiden kann, bestimmt das Bit7 (URSEL), welches Register tatsächlich beschrieben werden soll. ''1000 0011'' (0x83) adressiert demnach UCSRC und übergibt den Wert ''3''. Und ''0000 0011'' (0x3) adressiert UBRRH und übergibt ebenfalls den Wert ''3''. <br />
<br />
Speziell bei den 16-Bit-Timern und auch beim ADC ist es bei allen Zugriffen auf Datenregister erforderlich, dass diese Daten synchronisiert sind. Wenn z.&nbsp;B. bei einem 16-Bit-Timer das High-Byte des Zählregisters gelesen wurde und vor dem Lesezugriff auf das Low-Byte ein Überlauf des Low-Bytes stattfindet, erhält man einen völlig unsinnigen Wert. Auch die Compare-Register müssen synchron geschrieben werden, da es ansonsten zu unerwünschten Compare-Ereignissen kommen kann. <br />
<br />
Beim ADC besteht das Problem darin, dass zwischen den Zugriffen auf die beiden Teilregister eine Wandlung beendet werden kann und der ADC ein neues Ergebnis in ADCL und ADCH schreiben will, wodurch High- und Low-Byte nicht zusammenpassen.<br />
<br />
Um diese Datenmüllproduktion zu verhindern, gibt es in beiden Fällen eine Synchronisation, die jeweils durch den Zugriff auf das Low-Byte ausgelöst wird:<br />
* Bei den Timer-Registern (das gilt für alle TCNT-, OCR- und ICR-Register bei den 16-Bit-Timern) wird bei einem ''Lesezugriff'' auf das Low-Byte automatisch das High-Byte in ein temporäres Register, das ansonsten nach außen nicht sichtbar ist, geschoben. Greift man nun ''anschließend'' auf das High-Byte zu, dann wird eben dieses temporäre Register gelesen.<br />
* Bei einem ''Schreibzugriff'' auf eines der genannten Register wird das High-Byte in besagtem temporären Register zwischengespeichert und erst beim Schreiben des Low-Bytes werden ''beide'' gleichzeitig in das eigentliche Register übernommen.<br />
<br />
Das bedeutet für die Reihenfolge:<br />
* Lesezugriff: Erst Low-Byte, dann High-Byte<br />
* Schreibzugriff: Erst High-Byte, dann Low-Byte<br />
<br />
Des weiteren ist zu beachten, dass es für all diese 16-Bit-Register nur ein einziges temporäres Register gibt, so dass das Auftreten eines Interrupts, in dessen Handler ein solches Register manipuliert wird, bei einem durch ihn unterbrochenen Zugriff i.d.R. zu Datenmüll führt. 16-Bit-Zugriffe sind generell nicht atomar! Wenn mit Interrupts gearbeitet wird, kann es erforderlich sein, vor einem solchen Zugriff auf ein 16-Bit-Register die Interrupt-Bearbeitung zu deaktivieren.<br />
<br />
Beim ADC-Datenregister ADCH/ADCL ist die Synchronisierung anders gelöst. Hier wird beim Lesezugriff (ADCH/ADCL sind logischerweise read-only) auf das Low-Byte ADCL beide Teilregister für Zugriffe seitens des ADC so lange gesperrt, bis das High-Byte ADCH ausgelesen wurde. Dadurch kann der ADC nach einem Zugriff auf ADCL keinen neuen Wert in ADCH/ADCL ablegen, bis ADCH gelesen wurde. Ergebnisse von Wandlungen, die zwischen einem Zugriff auf ADCL und ADCH beendet werden, gehen verloren!<br />
<br />
Nach einem Zugriff auf ADCL muss grundsätzlich ADCH gelesen werden!<br />
<br />
In beiden Fällen – also sowohl bei den Timern als auch beim ADC – werden vom C-Compiler 16-Bit Pseudo-Register zur Verfügung gestellt (z.&nbsp;B. TCNT1H/TCNT1L → TCNT1, ADCH/ADCL → ADC bzw. ADCW), bei deren Verwendung der Compiler automatisch die richtige Zugriffsreihenfolge regelt. In C-Programmen sollten grundsätzlich diese 16-Bit-Register verwendet werden! Sollte trotzdem ein Zugriff auf ein Teilregister erforderlich sein, sind obige Angaben zu berücksichtigen.<br />
<br />
Es ist darauf zu achten, dass auch ein Zugriff auf die 16-Bit-Register vom Compiler in zwei 8-Bit-Zugriffe aufgeteilt wird und dementsprechend genauso nicht-atomar ist wie die Einzelzugriffe. Auch hier gilt, dass u.U. die Interrupt-Bearbeitung gesperrt werden muss, um Datenmüll zu vermeiden.<br />
<br />
Beim ADC gibt es für den Fall, dass eine Auflösung von 8 Bit ausreicht, die Möglichkeit, das Ergebnis "linksbündig" in ADCH/ADCL auszurichten, so dass die relevanten 8 MSB in ADCH stehen. In diesem Fall muss bzw. sollte nur ADCH ausgelesen werden.<br />
<br />
ADC und ADCW sind unterschiedliche Bezeichner für das selbe Registerpaar. Üblicherweise kann man in C-Programmen ADC verwenden, was analog zu den anderen 16-Bit-Registern benannt ist. ADCW (ADC Word) existiert nur deshalb, weil die Headerdateien auch für Assembler vorgesehen sind und es bereits einen Assembler-Befehl namens ''adc'' gibt. <br />
<br />
Im Umgang mit 16-Bit Registern siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Related Pages/Frequently Asked Questions/Nr. 8<br />
* Datenblatt Abschnitt ''Accessing 16-bit Registers''<br />
<br />
== IO-Register als Parameter und Variablen ==<br />
<br />
Um Register als Parameter für eigene Funktionen übergeben zu können, muss man sie als einen volatile uint8_t Pointer übergeben. Zum Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
uint8_t key_pressed (volatile uint8_t *inputreg, uint8_t inputbit)<br />
{<br />
static uint8_t last_state = 0;<br />
<br />
if (last_state == (*inputreg & (1<<inputbit)))<br />
return 0; /* keine Änderung */<br />
<br />
/* Wenn doch, warten bis etwaiges Prellen vorbei ist: */<br />
_delay_ms(20);<br />
<br />
/* Zustand für nächsten Aufruf merken: */<br />
last_state = *inputreg & (1<<inputbit);<br />
<br />
/* und den entprellten Tastendruck zurückgeben: */<br />
return *inputreg & (1<<inputbit);<br />
}<br />
<br />
/* Beispiel für einen Funktionsaufruf: */<br />
<br />
void foo (void)<br />
{<br />
uint8_t i = key_pressed (&PINB, PB1);<br />
}<br />
</syntaxhighlight><br />
<br />
Ein Aufruf der Funktion mit call by value würde Folgendes bewirken: Beim Funktionseintritt wird nur eine Kopie des momentanen Portzustandes angefertigt, die sich unabhängig vom tatsächlichen Zustand das Ports nicht mehr ändert, womit die Funktion wirkungslos wäre. Die Übergabe eines Zeigers wäre die Lösung, wenn der Compiler nicht optimieren würde. Denn dadurch wird im Programm nicht von der Hardware gelesen, sondern wieder nur von einem Abbild im Speicher. Das Ergebnis wäre das gleiche wie oben. Mit dem Schlüsselwort volatile sagt man nun dem Compiler, dass die entsprechende Variable entweder durch andere Softwareroutinen (Interrupts) oder durch die Hardware verändert werden kann.<br />
<br />
Siehe auch: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass avr-libc FAQ: "How do I pass an IO port as a parameter to a function?"]<br />
<br />
= Zugriff auf IO-Ports =<br />
<br />
Jeder AVR implementiert eine unterschiedliche Menge an GPIO-Registern<br />
(GPIO - General Purpose Input/Output). Diese Register dienen dazu:<br />
* einzustellen welche der Anschlüsse ("Beinchen") des Controllers als Ein- oder Ausgänge dienen<br />
* bei Ausgängen deren Zustand festzulegen<br />
* bei Eingängen deren Zustand zu erfassen<br />
<br />
Mittels GPIO werden digitale Zustände gesetzt und erfasst, d.h. die Spannung an einem Ausgang wird ein- oder ausgeschaltet und an einem Eingang wird erfasst, ob die anliegende Spannung über oder unter einem bestimmten Schwellwert liegt. Im Datenblatt Abschnitt Electrical Characteristics/DC Characteristics finden sich die Spannungswerte (V_OL, V_OH für Ausgänge, V_IL, V_IH für Eingänge).<br />
<br />
Die Verarbeitung von analogen Eingangswerten und die Ausgabe von Analogwerten wird in Kapitel [[AVR-GCC-Tutorial#Analoge_Ein-_und_Ausgabe|Analoge Ein- und Ausgabe]] behandelt.<br />
<br />
Die physischen Ein- und Ausgänge werden bei AVR-Controllern zu logischen Ports gruppiert.<br />
<br />
Alle Ports werden über Register gesteuert. Dazu sind jedem Port 3 Register zugeordnet:<br />
<br />
{| class="wikitable"<br />
|- <br />
! width="10%"| DDRx<br />
| Datenrichtungsregister für Port'''x'''. <br />
'''x''' entspricht '''A''', '''B''', ''' C''' usw. je nach gewünschtem Port. Bit im Register gesetzt (1) für Ausgang, Bit gelöscht (0) für Eingang.<br />
|- <br />
! PINx<br />
| Eingangsadresse für Port'''x'''. <br />
Zustand des Ports. Die Bits in PINx entsprechen dem Zustand der als Eingang definierten Portpins. Bit 1 wenn Pin "high", Bit 0 wenn Portpin low.<br />
|-<br />
! PORTx<br />
| Datenregister für Port'''x'''. <br />
Dieses Register wird verwendet, um die Ausgänge eines Ports anzusteuern. Bei Pins, die mittels DDRx auf Eingang geschaltet wurden, können über PORTx<br />
die internen Pull-Up Widerstände aktiviert oder deaktiviert werden (1 = aktiv).<br />
|}<br />
<br />
Die folgenden Beispiele gehen von einem AVR aus, der sowohl Port A als auch Port B besitzt. Sie müssen für andere AVRs (zum Beispiel ATmega8/48/88/168) entsprechend angepasst werden.<br />
<br />
== Datenrichtung bestimmen ==<br />
<br />
Zuerst muss die Datenrichtung der verwendeten Pins bestimmt werden. Um dies zu erreichen, wird das Datenrichtungsregister des entsprechenden Ports beschrieben.<br />
<br />
Für jeden Pin, der als Ausgang verwendet werden soll, muss dabei das<br />
entsprechende Bit auf dem Port gesetzt werden. Soll der Pin als Eingang<br />
verwendet werden, muss das entsprechende Bit gelöscht sein.<br />
<br />
Beispiel:<br />
Angenommen am Port B sollen die Pins 0 bis 4 als Ausgänge definiert werden, die noch verbleibenden Pins 5 bis 7 sollen als Eingänge fungieren. Dazu ist es daher notwendig, im für das Port B zuständigen Datenrichtungsregister DDRB folgende Bitkonfiguration einzutragen<br />
<br />
+---+---+---+---+---+---+---+---+<br />
| 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |<br />
+---+---+---+---+---+---+---+---+<br />
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |<br />
<br />
In C liest sich das dann so:<br />
<br />
<syntaxhighlight lang="c"><br />
// in io.h wird u.a. DDRB definiert:<br />
#include <avr/io.h><br />
<br />
int main()<br />
{<br />
// Setzen der Bits 0,1,2,3 und 4<br />
// Binaer 00011111 = Hexadezimal 1F<br />
// direkte Zuweisung - standardkonform */<br />
DDRB = 0x1F; /* <br />
<br />
// Uebersichtliche Alternative - Binaerschreibweise, aber kein ISO-C<br />
DDRB = 0b00011111;<br />
<br />
// Ausfuehrliche Schreibweise: identische Funktionalitaet, mehr Tipparbeit<br />
// aber uebersichtlicher und selbsterklaerend:<br />
DDRB |= (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4); <br />
</syntaxhighlight><br />
<br />
Die Pins 5 bis 7 werden (da 0) als Eingänge geschaltet. Weitere Beispiele:<br />
<br />
<syntaxhighlight lang="c"><br />
// Alle Pins des Ports B als Ausgang definieren:<br />
DDRB = 0xff; <br />
// Pin0 wieder auf Eingang und andere im urspruenglichen Zustand belassen:<br />
DDRB &= ~(1 << DDB0);<br />
// Pin 3 und 4 auf Eingang und andere im urspruenglichen Zustand belassen:<br />
DDRB &= ~((1 << DDB3) | (1 << DDB4));<br />
// Pin 0 und 3 wieder auf Ausgang und andere im ursprünglichen Zustand belassen:<br />
DDRB |= (1 << DDB0) | (1 << DDB3);<br />
// Alle Pins auf Eingang:<br />
DDRB = 0x00;<br />
</syntaxhighlight><br />
<br />
== Vordefinierte Bitnummern für I/O-Register ==<br />
<br />
Die Bitnummern (z.&nbsp;B. PCx, PINCx und DDCx für den Port C) sind in den io*.h-Dateien der avr-libc definiert und dienen lediglich der besseren Lesbarkeit. Man muss diese Definitionen nicht verwenden oder kann auch einfach "immer" PAx, PBx, PCx usw. nutzen, auch wenn der Zugriff auf Bits in DDRx- oder PINx-Registern erfolgt. Für den Compiler sind die Ausdrücke (1<<PC7), (1<<DDC7) und (1<<PINC7) identisch zu (1<<7) (genauer: der Präprozessor ersetzt die Ausdrücke (1<<PC7),... zu (1<<7)). Ein Ausschnitt der Definitionen für Port C eines ATmega32 aus der iom32.h-Datei zur Verdeutlichung (analog für die weiteren Ports):<br />
<br />
<syntaxhighlight lang="c"><br />
...<br />
/* PORTC */<br />
#define PC7 7<br />
#define PC6 6<br />
#define PC5 5<br />
#define PC4 4<br />
#define PC3 3<br />
#define PC2 2<br />
#define PC1 1<br />
#define PC0 0<br />
<br />
/* DDRC */<br />
#define DDC7 7<br />
#define DDC6 6<br />
#define DDC5 5<br />
#define DDC4 4<br />
#define DDC3 3<br />
#define DDC2 2<br />
#define DDC1 1<br />
#define DDC0 0<br />
<br />
/* PINC */<br />
#define PINC7 7<br />
#define PINC6 6<br />
#define PINC5 5<br />
#define PINC4 4<br />
#define PINC3 3<br />
#define PINC2 2<br />
#define PINC1 1<br />
#define PINC0 0<br />
</syntaxhighlight><br />
<br />
<br />
== Digitale Signale ==<br />
<br />
Am einfachsten ist es, digitale Signale mit dem Mikrocontroller zu erfassen bzw. auszugeben.<br />
<br />
== Ausgänge ==<br />
Will man als Ausgang definierte Pins (entsprechende DDRx-Bits = 1) auf Logisch 1 setzen, setzt man die entsprechenden Bits im Portregister.<br />
<br />
Mit dem Befehl<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB = 0x04; /* besser PORTB=(1<<PB2) */<br />
<br />
// Uebersichtliche Alternative - Binaerschreibweise<br />
PORTB = 0b00000100; /* direkte Zuweisung - uebersichtlich */<br />
<br />
</syntaxhighlight><br />
wird also der Ausgang an Pin PB2 gesetzt (Beachte, dass die Bits immer ''von 0 an'' gezählt werden, das niederwertigste Bit ist also Bitnummer 0 und nicht etwa Bitnummer 1).<br />
<br />
Man beachte, dass bei der Zuweisung mittels '''=''' immer alle Pins gleichzeitig angegeben werden. Man sollte also, wenn nur bestimmte Ausgänge geschaltet werden sollen, zuerst den aktuellen Wert des Ports einlesen und das Bit des gewünschten Ports in diesen Wert einfließen lassen. Will man also nur den dritten Pin (Bit Nr. 2) an Port B auf "high" setzen und den Status der anderen Ausgänge unverändert lassen, nutze man diese Form:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB = PORTB | 0x04; /* besser: PORTB = PORTB | ( 1<<PB2 ) */<br />
/* vereinfacht durch Nutzung des |= Operators : */<br />
PORTB |= (1<<PB2);<br />
<br />
/* auch mehrere "gleichzeitig": */<br />
PORTB |= (1<<PB4) | (1<<PB5); /* Pins PB4 und PB5 "high" */<br />
</syntaxhighlight><br />
<br />
"Ausschalten", also Ausgänge auf "low" setzen, erfolgt analog:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB &= ~(1<<PB2); /* loescht Bit 2 in PORTB und setzt damit Pin PB2 auf low */ <br />
PORTB &= ~( (1<<PB4) | (1<<PB5) ); /* Pin PB4 und Pin PB5 "low" */<br />
</syntaxhighlight><br />
Siehe auch [[Bitmanipulation]]<br />
<br />
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind in aktuellen Versionen der avr-libc nicht mehr enthalten und auch nicht mehr erforderlich.<br />
<br />
''Falls der Anfangszustand von Ausgängen kritisch ist, muss die Reihenfolge beachtet werden, mit der die Datenrichtung (DDRx) eingestellt und der Ausgabewert (PORTx) gesetzt wird:''<br />
<br />
Für Ausgangspins, die mit Anfangswert "high" initialisiert werden sollen:<br />
* zuerst die Bits im PORTx-Register setzen<br />
* anschließend die Datenrichtung auf Ausgang stellen<br />
<br />
Daraus ergibt sich die Abfolge für einen Pin, der bisher als Eingang mit abgeschaltetem Pull-Up konfiguriert war:<br />
* setze PORTx: interner Pull-Up aktiv<br />
* setze DDRx: Ausgang ("high")<br />
<br />
Bei der Reihenfolge erst DDRx und dann PORTx kann es zu einem kurzen "low-Puls" kommen, der auch externe Pull-Up-Widerstände "überstimmt". Die (ungünstige) Abfolge: Eingang -> setze DDRx: Ausgang (auf "low", da PORTx nach Reset 0) -> setze PORTx: Ausgang auf high. Vergleiche dazu auch das Datenblatt Abschnitt ''Configuring the Pin''.<br />
<br />
== Eingänge (Wie kommen Signale in den &micro;C) ==<br />
<br />
Die digitalen Eingangssignale können auf verschiedene Arten zu unserer Logik gelangen.<br />
<br />
=== Signalkopplung ===<br />
<br />
Am einfachsten ist es, wenn die Signale direkt aus einer anderen digitalen Schaltung übernommen werden können. Hat der Ausgang der entsprechenden Schaltung TTL-Pegel dann können wir sogar direkt den Ausgang der Schaltung mit einem Eingangspin von unserem Controller verbinden.<br />
<br />
Hat der Ausgang der anderen Schaltung keinen TTL-Pegel so müssen wir den Pegel über entsprechende Hardware (z.&nbsp;B. Optokoppler, [[Widerstand#Spannungsteiler|Spannungsteiler]], "Levelshifter" aka [[Pegelwandler]]) anpassen.<br />
<br />
Die Masse der beiden Schaltungen muss selbstverständlich miteinander verbunden werden. Der Software selber ist es natürlich letztendlich egal, wie das Signal eingespeist wird. Wir können ja ohnehin lediglich prüfen, ob an einem Pin unseres Controllers eine logische 1 (Spannung größer ca. 0,7*Vcc) oder eine logische 0 (Spannung kleiner ca. 0,2*Vcc) anliegt. Detaillierte Informationen darüber, ab welcher Spannung ein Eingang als 0 ("low") bzw. 1 ("high") erkannt wird, liefert die Tabelle DC Characteristics im Datenblatt des genutzten Controllers.<br />
<br />
{| class="wikitable" style="text-align:center; width:20em"<br />
|+ '''Logikpegel'''<br />
|-<br />
! VCC [V]<br />
! Low [V]<br />
! High [V]<br />
|-<br />
! 5<br />
| 1,0 || 3,5<br />
|-<br />
! 3,3<br />
| 0,66 || 2,3<br />
|-<br />
! 1,8<br />
| 0,36 || 1,26 <br />
|}<br />
<br />
Die Abfrage der Zustände der Portpins erfolgt direkt über den Registernamen.<br />
<br />
{{Warnung|Dabei ist wichtig, zur Abfrage der Eingänge ''nicht'' etwa Portregister '''PORTx''' zu verwenden, sondern Eingangsregister '''PINx'''. Ansonsten liest man nicht den Zustand der Eingänge, sondern den Status der internen Pull-Up-Widerstände. Die Abfrage der Pinzustände über PORTx statt PINx ist ein häufiger Fehler beim AVR-"Erstkontakt".}}<br />
<br />
Will man also die aktuellen Signalzustände von Port D abfragen und in eine Variable namens bPortD abspeichern, schreibt man folgende Befehlszeilen:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdint.h><br />
...<br />
uint8_t bPortD;<br />
...<br />
bPortD = PIND;<br />
...<br />
</syntaxhighlight><br />
<br />
Mit den C-Bitoperationen kann man den Status der Bits abfragen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */<br />
if ( PINC & (1<<PINC1) ) {<br />
/* Aktion */<br />
}<br />
<br />
/* Fuehre Aktion aus, wenn Bit Nr. 2 (das "dritte" Bit) in PINB geloescht (0) ist */<br />
if ( !(PINB & (1<<PINB2)) ) {<br />
/* Aktion */<br />
}<br />
...<br />
</syntaxhighlight><br />
Siehe auch [[Bitmanipulation#Bits_prüfen]]<br />
<br />
=== Interne Pull-Up Widerstände ===<br />
<br />
Portpins für Ein- und Ausgänge (GPIO) eines AVR verfügen über zuschaltbare interne Pull-Up Widerstände (nominal mehrere 10kOhm, z.&nbsp;B. ATmega16 20-50kOhm). Diese können in vielen Fällen statt externer Widerstände genutzt werden.<br />
<br />
Die internen Pull-Up Widerstände von Vcc zu den einzelnen Portpins werden über das Register ''' PORTx''' aktiviert bzw. deaktiviert, wenn ein Pin als ''' Eingang''' geschaltet ist.<br />
<br />
Wird der Wert des entsprechenden Portpins auf 1 gesetzt, so ist der Pull-Up Widerstand aktiviert. Bei einem Wert von 0 ist der Pull-Up Widerstand nicht aktiv. Man sollte jeweils entweder den internen oder einen externen Pull-Up Widerstand verwenden, aber nicht beide zusammen.<br />
<br />
Im Beispiel werden alle Pins des Ports D als Eingänge geschaltet und alle Pull-Up Widerstände aktiviert. Weiterhin wird Pin PC7 als Eingang geschaltet und dessen interner Pull-Up Widerstand aktiviert, ohne die Einstellungen für die anderen Portpins (PC0-PC6) zu verändern.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
DDRD = 0x00; /* alle Pins von Port D als Eingang */<br />
PORTD = 0xff; /* interne Pull-Ups an allen Port-Pins aktivieren */<br />
...<br />
DDRC &= ~(1<<PC7); /* Pin PC7 als Eingang */<br />
PORTC |= (1<<PC7); /* internen Pull-Up an PC7 aktivieren */<br />
</syntaxhighlight><br />
<br />
=== Taster und Schalter ===<br />
<br />
Der Anschluss mechanischer Kontakte an den Mikrocontroller, ist zwischen zwei unterschiedliche Methoden zu unterscheiden: ''Active Low'' und ''Active High''.<br />
<br />
<gallery widths="300" heights="300" caption="Anschluss mechanischer Kontakte an einen µC"><br />
Image:Active Low.gif|'''Active Low:''' Bei dieser Methode wird der Kontakt zwischen den Eingangspin des Controllers und Masse geschaltet. Damit bei offenem Schalter der Controller kein undefiniertes Signal bekommt, wird zwischen die Versorgungsspannung und den Eingangspin ein sogenannter '''Pull-Up''' Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffnetem Schalter auf logisch 1 zu ziehen.<br />
Image:Active High.gif|'''Active High:''' Hier wird der Kontakt zwischen die Versorgungsspannung und den Eingangspin geschaltet. Damit bei offener Schalterstellung kein undefiniertes Signal am Controller ansteht, wird zwischen den Eingangspin und die Masse ein '''Pull-Down''' Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffneter Schalterstellung auf logisch 0 zu halten. <br />
</gallery><br />
<br />
Der Widerstandswert von Pull-Up- und Pull-Down-Widerständen ist an sich nicht kritisch. Wird er allerdings zu hoch gewählt, ist die Wirkung eventuell nicht gegeben. Als üblicher Wert haben sich 10 kOhm eingebürgert. Die AVRs verfügen an den meisten Pins über zuschaltbare interne Pull-Up Widerstände (vgl. Abschnitt [[AVR-GCC-Tutorial#Interne Pull-Up Widerstände|Interne Pull-Up Widerstände]]), welche insbesondere wie hier bei Tastern und ähnlichen Bauteilen (z.&nbsp;B. Drehgebern) statt externer Bauteile verwendet werden können. Interne Pull-Down-Widerstand sind nicht verfügbar und müssen daher in Form zusätzlicher Bauteile in die Schaltung eingefügt werden.<br />
<br />
==== Taster entprellen ====<br />
<br />
Siehe: ''[[Entprellung#Warteschleifen-Verfahren|Entprellung: Warteschleifen-Verfahren]]<br />
<br />
= Warteschleifen (delay.h) =<br />
<br />
Der Programmablauf kann verschiedene Arten von Wartefunktionen erfordern:<br />
<br />
* Warten im Sinn von Zeitvertrödeln<br />
* Warten auf einen bestimmten Zustand an den I/O-Pins<br />
* Warten auf einen bestimmten Zeitpunkt (siehe Timer)<br />
* Warten auf einen bestimmten Zählerstand (siehe Counter)<br />
<br />
Der einfachste Fall, das Zeitvertrödeln, kann in vielen Fällen und mit großer Genauigkeit anhand der avr-libc Bibliotheksfunktionen _delay_ms() und _delay_us() erledigt werden. Die Bibliotheksfunktionen sind einfachen Zählschleifen (Warteschleifen) vorzuziehen, da leere Zählschleifen ohne besondere Vorkehrungen sonst bei eingeschalteter Optimierung vom avr-gcc-Compiler wegoptimiert werden. Weiterhin sind die Bibliotheksfunktionen bereits darauf vorbereitet, die in F_CPU definierte Taktfrequenz zu verwenden. Außerdem sind die Funktionen der Bibliothek wirklich getestet.<br />
<br />
Einfach!? Schon, aber während gewartet wird, macht der µC nichts anderes mehr (abgesehen von möglicherweise auftretenden Interrupts, falls welche aktiviert sind). Die Wartefunktion blockiert den Programmablauf. Möchte man einerseits warten, um z.&nbsp;B. eine LED blinken zu lassen und gleichzeitig andere Aktionen ausführen z.&nbsp;B. weitere LED bedienen, sollten die Timer/Counter des AVR verwendet werden, siehe Artikel [[Multitasking]].<br />
<br />
Die Bibliotheksfunktionen funktionieren allerdings nur dann korrekt, wenn sie mit zur Übersetzungszeit (beim Compilieren) bekannten konstanten Werten aufgerufen werden. Der Quellcode muss mit eingeschalteter Optimierung übersetzt werden, sonst wird sehr viel Maschinencode erzeugt, und die Wartezeiten stimmen nicht mehr mit dem Parameter überein.<br />
<br />
Eine weitere Einschränkung liegt darin, daß sie möglicherweise länger warten, als erwartet, nämlich in dem Fall, daß Interrupts auftreten und die _delay...()-Funktion unterbrechen. Genau genommen warten diese nämlich nicht eine bestimmte Zeit, sondern verbrauchen eine bestimmte Anzahl von Prozessortakten. Die wiederum ist so bemessen, daß ohne Unterbrechung durch Interrupts die gewünschte Wartezeit erreicht wird.<br />
Wird das Warten aber durch eine oder mehrere ISR unterbrochen, die zusammen 1% Prozessorzeit verbrauchen, dann dauert das Warten etwa 1% länger. Bei 50% Last durch die ISR dauert das Warten doppelt solange wie gewünscht, bei 90% zehnmal solange...<br />
<br />
Abhängig von der Version der Bibliothek verhalten sich die Bibliotheksfunktionen etwas unterschiedlich.<br />
<br />
== avr-libc Versionen bis 1.6 ==<br />
<br />
Die Wartezeit der Funktion _delay_ms() ist auf 262,14ms/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 13,1ms warten. Die Wartezeit der Funktion _delay_us() ist auf 768us/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 38,4µs warten. Längere Wartezeiten müssen dann über einen mehrfachen Aufruf in einer Schleife gelöst werden.<br />
<br />
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#ifndef F_CPU<br />
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert <br />
(z.&nbsp;B. durch Übergabe als Parameter zum Compiler innerhalb <br />
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die<br />
"nachträgliche" Definition hinweist */<br />
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"<br />
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */<br />
#endif<br />
#include <util/delay.h> /* in älteren avr-libc Versionen <avr/delay.h> */ <br />
<br />
/*<br />
lange, variable Verzögerungszeit, Einheit in Millisekunden<br />
<br />
Die maximale Zeit pro Funktionsaufruf ist begrenzt auf <br />
262.14 ms / F_CPU in MHz (im Beispiel: <br />
262.1 / 3.6864 = max. 71 ms) <br />
<br />
Daher wird die kleine Warteschleife mehrfach aufgerufen,<br />
um auf eine längere Wartezeit zu kommen. Die zusätzliche <br />
Prüfung der Schleifenbedingung lässt die Wartezeit geringfügig<br />
ungenau werden (macht hier vielleicht 2-3ms aus).<br />
*/<br />
<br />
void long_delay(uint16_t ms)<br />
{<br />
for(; ms>0; ms--) _delay_ms(1);<br />
}<br />
<br />
int main( void )<br />
{<br />
DDRB = ( 1 << PB0 ); // PB0 an PORTB als Ausgang setzen<br />
<br />
while( 1 ) // Endlosschleife<br />
{ <br />
PORTB ^= ( 1 << PB0 ); // Toggle PB0 z.&nbsp;B. angeschlossene LED<br />
long_delay(1000); // Eine Sekunde warten...<br />
}<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
== avr-libc Versionen ab 1.7 ==<br />
<br />
_delay_ms() kann mit einem Argument bis 6553,5 ms (= 6,5535 Sekunden) benutzt werden. Es ist nicht möglich, eine Variable als Argument zu übergeben. Wird die früher gültige Grenze von 262,14 ms/F_CPU (in MHz) überschritten, so arbeitet _delay_ms() einfach etwas ungenauer und zählt nur noch mit einer Auflösung von 1/10 ms. Eine Verzögerung von 1000,10 ms ließe sich nicht mehr von einer von 1000,19 ms unterscheiden. Ein Verlust, der sich im Allgemeinen verschmerzen lässt. Dem Programmierer wird keine Rückmeldung gegeben, dass die Funktion ggf. gröber arbeitet, d.h. wenn es darauf ankommt, bitte den Parameter wie bisher geschickt wählen.<br />
<br />
Die Funktion _delay_us() wurde ebenfalls erweitert. Wenn deren maximal als genau behandelbares Argument überschritten wird, benutzt diese intern _delay_ms(). Damit gelten in diesem Fall die _delay_ms() Einschränkungen.<br />
<br />
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus, avr-libc ab Version 1.6<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#ifndef F_CPU<br />
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert <br />
(z.B. durch Übergabe als Parameter zum Compiler innerhalb <br />
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die<br />
"nachträgliche" Definition hinweist */<br />
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"<br />
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */<br />
#endif<br />
#include <util/delay.h><br />
<br />
int main( void )<br />
{<br />
DDRB = ( 1 << PB0 ); // PB0 an PORTB als Ausgang setzen<br />
<br />
while( 1 ) { // Endlosschleife<br />
PORTB ^= ( 1 << PB0 ); // Toggle PB0 z.B. angeschlossene LED<br />
_delay_ms(1000); // Eine Sekunde +/-1/10000 Sekunde warten...<br />
// funktioniert nicht mit Bibliotheken vor 1.6<br />
<br />
}<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
Die _delay_ms() und die _delay_us aus '''avr-libc 1.7.0''' sind fehlerhaft. _delay_ms () läuft 4x schneller als erwartet. Abhilfe ist eine korrigierte Includedatei: [http://www.mikrocontroller.net/topic/196738#1943039]<br />
<br />
= Programmieren mit Interrupts =<br />
<br />
<div style="float:right; margin:2em;"><br />
[[Image:Interrupt Programme.gif]]<br />
</div><br />
Nachdem wir nun alles Wissenswerte für die serielle Programmerstellung<br />
gelernt haben nehmen wir jetzt ein völlig anderes Thema in Angriff, nämlich<br />
die Programmierung unter Zuhilfenahme der Interrupts des AVR.<br />
<br />
Tritt ein Interrupt auf, unterbricht (engl. interrupts) der Controller die Verarbeitung des Hauptprogramms und verzweigt zu einer Interruptroutine. Das Hauptprogramm wird also beim Eintreffen eines Interrupts unterbrochen, die Interruptroutine ausgeführt und danach erst wieder das Hauptprogramm an der Unterbrechungsstelle fortgesetzt (vgl. die Abbildung).<br />
<br />
Um Interrupts verarbeiten zu können, ist folgendes zu beachten:<br />
<br />
* Für jede aktivierte Interruptquelle ist eine Funktion zu programmieren, in der die beim Auftreten des jeweiligen Interrupts erforderlichen Verarbeitungsschritte enthalten sind. Für diese Funktion existieren verschiedene Bezeichnungen. Üblich sind die englischen Begriffe Interrupt-Handler oder Interrupt-Service-Routinen (ISR), man findet aber auch die Bezeichnungen Interruptverarbeitungs- oder -behandlungsroutine oder auch kurz Interruptroutine. Zum Beispiel wird üblicherweise in der ISR zur Verarbeitung des Empfangsinterrupts eines UARTs (UART-RX Interrupt) das empfangene Zeichen in einen Zwischenspeicher (FIFO-Buffer) kopiert, dessen Inhalt später von anderen Programmteilen geleert wird. Sofern der Zwischenspeicher ausreichend groß ist, geht also kein Zeichen verloren, auch wenn im Hauptprogramm zeitintensive Operationen durchgeführt werden.<br />
* Die benötigten Interrupts sind in den jeweiligen Funktionsbausteinen einzuschalten. Dies erfolgt über das jeweilige Aktivierungsbit (Interrupt Enable) in einem der Hardwareregister (z.B. RX(Complete)Interrupt Enable eines UARTs)<br />
* Sämtliche Interrupts werden über einen weiteren globalen Schalter aktiviert und deaktiviert. Zur Verarbeitung der Interrupts ist dieser Schalter zu aktivieren (sei(), siehe unten).<br />
<br />
Alle Punkte sind zu beachten. Fehlt z.B. die globale Aktivierung, werden Interruptroutinen auch dann nicht aufgerufen, wenn sie im Funktionsbaustein eingeschaltet sind und eine Behandlungsroutine verhanden ist.<br />
<br />
Siehe auch<br />
<br />
* [http://www.mikrocontroller.net/forum/read-1-235092.html#new Ausführlicher Thread im Forum]<br />
* Artikel [[Interrupt]]<br />
* Artikel [[Multitasking]]<br />
{{Clear}}<br />
<br />
== Anforderungen an Interrupt-Routinen ==<br />
<br />
Um unliebsamen Überraschungen vorzubeugen, sollten einige Grundregeln bei der Implementierung der Interruptroutinen beachtet werden. Interruptroutinen sollten möglichst kurz und schnell abarbeitbar sein, daraus folgt:<br />
<br />
* Keine umfangreichen Berechnungen innerhalb der Interruptroutine. (*)<br />
* Keine langen Programmschleifen.<br />
* Obwohl es möglich ist, während der Abarbeitung einer Interruptroutine andere oder sogar den gleichen Interrupt wieder zuzulassen, wird davon ohne genaue Kenntnis der internen Abläufe dringend abgeraten.<br />
<br />
Interruptroutinen (ISRs) sollten also möglichst kurz sein und keine Schleifen mit vielen Durchläufen enthalten. Längere Operationen können meist in einen "Interrupt-Teil" in einer ISR und einen "Arbeitsteil" im Hauptprogramm aufgetrennt werden. Z.B. Speichern des Zustands aller Eingänge im EEPROM in bestimmten Zeitabständen: ISR-Teil: Zeitvergleich (Timer,RTC) mit Logzeit/-intervall. Bei Übereinstimmung ein globales Flag setzen (volatile bei Flag-Deklaration nicht vergessen, s.u.). Dann im Hauptprogramm prüfen, ob das Flag gesetzt ist. Wenn ja: die Daten im EEPROM ablegen und Flag löschen.<br />
<br />
(*)<br />
Hinweis: <br />
Es gibt allerdings die seltene Situation, dass man gerade eingelesene<br />
ADC-Werte sofort verarbeiten muss. Besonders dann, wenn man mehrere Werte sehr<br />
schnell hintereinander bekommt. Dann bleibt einem nichts anderes übrig, als die<br />
Werte noch in der ISR zu verarbeiten. Kommt aber sehr selten vor und sollte<br />
durch geeignete Wahl des Systemtaktes bzw. Auswahl des Controllers vermieden werden!<br />
<br />
== Interrupt-Quellen ==<br />
<br />
Die folgenden Ereignisse können einen Interrupt auf einem AVR AT90S2313 auslösen, wobei die Reihenfolge der Auflistung auch die Priorität der Interrupts aufzeigt.<br />
<br />
* Reset<br />
* Externer Interrupt 0<br />
* Externer Interrupt 1<br />
* Timer/Counter 1 Capture Ereignis<br />
* Timer/Counter 1 Compare Match<br />
* Timer/Counter 1 Überlauf<br />
* Timer/Counter 0 Überlauf<br />
* UART Zeichen empfangen<br />
* UART Datenregister leer<br />
* UART Zeichen gesendet<br />
* Analoger Komparator<br />
<br />
Die Anzahl der möglichen Interruptquellen variiert zwischen den verschiedenen Microcontroller-Typen. Im Zweifel hilft ein Blick ins Datenblatt ("Interrupt Vectors").<br />
<br />
== Register ==<br />
<br />
Der AT90S2313 verfügt über 2 Register die mit den<br />
Interrupts zusammenhängen.<br />
<br />
{| class="wikitable"<br />
|- <br />
!width="10%"| GIMSK<br />
| '''G'''eneral '''I'''nterrupt '''M'''a'''sk''' Register.<br /><br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit <br />
| 7 || 6|| 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''INT1''' || '''INT0''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-'''<br />
|- <br />
! R/W<br />
| R/W || R/W || R || R || R || R || R || R<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''INT1''' (External '''Int'''errupt Request '''1''' Enable)<br />
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am '''INT1'''-Pin eine steigende oder fallende (je nach Konfiguration im '''MCUCR''') Flanke erkannt wird.<br />
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.<br />
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.<br />
<br />
'''INT0''' (External '''Int'''errupt Request '''0''' Enable)<br />
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am '''INT0'''-Pin eine steigende oder fallende (je nach Konfiguration im '''MCUCR''') Flanke erkannt wird.<br />
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.<br />
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.<br />
<br />
|- <br />
! GIFR<br />
| '''G'''eneral '''I'''nterrupt '''F'''lag '''R'''egister.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''INTF1''' || '''INTF0''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-'''<br />
|- <br />
! R/W<br />
| R/W || R/W || R || R || R || R || R || R<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''INTF1''' (External '''Int'''errupt Flag '''1''')<br />
:Dieses Bit wird gesetzt, wenn am '''INT1'''-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.<br />
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert '''1(!)''' eingeschrieben wird.<br />
<br />
'''INTF0''' (External '''Int'''errupt Flag '''0''')<br />
:Dieses Bit wird gesetzt, wenn am '''INT0'''-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.<br />
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert '''1(!)''' eingeschrieben wird.<br />
|- <br />
! MCUCR<br />
| '''MCU''' '''C'''ontrol '''R'''egister.<br />
<br />
Das MCU Control Register enthält Kontrollbits für allgemeine MCU-Funktionen.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''-'''|| '''-'''|| '''SE'''|| '''SM'''|| '''ISC11'''|| '''ISC10'''|| '''ISC01'''|| '''ISC00'''<br />
|- <br />
! R/W<br />
| R || R || R/W || R/W || R/W || R/W || R/W || R/W<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
<br />
|}<br />
<br />
'''SE''' ('''S'''leep '''E'''nable)<br />
:Dieses Bit muss gesetzt sein, um den Controller mit dem '''SLEEP'''-Befehl in den Schlafzustand versetzen zu können.<br />
:Um den Schlafmodus nicht irrtümlich einzuschalten, wird empfohlen, das Bit erst unmittelbar vor Ausführung des '''SLEEP'''-Befehls zu setzen.<br />
<br />
'''SM''' ('''S'''leep '''M'''ode)<br />
:Dieses Bit bestimmt über den Schlafmodus.<br />
:Ist das Bit gelöscht, so wird der '''Idle'''-Modus ausgeführt. Ist das Bit gesetzt, so wird der '''Power-Down'''-Modus ausgeführt. (für andere AVR Controller siehe Abschnitt "Sleep-Mode")<br />
<br />
'''ISC11''', '''ISC10''' ('''I'''nterrupt '''S'''ense '''C'''ontrol '''1''' Bits)<br />
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am '''INT1'''-Pin ausgewertet wird.<br />
<br />
:{| class="wikitable"<br />
|- <br />
!width="10%"| ISC11 ||width="10%"| ISC10 || Bedeutung<br />
|- <br />
| align="center" | 0<br />
| align="center" | 0<br />
| Low Level an '''INT1''' erzeugt einen Interrupt.<br />
<br />
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.<br />
|- <br />
| align="center" | 0<br />
| align="center" | 1<br />
| Reserviert<br />
|- <br />
| align="center" | 1<br />
| align="center" | 0<br />
| Die fallende Flanke an '''INT1''' erzeugt einen Interrupt.<br />
|- <br />
| align="center" | 1<br />
| align="center" | 1<br />
| Die steigende Flanke an '''INT1''' erzeugt einen Interrupt.<br />
|}<br />
<br />
'''ISC01''', '''ISC00''' ('''I'''nterrupt '''S'''ense '''C'''ontrol '''0''' Bits)<br />
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am '''INT0'''-Pin ausgewertet wird.<br />
<br />
:{| class="wikitable"<br />
|- <br />
!width="10%"| ISC01 ||width="10%"| ISC00 || Bedeutung<br />
|- <br />
| align="center" | 0<br />
| align="center" | 0<br />
| Low Level an '''INT0''' erzeugt einen Interrupt.<br />
<br />
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.<br />
|- <br />
| align="center" | 0<br />
| align="center" | 1<br />
| Reserviert<br />
|- <br />
| align="center" | 1<br />
| align="center" | 0<br />
| Die fallende Flanke an '''INT0''' erzeugt einen Interrupt.<br />
|- <br />
| align="center" | 1<br />
| align="center" | 1<br />
| Die steigende Flanke an '''INT0''' erzeugt einen Interrupt.<br />
|}<br />
<br />
|}<br />
<br />
== Allgemeines über die Interrupt-Abarbeitung ==<br />
<br />
Wenn ein Interrupt eintrifft, wird automatisch das '''Global Interrupt Enable''' Bit im Status Register '''SREG''' gelöscht und alle weiteren Interrupts unterbunden. Dieses wird automatisch wieder gesetzt, wenn die Interruptroutine beendet wird. Wenn in der Zwischenzeit weitere Interrupts eintreffen, werden die zugehörigen Interrupt-Bits gesetzt und die Interrupts bei Beendigung der laufenden Interrupt-Routine in der Reihenfolge ihrer Priorität ausgeführt. Dies kann<br />
eigentlich nur dann zu Problemen führen, wenn ein hoch priorisierter Interrupt ständig und in kurzer Folge auftritt. Dieser sperrt dann möglicherweise alle anderen Interrupts mit niedrigerer Priorität. Dies ist einer der Gründe, weshalb die Interrupt-Routinen sehr kurz gehalten werden sollen. Es ist möglich das GIE-Bit in der ISR zu setzen und so schon wieder weitere Interrupts zuzulassen - allerdings sollte man damit vorsichtig sein und genau wissen was man damit macht. Kritisch wird es vor allem wenn der gleiche Interrupt noch einmal kommt, bevor die ISR abgearbeitet ist. <br />
<br />
<!-- === Das Status-Register ===<br />
<br />
Es gilt auch zu beachten, dass das Status-Register während der Abarbeitung einer Interruptroutine nicht automatisch gesichert wird. Falls notwendig, muss dies vom Programmierer selber vorgesehen werden. --><br />
<br />
== Interrupts mit avr-gcc ==<br />
<br />
<!-- ''Anmerkung eines Nutzers: Ich habe mir das Thema hier angearbeitet und hatte am Anfang starke Probleme: Jeder Interrupt muss nochmals einzeln aktiviert werden. Es reicht nicht nur per ''sei()'' die Interrupts global zu aktiveren.'' - mthomas: Hoffentlich duch die modifizerte Einleitung etwas offensichtlicher erläutert. Ansonsten bitte per Eintrag auf die Diskussionseite nochmals melden) --> <br />
<!-- Selbstverständlich können alle interruptspezifischen Registerzugriffe wie gewohnt über I/O-Adressierung vorgenommen werden. Etwas einfacher geht es jedoch, wenn wir die vom Compiler zur Verfügung gestellten Mittel einsetzen.--><br />
Funktionen zur Interrupt-Verarbeitung werden in den Includedateien ''interrupt.h'' der avr-libc zur Verfügung gestellt (bei älterem Quellcode zusätzlich ''signal.h'').<br />
<br />
<syntaxhighlight lang="c"><br />
// fuer sei(), cli() und ISR():<br />
#include <avr/interrupt.h><br />
</syntaxhighlight><br />
<br />
Das Makro '''sei()''' schaltet die Interrupts ein. Eigentlich wird nichts anderes gemacht, als das '''Global Interrupt Enable''' Bit im Status Register gesetzt.<br />
<br />
<syntaxhighlight lang="c"><br />
sei();<br />
</syntaxhighlight><br />
<br />
Das Makro '''cli()''' schaltet die Interrupts aus, oder anders gesagt, das '''Global Interrupt Enable''' Bit im Status Register wird gelöscht.<br />
<br />
<syntaxhighlight lang="c"><br />
cli();<br />
</syntaxhighlight><br />
<br />
Oft steht man vor der Aufgabe, dass eine Codesequenz nicht unterbrochen werden darf. Es liegt dann nahe, zu Beginn dieser Sequenz ein cli() und am Ende ein sei() einzufügen. Dies ist jedoch ungünstig, wenn die Interrupts vor Aufruf der Sequenz deaktiviert waren und danach auch weiterhin deaktiviert bleiben sollen. Ein sei() würde ungeachtet des vorherigen Zustands die Interrupts aktivieren, was zu unerwünschten Seiteneffekten führen kann. Die aus dem folgenden Beispiel ersichtliche Vorgehensweise ist in solchen Fällen vorzuziehen:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
#include <inttypes.h><br />
<br />
//...<br />
<br />
void NichtUnterbrechenBitte(void)<br />
{<br />
uint8_t tmp_sreg; // temporaerer Speicher fuer das Statusregister<br />
<br />
tmp_sreg = SREG; // Statusregister (also auch das I-Flag darin) sichern<br />
cli(); // Interrupts global deaktivieren<br />
<br />
/* hier "unterbrechnungsfreier" Code */<br />
<br />
/* Beispiel Anfang<br />
JTAG-Interface eines ATmega16 per Software deaktivieren <br />
und damit die JTAG-Pins an PORTC für "general I/O" nutzbar machen<br />
ohne die JTAG-Fuse-Bit zu aendern. Dazu ist eine "timed sequence"<br />
einzuhalten (vgl Datenblatt ATmega16, Stand 10/04, S. 229): <br />
Das JTD-Bit muss zweimal innerhalb von 4 Taktzyklen geschrieben <br />
werden. Ein Interrupt zwischen den beiden Schreibzugriffen wuerde <br />
die erforderliche Sequenz "brechen", das JTAG-Interface bliebe<br />
weiterhin aktiv und die IO-Pins weiterhin für JTAG reserviert. */<br />
<br />
MCUCSR |= (1<<JTD);<br />
MCUCSR |= (1<<JTD); // 2 mal in Folge ,vgl. Datenblatt fuer mehr Information<br />
<br />
/* Beispiel Ende */<br />
<br />
SREG = tmp_sreg; // Status-Register wieder herstellen <br />
// somit auch das I-Flag auf gesicherten Zustand setzen<br />
}<br />
<br />
void NichtSoGut(void)<br />
{<br />
cli();<br />
<br />
/* hier "unterbrechnungsfreier" Code */<br />
<br />
sei();<br />
}<br />
<br />
<br />
int main(void)<br />
{<br />
//...<br />
<br />
cli(); <br />
// Interrupts global deaktiviert <br />
<br />
NichtUnterbrechenBitte();<br />
// auch nach Aufruf der Funktion deaktiviert<br />
<br />
sei();<br />
// Interrupts global aktiviert <br />
<br />
NichtUnterbrechenBitte();<br />
// weiterhin aktiviert<br />
//...<br />
<br />
/* Verdeutlichung der unguenstigen Vorgehensweise mit cli/sei: */<br />
cli(); <br />
// Interrupts jetzt global deaktiviert <br />
<br />
NichtSoGut();<br />
// nach Aufruf der Funktion sind Interrupts global aktiviert <br />
// dies ist mglw. ungewollt!<br />
//...<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<!-- mt: besser so nicht(?), lieber "datenblattkonform"<br />
<br />
<font face="Courier New">'''timer_enable_int (unsigned char ints);<br /><br />
'''</font>Schaltet Timerbezogene Interrupts ein bzw. aus.<br /><br />
Wenn als Argument '''ints''' der Wert 0 übergeben wird so werden alle<br />
Timerinterrupts ausgeschaltet, ansonsten muss in '''ints''' angegeben werden,<br />
welche Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu<br />
setzenden Bits definiert werden.<br /><br />
Beispiel: '''<font face="Courier New">timer_enable_int (1 << TOIE1));<br /><br />
</font>'''Achtung: Wenn ein Timerinterrupt eingeschaltet wird während ein<br />
anderer Timerinterrupt bereits läuft, dann müssen beide Bits angegeben werden<br />
sonst wird der andere Timerinterrupt versehentlich ausgeschaltet.<br />
<br />
<font face="Courier New">'''enable_external_int (unsigned char ints);<br /><br />
'''</font>Schaltet die externen Interrupts ein bzw. aus.<br /><br />
Wenn als Argument '''ints''' der Wert 0 übergeben wird so werden alle externen<br />
Interrrups ausgeschaltet, ansonsten muss in '''ints''' angegeben werden, welche<br />
Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu<br />
setzenden Bits definiert werden.<br /><br />
Beispiel: '''<font face="Courier New">enable_external_int ((1<<br />
</font>'''Schaltet die externen Interrupts 0 und 1 ein.<br />
<br />
Nachdem nun die Interrupts aktiviert sind, braucht es selbstverständlich noch den auszuführenden Code, der ablaufen soll, wenn ein Interrupt eintrifft.<br />
--><br />
Zu den aktivierten Interrupts ist eine Funktion zu programmieren, deren Code aufgerufen wird, wenn der betreffende Interrupt auftritt (Interrupt-Handler, Interrupt-Service-Routine). Dazu existiert die Definition (ein Makro) '''ISR'''.<br />
<br />
=== ISR ===<br />
<br />
(''ISR()'' ersetzt bei neueren Versionen der avr-libc ''SIGNAL()''. SIGNAL sollte nicht mehr genutzt werden, zur Portierung von SIGNAL nach ISR siehe den [[AVR-GCC-Tutorial#Anhang|Anhang]].)<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
//...<br />
ISR(Vectorname) /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */<br />
{<br />
/* Interrupt Code */<br />
}<br />
</syntaxhighlight><br />
<br />
Mit ''ISR'' wird eine Funktion für die Bearbeitung eines Interrupts eingeleitet. Als Argument muss dabei die Benennung des entsprechenden Interruptvektors angegeben werden. Diese sind in den jeweiligen Includedateien IOxxxx.h zu finden. Die Bezeichnung entspricht dem Namen aus dem Datenblatt, bei dem die Leerzeichen durch Unterstriche ersetzt sind und ein ''_vect'' angehängt ist.<br />
<br />
Als Beispiel ein Ausschnitt aus der Datei für den ATmega8 (bei WinAVR Standardinstallation in C:\WinAVR\avr\include\avr\iom8.h) in der neben den aktuellen Namen für ''ISR'' (*_vect) noch die Bezeichnungen für das inzwischen nicht mehr aktuelle ''SIGNAL'' (SIG_*) enthalten sind.<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
/* $Id: iom8.h,v 1.13 2005/10/30 22:11:23 joerg_wunsch Exp $ */<br />
<br />
/* avr/iom8.h - definitions for ATmega8 */<br />
//...<br />
<br />
/* Interrupt vectors */<br />
<br />
/* External Interrupt Request 0 */<br />
#define INT0_vect _VECTOR(1)<br />
#define SIG_INTERRUPT0 _VECTOR(1)<br />
<br />
/* External Interrupt Request 1 */<br />
#define INT1_vect _VECTOR(2)<br />
#define SIG_INTERRUPT1 _VECTOR(2)<br />
<br />
/* Timer/Counter2 Compare Match */<br />
#define TIMER2_COMP_vect _VECTOR(3)<br />
#define SIG_OUTPUT_COMPARE2 _VECTOR(3)<br />
<br />
/* Timer/Counter2 Overflow */<br />
#define TIMER2_OVF_vect _VECTOR(4)<br />
#define SIG_OVERFLOW2 _VECTOR(4)<br />
<br />
/* Timer/Counter1 Capture Event */<br />
#define TIMER1_CAPT_vect _VECTOR(5)<br />
#define SIG_INPUT_CAPTURE1 _VECTOR(5)<br />
<br />
/* Timer/Counter1 Compare Match A */<br />
#define TIMER1_COMPA_vect _VECTOR(6)<br />
#define SIG_OUTPUT_COMPARE1A _VECTOR(6)<br />
<br />
/* Timer/Counter1 Compare Match B */<br />
#define TIMER1_COMPB_vect _VECTOR(7)<br />
#define SIG_OUTPUT_COMPARE1B _VECTOR(7)<br />
<br />
//...<br />
</syntaxhighlight><br />
<br />
<!--Vor Nutzung von SIGNAL muss ebenfalls die Header-Datei signal.h eingebunden werden.--> <br />
Mögliche Funktionsrümpfe für Interruptfunktionen sind zum Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
/* veraltet: #include <avr/signal.h> */<br />
<br />
ISR(INT0_vect) /* veraltet: SIGNAL(SIG_INTERRUPT0) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
ISR(TIMER0_OVF_vect) /* veraltet: SIGNAL(SIG_OVERFLOW0) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
ISR(USART_RXC_vect) /* veraltet: SIGNAL(SIG_UART_RECV) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
// und so weiter und so fort...<br />
</syntaxhighlight><br />
<br />
Auf die korrekte Schreibweise der Vektorbezeichnung ist zu achten. Der gcc-Compiler prüft erst ab Version 4.x, ob ein Signal/Interrupt der angegebenen Bezeichnung tatsächlich in der Includedatei definiert ist und gibt andernfalls eine Warnung aus. Bei WinAVR (ab 2/2005) wurde die Überprüfung auch in den mitgelieferten Compiler der Version 3.x integriert. Aus dem gcc-Quellcode Version 3.x selbst erstellte Compiler enthalten die Prüfung nicht (vgl. [[AVR-GCC]]). <br />
<br />
Während der Ausführung der Funktion sind alle weiteren Interrupts automatisch gesperrt. Beim Verlassen der Funktion werden die Interrupts wieder zugelassen.<br />
<br />
Sollte während der Abarbeitung der Interruptroutine ein weiterer Interrupt (gleiche oder andere Interruptquelle) auftreten, so wird das entsprechende Bit im zugeordneten Interrupt Flag Register gesetzt und die entsprechende Interruptroutine automatisch nach dem Beenden der aktuellen Funktion aufgerufen.<br />
<br />
Ein Problem ergibt sich eigentlich nur dann, wenn während der Abarbeitung der aktuellen Interruptroutine mehrere gleichartige Interrupts auftreten. Die entsprechende Interruptroutine wird im Nachhinein zwar aufgerufen jedoch wissen wir nicht, ob nun der entsprechende Interrupt einmal, zweimal oder gar noch öfter aufgetreten ist. Deshalb soll hier noch einmal betont werden, dass Interruptroutinen so schnell wie nur irgend möglich wieder verlassen werden sollten.<br />
<br />
=== Unterbrechbare Interruptroutinen ===<br />
<br />
"Faustregel": im Zweifel '''ISR'''. Die nachfolgend beschriebene Methode nur dann verwenden, wenn man sich über die unterschiedliche Funktionsweise im Klaren ist.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
<br />
ISR(XXX,ISR_NOBLOCK) /* veraltet: INTERRUPT(SIG_OVERFLOW0) */<br />
{<br />
/* Interrupt-Code */<br />
}<br />
</syntaxhighlight><br />
<br />
Hierbei steht XXX für den oben beschriebenen Namen des Vektors (also z.&nbsp;B. ''TIMER0_OVF_vect''). Der Unterschied im Vergleich zu einer herkömmlichen ISR ist, dass hier beim Aufrufen der Funktion das '''Global Enable Interrupt''' Bit durch Einfügen einer SEI-Anweisung direkt wieder gesetzt und somit alle Interrupts zugelassen werden &ndash; auch XXX-Interrupts. <br />
<br />
Bei unsachgemässer Handhabung kann dies zu erheblichen Problemen durch Rekursion wie einem Stack-Overflow oder anderen unerwarteten Effekten führen und sollte wirklich nur dann eingesetzt werden, wenn man sich sicher ist, das Ganze auch im Griff zu haben.<br />
<br />
Insbesondere sollte möglichst am ISR-Anfang die auslösende IRQ-Quelle deaktiviert und erst am Ende der ISR wieder aktiviert werden. Robuster als die Verwendung einer NOBLOCK-ISR ist daher folgender ISR-Aufbau:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
<br />
ISR (XXX) <br />
{<br />
// Implementiere die ISR ohne zunaechst weitere IRQs zuzulassen<br />
<br />
<<Deaktiviere die XXX-IRQ>><br />
<br />
// Erlaube alle Interrupts (ausser XXX)<br />
sei();<br />
<br />
//... Code ...<br />
<br />
// IRQs global deaktivieren um die XXX-IRQ wieder gefahrlos <br />
// aktivieren zu koennen<br />
cli();<br />
<br />
<<Aktiviere die XXX-IRQ>><br />
}<br />
</syntaxhighlight><br />
Auf diese Weise kann sich die XXX-IRQ nicht selbst unterbrechen, was zu einer Art Endlosschleife führen würde.<br />
<br />
Siehe auch: Hinweise in [[AVR-GCC]]<br />
<br />
siehe dazu: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html<br />
<br />
== Datenaustausch mit Interrupt-Routinen ==<br />
<br />
Variablen, die sowohl in Interrupt-Routinen (ISR = Interrupt Service Routine(s)) als auch vom übrigen Programmcode geschrieben oder gelesen werden, müssen mit einem '''volatile''' deklariert werden. Damit wird dem Compiler mitgeteilt, dass der Inhalt der Variablen vor jedem Lesezugriff aus dem Speicher gelesen und nach jedem Schreibzugriff in den Speicher geschrieben wird. Ansonsten könnte der Compiler den Code so optimieren, dass der Wert der Variablen nur in Prozessorregistern zwischengespeichert wird, die nichts von der Änderung woanders mitbekommen.<br />
<br />
Zur Veranschaulichung ein Codefragment für eine Tastenentprellung mit Erkennung einer "lange gedrückten" Taste.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
#include <stdint.h><br />
//...<br />
<br />
// Schwellwerte<br />
// Entprellung: <br />
#define CNTDEBOUNCE 10<br />
// "lange gedrueckt:"<br />
#define CNTREPEAT 200<br />
<br />
// hier z.&nbsp;B. Taste an Pin2 PortA "active low" = 0 wenn gedrueckt<br />
#define KEY_PIN PINA<br />
#define KEY_PINNO PA2<br />
<br />
// beachte: volatile! <br />
volatile uint8_t gKeyCounter;<br />
<br />
// Timer-Compare Interrupt ISR, wird z.B. alle 10ms ausgefuehrt<br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
// hier wird gKeyCounter veraendert. Die übrigen<br />
// Programmteile müssen diese Aenderung "sehen":<br />
// volatile -> aktuellen Wert immer in den Speicher schreiben<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
if (gKeyCounter < CNTREPEAT) gKeyCounter++;<br />
}<br />
else {<br />
gKeyCounter = 0;<br />
}<br />
}<br />
<br />
//...<br />
<br />
int main(void)<br />
{<br />
//...<br />
/* hier: Initialisierung der Ports und des Timer-Interrupts */<br />
//... <br />
// hier wird auf gKeyCounter zugegriffen. Dazu muss der in der<br />
// ISR geschriebene Wert bekannt sein:<br />
// volatile -> aktuellen Wert immer aus dem Speicher lesen<br />
if ( gKeyCounter > CNTDEBOUNCE ) { // Taste mind. 10*10 ms "prellfrei"<br />
if (gKeyCounter == CNTREPEAT) {<br />
/* hier: Code fuer "Taste lange gedrueckt" */<br />
}<br />
else {<br />
/* hier: Code fuer "Taste kurz gedrueckt" */<br />
}<br />
}<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Wird innerhalb einer ISR mehrfach auf eine mit volatile deklarierte Variable zugegriffen, wirkt sich dies ungünstig auf die Verarbeitungsgeschwindigkeit aus, da bei jedem Zugriff mit dem Speicherinhalt abgeglichen wird. Da bei AVR-Controllern ''innerhalb'' einer ISR keine Unterbrechungen zu erwarten sind, bietet es sich an, einen Zwischenspeicher in Form einer lokalen Variable zu verwenden, deren Inhalt zu Beginn und am Ende mit dem der volatile Variable synchronisiert wird. Lokale Variable werden bei eingeschalteter Optimierung mit hoher Wahrscheinlichkeit in Prozessorregistern verwaltet und der Zugriff darauf ist daher nur mit wenigen internen Operationen verbunden. Die ISR aus dem vorherigen Beispiel lässt sich so optimieren:<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
uint8_t tmp_kc;<br />
<br />
tmp_kc = gKeyCounter; // Uebernahme in lokale Arbeitsvariable<br />
<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
if (tmp_kc < CNTREPEAT) {<br />
tmp_kc++;<br />
}<br />
}<br />
else {<br />
tmp_kc = 0;<br />
}<br />
<br />
gKeyCounter = tmp_kc; // Zurueckschreiben<br />
}<br />
//...<br />
</syntaxhighlight><br />
<br />
Zum Vergleich die Disassemblies (Ausschnitte der "lss-Dateien", compiliert für ATmega162) im Anschluss. Man erkennt den viermaligen Zugriff auf die Speicheraddresse von ''gKeyCounter'' (hier 0x032A) in der ISR ohne "Cache"-Variable und den zweimaligen Zugriff in der Variante mit Zwischenspeicher. Im Beispiel ist der Vorteil gering, bei komplexeren Routinen kann die Zwischenspeicherung in lokalen Variablen jedoch zu deutlicheren Verbesserungen führen.<br />
<br />
<pre><br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
86a: 1f 92 push r1<br />
86c: 0f 92 push r0<br />
86e: 0f b6 in r0, 0x3f ; 63<br />
870: 0f 92 push r0<br />
872: 11 24 eor r1, r1<br />
874: 8f 93 push r24<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
876: ca 99 sbic 0x19, 2 ; 25<br />
878: 0a c0 rjmp .+20 ; 0x88e <__vector_13+0x24><br />
if (gKeyCounter < CNTREPEAT) gKeyCounter++;<br />
87a: 80 91 2a 03 lds r24, 0x032A<br />
87e: 88 3c cpi r24, 0xC8 ; 200 <br />
880: 40 f4 brcc .+16 ; 0x892 <__vector_13+0x28><br />
882: 80 91 2a 03 lds r24, 0x032A<br />
886: 8f 5f subi r24, 0xFF ; 255<br />
888: 80 93 2a 03 sts 0x032A, r24<br />
88c: 02 c0 rjmp .+4 ; 0x892 <__vector_13+0x28><br />
}<br />
else {<br />
gKeyCounter = 0;<br />
88e: 10 92 2a 03 sts 0x032A, r1<br />
892: 8f 91 pop r24<br />
894: 0f 90 pop r0<br />
896: 0f be out 0x3f, r0 ; 63<br />
898: 0f 90 pop r0<br />
89a: 1f 90 pop r1<br />
89c: 18 95 reti<br />
</pre><br />
<br />
<pre><br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
86a: 1f 92 push r1<br />
86c: 0f 92 push r0<br />
86e: 0f b6 in r0, 0x3f ; 63<br />
870: 0f 92 push r0<br />
872: 11 24 eor r1, r1<br />
874: 8f 93 push r24<br />
uint8_t tmp_kc;<br />
<br />
tmp_kc = gKeyCounter;<br />
876: 80 91 2a 03 lds r24, 0x032A<br />
<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
87a: ca 9b sbis 0x19, 2 ; 25<br />
87c: 02 c0 rjmp .+4 ; 0x882 <__vector_13+0x18><br />
87e: 80 e0 ldi r24, 0x00 ; 0<br />
880: 03 c0 rjmp .+6 ; 0x888 <__vector_13+0x1e><br />
if (tmp_kc < CNTREPEAT) {<br />
882: 88 3c cpi r24, 0xC8 ; 200<br />
884: 08 f4 brcc .+2 ; 0x888 <__vector_13+0x1e><br />
tmp_kc++;<br />
886: 8f 5f subi r24, 0xFF ; 255<br />
}<br />
}<br />
else {<br />
tmp_kc = 0;<br />
}<br />
<br />
gKeyCounter = tmp_kc;<br />
888: 80 93 2a 03 sts 0x032A, r24<br />
88c: 8f 91 pop r24<br />
88e: 0f 90 pop r0<br />
890: 0f be out 0x3f, r0 ; 63<br />
892: 0f 90 pop r0<br />
894: 1f 90 pop r1<br />
896: 18 95 reti<br />
</pre><br />
<br />
=== volatile und Pointer ===<br />
<br />
Bei '''volatile''' in Verbindung mit Pointern ist zu beachten, ob der Pointer selbst oder die Variable, auf die der Pointer zeigt, '''volatile''' ist.<br />
<br />
<syntaxhighlight lang="c"><br />
volatile uint8_t *a; // das Ziel von a ist volatile<br />
<br />
uint8_t *volatile a; // a selbst ist volatile<br />
</syntaxhighlight><br />
<br />
Falls der Pointer volatile ist (zweiter Fall im Beispiel), ist zu beachten, dass der Wert des Pointers, also eine Speicheradresse, intern in mehr als einem Byte verwaltet wird. Lese- und Schreibzugriffe im Hauptprogramm (außerhalb von Interrupt-Routinen) sind daher so zu implementieren, dass alle Teilbytes der Adresse konsistent bleiben, vgl. dazu den folgenden Abschnitt.<br />
<br />
=== Variablen größer 1 Byte ===<br />
<br />
Bei Variablen größer ein Byte, auf die in Interrupt-Routinen und im Hauptprogramm zugegriffen wird, muss darauf geachtet werden, dass die Zugriffe auf die einzelnen Bytes außerhalb der ISR nicht durch einen Interrupt unterbrochen werden. (Allgemeinplatz: AVRs sind 8-bit Controller). Zur Veranschaulichung ein Codefragment:<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
volatile uint16_t gMyCounter16bit;<br />
//...<br />
ISR(...)<br />
{<br />
//...<br />
gMyCounter16Bit++;<br />
//...<br />
}<br />
<br />
int main(void)<br />
{<br />
uint16_t tmpCnt;<br />
//...<br />
// nicht gut: Mglw. hier ein Fehler, wenn ein Byte von MyCounter <br />
// schon in tmpCnt kopiert ist aber vor dem Kopieren des zweiten Bytes <br />
// ein Interrupt auftritt, der den Inhalt von MyCounter verändert.<br />
tmpCnt = gMyCounter16bit; <br />
<br />
<br />
// besser: Änderungen "außerhalb" verhindern -> alle "Teilbytes"<br />
// bleiben konsistent<br />
cli(); // Interrupts deaktivieren<br />
tmpCnt = gMyCounter16Bit;<br />
sei(); // wieder aktivieren<br />
<br />
// oder: vorheriger Status des globalen Interrupt-Flags bleibt erhalten<br />
uint8_t sreg_tmp;<br />
sreg_tmp = SREG; /* Sichern */<br />
cli()<br />
tmpCnt = gMyCounter16Bit;<br />
SREG = sreg_tmp; /* Wiederherstellen */<br />
<br />
// oder: mehrfach lesen, bis man konsistente Daten hat<br />
uint16_t count1 = gMyCounter16Bit;<br />
uint16_t count2 = gMyCounter16Bit;<br />
while (count1 != count2) {<br />
count1 = count2;<br />
count2 = gMyCounter16Bit;<br />
}<br />
tmpCnt = count1;<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Die avr-libc bietet ab Version 1.6.0(?) einige Hilfsfunktionen/Makros, mit der im Beispiel oben gezeigten Funktionalität, die zusätzlich auch sogenannte [http://en.wikipedia.org/wiki/Memory_barrier memory barriers] beinhalten. Diese stehen nach #include <util/atomic.h> zur Verfügung.<br />
<syntaxhighlight lang="c"><br />
//...<br />
#include <util/atomic.h><br />
//...<br />
<br />
// analog zu cli, Zugriff, sei:<br />
ATOMIC_BLOCK(ATOMIC_FORCEON) {<br />
tmpCnt = gMyCounter16Bit;<br />
}<br />
<br />
// oder:<br />
<br />
// analog zu Sicherung des SREG, cli, Zugriff und Zurückschreiben des SREG:<br />
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />
tmpCnt = gMyCounter16Bit;<br />
}<br />
<br />
//...<br />
</syntaxhighlight><br />
<br />
* siehe auch [http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html Dokumentation der avr-libc zu atomic.h]<br />
<br />
== Interrupt-Routinen und Registerzugriffe ==<br />
<br />
Falls Register sowohl im Hauptprogramm als auch in Interrupt-Routinen verändert werden, ist darauf zu achten, dass diese Zugriffe sich nicht überlappen. Nur wenige Anweisungen lassen sich in sogenannte "atomare" Zugriffe übersetzen, die nicht von Interrupt-Routinen unterbrochen werden können. <br />
<br />
Zur Veranschaulichung eine Anweisung, bei der ein Bit und im Anschluss drei Bits in einem Register gesetzt werden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
int main(void)<br />
{<br />
//...<br />
PORTA |= (1<<PA0);<br />
<br />
PORTA |= (1<<PA2)|(1<<PA3)|(1<<PA4);<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Der Compiler übersetzt diese Anweisungen für einen ATmega128 bei Optimierungsstufe "S" nach:<br />
<br />
<div class="code"><pre><br />
...<br />
PORTA |= (1<<PA0);<br />
d2: d8 9a sbi 0x1b, 0 ; 27 (a)<br />
<br />
PORTA |= (1<<PA2)|(1<<PA3)|(1<<PA4);<br />
d4: 8b b3 in r24, 0x1b ; 27 (b)<br />
d6: 8c 61 ori r24, 0x1C ; 28 (c)<br />
d8: 8b bb out 0x1b, r24 ; 27 (d)<br />
...<br />
</pre></div><br />
<br />
Das Setzen des einzelnen Bits wird bei eingeschalteter Optimierung für Register im unteren Speicherbereich in eine einzige Assembler-Anweisung (sbi) übersetzt und ist nicht anfällig für Unterbrechungen durch Interrupts. Die Anweisung zum Setzen von drei Bits wird jedoch in drei abhängige Assembler-Anweisungen übersetzt und bietet damit zwei "Angriffspunkte" für Unterbrechungen. Eine Interrupt-Routine könnte nach dem Laden des Ausgangszustands in den Zwischenspeicher (hier Register 24) den Wert des Registers ändern, z.&nbsp;B. ein Bit löschen. Damit würde der Zwischenspeicher nicht mehr mit dem tatsächlichen Zustand übereinstimmen aber dennoch nach der Bitoperation (hier ori) in das Register zurückgeschrieben. <br />
<br />
Beispiel: PORTA sei anfangs 0b00000000. Die erste Anweisung (a) setzt Bit 0 auf '''1''', PORTA ist danach 0b0000000'''1'''. Nun wird im ersten Teil der zweiten Anweisung der Portzustand in ein Register eingelesen (b). Unmittelbar darauf (vor (c)) "feuert" ein Interrupt, in dessen Interrupt-Routine Bit 0 von PORTA gelöscht wird. Nach Verlassen der Interrupt-Routine hat PORTA den Wert 0b00000000. In den beiden noch folgenden Anweisungen des Hauptprogramms wird nun der zwischengespeicherte "alte" Zustand 0b00000001 mit 0b00011100 logisch-'''ODER'''-verknüft (c) und das Ergebnis 0b00011101 in PortA geschrieben (d). Obwohl zwischenzeitlich Bit 0 gelöscht wurde, ist es nach (d) wieder gesetzt. <br />
<br />
Lösungsmöglichkeiten:<br />
* Register ohne besondere Vorkehrungen nicht in Interruptroutinen ''und'' im Hauptprogramm verändern.<br />
* Interrupts vor Veränderungen in Registern, die auch in ISRs verändert werden, deaktivieren ("cli").<br />
* Bits einzeln löschen oder setzen. sbi und cbi können nicht unterbrochen werden. Vorsicht: nur Register im unteren Speicherbereich sind mittels sbi/cbi ansprechbar. Der Compiler kann nur für diese sbi/cbi-Anweisungen generieren. Für Register außerhalb dieses Adressbereichs ("Memory-Mapped"-Register) werden auch zur Manipulation einzelner Bits abhängige Anweisungen erzeugt (lds,...,sts).<br />
<br />
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Frequently asked Questions/Fragen Nr. 1 und 8. (Stand: avr-libc Vers. 1.0.4)<br />
<br />
== Interruptflags löschen ==<br />
<br />
Beim Löschen von Interruptflags haben AVRs eine Besonderheit, die auch im Datenblatt beschrieben ist: Es wird zum Löschen eine 1 in das betreffende Bit geschrieben. <br />
<br />
Hinweis:<br /><br />
Bei Registern mit mehreren Interrupt-Flag-Bits (wie die Timer Interrupt Flag Register) '''nicht''' die übliche bitweise VerODERung nehmen, sondern eine direkte Zuweisung machen. Da sonst weitere Flags, als nur das gewünschte, ebenfalls gelöscht werden könnten.<br /><br />
([http://www.mikrocontroller.net/topic/171148#1640133 Erklärung]).<br />
<br />
== Was macht das Hauptprogramm? ==<br />
<br />
Im einfachsten (Ausnahme-)Fall gar nichts mehr. Es ist also durchaus denkbar, ein Programm zu schreiben, welches in der main-Funktion lediglich noch die Interrupts aktiviert und dann in einer Endlosschleife verharrt. Sämtliche Funktionen werden dann in den ISRs abgearbeitet. Diese Vorgehensweise ist jedoch bei den meisten Anwendungen schlecht: man verschenkt eine Verarbeitungsebene und hat außerdem möglicherweise Probleme durch Interruptroutinen, die zu viel Verarbeitungszeit benötigen.<br />
<br />
Normalerweise wird man in den Interruptroutinen nur die bei Auftreten des jeweiligen Interruptereignisses unbedingt notwendigen Operationen ausführen lassen. Alle weniger kritischen Aufgaben werden dann im Hauptprogramm abgearbeitet.<br />
<br />
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Interrupts and Signals<br />
<br />
= Sleep-Modes =<br />
<br />
AVR Controller verfügen über eine Reihe von sogenannten [[Sleep Mode |''Sleep-Modes'']] ("Schlaf-Modi"). Diese ermöglichen es, Teile des Controllers abzuschalten. Zum Einen kann damit besonders bei Batteriebetrieb Strom gespart werden, zum Anderen können Komponenten des Controllers deaktiviert werden, die die Genauigkeit des Analog-Digital-Wandlers bzw. des Analog-Comparators negativ beeinflussen. Der Controller wird durch Interrupts aus dem Schlaf geweckt. Welche Interrupts den jeweiligen Schlafmodus beenden, ist einer Tabelle im Datenblatt des jeweiligen Controllers zu entnehmen.<br />
Die Funktionen (eigentlich Makros) der avr-libc stehen nach Einbinden der header-Datei ''sleep.h'' zur Verfügung.<br />
<br />
;set_sleep_mode (uint8_t mode): Setzt den Schlafmodus, der bei Aufruf von sleep() aktiviert wird. In sleep.h sind einige Konstanten definiert (z.&nbsp;B. SLEEP_MODE_PWR_DOWN). Die definierten Modi werden jedoch nicht alle von sämtlichten AVR-Controllern unterstützt.<br />
;sleep_enable(): Aktiviert den gesetzten Schlafmodus, versetzt den Controller aber noch nicht in den Schlafmodus<br />
;sleep_cpu(): Versetzt den Controller in den Schlafmodus .sleep_cpu wird im Prinzip durch die Assembler-Anweisung ''sleep'' ersetzt.<br />
;sleep_disable(): Deaktiviert den gesetzten Schlafmodus<br />
;sleep_mode(): Versetzt den Controller in den mit set_sleep_mode gewählten Schlafmodus. Das Makro entspricht sleep_enable()+sleep_cpu()+sleep_disable(), beinhaltet also nicht die Aktivierung von Interrupts (besser nicht benutzen).<br />
<br />
Bei Anwendung von sleep_cpu() müssen Interrupts also bereits freigeben sein (sei()), da der Controller sonst nicht mehr "aufwachen" kann. sleep_mode() ist nicht geeignet für die Verwendung in ISR Interrupt-Service-Routinen, da bei deren Abarbeitung Interrupts global deaktiviert sind und somit auch die möglichen "Aufwachinterrupts". Abhilfe: stattdessen sleep_enable(), sei(), sleep_cpu(), sleep_disable() und evtl. cli() verwenden (vgl. Dokumentation der avr-libc).<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/sleep.h><br />
<br />
int main(void)<br />
{<br />
...<br />
<br />
while (1) {<br />
...<br />
set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br />
sleep_mode();<br />
<br />
// Code hier wird erst nach Auftreten eines entsprechenden<br />
// "Aufwach-Interrupts" verarbeitet<br />
...<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
In älteren Versionenen der avr-libc wurden nicht alle AVR-Controller durch die sleep-Funktionen richtig angesteuert. Mit avr-libc 1.2.0 wurde die Anzahl der unterstützten Typen jedoch deutlich erweitert. Bei nicht-unterstützten Typen erreicht man die gewünschte Funktionalität durch direkte "[[Bitmanipulation]]" der entsprechenden Register (vgl. Datenblatt) und Aufruf des Sleep-Befehls via Inline-Assembler oder sleep_cpu():<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
// Sleep-Mode "Power-Save" beim ATmega169 "manuell" aktivieren<br />
SMCR = (3<<SM0) | (1<<SE);<br />
asm volatile ("sleep"::); // alternativ sleep_cpu() aus sleep.h<br />
...<br />
</syntaxhighlight><br />
<br />
== Sleep-Modi ==<br />
Die vielen Prozessoren aus der AVR-Familie unterstützen unterschiedliche Sleep-Modi, gefächert nach Vorhandensein von Funktionsblöcken im Controller. Konkrete und verläßliche Auskunft über die tatsächlichen Gegebenheiten finden sich wie immer in den jeweiligen Datenblättern. Die Modi unterscheiden sich darin, welche Funktionsbereiche zum Energiesparen abgeschaltet werden. Davon hängt auch ab, mit welchen Mitteln der Prozessor aus der jeweiligen Schlaftiefe wieder aufgeweckt werden kann.<br />
<br />
;Idle Mode (SLEEP_MODE_IDLE): Die CPU kann durch SPI, USART, Analog Comperator, ADC, TWI, Timer, Watchdog und irgendeinen anderen Interrupt wieder aufgeweckt werden.<br />
<br />
;ADC Noise Reduction Mode (SLEEP_MODE_ADC): In diesem Modus liegt das Hauptaugenmerk darauf, die CPU soweit stillzulegen, dass der ADC möglichst keine Störungen aus dem inneren der CPU auffangen kann, die das Meßergebnis negativ beeinflussen können. Das Aufwachen aus diesem Modus kann ausgelöst werden durch den ADC, externe Interrupts, TWI, Timer und Watchdog.<br />
<br />
;Power-Down Mode (SLEEP_MODE_PWR_DOWN): In diesem Modus wird ein externer Oszillator (Quarz, Quarzoszillator), wenn vorhanden. gestoppt. Geweckt werden kann die CPU durch einen externen Level-Interrupt, TWI, Watchdog, Brown-Out-Reset.<br />
<br />
;Power-Save-Mode (SLEEP_MODE_PWR_SAVE): Power-Save ist identisch zu Power-Down mit einer Ausnahme: Ist der Timer 2 auf die Verwendung eines externen Taktes konfiguriert, so läuft dieser Timer auch im Power-Save weiter und kann die CPU mit einem Interrupt aufwecken.<br />
<br />
;Standby-Mode (SLEEP_MODE_STANDBY, SLEEP_MODE_EXT_STANDBY): Voraussetzung für den Standby-Modus ist die Verwendung eines Quarzes oder eines Quarzoszillators, also einer externen Taktquelle. Ansonsten ist dieser Modus identisch zum Power-Down Modus. Vorteil dieses Modus' ist eine kürzere Aufwachzeit.<br />
<br />
;Abschalten des Brownout Detect (BOD) während der Sleep-Phase (nur P-Typen): Zur Stromersparnis bieten die P-Typen die Möglichkeit den BOD während der Sleep-Phase abzuschalten. Bei einem Atmega88PA beispielsweise, kann dadurch der Stromverbrauch im SLEEP_MODE_PWR_SAVE mit Timer2 im Asynchronmodus mit Uhrenquarz und periodischer Selbstaufweckung um ca. 50% gesenkt werden.<br />
Das Einschalten dieser Funktion geschieht in einer Timed Sequence.<br />
<br />
<syntaxhighlight lang="c"><br />
unsigned char temp0 = MCUCR;<br />
unsigned char temp1 = MCUCR;<br />
temp0 |= (1 << BODS) | (1 << BODSE);<br />
temp1 |= (1 << BODS);<br />
MCUCR = temp0;<br />
MCUCR = temp1;<br />
sleep_cpu();<br />
</syntaxhighlight><br />
<br />
Hierbei ist unbedingt zu beachten, dass das BODS-Bit 3 Takte nach dem Setzen wieder gelöscht wird. Daher muss der Aufruf des Sleep unmittelbar nach dem Setzen erfolgen und das BODS-Bit muss jedes Mal vor einem Sleep Aufruf erneut gesetzt werden.<br />
<br />
<br />
Siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Power Management and Sleep-Modes<br />
* [http://www.mikrocontroller.net/topic/96369#832712 Forenbeitrag] zur "Nichtverwendung" von sleep_mode in ISRs.<br />
<br />
= Zeiger =<br />
Zeiger (engl. ''Pointer'') sind Variablen, die die Adresse von Daten oder Funktionen enthalten und belegen 16 Bits. Die Größe hängt mit dem adressierbaren Speicherbereich zusammen und der GCC reserviert dann den entsprechenden Platz.<br />
Ggf. ist es also günstiger, Indizes auf Arrays (Listen) zu verwenden, so dass der GCC für die Zeigerarithmetik den erforderlichen RAM nur temporär benötigt.<br />
<br />
Siehe auch: [[Zeiger]]<br />
<br />
= Speicherzugriffe =<br />
<br />
Atmel AVR-Controller verfügen typisch über drei Speicher:<br />
<br />
* [[RAM]]: Im RAM (genauer statisches RAM/SRAM) wird vom gcc-Compiler Platz für Variablen reserviert. Auch der Stack befindet sich im RAM. Dieser Speicher ist "flüchtig", d.h. der Inhalt der Variablen geht beim Ausschalten oder einem Zusammenbruch der Spannungsversorgung verloren.<br />
<br />
* Programmspeicher: Ausgeführt als FLASH-Speicher, seitenweise wiederbeschreibbar. Darin ist das Anwendungsprogramm abgelegt.<br />
<br />
* [[EEPROM]]: Nichtflüchtiger Speicher, d.h. der einmal geschriebene Inhalt bleibt auch ohne Stromversorgung erhalten. Byte-weise schreib/lesbar. Im EEPROM werden typischerweise gerätespezifische Werte wie z.&nbsp;B. Kalibrierungswerte von Sensoren abgelegt.<br />
<br />
Einige AVRs besitzen keinen RAM-Speicher, lediglich die Register können als "Arbeitsvariablen"<br />
genutzt werden. Da die Anwendung des avr-gcc auf solch "kleinen" Controllern ohnehin selten sinnvoll ist und auch nur bei einigen RAM-losen Typen nach [http://lightner.net/avr/ATtinyAvrGcc.html "Bastelarbeiten"] möglich ist, werden diese Controller hier nicht weiter berücksichtigt. Auch EEPROM-Speicher ist nicht auf allen Typen verfügbar. Generell sollten die nachfolgenden Erläuterungen auf alle ATmega-Controller und die größeren AT90-Typen übertragbar sein. Für die Typen ATtiny2313, ATtiny26 und viele weitere der "ATtiny-Reihe" gelten die Ausführungen ebenfalls.<br />
<br />
Siehe auch:<br />
* [[Binäre Daten zum Programm hinzufügen]]<br />
== RAM ==<br />
<br />
Die Verwaltung des RAM-Speichers erfolgt durch den Compiler, im Regelfall ist beim Zugriff auf Variablen im RAM nichts Besonderes zu beachten. Die Erläuterungen in jedem brauchbaren C-Buch gelten auch für den vom avr-gcc-Compiler erzeugten Code.<br />
<br />
Um Speicher dynamisch (während der Laufzeit) zu reservieren, kann '''malloc()''' verwendet werden. malloc(size) "alloziert" (~reserviert) einen gewissen Speicherblock mit '''size''' Bytes. Ist kein Platz für den neuen Block, wird NULL (0) zurückgegeben.<br />
<br />
Wird der angelegte Block zu klein (groß), kann die Größe mit realloc() verändert werden. Den allozierten Speicherbereich kann man mit free() wieder freigeben. Wenn das Freigeben eines Blocks vergessen wird spricht man von einem "Speicherleck" (memory leak).<br />
<br />
malloc() legt Speicherblöcke im '''Heap''' an, belegt man zuviel Platz, dann wächst der Heap zu weit nach oben und überschreibt den Stack, und der Controller kommt in Teufels Küche. Das kann leider nicht nur passieren wenn man insgesamt zu viel Speicher anfordert, sondern auch wenn man Blöcke unterschiedlicher Größe in ungünstiger Reihenfolge alloziert/freigibt (siehe Artikel [[Heap-Fragmentierung]]). Aus diesem Grund sollte man malloc() auf Mikrocontrollern sehr sparsam (am besten gar nicht) verwenden.<br />
<br />
Beispiel zur Verwendung von malloc():<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
<br />
void foo(void) {<br />
// neuen speicherbereich anlegen,<br />
// platz für 10 uint16<br />
uint16_t* pBuffer = malloc(10 * sizeof(uint16_t));<br />
<br />
// darauf zugreifen, als wärs ein gewohnter Buffer<br />
pBuffer[2] = 5;<br />
<br />
// Speicher (unbedingt!) wieder freigeben<br />
free(pBuffer);<br />
}<br />
</syntaxhighlight><br />
<br />
Wenn (wie in obigem Beispiel) dynamischer Speicher nur für die Dauer einer Funktion benötigt und am Ende wieder freigegeben wird, bietet es sich an, statt malloc() '''alloca()''' zu verwenden. Der Unterschied zu malloc() ist, dass der Speicher auf dem Stack reserviert wird, und beim Verlassen der Funktion automatisch wieder freigegeben wird. Es kann somit kein Speicherleck und keine Fragmentierung entstehen.<br />
<br />
siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/malloc.html AVR Libc Home Page]: Memory Areas and Using malloc()<br />
* [https://www.mikrocontroller.net/topic/479027#5934443 Forumsbeitrag]: RAM Verbrauch auch von lokalen variablen ermitteln<br />
<br />
== Flash mit PROGMEM und pgm_read ==<br />
<br />
→ [http://nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html avr-libc: Doku zu avr/pgmspace.h]<br />
<br />
Ein Zugriff auf Konstanten im Programmspeicher ist mittels avr-gcc erst ab Version 4.7 "transparent" möglich. Um Daten aus dem Flash zu lesen, muss die AVR-Instruktion LPM (''Load from Program Memory'') erzeugt werden, bei Controllern mit mehr als 64kiB Flash auch ELPM.<br />
<br />
Dazu gibt es das AVR-spezifische GCC-Attribut <tt>progmem</tt>, mit dem eine Variablendeklaration im ''static storage''<ref>Variablen der Speicherklasse ''static storage'' haben eine unbegrenzte Lebensdauer. Beispiel für solche Variablen sind globale Variablen, aber auch static-Variablen innerhalb einer Funktion gehören dazu. Beispiele für Variablen, die nicht ''static storage'' sind: auto-Variablen ("normale" lokale Variablen), register-Variablen, durch malloc geschaffene Objekte, etc.</ref> markiert werden kann:<br />
<syntaxhighlight lang="c"><br />
const int value __attribute__((progmem)) = 1;<br />
</syntaxhighlight><br />
<br />
Effekt ist, dass die so markierte Variable nicht im RAM sondern im Flash angelegt wird. Wird durch "normalen" C-Code auf solch eine Variable zugegriffen, wird jedoch aus der gleichen Adresse aus dem RAM gelesen und nicht aus dem Flash! Das ist ein Fehler, den der Compiler aber nicht anzeigt!<br />
<br />
<syntaxhighlight lang="c"><br />
int test = value; // Fehler! PROGMEM Konstanten müssen mit den pgm_read-Funktionen gelesen werden!<br />
</syntaxhighlight><br />
<br />
Zum Lesen aus dem Flash stellt die avr-libc daher zahlreiche Makros zur Verfügung. Zudem wird das Makro <tt>PROGMEM</tt> definiert, das etwas Tipparbeit spart:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
const int value PROGMEM = 1;<br />
</syntaxhighlight><br />
<br />
<tt>progmem</tt> funktioniert im Wesentlichen wie ein Section-Attribut, das die Daten in der Section <tt>.progmem.data</tt> ablegt. Im Gegensatz zum Section-Attribut werden jedoch noch weitere Prüfungen unternommen, ab avr-gcc 4.6 etwa muss die entsprechende Variable <tt>const</tt> sein.<br />
<br />
=== Integer und float ===<br />
<br />
Zum Lesen von Skalaren stellt die avr-libc folgende Makros zu Verfügung, die jeweils ein Argument erhalten: Die 16-Bit Adresse des zu lesenden Wertes<ref>Damit ist der mögliche Speicherbereich für Flash-Konstanten auf 64kiB begrenzt. Einige pgmspace-Funktionen ermöglichen den Lesezugriff auf den gesamten Flash-Speicher, intern via Assembler-Anweisung ELPM. Die Initialisierungswerte des Speicherinhalts jenseits der 64kiB-Marke müssen dann jedoch auf anderem Weg angelegt werden, d.h. nicht per PROGMEM. Evtl. eigene Section und Linker-Optionen. Alt und nicht ganz korrekt: Die avr-libc pgmspace-Funktionen unterstützen nur die unteren 64kiB Flash bei Controllern mit mehr als 64kiB.</ref><br />
<br />
:{| {{Tabelle}}<br />
|+ Übersicht der <tt>pgm_read</tt> Funktionen aus<br/>dem Header <tt>avr/pgmspace.h</tt> der avr-libc<br />
|-<br />
! Gelesener Wert || <tt>pgm_read_xxx</tt> || Anzahl Bytes<br />
|-<br />
| <tt>uint8_t</tt> || <tt>pgm_read_byte</tt> || 1<br />
|-<br />
| <tt>uint16_t</tt> || <tt>pgm_read_word</tt> || 2<br />
|-<br />
| <tt>uint32_t</tt> || <tt>pgm_read_dword</tt> || 4<br />
|-<br />
| <tt>float</tt> || <tt>pgm_read_float</tt><ref>ab avr-libc 1.7.0</ref> || 4<br />
|}<br />
<br />
Soll ein Zeiger gelesen werden, so verwendet man <tt>pgm_read_word</tt> und castet das Ergebnis zum gewünschten Zeiger-Typ.<br />
<br />
;Beispiele:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
/* Byte */<br />
const uint8_t aByte PROGMEM = 123;<br />
<br />
/* int-Array */<br />
const int anArray[] PROGMEM = { 18, 3 ,70 };<br />
<br />
void foo (void)<br />
{<br />
/* Zeiger */<br />
static const uint8_t* const aPointer PROGMEM = &aByte;<br />
<br />
uint8_t a = pgm_read_byte (&aByte);<br />
int a2 = (int) pgm_read_word (&anArray[2]);<br />
const uint8_t* p = (const uint8_t*) pgm_read_word (&aPointer);<br />
}<br />
</syntaxhighlight><br />
<br />
=== Blöcke ===<br />
<br />
In den Flash-Funktionen der avr-libc sind keine der pgm_read_xxxx Nomenklatur folgenden Funktionen, die Speicherblöcke auslesen oder vergleichen. Die enstprechende Funktionen sind Varianten von <tt>memcpy</tt>, <tt>memcmp</tt> und heißt <tt>memcpy_P</tt>, <tt>memcmp_P</tt>, usw. Für weitere Funktionen und deren Prototypen siehe die Dokumentation der avr-libc.<br />
<br />
=== Strings ===<br />
<br />
Strings sind in C nichts anderes als eine Abfolge von Zeichen und einem <tt>'\0'</tt> als Stringende. Der prinzipielle Weg ist daher identisch zum Lesen von Bytes, wobei auf die [[FAQ#Wie funktioniert String-Verarbeitung in C?|Besonderheiten von Strings]] wie 0-Terminierung geachtet werden muss.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
size_t my_string_length (const char *addr)<br />
{<br />
size_t length = 0;<br />
<br />
while (pgm_read_byte (addr++))<br />
{<br />
length++;<br />
}<br />
return length;<br />
}<br />
</syntaxhighlight><br />
<br />
Zur Unterstützung des Programmierers steht das Repertoire der str-Funktionen auch in jeweils eine Variante zur Verfügung, die mit dem Flash-Speicher arbeiten kann. Die Funktionsnamen tragen den Suffix <tt>_P</tt>. Darüber hinaus gibt es das Makro <tt>PSTR</tt>, das ein String-Literal im Flash-Speicher ablegt und die Adresse des Strings liefert:<br />
<br />
Die nachfolgende Funktion liefert 0 zurück, wenn string_im_ram gleich "Hallo Welt" ist. Mit strcmp (String Compare) können wir zwei Strings vergleichen. Der Rückgabewert kann hierbei folgende Werte haben:<br><br />
0 die Strings sind gleich<br />
>0 das erste ungleiche Zeichen in string_im_ram ist größer als in "Hallo Welt"<br />
<0 das erste ungleiche Zeichen in string_im_ram ist kleiner als in "Hallo Welt"<br />
<br><br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
int foo (const char *string_im_ram)<br />
{<br />
return strcmp_P (string_im_ram, PSTR ("Hallo Welt"));<br />
}<br />
</syntaxhighlight><br />
<br />
Zu beachten ist, dass <tt>PSTR</tt> nur innerhalb von Funktionen verwendet werden kann.<br />
<br />
; Array aus Strings:<br />
<br />
Arrays aus Strings im Flash-Speicher werden in zwei Schritten angelegt:<br />
<br />
# Zuerst die einzelnen Elemente des Arrays und<br />
# im Anschluss ein Array, in dem die Startaddressen der Strings abgelegt werden.<br />
<br />
Zum Auslesen wird zuerst die Adresse des gewünschten Elements aus dem Array im Flash-Speicher gelesen, die im Anschluss dazu genutzt wird, um auf das Element (den String) selbst zuzugreifen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
static const char str1[] PROGMEM = "Hund";<br />
static const char str2[] PROGMEM = "Katze";<br />
static const char str3[] PROGMEM = "Maus";<br />
<br />
const char * const array[] PROGMEM = <br />
{<br />
str1, str2, str3<br />
};<br />
<br />
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]<br />
void read_string (char *buf, size_t i)<br />
{<br />
// Lese die Adresse des i-ten Strings aus array[]<br />
const char *parray = (const char*) pgm_read_ptr (&array[i]);<br />
<br />
// Kopiere den Inhalt der Zeichenkette vom Flash ins RAM<br />
strcpy_P (buf, parray);<br />
}<br />
</syntaxhighlight><br />
<br />
Eine weitere Möglichkeit ist, die Strings in einem 2-dimensionalen char-Array abzulegen anstatt deren Adresse in einem 1-dimensionalen Adress-Array zu speichern.<br />
<br />
Vorteil ist, dass der Code einfacher wird. Nachteil ist, dass bei unterschiedlich langen Strings Speicherplatz verschwendet wird, weil sich die Array-Dimension and der Länge des längsten Strings orientieret. Bei in etwa gleich langen Strings kann es aber sogar Speicherplatz sparen, denn es die Adressen der einzelnen Strings müssen nicht abgespeichert werden.<ref>In unserem Hund-Katze-Maus Beispiel belegt die erste Variante 22 Bytes Daten und 18 Bytes Code, die zweite Variante mit 2-dimensionalem Array belegt 18 Bytes Daten und 20 Bytes Code. Gemessen wurde mit avr-gcc 4.8 -Os für ATmega8.</ref><br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
// Die "6" ist 1 plus die Länge des längsten Strings ("Katze")<br />
const char array[][6] PROGMEM = <br />
{<br />
"Hund", "Katze", "Maus"<br />
};<br />
<br />
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]<br />
void read_string (char *buf, size_t i)<br />
{<br />
// Kopiere den Inhalt der i-ten Zeichenkette vom Flash ins RAM<br />
strcpy_P (buf, array[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Siehe dazu auch die avr-libc FAQ: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array How do I put an array of strings completely in ROM?]<br />
<br />
=== Warum so kompliziert? ===<br />
<br />
Zu dem Thema, warum die Verabeitung von Werten aus dem Flash-Speicher so kompliziert ist, sei hier nur kurz erläutert: Die Harvard-Architektur des AVR weist getrennte Adressräume für Programm (Flash) und Datenspeicher (RAM) auf. Der C-Standard sieht keine unterschiedlichen Adressräume vor.<br />
<br />
Hat man zum Beispiel eine Funktion string_an_uart (const char* s) und übergibt an diese Funktion die Adresse einer Zeichenkette, dann weiß die Funktion nicht, ob die Adresse in den Flash-Speicher oder das RAM zeigt. Weder aus dem Pointer-Wert, also dem Zahlenwert, noch aus dem "const" kann auf den Ort der Ablage geschlossen werden.<br />
<br />
Einige AVR-Compiler bilden die Harvard-Architektur ab, indem sie in einen Pointer nicht nur die Adresse speichern, sondern auch den Ablageort wie ''Flash'' oder ''RAM''. In einem Aufruf einer Funktion wird dann bei Pointer-Parametern neben der Adresse auch der Speicherbereich, auf den der Pointer zeigt, übergeben.<br />
<br />
Dies hat jedoch auch Nachteile, denn bei jedem Zugriff über einen Zeiger muss zur ''Laufzeit'' entschieden werden, wie der Zugriff auszuführen ist und entsprechend länglicher und langsamer wird der erzeugte Code.<br />
<br />
Siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitte Modules/Program Space String Utilities und Abschnitt Modules/Bootloader Support Utilities<br />
<br />
=== Datenzugriff >64kiB ===<br />
<br />
Die Zeiger beim avr-gcc sind nur 16 Bit breit, können somit also nur 64kiB Datenspeicher adressieren. Darauf sind auch alle Funktion der libc ausgelegt, welche auf _P enden. Als Funktionspointer können sie beim AVR bis zu 128 kiB Programmspeicher adressieren, weil Funktionsadressen immer 16-Bit Worte adressieren und nicht Bytes. Der Zugriff auf den RAM ist mit maximal 16kiB durch 16 Bit Poiinter nicht begrenzt. Um Zugriff jenseits von 64KiB zu bewerkstelligen gibt es mehrere Möglichkeiten:<br />
<br />
* Address-Spaces wie <tt>__flash1</tt> oder <tt>__memx</tt>, siehe Abschnitt "[[#Jenseits von flash|Jenseits von __flash]]".<br />
* Die Funktionen bzw. Makros <tt>pgm_read_xxx_far</tt> der AVR-Libc ab Version 1.8.0, wie im folgenden beschrieben. Dafür gibt es die Funktion pgm_get_far_address(), um 32-Bit Pointer eines Objekts zu erhalten<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/pgmspace.h><br />
<br />
//===================================================================<br />
// Define an additional section, which will be placed after all others<br />
//--------------------------------------------------------------------<br />
#define FAR_SECTION __attribute__((__section__(".far_section")))<br />
//--------------------------------------------------------------------<br />
<br />
//====================================================================<br />
// Just an example<br />
//====================================================================<br />
<br />
const char MyString[] FAR_SECTION = "Hier liegt mein FAR-Teststring!";<br />
const char MyBmp64[] FAR_SECTION = {0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x00};<br />
<br />
int main(void) {<br />
uint32_t ptr = pgm_get_far_address(MyString);<br />
char MyChar;<br />
DDRC = 0xFF;<br />
do {<br />
MyChar = pgm_read_byte_far(ptr++);<br />
PORTC = MyChar;<br />
} while(MyChar);<br />
}<br />
</syntaxhighlight><br />
<br />
D.h. man muss<br />
* Die Definition der neuen Section <tt>FAR_SECTION</tt> einfügen<br />
* Die konstanten Daten mit dieser Section kennzeichnen<br />
<br />
Dem Linker muss man über diese Section nichts mitteilen, er fügt diese automatisch nach allen bestehenden sections im Flash ein. Der Zugriff auf diese Variablen kann nur mittels direkter Pointerarithmetik erfolgen, eine Indizierung von Arrays mit variablem Index ist nicht möglich. Dabei muss die Größe des Datentyps immer manuell berücksichtigt werden, denn der Pointer ist immer ein Bytepointer!<br />
<br />
<syntaxhighlight lang="c"><br />
int n=3;<br />
MyChar = pgm_read_byte_far(pgm_get_far_address(MyBmp64)+n*sizeof(char));<br />
</syntaxhighlight><br />
<br />
Dabei gibt es einige praktische Probleme.<br />
* Beim recht alten AVR-Studio 4.18 wird die Größe des belegten FLASH-Speichers nicht korrekt angezeigt, die Daten landen aber im HEX-File.<br />
* beim moderneren Atmelstudio 6.2 sieht man in der Consolenausgabe die richtige Größe, welche von avr-size ermittelt wurde, diese wird aber dann in der 2. Ausgabe durch Atmelstudio falsch dargestellt<br />
* Die Arduino-IDE rechnet richtig, siehe dieser [https://www.mikrocontroller.net/topic/511511?goto=6568945#6568945 Forumsbeitrag].<br />
<br />
== Flash mit __flash und Embedded-C ==<br />
<br />
Ab Version 4.7 unterstützt avr-gcc ''Adress-Spaces'' gemäß dem Embedded-C Dokument ISO/IEC TR18037. Der geläufigste Adress-Space ist <tt>__flash</tt>, der im Gegensatz zu <tt>progmem</tt> kein GCC-Attribut ist, sondern ein Qualifier und damit syntaktisch ähnlich verwendet wird wie <tt>const</tt> oder <tt>volatile</tt>.<br />
<br />
GCC kennt keine eigene Option zum Aktivieren von Embedded-C, es wird als GNU-C Erweiterung behandelt. Daher müssen C-Module, die Address-Spaces verwenden, mit <tt>-std=gnu99</tt> o.ä. compiliert werden.<br />
<br />
<syntaxhighlight lang="c"><br />
static const __flash int value = 10;<br />
<br />
int get_value (void)<br />
{<br />
return value;<br />
}<br />
</syntaxhighlight><br />
<br />
# Im Gegensatz zu <tt>progmem</tt> sind keine speziellen Bibliotheksfunktionen oder -makros für den Zugriff mehr notwendig: Der Code zum Lesen der Variable ist "normales" C.<br />
# Die Variable wird im richtigen Speicherbereich (Flash) angelegt.<br />
# <tt>__flash</tt> ist nur zusammen mit read-only Objekten oder Zeigern, d.h. nur zusammen mit <tt>const</tt>, erlaubt.<br />
# Zugriffe wie im obigen Beispiel können (weg)optimiert werden. Das Beispiel entspricht einem "<tt>return 10</tt>". Es besteht keine Notwendigkeit, für <tt>value</tt> überhaupt Flash-Speicher zu reservieren.<br />
<br />
Auch Zeiger-Indirektionen sind problemlos möglich. Zu beachten ist, dass <tt>__flash</tt> auf der richtigen Seite des "<tt>*</tt>" in der Zeigerdeklaration bzw. -definition steht:<br />
* '''Rechts vom <tt>*</tt>:''' Der Zeiger selbst liegt im Flash<br />
* '''Links vom <tt>*</tt>:''' Der Zeiger enthält eine Flash-Adresse<br />
<br />
<syntaxhighlight lang="c"><br />
// val ist eine Variable im Flash<br />
const __flash int val = 42;<br />
<br />
// pval liegt auch im Flash und enthält die Adresse von val<br />
const __flash int* const __flash pval = &val;<br />
<br />
int get_val (void)<br />
{<br />
// liest den Wert von val über die in pval abgelegte Adresse<br />
return *pval;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Blöcke ===<br />
<br />
Um Speicherbereiche vom Flash in den RAM zu kopieren, gibt es zwei Möglichkeiten: Zum einen können wie bei <tt>progmem</tt> beschreiben die Funktionen der avr-libc wie <tt>memcpy_P</tt>, <tt>memcmp_P</tt>, <tt>movmem_P</tt>, etc. verwendet werden:<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
// Eine Datenstruktur<br />
typedef struct<br />
{<br />
int id;<br />
char buf[10];<br />
} data_t;<br />
<br />
extern void uart_send (const void*, size_t);<br />
<br />
void send_data (const __flash data_t *pdata)<br />
{<br />
// buf wird auf dem Stack angelegt<br />
data_t buf;<br />
<br />
// Kopiere Daten vom Flash nach buf ins RAM<br />
memcpy_P (&buf, pdata, sizeof (data_t));<br />
<br />
// Sende die Daten in buf<br />
uart_send (&buf, sizeof (data_t));<br />
}<br />
</syntaxhighlight><br />
<br />
Zum anderen kann eine Struktur auch über direktes Kopieren ins RAM geladen werden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
<br />
// Eine Datenstruktur<br />
typedef struct<br />
{<br />
int id;<br />
char buf[10];<br />
} data_t;<br />
<br />
extern void uart_send (const void*, size_t);<br />
<br />
void send_data (const __flash data_t *pdata)<br />
{<br />
// Kopiere Daten ins RAM. buf wird auf dem Stack angelegt<br />
const data_t buf = *pdata;<br />
<br />
// Verwendet die Daten in buf<br />
uart_send (&buf, sizeof (data_t));<br />
}<br />
</syntaxhighlight><br />
<br />
=== Strings ===<br />
<br />
Natürlich können auch Strings im Flash abgelegt werden und auch mit Funktionen wie <tt>strcpy_P</tt> aus der avr-libc verarbeitet werden. Zudem ist es möglich, Flash-Zeiger mit der Adresse eines String-Literals zu initialisieren:<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
#define FSTR(X) ((const __flash char[]) { X } )<br />
<br />
const __flash char * const __flash array[] = <br />
{<br />
FSTR ("Hund"), FSTR ("Katze"), FSTR ("Maus")<br />
};<br />
<br />
size_t get_len (uint8_t tier)<br />
{<br />
return strlen_P (array[tier]);<br />
}<br />
</syntaxhighlight><br />
<br />
Leider sieht der Embedded-C Draft nicht vor, String-Literale direkt in einem anderen Adress-Space als ''generic'' anzulegen, so dass hier der Umweg über <tt>FSTR</tt> genommen werden muss. Dieses Konstrukt ist nur ausserhalb von Funktionen möglich und kann daher nicht als Ersatz für <tt>PSTR</tt> aus der avr-libc dienen.<br />
<br />
Soll <tt>array</tt> ein 2-dimensonales Array sein anstatt ein 1-dimensionales Array von Zeigern, dann geht das ohne große Verrenkungen:<br />
<br />
<syntaxhighlight lang="c"><br />
// Die 6 ergibt sich aus 1 plus der Länge des längsten Strings "Katze"<br />
const __flash char array[][6] = <br />
{<br />
"Hund", "Katze", "Maus"<br />
};<br />
</syntaxhighlight><br />
<br />
Weiters besteht die Möglichkeit, <tt>array</tt> analog anzulegen, wie man es mit <tt>PROGMEM</tt> machen würde: Jeder String wird explizit angelegt und seine Adresse bei der Initialisierung von <tt>array</tt> verwendet. Dies entspricht dem ersten Beispiel eines 1-dimensionalen Zeigerarrays:<br />
<br />
<syntaxhighlight lang="c"><br />
static const __flash char strHund[] = "Hund";<br />
static const __flash char strKatze[] = "Katze";<br />
static const __flash char strMaus[] = "Maus";<br />
<br />
const __flash char * const __flash array[] = <br />
{<br />
strHund, strKatze, strMaus<br />
};<br />
</syntaxhighlight><br />
<br />
=== Casts ===<br />
<br />
Embedded C fordert, dass zwei Adress-Spaces entweder disjunkt sind – d.h. sie enthalten keine gemeinsamen Adressen – oder aber ein Space komplett im anderen enthalten ist, also eine Teilmengen-Beziehung besteht. Die Adress-Spaces von avr-gcc sind so implementiert, dass jeder Space Teilmenge jedes anderes ist. Zwar haben Spaces wie RAM und Flash physikalisch keinen Speicherbereich gemein, allerdings ermöglicht diese Implementierung das Casten von Zeigern zu unterschiedlichen Adress-Spaces<ref>Im Gegensatz zu einem Attribute wie <tt>progmem</tt> ist ein (Adress Space) Qualifier Teil des Zeiger-Typs.</ref>: <br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdbool.h><br />
<br />
char read_char (const char *address, bool data_in_flash)<br />
{<br />
if (data_in_flash)<br />
return *(const __flash char*) address;<br />
else<br />
return *address;<br />
}<br />
</syntaxhighlight><br />
<br />
Der Cast selbst erzeugt keinen zusätzlichen Code, da eine RAM-Adresse und eine Flash-Adresse die gleiche Binärdarstellung haben. Allerdings wird über den nach <tt>__flash</tt> gecasteten Zeiger anders zugegriffen, nämlich per LPM.<br />
<br />
=== Jenseits von __flash ===<br />
<br />
Ausser <tt>__flash</tt> gibt es auch folgende Address-Spaces:<br />
<br />
==== <tt>__flash</tt>''N'' ====<br />
<br />
<tt>__flash</tt>''N'' mit ''N'' = 1..5 sind fünf weitere Spaces, die analog zu <tt>__flash</tt> funktionieren und deren Zeiger ebenfalls 16 Bit breit sind. avr-gcc erwartet, dass die zugehörigen Daten, welche in die Section <tt>.progmem</tt>''N''<tt>.data</tt> abgelegt werden, so lokatiert sind, dass das high-Byte der Adresse (Bits 16..23) gerade ''N'' ist.<br />
<br />
Weil Daten- und Code-Layout höchst projektspezifisch sind, werden diese Sections im Standard Linker-Skript nicht beschrieben. Um funktionsfähigen Code zu erhalten, muss daher ein eigenes Linker-Skript zur Verfügung gestellt werden, das diese Sections beschreibt, oder es kann eine Erweiterung des Standard Skripts bereitgestellt werden falls dies möglich ist.<br />
<br />
;Beispiel: Eine Applikation, die <tt>__flash2</tt> verwendet. Die zugehörende Section <tt>.progmem2.data</tt> wird hinter <tt>.text</tt> angeordnet aber vor den Initializern für <tt>.data</tt>. Dazu wird beim Linken das ld-Skript Fragment per <tt>-Tflash12.ld</tt> angegeben, welches dann an der gewünschten Stelle in das default Skript eingefügt wird:<br />
:{| <!-- Tabelle bitte für korrekte Einrückung belassen --><br />
|-<br />
|<pre><br />
SECTIONS<br />
{<br />
.flash2 :<br />
{<br />
. = MAX (ABSOLUTE(0x20000), .);<br />
PROVIDE (__flash2_start = .);<br />
. = ALIGN(2);<br />
*(.flash2.text*)<br />
*(.progmem2.data*)<br />
PROVIDE (__flash2_end = .);<br />
<br />
ASSERT (__flash2_start == __flash2_end || __flash2_start >= ABSOLUTE(0x20000),<br />
"__flash2 data in .progmem2.data below 0x20000");<br />
ASSERT (__flash2_start == __flash2_end || __flash2_end <= ABSOLUTE(0x30000),<br />
"__flash2 data in .progmem2.data exceeds 0x30000");<br />
}<br />
}<br />
INSERT AFTER .text<br />
</pre><br />
|}<br />
<br />
==== <tt>__memx</tt> ====<br />
<br />
Dieser Address-Space implementiert 3-Byte Zeiger und unterstützt Lesen über 64KiB-Segmentgrenzen hinweg. Das MSB (Bit 23) gibt dabei an, ob der <tt>__memx</tt>-Zeiger eine Flash-Adresse enthält (Bit23 = 0) oder eine RAM-Adresse (Bit23 = 1), was folgenden Code erlaubt:<br />
<br />
<syntaxhighlight lang="c"><br />
const __memx int a_flash = 42;<br />
const int a_ram = 100;<br />
<br />
int get_a (const __memx int* pa)<br />
{<br />
return *pa;<br />
}<br />
<br />
int main (void)<br />
{<br />
return get_a (&a_flash) + get_a (&a_ram);<br />
}</syntaxhighlight><br />
<br />
Dies bedeutet, dass erst zur ''Laufzeit'' entschieden werden kann, ob <tt>get_a</tt> die Daten aus dem RAM oder aus dem Flash lesen soll, was <tt>__memx</tt> im Vergleich zu den anderen Address-Spaces langsamer macht. Ausserdem ist zu beachten, dass <tt>__memx</tt>-Zeiger zwar 24-Bit Zeiger sind, die zugrundeliegende Adress-Arithmetik jedoch gemäß dem C-Standard erfolgt, also als 16-Bit Arithmetik. Bestehende Funktion der avr-libc wie z.B. printf_P funktionieren damit ebensowenig wie printf! Wenn man <tt>__memx</tt> verwenden will, braucht man dafür eigene Funktionen.<br />
<br />
=== __flash, progmem und Portierbarkeit ===<br />
<br />
Da ab er aktuellen Compilerversion 4.7 sowohl <tt>__flash</tt> als auch <tt>PROGMEM</tt> und die <tt>pgm_read</tt>-Funktionen zur Verfügung stehen, ergibt sich die Frage, welche Variante "besser" ist und wie zwischen ihnen hin- und her zu portieren ist.<br />
<br />
Zunächst sei erwähnt, dass <tt>__flash</tt> kein Ersatz für <tt>PROGMEM</tt> ist, sondern lediglich eine Alternative dazu. Das "alte" progmem wird weiterhin mir gleicher Semantik unterstützt, so dass alter Code ohne Änderungen mit den neueren Compilerversionen übersetzbar bleibt.<br />
<br />
Von der Codegüte her dürften sich keine großen Unterschiede ergeben. Es ist nicht zu erwarten, dass die eine oder die andere Variante wesentlich besseren oder schlechteren Code erzeugt — von einer Ausnahme abgesehen: Der Wert beim Zugriff ist zur Compilezeit bekannt und kann daher eliminiert werden.<br />
<syntaxhighlight lang="c"><br />
static const __flash char x[] = { 'A', 'V', 'R' };<br />
<br />
char foo (void)<br />
{<br />
return x[2];<br />
}<br />
</syntaxhighlight><br />
Dies wird übersetzt wie "<tt>return 'R';</tt>", und das Array <tt>x[]</tt> kann komplett wegoptimiert werden und entfallen.<br />
<br />
==== progmem → __flash ====<br />
<br />
Portierung in diese Richtung bedeutet, alten Code anzupassen. Zwingend ist die Portierung nicht, da <tt>progmem</tt> weiterhin unterstützt wird.<br />
Allerdings ist eine Quelle mit <tt>__flash</tt> besser lesbar, denn der Code wird von den <tt>pgm_read</tt>-Funktionen befreit, die vor allem bei Mehrfach-Indirektion den Code ziemlich verunstalten und unleserlich machen können.<br />
Weiterer Vorteil von <tt>_flash</tt> ist, daß eine striktere Typprüfung erfolgen kann.<br />
<br />
Eine Portierung wird man in zwei Schritten vornehmen:<br />
<br />
;1. Definitionen von Flash-Variablen werden angepasst:<br />
<br />
Vorher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
static const char hund[] PROGMEM = "Hund";<br />
static const char katze[] PROGMEM = "Katze";<br />
static const char maus[] PROGMEM = "Maus";<br />
<br />
const char * const tier[] PROGMEM = <br />
{<br />
hund, katze, maus<br />
};<br />
</syntaxhighlight><br />
|}<br />
<br />
Nachher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
static const __flash char hund[] = "Hund";<br />
static const __flash char katze[] = "Katze";<br />
static const __flash char maus[] = "Maus";<br />
<br />
const __flash char * const __flash tier[] = <br />
{<br />
hund, katze, maus<br />
};<br />
</syntaxhighlight><br />
|}<br />
<br />
Der Header <tt>avr/pgmspace.h</tt> wird nicht mehr benötigt. Im Gegensatz zu <tt>progmem</tt> müssen Qualifier immer links von der definierten Variablen stehen; bei Attributen wie <tt>progmem</tt> ist das mehr oder weniger egal.<br />
<br />
Nachdem diese Anpassung erfolgreich abgeschlossen ist, folgt Schritt<br />
<br />
; 2. Der Code wird von <tt>pgm_read</tt>-Aufrufen bereinigt:<br />
<br />
Vorher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
extern const char *tier[];<br />
<br />
char first_letter (uint8_t i)<br />
{<br />
const char* ptier = (const char*) pgm_read_word (&tier[i]);<br />
return (char) pgm_read_byte (&ptier[0]);<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
Nachher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <stdint.h><br />
<br />
extern const __flash char * const __flash tier[];<br />
<br />
char first_letter (uint8_t i)<br />
{<br />
return tier[i][0];<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
== Dateien direkt im Flash einbinden ==<br />
<br />
Wenn man größere Dateien direkt im Programm einbinden will, ohne sie vorher in C Quelltext umzuwandeln, muss man das mit dem Linker machen. Wie das geht steht hier.<br />
<br />
* [http://www.atmel.com/webdoc/avrlibcreferencemanual/FAQ_1faq_binarydata.html Atmel, avr gcc Dokumentation]<br />
* [http://nongnu.org/avr-libc/user-manual/FAQ.html#faq_binarydata Nongnu avr gcc Dokumentation]<br />
<br />
Wie man das dann praktisch umsetzt, sieht man in diesem Beitrag.<br />
<br />
* [https://www.mikrocontroller.net/topic/361429?goto=4056910#4056910 Forumsbeitrag]: Binärdateien mittels Linker einbinden<br />
* [https://www.mikrocontroller.net/topic/361429?goto=4056910#4056947 Forumsbeitrag]: Ein kleines Tool zum Umwandeln von Binärdateien in C-Quelltext.<br />
<br />
== Flash in der Anwendung schreiben ==<br />
<br />
Bei AVRs mit "self-programming"-Option – auch bekannt als [[Bootloader]]-Support – können Teile des Flash-Speichers vom Anwendungsprogramm beschrieben werden. Dies ist nur möglich, wenn die Schreibfunktion in einem besonderen Speicherbereich, der Boot-Section des Programmspeichers/Flash, abgelegt ist.<br />
<br />
Bei einigen kleinen AVRs gibt es keine gesonderte Boot-Section, bei diesen kann der Flashspeicher von jeder Stelle des Programms geschrieben werden. Für Details sei hier auf das jeweilige Controller-Datenblatt und die Erläuterungen zum Modul boot.h der avr-libc verwiesen. Es existieren auch Application-Notes dazu bei atmel.com, die auf avr-gcc-Code übertragbar sind.<br />
<br />
Siehe auch: <br />
* Forumsbeitrag [http://www.mikrocontroller.net/topic/163632#1561622 Daten in Programmspeicher speichern]<br />
<br />
== EEPROM ==<br />
<br />
Möchte man Werte aus einem Programm heraus so speichern, dass sie auch nach dem Abschalten der Versorgungsspannung noch erhalten bleiben und nach dem Wiederherstellen der Versorgungsspannung bei erneutem Programmstart wieder zur Verfügung stehen, dann benutzt man das EEPROM.<br />
<br />
Schreib- und Lesezugriffe auf den EEPROM-Speicher erfolgen über die im Modul eeprom.h der avr-libc definierten Funktionen. Mit diesen Funktionen können einzelne Bytes, Datenworte (16 Bit), Fließkommawerte (32 Bit, single-precision, float) und Datenblöcke geschrieben und gelesen werden.<br />
<br />
Diese Funktionen kümmern sich auch um diverse Details, die bei der Benutzung des EEPROMs normalerweise notwendig sind:<br />
* EEPROM-Operationen sind im Vergleich relativ langsam. Man muss daher darauf achten, dass eine vorhergehende Operation abgeschlossen ist, ehe die nächste Operation mit dem EEPROM gestartet wird. Die in der avr-libc implementierten Funktionen aus eeprom.h berücksichtigten dies. Soll beim Aufruf einer EEPROM-Funktion sichergestellt werden, dass diese nicht intern in einer Warteschleife auf den Abschluss der vorherigen Operation wartet, kann vorher per eeprom_is_ready testen, ob der Zugriff auf den EEPROM-Speicher sofort möglich ist.<br />
* Es ist darauf zu achten, dass die EEPROM-Funktionen nicht durch einen Interrupt unterbrochen werden. Einige Phasen des Zugriffs sind zeitkritisch und müssen in einer definierten bzw. begrenzten Anzahl von Takten durchgeführt werden. Durch einen unterbrechenden Interrupt würde diese Restriktion nicht mehr eingehalten. Auch dieses Detail wird von den avr-libc Funktionen berücksichtigt, so dass man sich als C-Programmierer nicht darum kümmern muss. Innerhalb der Funktionen werden Interrupts vor der "EEPROM-Sequenz" global deaktiviert und im Anschluss, falls vorher auch schon eingeschaltet, wieder aktiviert.<br />
<br />
Man beachte, dass der EEPROM-Speicher nur eine begrenzte Anzahl von Schreibzugriffen zulässt. Beschreibt man eine EEPROM-Zelle öfter als die im Datenblatt zugesicherte Anzahl (typisch 100.000), wird die Funktion der Zelle nicht mehr garantiert. Dies gilt für jede einzelne Zelle. <br />
<br />
Bei geschickter Programmierung (z.&nbsp;B. Ring-Puffer), bei der die zu beschreibenden Zellen regelmäßig gewechselt werden, kann man eine deutlich höhere Anzahl an Schreibzugriffen, bezogen auf den gesamten EEPROM-Speicher, erreichen. Auf jeden Fall sollte man aber eine Abschätzung über die zu erwartende Lebensdauer des EEPROM durchführen. Wird ein Wert im EEPROM im Durchschnitt nur einmal pro Woche verändert, wird die garantierte Anzahl der Schreibzyklen innerhalb der voraussichtlichen Verwendungszeit des Controllers sicherlich nicht erreicht werden. Welcher Controller ist schon 100000 / 52 = 1923 Jahre im Einsatz? In diesem Fall lohnt es sich daher nicht, erweiterte Programmfunktionen zu implementieren, mit denen die Anzahl der Schreibzugriffe minimiert wird.<br />
<br />
Eine weitere Möglichkeit, Schreibzyklen einzusparen, besteht in der Vorabprüfung, ob der zu speichernde Wert im EEPROM bereits enthalten ist und nur veränderte Werte zu schreiben. In aktuelleren Versionen der avr-libc sind bereits Funktionen enthalten, die solche Prüfungen enthalten (eeprom_update_*).<br />
<br />
Eine dritte Möglichkeit speichert alle Daten zunächst im RAM, wo sie beliebig oft beschrieben werden können. Nur beim Ausschalten oder beim Ausfall der Stromversorgung werden die Daten in den EEPROM geschrieben. Wie man das richtig macht sieht man im Artikel [[Speicher#EEPROM Schreibzugriffe minimieren | Speicher]].<br />
<br />
Lesezugriffe können beliebig oft durchgeführt werden. Sie unterliegen keinen Einschränkungen in Bezug auf deren Anzahl. <br />
<br />
=== EEMEM ===<br />
Um eine Variable im EEPROM anzulegen, stellt die avr-libc das Makro EEMEM zur Verfügung:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdint.h><br />
#include <avr/eeprom.h><br />
<br />
/* Byte */<br />
uint8_t eeFooByte EEMEM = 123;<br />
<br />
/* Wort */<br />
uint16_t eeFooWord EEMEM = 12345;<br />
<br />
/* float */<br />
float eeFooFloat EEMEM;<br />
<br />
/* Byte-Array */<br />
uint8_t eeFooByteArray1[] EEMEM = { 18, 3, 70 };<br />
uint8_t eeFooByteArray2[] EEMEM = { 30, 7, 79 };<br />
<br />
/* 16-bit unsigned short feld */<br />
uint16_t eeFooWordArray1[4] EEMEM;<br />
</syntaxhighlight><br />
<br />
Die grundsätzliche Vorgehensweise ist identisch zur Verwendung von PROGMEM. Auch hier erzeugt man sich spezielle attributierte Variablen (EEMEM erledigt das), die vom Compiler/Linker nicht wie normale Variablen behandelt werden. Compiler/Linker kümmern sich zwar darum, dass diesen Variablen eine Adresse zugewiesen wird, diese Adresse ist dann aber die Adresse der 'Variablen' im EEPROM. Um die dort gespeicherten Werte zu lesen bzw. zu schreiben, übergibt man diese Adresse an spezielle Funktionen, die die entsprechenden Werte aus dem EEPROM holen bzw. das EEPROM neu beschreiben.<br />
<br />
Die mittels EEMEM erzeugten 'Variablen' sind also mehr als Platzhalter zu verstehen, denn als echte Variablen. Es geht nur darum, im C-Programm symbolische Namen zur Verfügung zu haben, anstatt mit echten EEPROM-Adressen hantieren zu müssen, etwas, das grundsätzlich aber auch genauso gut möglich ist. Nur muss man sich in diesem Fall dann selbst darum kümmern, dass mehrere 'Variablen' ohne Überschneidung im EEPROM angeordnet werden.<br />
<br />
=== Bytes lesen/schreiben ===<br />
<br />
Die avr-libc Funktion zum Lesen eines Bytes heißt eeprom_read_byte. Parameter ist die Adresse des Bytes im EEPROM. Geschrieben wird über die Funktion eeprom_write_byte mit den Parametern Adresse und Inhalt. Anwendungsbeispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#define EEPROM_DEF 0xFF<br />
<br />
void eeprom_example (void)<br />
{<br />
uint8_t myByte;<br />
<br />
// myByte lesen (Wert = 123)<br />
myByte = eeprom_read_byte (&eeFooByte);<br />
<br />
// der Wert 99 wird im EEPROM an die Adresse der<br />
// Variablen eeFooByte geschrieben<br />
myByte = 99;<br />
eeprom_write_byte(&eeFooByte, myByte); // schreiben<br />
<br />
myByte = eeprom_read_byte (&eeFooByteArray1[1]); <br />
// myByte hat nun den Wert 3<br />
<br />
// Beispiel fuer eeprom_update_byte: die EEPROM-Zelle wird nur<br />
// dann beschrieben, wenn deren Inhalt sich vom Parameterwert<br />
// unterscheidet. In diesem Beispiel erfolgt also kein Schreib-<br />
// zugriff, da die Werte gleich sind.<br />
eeprom_update_byte(&eeFooByte, myByte);<br />
<br />
<br />
// Beispiel zur "Sicherung" gegen leeres EEPROM nach "Chip Erase"<br />
// (z. B. wenn die .eep-Datei nach Programmierung einer neuen Version<br />
// des Programms nicht in den EEPROM uebertragen wurde und EESAVE<br />
// deaktiviert ist (unprogrammed/1)<br />
// <br />
// Vorsicht: wenn EESAVE "programmed" ist, hilft diese Sicherung nicht<br />
// weiter, da die Speicheraddressen in einem neuen/erweiterten Programm<br />
// moeglicherweise verschoben wurden. An der Stelle &eeFooByte steht<br />
// dann u.U. der Wert einer anderen Variable aus einer "alten" Version.<br />
<br />
uint8_t fooByteDefault = 222;<br />
if ((myByte = eeprom_read_byte (&eeFooByte)) == EEPROM_DEF)<br />
{<br />
myByte = fooByteDefault;<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
=== Wort lesen/schreiben ===<br />
<br />
Schreiben und Lesen von Datenworten erfolgt analog zur Vorgehensweise bei Bytes:<br />
<br />
<syntaxhighlight lang="c"><br />
// lesen<br />
uint16_t myWord = eeprom_read_word (&eeFooWord);<br />
<br />
// schreiben<br />
eeprom_write_word (&eeFooWord, 2222);<br />
</syntaxhighlight><br />
<br />
=== Block lesen/schreiben ===<br />
<br />
Lesen und Schreiben von Datenblöcken erfolgt über die Funktionen <code>eeprom_read_block()</code> bzw. <code>eeprom_write_block()</code>. Die Funktionen erwarten drei Parameter: die Adresse der Quell- bzw. Zieldaten im RAM, die EEPROM-Adresse und die Länge des Datenblocks in Bytes als <code>size_t</code>.<br />
<syntaxhighlight lang="c"><br />
uint8_t myByteBuffer[3];<br />
uint16_t myWordBuffer[4];<br />
<br />
void eeprom_block_example (void)<br />
{<br />
/* Datenblock aus EEPROM lesen */<br />
<br />
/* liest 3 Bytes ab der von eeFooByteArray1 definierten EEPROM-Adresse<br />
in das RAM-Array myByteBuffer */<br />
eeprom_read_block (myByteBuffer, eeFooByteArray1, 3);<br />
<br />
/* dito mit etwas Absicherung betr. der Länge */<br />
eeprom_read_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));<br />
<br />
/* und nun mit 16-Bit Array */<br />
eeprom_read_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));<br />
<br />
/* Datenblock in EEPROM schreiben */<br />
eeprom_write_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));<br />
eeprom_write_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));<br />
}<br />
</syntaxhighlight><br />
<br />
=== Fließkommawerte lesen/schreiben ===<br />
<br />
In der avr-libc stehen auch EEPROM-Funktionen für Variablen des Typs float (Fließkommazahlen mit "einfacher" Genauigkeit) zur Verfügung.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/eeprom.h><br />
<br />
float eeFloat EEMEM = 12.34f;<br />
<br />
float void eeprom_float_example(float value)<br />
{<br />
/* float in EEPROM schreiben */<br />
eeprom_write_float(&eeFloat, value);<br />
<br />
/* float aus EEPROM lesen */<br />
return eeprom_read_float(&eeFloat);<br />
}</syntaxhighlight><br />
<br />
=== EEPROM-Speicherabbild in .eep-Datei ===<br />
<br />
Mit den zum Compiler gehörenden Werkzeugen kann der aus den Variablendeklarationen abgeleitete EEPROM-Inhalt in eine Datei geschrieben werden. Die übliche Dateiendung ist .eep, Daten im Intel Hex-Format. Damit können Standardwerte für den EEPROM-Inhalt im Quellcode definiert werden. <br />
<br />
Makefiles nach WinAVR/MFile-Vorlage enthalten bereits die notwendigen Einstellungen, siehe dazu die Erläuterungen im [[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]].<br />
<br />
Der Inhalt der eep-Datei muss ebenfalls zum Mikrocontroller übertragen werden, wenn die Initialisierungswerte aus der Deklaration vom Programm erwartet werden. Ansonsten enthält der EEPROM-Speicher nach der Übertragung des Programmers mittels ISP abhängig von der Einstellung der EESAVE-Fuse<ref>vgl. Datenblatt Abschnitt Fuse Bits</ref> nicht die korrekten Werte:<br />
; EESAVE = 0 (programmed): Die Daten im EEPROM bleiben erhalten. Werden sie nicht neu geschrieben, so enthält das EEPROM evtl. Daten, die nicht mehr zum Programm passen.<br />
; EESAVE = 1 (unprogrammed): Beim Programmieren werden die Daten im EEPROM gelöscht, also auf 0xff gesetzt.<br />
<br />
Als Sicherung kann man im Programm nochmals die Standardwerte vorhalten, beim Lesen auf 0xFF prüfen und gegebenenfalls einen Standardwert nutzen. Das geht natürlich nur, wenn 0xFF selbst nicht als Datenwert vorkommen kann.<br />
<syntaxhighlight lang="c"><br />
#define DUTY_CYCLE_DEFAULT 0x80<br />
<br />
uint8_t eeDutyCycle EEMEM; // Platzhalter für EEPROM<br />
uint8_t DutyCycle; // die echte Variable<br />
<br />
<br />
int main(void)<br />
{<br />
DutyCycle = eeprom_read_byte( &eeDutyCycle );<br />
if( DutyCycle == 0xFF ) // das allererste mal. Im EEPROM steht noch kein gültiger Wert<br />
{<br />
DutyCycle = DUTY_CYCLE_DEFAULT;<br />
eeprom_writeByte( &eeDutyCycle, DutyCycle );<br />
}<br />
<br />
...<br />
</syntaxhighlight><br />
<br />
=== Direkter Zugriff auf EEPROM-Adressen ===<br />
<br />
Will man direkt auf bestimmte EEPROM Adressen zugreifen, dann sind folgende IAR-kompatiblen Makros <tt>_EEGET</tt> und <tt>_EEPUT</tt> hilfreich, um sich die Typecasts zu ersparen.<br />
<br />
;Hinweis: Die nachfolgend gezeigten Makros und Zugriffe auf absolute Adressen sind in Normalfall nicht nötig und nur auf sehr wenige, spezielle Fälle beschränkt! Im Normalfall sollte man auf absolute Adressen möglichst nicht zugreifen und den Compiler seine Arbeit machen lassen, der verwaltet die Variablen und deren Adressen meist besser als der Programmierer. Der Zugriff auf Variablen im EEPROM sollte immer über ihren Namen erfolgen.<br />
<br />
Verwendung:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/eeprom.h><br />
<br />
_EEPUT (0x20, 128); // Byte-Wert 128 an Adresse 0x20 schreiben<br />
...<br />
uint8_t val = _EEGET (0x20); // EEPROM-Wert von Adresse 0x20 lesen<br />
</syntaxhighlight><br />
<br />
=== Was steckt dahinter? - EEPROM-Register ===<br />
Auch wenn es normalerweise keinen Grund gibt, in C selbst an den Steuerregistern herumzuschrauben - die eeprom Funktionen erledigen das alles zuverlässig - der Vollständigkeit halber der registermässige technische Unterbau.<br />
Um das EEPROM anzusteuern, sind drei Register von Bedeutung:<br />
;EEAR: Hier werden die Adressen eingetragen zum Schreiben oder Lesen. Dieses Register unterteilt sich nochmal in EEARH und EEARL, da in einem 8-Bit-Register keine 512 Adressen adressiert werden können.<br />
;EEDR: Hier werden die Daten eingetragen, die geschrieben werden sollen, bzw. es enthält die gelesenen Daten.<br />
;EECR: Ist das Kontrollregister für das EEPROM<br />
<br />
Das EECR steuert den Zugriff auf das EEPROM und ist wie folgt aufgebaut:<br />
<br />
:{| class="wikitable" style="text-align:center"<br />
|+ '''Aufbau des EECR-Registers'''<br />
|-<br />
!Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|-<br />
! Name<br />
| - || - || - ||- || EERIE || EEMWE || EEWE || EERE<br />
|-<br />
! Read/Write<br />
| R || R || R || R || R/W || R/W || R/W || R/W<br />
|-<br />
!Init Value<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''Bedeutung der Bits'''<br />
<br />
;Bit 4-7: nicht belegt<br />
<br />
;Bit 3 (EERIE): ''EEPROM Ready Interrupt Enable'': Wenn das Bit gesetzt ist und globale Interrupts erlaubt sind in Register SREG (Bit 7), wird ein Interrupt ausgelöst nach Beendigung des Schreibzyklus (EEPROM Ready Interrupt). Ist einer der beiden Bits 0, wird kein Interrupt ausgelöst.<br />
<br />
;Bit 2 EEMWE): ''EEPROM Master Write Enable'': Dieses Bit bestimmt, dass, wenn EEWE = 1 gesetzt wird (innerhalb von 4 Taktzyklen), das EEPROM beschrieben wird mit den Daten in EEDR bei Adresse EEAR. Wenn EEMWE = 0 ist und EEWE = 1 gesetzt wird, hat das keine Auswirkungen. Der Schreibvorgang wird dann nicht ausgelöst. Nach 4 Taktzyklen wird das Bit EEMWE automatisch wieder auf 0 gesetzt. Dieses Bit löst den Schreibvorgang nicht aus, es dient sozusagen als Sicherungsbit für EEWE.<br />
<br />
;Bit 1 (EEWE): ''EEPROM Write Enable'': Dieses Bit löst den Schreibvorgang aus, wenn es auf 1 gesetzt wird, sofern vorher EEMWE gesetzt wurde und seitdem nicht mehr als 4 Taktzyklen vergangen sind. Wenn der Schreibvorgang abgeschlossen ist, wird dieses Bit automatisch wieder auf 0 gesetzt und, sofern EERIE gesetzt ist, ein Interrupt ausgelöst. Ein Schreibvorgang sieht typischerweise wie folgt aus:<br />
:# EEPROM-Bereitschaft abwarten (EEWE=0) <br />
:# Adresse übergeben an EEAR<br />
:# Daten übergeben an EEDR<br />
:# Schreibvorgang auslösen in EECR mit Bit EEMWE=1 und EEWE=1<br />
:# (Optional) Warten, bis Schreibvorgang abgeschlossen ist<br />
<br />
;Bit 0 EERE: ''EEPROM Read Enable'': Wird dieses Bit auf 1 gesetzt wird das EEPROM an der Adresse in EEAR ausgelesen und die Daten in EEDR gespeichert. Das EEPROM kann nicht ausgelesen werden, wenn bereits eine Schreiboperation gestartet wurde. Es ist daher zu empfehlen, die Bereitschaft vorher zu prüfen. Das EEPROM ist lesebereit, wenn das Bit EEWE=0 ist. Ist der Lesevorgang abgeschlossen, wird das Bit wieder auf 0 gesetzt, und das EEPROM ist für neue Lese- und Schreibbefehle wieder bereit. Ein typischer Lesevorgang kann wie folgt aufgebaut sein:<br />
:# Bereitschaft zum Lesen prüfen (EEWE=0)<br />
:# Adresse übergeben an EEAR<br />
:# Lesezyklus auslösen mit EERE = 1<br />
:# Warten, bis Lesevorgang abgeschlossen EERE = 0<br />
:# Daten abholen aus EEDR<br />
<br />
= Die Nutzung von sprintf und printf =<br />
<br />
Um komfortabel, d.h. formatiert, Ausgaben auf ein Display oder die serielle Schnittstelle zu tätigen, bieten sich '''sprintf''' oder '''printf''' an. Alle *printf-Varianten sind jedoch ziemlich speicherintensiv und der Einsatz in einem Mikrocontroller mit knappem Speicher muss sorgsam abgewogen werden.<br />
<br />
Bei '''sprintf''' wird die Ausgabe zunächst in einem Puffer vorbereitet und anschließend mit einfachen Funktionen zeichenweise ausgegeben. Es liegt in der Verantwortung des Programmierers, genügend Platz im Puffer für die erwarteten Zeichen bereitzuhalten.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdio.h><br />
#include <stdint.h><br />
<br />
// ...<br />
// nicht dargestellt: Implementierung von uart_puts (vgl. Abschnitt UART)<br />
// ...<br />
<br />
uint16_t counter;<br />
<br />
// Ausgabe eines unsigned Integerwertes<br />
void uart_puti( uint16_t value )<br />
{<br />
uint8_t puffer[20];<br />
<br />
sprintf( puffer, "Zählerstand: %u", value );<br />
uart_puts( puffer );<br />
}<br />
<br />
int main()<br />
{<br />
counter = 5;<br />
<br />
uart_puti( counter );<br />
uart_puti( 42 );<br />
}<br />
</syntaxhighlight><br />
<br />
Eine weitere elegante Möglichkeit besteht darin, den STREAM stdout (Standardausgabe) auf eine eigene Ausgabefunktion umzuleiten. Dazu wird dem Ausgabemechanismus der C-Bibliothek eine neue Ausgabefunktion bekannt gemacht, deren Aufgabe es ist, ein einzelnes Zeichen auszugeben. Wohin die Ausgabe dann tatsächlich stattfindet, ist Sache der Ausgabefunktion. Im Beispiel unten wird auf UART ausgegeben. Alle anderen, höheren Funktionen wie z.&nbsp;B. '''printf''', greifen letztendlich auf diese primitive Ausgabefunktion zurück. <br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdio.h><br />
<br />
void uart_init(void);<br />
<br />
// a. Deklaration der primitiven Ausgabefunktion<br />
int uart_putchar(char c, FILE *stream);<br />
<br />
// b. Umleiten der Standardausgabe stdout (Teil 1)<br />
static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );<br />
<br />
// c. Definition der Ausgabefunktion<br />
int uart_putchar( char c, FILE *stream )<br />
{<br />
if( c == '\n' )<br />
uart_putchar( '\r', stream );<br />
<br />
loop_until_bit_is_set( UCSRA, UDRE );<br />
UDR = c;<br />
return 0;<br />
}<br />
<br />
void uart_init(void)<br />
{<br />
/* hier µC spezifischen Code zur Initialisierung */<br />
/* des UART einfügen... s.o. im AVR-GCC-Tutorial */<br />
<br />
// Beispiel: <br />
//<br />
// myAVR Board 1.5 mit externem Quarz Q1 3,6864 MHz<br />
// 9600 Baud 8N1<br />
<br />
#ifndef F_CPU<br />
#define F_CPU 3686400<br />
#endif<br />
#define UART_BAUD_RATE 9600<br />
<br />
// Hilfsmakro zur UBRR-Berechnung ("Formel" laut Datenblatt)<br />
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)<br />
<br />
UCSRB |= (1<<TXEN) | (1<<RXEN); // UART TX und RX einschalten<br />
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 <br />
<br />
UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );<br />
UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );<br />
}<br />
<br />
int main(void)<br />
{<br />
int16_t antwort = 42;<br />
uart_init();<br />
<br />
// b. Umleiten der Standardausgabe stdout (Teil 2)<br />
stdout = &mystdout;<br />
<br />
// Anwendung<br />
printf( "Die Antwort ist %d.\n", antwort );<br />
return 0;<br />
}<br />
<br />
// Quelle: avr-libc-user-manual-1.4.3.pdf, S.74<br />
// + Ergänzungen<br />
</syntaxhighlight><br />
<br />
<br />
Sollen Fließkommazahlen ausgegeben werden, muss im Makefile eine andere (größere) Version der [[FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio|printflib]] eingebunden werden.<br />
<br />
= Anmerkungen =<br />
<references/><br />
<br />
= TODO =<br />
* Aktualisierung Register- und Bitbeschreibungen an aktuelle AVR<br />
* "naked"-Funktionen [http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html][http://arduino.stackexchange.com/questions/8758/arduino-interruption-on-pin-change]<br />
<br />
[[Kategorie:avr-gcc Tutorial| ]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106545
Avr-gcc Bugs
2024-01-08T13:22:33Z
<p>Gjlayde: /* Fixed */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 optimization <br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in flash for AVR64* and AVR128* devices<br />
| avr<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR112952 112952] || Fix attributes <code>address</code>, <code>io</code> and <code>io_low</code><br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106510
Avr-gcc Bugs
2023-12-17T19:42:22Z
<p>Gjlayde: /* Binutils / avr-libc */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| 2.42 optimization <br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in flash for AVR64* and AVR128* devices<br />
| avr<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106503
Avr-gcc Bugs
2023-12-10T15:21:05Z
<p>Gjlayde: /* Erweiterungen */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| optimization <br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112944 112944] || Support .rodata in flash for AVR64* and AVR128* devices<br />
| avr<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106497
Avr-gcc Bugs
2023-12-08T15:38:31Z
<p>Gjlayde: /* Binutils / avr-libc */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR31124 31124] || Support new Emulations for Devices with FLMAP<br />
| optimization <br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106485
Avr-gcc Bugs
2023-12-05T20:46:36Z
<p>Gjlayde: /* Fixed */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR112830 112830] || ICE (__memx): in convert_memory_address_addr_space_1, at explow.cc:302<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106430
Avr-gcc Bugs
2023-11-17T13:03:00Z
<p>Gjlayde: PR53372</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| 13.3<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106257
Avr-gcc Bugs
2023-08-09T19:22:22Z
<p>Gjlayde: </p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Avoid diagnostic <i>"array subscript 0 is outside array bounds of 'volatile uint8_t[0] [-Warray-bounds]"</i><br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| 14<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os (cc0 → CCmode fallout)<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| 13.2, 12.4<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106182
Avr-gcc Bugs
2023-06-02T17:51:42Z
<p>Gjlayde: /* Optimierung */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Set <tt>--param=min-pagesize=0</tt> in the backend to avoid diagnostic<br> "array subscript 0 is outside array bounds of 'volatile uint8_t[0]'<br> {aka 'volatile unsigned char[]'} [-Warray-bounds]"<br />
| Patch <br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| postreload<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR110093 110093] || Move frenzy leading to code bloat.<br />
| Regression<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106170
Avr-gcc Bugs
2023-05-28T09:31:13Z
<p>Gjlayde: </p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Set <tt>--param=min-pagesize=0</tt> in the backend to avoid diagnostic<br> "array subscript 0 is outside array bounds of 'volatile uint8_t[0]'<br> {aka 'volatile unsigned char[]'} [-Warray-bounds]"<br />
| Patch <br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Uses content of a clobbered register<br />
| postreload<br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106161
Avr-gcc Bugs
2023-05-19T16:48:24Z
<p>Gjlayde: </p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Set <tt>--param=min-pagesize=0</tt> in the backend to avoid diagnostic<br> "array subscript 0 is outside array bounds of 'volatile uint8_t[0]'<br> {aka 'volatile unsigned char[]'} [-Warray-bounds]"<br />
| Patch <br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Wrong code due to R31 clobber <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106160
Avr-gcc Bugs
2023-05-19T16:46:49Z
<p>Gjlayde: /* Bugs */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR109910 109910] || Prologue/epilogue saves/restores regs that are never changed.<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Set <tt>--param=min-pagesize=0</tt> in the backend to avoid diagnostic<br> "array subscript 0 is outside array bounds of 'volatile uint8_t[0]'<br> {aka 'volatile unsigned char[]'} [-Warray-bounds]"<br />
| Patch <br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Wrong code due to R31 clobber <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106158
Avr-gcc Bugs
2023-05-19T10:14:25Z
<p>Gjlayde: </p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR109907 109907] || Code bloat for single bit extractions<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Set <tt>--param=min-pagesize=0</tt> in the backend to avoid diagnostic<br> "array subscript 0 is outside array bounds of 'volatile uint8_t[0]'<br> {aka 'volatile unsigned char[]'} [-Warray-bounds]"<br />
| Patch <br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Wrong code due to R31 clobber <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106145
Avr-gcc Bugs
2023-05-13T20:02:34Z
<p>Gjlayde: </p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR109650 109650] || Wrong code with -Os<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Set <tt>--param=min-pagesize=0</tt> in the backend to avoid diagnostic<br> "array subscript 0 is outside array bounds of 'volatile uint8_t[0]'<br> {aka 'volatile unsigned char[]'} [-Warray-bounds]"<br />
| Patch <br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Wrong code due to R31 clobber <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106093
Avr-gcc Bugs
2023-04-28T16:50:43Z
<p>Gjlayde: </p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/109650 109650] || Wrong code with -Os<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR105523 105523] || Set <tt>--param=min-pagesize=0</tt> in the backend to avoid diagnostic<br> "array subscript 0 is outside array bounds of 'volatile uint8_t[0]'<br> {aka 'volatile unsigned char[]'} [-Warray-bounds]"<br />
| Patch <br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705<br />
| Patch<br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Wrong code due to R31 clobber <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106070
Avr-gcc Bugs
2023-04-24T16:35:03Z
<p>Gjlayde: </p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR105532 105532] || Set <tt>--param=min-pagesize=0</tt> in the backend to avoid diagnostic<br> "array subscript 0 is outside array bounds of 'volatile uint8_t[0]'<br> {aka 'volatile unsigned char[]'} [-Warray-bounds]"<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705 || Patch <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Wrong code due to R31 clobber <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=106059
Avr-gcc Bugs
2023-04-22T12:12:17Z
<p>Gjlayde: </p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107842 107842] || Set <tt>--param=min-pagesize=0</tt> in the backend to avoid diagnostic<br> "array subscript 0 is outside array bounds of 'volatile uint8_t[0]'<br> {aka 'volatile unsigned char[]'} [-Warray-bounds]"<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR105753 105753] || ICE: in add_clobbers, at config/avr/avr-dimode.md:2705 || Patch <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Wrong code due to R31 clobber <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
| 12.3<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=105638
Avr-gcc Bugs
2022-11-23T17:40:42Z
<p>Gjlayde: + PR107842</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107842 107842] || Set <tt>--param=min-pagesize=0</tt> in the backend to avoid diagnostic<br> "array subscript 0 is outside array bounds of 'volatile uint8_t[0]'<br> {aka 'volatile unsigned char[]'} [-Warray-bounds]"<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Wrong code due to R31 clobber <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=105508
Avr-gcc Bugs
2022-10-27T09:46:28Z
<p>Gjlayde: +PR101188</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR101188 101188] || Wrong code due to R31 clobber <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=105507
Avr-gcc Bugs
2022-10-26T21:35:16Z
<p>Gjlayde: +PR92606</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR92606 92606] || Invalid merge of symbols in progmem and data sections (WA: <tt>-fno-ipa-icf-variables</tt>)<br />
| IPA<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=105478
Avr-gcc Bugs
2022-10-10T17:50:00Z
<p>Gjlayde: Fixed PR86040</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| 9.3, 8.4, 7.5<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=105477
Avr-gcc Bugs
2022-10-10T17:44:50Z
<p>Gjlayde: +PR107201</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR107201 107201] || <tt>-nodevicelib</tt> not working together with <tt>-mmcu=avr*</tt> devices <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=105412
Avr-gcc Bugs
2022-09-20T15:44:00Z
<p>Gjlayde: </p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
| 12.3, 11.4, 10.5<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| 11.0<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=105411
Avr-gcc Bugs
2022-09-20T15:38:52Z
<p>Gjlayde: /* Binutils / avr-libc */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| [https://www.bountysource.com/issues/84630749-avr-convert-the-backend-to-mode_cc-so-it-can-be-kept-in-future-releases Bounty]<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| 2.2<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=104014
Avr-gcc Bugs
2021-02-20T22:48:35Z
<p>Gjlayde: /* Bugs */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR99184 99184] || Wrong rounding in double to 32-bit and 16-bit integer conversions in libgcc.<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| [https://www.bountysource.com/issues/84630749-avr-convert-the-backend-to-mode_cc-so-it-can-be-kept-in-future-releases Bounty]<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial&diff=103077
AVR-GCC-Tutorial
2021-01-26T19:05:06Z
<p>Gjlayde: /* Strings */ Typo.</p>
<hr />
<div>Dieses Tutorial soll den Einstieg in die Programmierung von Atmel [[AVR]]-Mikrocontrollern in der Programmiersprache [[C]] mit dem freien C-Compiler [[avr-gcc]] aus der [http://gcc.gnu.org/ GNU Compiler Collection] (GCC) erleichtern.<br />
<br />
Vorausgesetzt werden Grundkenntnisse der Programmiersprache C. Diese Kenntnisse kann man sich online erarbeiten, z. B. mit dem [http://www.schellong.de/c.htm C Tutorial von Helmut Schellong] ([[C|Liste von C-Tutorials]]). Nicht erforderlich sind Vorkenntnisse in der Programmierung von Mikrocontrollern.<br />
<br />
= Vorwort =<br />
<br />
In diesem Text wird häufig auf die Standardbibliothek avr-libc verwiesen, für die es eine [http://www.nongnu.org/avr-libc/user-manual/index.html Online-Dokumentation] gibt, in der sich auch viele nützliche Informationen zum Compiler und zur Programmierung von AVR-Controllern finden. Beim Paket [[WinAVR]] gehört die avr-libc Dokumentation zum Lieferumfang und wird mitinstalliert.<br />
<br />
Der Compiler und die Standardbibliothek avr-libc werden ständig weiterentwickelt. Einige Unterschiede, die sich im Verlauf der Entwicklung ergeben haben, werden hier und im Artikel [[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen]] zwar angesprochen, Anfängern und Umsteigern sei jedoch empfohlen, eine aktuelle Versionen zu nutzen.<br />
<br />
Das ursprüngliche Tutorial stammt von Christian Schifferle, viele neue Abschnitte und aktuelle Anpassungen von Martin Thomas.<br />
<br />
Dieses Tutorial ist in [[Media:AVR-GCC-Tutorial.pdf|PDF-Form]] erhältlich (zur Zeit nur eine sehr veraltete Version).<br />
<br />
== Weiterführende Kapitel ==<br />
<br />
Um dieses riesige Tutorial etwas überschaubarer zu gestalten, wurden einige Kapitel ausgelagert, die nicht unmittelbar mit den Grundlagen von avr-gcc in Verbindung stehen. All diese Seiten gehören zur [[:Kategorie:avr-gcc Tutorial]].<br />
<br />
;UART: → Hauptartikel: ''[[AVR-GCC-Tutorial/Der UART|Der UART]]''<br />
<br />
;ADC: → Hauptartikel: ''[[AVR-GCC-Tutorial/Analoge Ein- und Ausgabe|Analoge Ein- und Ausgabe (ADC)]]''<br />
<br />
;Timer: → Hauptartikel: ''[[AVR-GCC-Tutorial/Die Timer und Zähler des AVR|Die Timer und Zähler des AVR]]''<br />
<br />
;LCD: → Hauptartikel: ''[[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Ansteuerung]]''<br />
<br />
;Watchdog: → Hauptartikel: ''[[AVR-GCC-Tutorial/Der Watchdog|Der Watchdog]]''<br />
<br />
;Assembler: → Hauptartikel: ''[[AVR-GCC-Tutorial/Assembler und Inline-Assembler|Assembler und Inline-Assembler]]''<br />
<br />
;alte Quellen anpassen: → Hauptartikel: ''[[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen anpassen]]''<br />
<br />
;Makefiles: → Hauptartikel: ''[[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]]'' sowie als Alternative für sehr kleine Projekte → Hauptartikel: ''[[C ohne Makefile]]''<br />
<br />
= Benötigte Werkzeuge =<br />
<br />
Um eigene Programme für AVRs mittels einer AVR-Toolchain zu erstellen wird folgende Hard- und Software benötigt:<br />
<br />
* Eine AVR-Toolchain bestehend aus avr-gcc, den avr-Binutils (Assembler, Linker, etc) und einer Standard-C Bibliothek. Üblich ist die AVR-LibC, die auch quasi in allen avr-gcc Distributionen enthalten ist.<br />
<br />
Hardware wird keine benötigt – bis auf einen PC natürlich, auf dem der Compiler ablaufen kann. Selbst ohne AVR-Hardware kann man also bereits C-Programme für AVRs schreiben, compiliern und sich das Look-and-Feel von avr-gcc sowie von IDEs wie [[Atmel Studio]], Eclipse oder leichtgewichtigeren Entwicklungsumbgebungen anschauen. Selbst das Debuggen und Simulieren ist mithilfe entsprechender Tools wie Debugger und Simulator in gewissen Grenzen möglich.<br />
<br />
Um Programme für AVRs mittels einer AVR-Toolchain zu testen, wird folgende Hard- und Software benötigt:<br />
<br />
* Platine oder Versuchsaufbau für die Aufnahme eines AVR-Controllers, der vom avr-gcc Compiler unterstützt wird.<ref>Für eine Liste der unterstützten COntroller siehe die Dokumentation des Compilers oder [http://www.nongnu.org/avr-libc/user-manual/index.html#supported_devices AVR-Libc: Supported Devices].</ref> Dieses Testboard kann durchaus auch selbst gelötet oder auf einem Steckbrett aufgebaut werden. Einige Registerbeschreibungen dieses Tutorials beziehen sich auf den inzwischen veralteten AT90S2313. Der weitaus größte Teil des Textes ist aber für alle Controller der AVR-Familie gültig. <br />
<br />
:Brauchbare Testplattformen sind auch das [[STK500]] und der [[AVR Butterfly]] von Atmel. Weitere Infos findet man in den Artikeln [[AVR#Starterkits|AVR Starterkits]] und [[AVR-Tutorial: Equipment]].<br />
<br />
* Programmiersoftware und -[[AVR In System Programmer |hardware]] z. B. PonyProg (siehe auch: [[Pony-Prog Tutorial]]) oder [[AVRDUDE]] mit [[STK200]]-Dongle oder die von Atmel verfügbare Hard- und Software ([[STK500]], Atmel AVRISP, [[AVR-Studio]]).<br />
<br />
* Nicht unbedingt erforderlich, aber zur Simulation und zum Debuggen unter MS-Windows recht nützlich: [[AVR-Studio]].<br />
<br />
* Wer unter Windows und Linux gleichermassen entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] ansehen. Beide sind unter Windows und Linux einfach zu installieren, siehe auch [[AVR Eclipse]]. Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks]<ref>Aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar.</ref>. Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins "AVR-Projekte" angelegt werden. Für Linux gibt es auch noch das [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=25220 KontrollerLab].<br />
<br />
= Was tun, wenn's nicht klappt? =<br />
<br />
* Herausfinden, ob es tatsächlich ein avr(-gcc) spezifisches Problem ist oder nur die eigenen C-Kenntnisse einer Auffrischung bedürfen. Allgemeine C-Fragen kann man eventuell "beim freundlichen Programmierer zwei Büro-, Zimmer- oder Haustüren weiter" loswerden. Ansonsten: [[C]]-Buch (gibt's auch "gratis" online) lesen.<br />
<br />
* Die [[AVR Checkliste]] durcharbeiten.<br />
<br />
* Die '''[http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc]''' lesen, vor allem (aber nicht nur) den Abschnitt Related Pages/'''Frequently Asked Questions''' = Oft gestellte Fragen (und Antworten dazu). Z.Zt leider nur in englischer Sprache verfügbar.<br />
<br />
* Den Artikel [[AVR-GCC]] in diesem Wiki lesen.<br />
<br />
* Das [http://www.mikrocontroller.net/forum/gcc GCC-Forum auf www.mikrocontroller.net] nach vergleichbaren Problemen absuchen.<br />
<br />
* Das avr-gcc-Forum bei [http://www.avrfreaks.net AVRfreaks] nach vergleichbaren Problemen absuchen.<br />
<br />
* Das [http://lists.gnu.org/archive/html/avr-gcc-list/ Archiv der avr-gcc Mailing-Liste] nach vergleichbaren Problemen absuchen.<br />
<br />
* Nach Beispielcode suchen. Vor allem im ''Projects''-Bereich von [http://www.avrfreaks.net AVRfreaks] (anmelden).<br />
<br />
* Google oder yahoo befragen schadet nie.<br />
<br />
* Bei Problemen mit der Ansteuerung interner AVR-Funktionen mit C-Code: das Datenblatt des Controllers lesen (ganz und am Besten zweimal). Datenblätter sind auf den [http://www.atmel.com Atmel Webseiten] als pdf-Dateien verfügbar. Das komplette Datenblatt (complete) und nicht die Kurzfassung (summary) verwenden.<br />
<br />
* Die Beispielprogramme im [[AVR-Tutorial]] sind zwar in AVR-Assembler verfasst, Erläuterungen und Vorgehensweisen sind aber auch auf C-Programme übertragbar.<br />
<br />
* Einen Beitrag in eines der Foren oder eine Mail an die Mailing-Liste schreiben. Dabei möglichst viel Information geben: Controller, Compilerversion, genutzte Bibliotheken, Ausschnitte aus dem Quellcode oder besser ein [http://www.mikrocontroller.net/topic/72767#598986 Testprojekt] mit allen notwendigen Dateien, um das Problem nachzuvollziehen, sowie genaue Fehlermeldungen bzw. Beschreibung des Fehlverhaltens. Bei Ansteuerung externer Geräte die Beschaltung beschreiben oder skizzieren (z. B. mit [http://www.tech-chat.de/ Andys ASCII Circuit]). Siehe dazu auch: '''[http://www.tty1.net/smart-questions_de.html "Wie man Fragen richtig stellt"]'''.<br />
<br />
= Erzeugen von Maschinencode =<br />
<br />
Aus dem C-Quellcode erzeugt der avr-gcc Compiler (zusammen mit Hilfsprogrammen wie z.&nbsp;B. Präprozessor, Assembler und Linker) Maschinencode für den AVR-Controller. Üblicherweise liegt dieser Code dann im Intel Hex-Format vor ("Hex-Datei"). Die Programmiersoftware (z.&nbsp;B. [[AVRDUDE]], PonyProg oder AVRStudio/STK500-plugin) liest diese Datei ein und überträgt die enthaltene Information (den Maschinencode) in den Speicher des Controllers. Im Prinzip sind also "nur" der avr-gcc-Compiler (und wenige Hilfsprogramme) mit den "richtigen" Optionen aufzurufen, um aus C-Code eine "Hex-Datei" zu erzeugen. Grundsätzlich stehen dazu drei verschiedene Ansätze zur Verfügung:<br />
<br />
* Die Verwendung einer integrierten Entwicklungsumgebung (IDE = '''I'''ntegrated '''D'''evelopment '''E'''nvironment), bei der alle Einstellungen z.&nbsp;B. in Dialogboxen durchgeführt werden können. Unter Anderem kann AVRStudio ab Version 4.12 (kostenlos auf [http://www.atmel.com/ atmel.com]) zusammen mit WinAVR als integrierte Entwicklungsumgebung für den Compiler avr-gcc genutzt werden (dazu müssen AVRStudio und WinAVR auf dem Rechner installiert sein). Weitere IDEs (ohne Anspruch auf Vollständigkeit): [http://www.eclipse.org/ Eclipse for C/C++ Developers] (d.h. inkl. CDT) und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] (für diverse Plattformen, u.a. Linux und MS Windows, IDE und Plugin kostenlos), [http://sourceforge.net/projects/kontrollerlab KontrollerLab] (Linux/KDE, kostenlos). [http://www.atmanecl.com/EnglishSite/SoftwareEnglish.htm AtmanAvr] (MS Windows, relativ günstig), KamAVR (MS-Windows, kostenlos, wird augenscheinlich nicht mehr weiterentwickelt), [http://www.amctools.com/vmlab.htm VMLab] (MS Windows, ab Version 3.12 ebenfalls kostenlos). Integrierte Entwicklungsumgebungen unterscheiden sich stark in Ihrer Bedienung und stehen auch nicht für alle Plattformen zur Verfügung, auf denen der Compiler ausführbar ist (z.&nbsp;B. AVRStudio nur für MS-Windows). Zur Anwendung des avr-gcc Compilers mit IDEs sei hier auf deren Dokumentation verwiesen. <br />
<br />
* Die Nutzung des Programms make mit passenden Makefiles. In den folgenden Abschnitten wird die Generierung von Maschinencode für einen AVR ("hex-Datei") aus C-Quellcode ("c-Dateien") anhand von "make" und den "Makefiles" näher erläutert. Viele der darin beschriebenen Optionen findet man auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio (AVRStudio generiert ein makefile in einem Unterverzeichnis des Projektverzeichnisses). <br />
<br />
* Das Generieren des Programms ohne IDE und ohne Makefile. In diesem Fall muss die Quellcodedatei durch eine vorgefertigte Kommandofolge an den Compiler übergeben werden. Der Artikel [[C ohne Makefile]] zeigt, wie das funktioniert. Diese Vorgehensweise empfiehlt sich jedoch nur für kleine Programme, die nicht auf verschiedene Quellcodedateien verteilt sind.<br />
<br />
Beim Wechsel vom makefile-Ansatz nach WinAVR-Vorlage zu AVRStudio ist darauf zu achten, dass AVRStudio (Stand: AVRStudio Version 4.13) bei einem neuen Projekt die Optimierungsoption (vgl. Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|AVR-GCC-Tutorial/Exkurs: Makefiles]], typisch: -Os) nicht einstellt und die mathematische Bibliothek der avr-libc (libm.a, Linker-Option -lm) nicht einbindet. (Hinweis: Bei Version 4.16 wird beides bereits gesetzt). Beides ist Standard bei Verwendung von makefiles nach WinAVR-Vorlage und sollte daher auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio "manuell" eingestellt werden, um auch mit AVRStudio kompakten Code zu erzeugen.<br />
<br />
= Einführungsbeispiel =<br />
<br />
Zum Einstieg ein kleines Beispiel, an dem die Nutzung des Compilers und der Hilfsprogramme (der sogenannten ''Toolchain'') demonstriert wird. Detaillierte Erläuterungen folgen in den weiteren Abschnitten dieses Tutorials.<br />
<br />
Das Programm soll auf einem AVR Mikrocontroller einige Ausgänge ein- und andere ausschalten. Das Beispiel ist für einen ATmega16 programmiert ([http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf Datenblatt]), kann aber sinngemäß für andere Controller der AVR-Familie modifiziert werden. <br />
<br />
Ein kurzes Wort zur Hardware: Bei diesem Programm werden alle Pins von PORTB auf Ausgang gesetzt, und einige davon werden auf HIGH andere auf LOW gesetzt. Das kann je nach angeschlossener Hardware an diesen Pins kritisch sein. Am ungefährlichsten ist es, wenn nichts an den Pins angeschlossen ist und man die Funktion des Programmes durch eine Spannungsmessung mit einem Multimeter kontrolliert. Die Spannung wird dabei zwischen GND-Pin und den einzelnen Pins von PORTB gemessen.<br />
<br />
Zunächst der Quellcode der Anwendung, der in einer Text-Datei mit dem Namen ''main.c'' abgespeichert wird.<br />
<br />
<syntaxhighlight lang="c"><br />
/* Alle Zeichen zwischen Schrägstrich-Stern <br />
und Stern-Schrägstrich sind Kommentare */<br />
<br />
// Zeilenkommentare sind ebenfalls möglich<br />
// alle auf die beiden Schrägstriche folgenden<br />
// Zeichen einer Zeile sind Kommentar<br />
<br />
#include <avr/io.h> // (1)<br />
<br />
int main (void) { // (2)<br />
<br />
DDRB = 0xFF; // (3)<br />
PORTB = 0x03; // (4)<br />
<br />
while(1) { // (5)<br />
/* "leere" Schleife*/ // (6)<br />
} // (7)<br />
<br />
/* wird nie erreicht */<br />
return 0; // (8)<br />
}<br />
</syntaxhighlight><br />
<br />
# In dieser Zeile wird eine sogenannte Header-Datei eingebunden. In <code>avr/io.h</code> sind die Registernamen definiert, die im späteren Verlauf genutzt werden. Auch unter Windows wird ein&nbsp;<code>/</code> zur Kennzeichnung von Unterverzeichnissen in Include-Dateinamen verwendet und kein&nbsp;<code>\</code>.<br />
# Hier beginnt das eigentliche Programm. Jedes C-Programm beginnt mit den Anweisungen in der Funktion <code>main</code>.<br />
# Die Anschlüsse eines AVR (Pins) werden zu Blöcken zusammengefasst, einen solchen Block bezeichnet man als Port. Beim ATmega16 hat jeder Port 8 Anschlüsse, bei kleineren AVRs können einem Port auch weniger als 8 Anschlüsse zugeordnet sein. Da per Definition (Datenblatt) alle gesetzten Bits in einem Datenrichtungsregister den entsprechenden Anschluss auf Ausgang schalten, werden mit DDRB=0xff alle Anschlüsse des Ports B als Ausgänge eingestellt.<br />
# Die den ersten beiden Bits des Ports zugeordneten Anschlüsse (PB0 und PB1) werden 1, alle anderen Anschlüsse des Ports B (PB2-PB7) zu 0. Aktivierte Ausgänge (logisch 1 oder "high") liegen auf Betriebsspannung (VCC, meist 5 Volt), nicht aktivierte Ausgänge führen 0 Volt (GND, Bezugspotential). Es ist sinnvoll, sich möglichst frühzeitig eine alternative Schreibweise beizubringen, die wegen der leichteren Überprüfbarkeit und Portierbarkeit oft im weiteren Tutorial und in Forenbeiträgen benutzt wird. Die Zuordnung sieht in diesem Fall so aus, Näheres dazu im Artikel [[Bitmanipulation]]:<syntaxhighlight lang="c">PORTB = (1<<PB1) | (1<<PB0);</syntaxhighlight><br />
# ist der Beginn der sogenannte ''Hauptschleife'' (main-loop). Dies ist eine Endlosschleife, welche kontinuierlich wiederkehrende Befehle enthält.<br />
# In diesem Beispiel ist die Hauptschleife leer. Der Controller durchläuft die Schleife immer wieder, ohne dass etwas passiert. Eine solche Schleife ist notwendig, da es auf dem Controller kein Betriebssystem gibt, das nach Beendigung des Programmes die Kontrolle übernehmen könnte. Ohne diese Schleife kehrt das Programm aus <code>main</code> zurück, alle Interrupts werden deaktiviert und eine Endlosschleife betreten.<br />
# Ende der Hauptschleife und Sprung zur passenden, öffnenden Klammer, also zu 5.<br />
# ist das Programmende. Die Zeile ist nur aus Gründen der C-Kompatibilität enthalten: <syntaxhighlight lang="c">int main(void)</syntaxhighlight> besagt, dass die Funktion einen int-Wert zurückgibt. Die Anweisung wird aber nicht erreicht, da das Programm die Hauptschleife nie verlässt.<br />
<br />
Um diesen Quellcode in ein lauffähiges Programm zu übersetzen, wird hier ein Makefile genutzt. Das verwendete Makefile findet sich auf der Seite [[Beispiel Makefile]] und basiert auf der Vorlage, die in WinAVR mitgeliefert wird und wurde bereits angepasst (Controllertyp ATmega16). Man kann das Makefile bearbeiten und an andere Controller anpassen oder sich mit dem Programm MFile menügesteuert ein Makefile "zusammenklicken". Das Makefile speichert man unter dem Namen <code>Makefile</code> (ohne Endung) im selben Verzeichnis, in dem auch die Datei <code>main.c</code> mit dem Programmcode abgelegt ist. Detailliertere Erklärungen zur Funktion von Makefiles finden sich im Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|Exkurs: Makefiles]].<br />
<br />
<pre><br />
D:\beispiel>dir<br />
<br />
Verzeichnis von D:\beispiel<br />
<br />
28.11.2006 22:53 <DIR> .<br />
28.11.2006 22:53 <DIR> ..<br />
28.11.2006 20:06 118 main.c<br />
28.11.2006 20:03 16.810 Makefile<br />
2 Datei(en) 16.928 Bytes<br />
</pre><br />
<br />
Nun gibt man ''make all'' ein. Falls das mit WinAVR installierte Programmers Notepad genutzt wird, gibt es dazu einen Menüpunkt im Tools Menü. Sind alle Einstellungen korrekt, entsteht eine Datei <code>main.hex</code>, in welcher der Code für den AVR enthalten ist. <br />
<pre><br />
D:\beispiel>make all<br />
<br />
-------- begin --------<br />
avr-gcc (GCC) 3.4.6<br />
Copyright (C) 2006 Free Software Foundation, Inc.<br />
This is free software; see the source for copying conditions. There is NO<br />
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.<br />
<br />
Compiling C: main.c<br />
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -f<br />
unsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef<br />
-Wa,-adhlns=obj/main.lst -std=gnu99 -Wundef -MD -MP -MF .dep/main.o.d main.c -<br />
o obj/main.o<br />
<br />
Linking: main.elf<br />
avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funs<br />
igned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -W<br />
a,-adhlns=obj/main.o -std=gnu99 -Wundef -MD -MP -MF .dep/main.elf.d obj/main.o<br />
--output main.elf -Wl,-Map=main.map,--cref -lm<br />
<br />
Creating load file for Flash: main.hex<br />
avr-objcopy -O ihex -R .eeprom main.elf main.hex<br />
</pre><br />
<br />
Der Inhalt der hex-Datei kann nun zum Controller übertragen werden. Dies kann z.&nbsp;B. über In-System-Programming ([[ISP]]) erfolgen, das im [[AVR-Tutorial: Equipment]] beschrieben ist. Makefiles nach der WinAVR/MFile-Vorlage sind für die Nutzung des Programms [[AVRDUDE]] vorbereitet. Wenn man den Typ und Anschluss des Programmiergerätes richtig eingestellt hat, kann mit ''make program'' die Übertragung mittels AVRDUDE gestartet werden. Jede andere Software, die hex-Dateien lesen und zu einem AVR übertragen kann<ref>z.&nbsp;B. [[Pony-Prog_Tutorial|Ponyprog]], yapp, AVRStudio</ref>, kann natürlich ebenfalls genutzt werden.<br />
<br />
Startet man nun den Controller (Reset-Taster oder Stromzufuhr aus/an), werden vom Programm die Anschlüsse PB0 und PB1 auf 1 gesetzt. Man kann mit einem Messgerät nun an diesem Anschluss die Betriebsspannung messen oder eine [[LED]] leuchten lassen (Anode an den Pin, Vorwiderstand nicht vergessen). An den Anschlüssen PB2-PB7 misst man 0 Volt. Eine mit der Anode mit einem dieser Anschlüsse verbundene LED leuchtet nicht.<br />
<br />
= Ganzzahlige Datentypen (Integer) =<br />
<br />
Bei der Programmierung von Mikrokontrollern ist die Definition einiger ganzzahliger Datentypen sinnvoll, an denen eindeutig die Bit-Länge abgelesen werden kann.<br />
<br />
Standardisierte Datentypen werden in der Header-Datei <code>stdint.h</code> definiert, die folgendermaßen eingebunden werden kann:<br />
<syntaxhighlight lang="c">#include <stdint.h></syntaxhighlight><br />
<br />
{| {{Tabelle}}<br />
|+ '''int-Typen aus <code>stdint.h</code> (C99)'''<br/>&nbsp;<br />
|- bgcolor="#d0d0ff"<br />
!colspan="5"| Vorzeichenbehaftete int-Typen<br />
|- bgcolor="#e8e8ff"<br />
! Typname || Bit-Breite ||colspan="2"| Wertebereich<br />
|align="center| '''C-Entsprechung''' (avr-gcc)<br />
|-<br />
|<code>int8_t</code> ||align="right"| 8 || −128 ⋯ 127 || −2<sup>7</sup> ⋯ 2<sup>7</sup>−1 || <code>signed char</code><br />
|-<br />
|<code>int16_t</code> ||align="right"| 16 || −32768 ⋯ 32767 || −2<sup>15</sup> ⋯ 2<sup>15</sup>−1 || <code>signed short</code>, <code>signed int</code><br />
|-<br />
|<code>int32_t</code> ||align="right"| 32 || −2147483648 ⋯ 2147483647 || −2<sup>31</sup> ⋯ 2<sup>31</sup>−1 || <code>signed long</code><br />
|-<br />
|<code>int64_t</code> ||align="right"| 64 || −9223372036854775808 ⋯ 9223372036854775807 || −2<sup>63</sup> ⋯ 2<sup>63</sup>−1 || <code>signed long long</code><br />
|- bgcolor="#d0d0ff"<br />
!colspan="5"| Vorzeichenlose int-Typen<br />
|- bgcolor="#e8e8ff"<br />
! Typname || Bit-Breite ||colspan="2"| Wertebereich<br />
|align="center| '''C-Entsprechung''' (avr-gcc)<br />
|-<br />
|<code>uint8_t</code> ||align="right"| 8 || 0 ⋯ 255 || 0 ⋯ 2<sup>8</sup>−1 || <code>unsigned char</code><br />
|-<br />
|<code>uint16_t</code> ||align="right"| 16 || 0 ⋯ 65535 || 0 ⋯ 2<sup>16</sup>−1 || <code>unsigned short</code>, <code>unsigned int</code><br />
|-<br />
|<code>uint32_t</code> ||align="right"| 32 || 0 ⋯ 4294967295 || 0 ⋯ 2<sup>32</sup>−1 || <code>unsigned long</code><br />
|-<br />
|<code>uint64_t</code> ||align="right"| 64 || 0 ⋯ 18446744073709551615 || 0 ⋯ 2<sup>64</sup>−1 || <code>unsigned long long</code><br />
|}<br />
<br />
Neben den Typen gibt es auch Makros für die Bereichsgrenzen wie <code>INT8_MIN</code> oder <code>UINT16_MAX</code>. Siehe dazu auch: [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdint.html Dokumentation der avr-libc: Standard Integer Types].<br />
<br />
= Grundsätzlicher Programmaufbau eines µC-Programms =<br />
<br />
Wir unterscheiden zwischen 2 verschiedenen Methoden, um ein<br />
Mikrocontroller-Programm zu schreiben, und zwar völlig unabhängig davon, in<br />
welcher Programmiersprache das Programm geschrieben wird.<br />
<br />
== Sequentieller Programmablauf ==<br />
<br />
[[Image:Sequentielle Programme.gif|left]]<br />
Bei dieser Programmiertechnik wird eine Endlosschleife programmiert, welche im<br />
Wesentlichen immer den gleichen Aufbau hat. Es wird hier nach dem sogenannten EVA-Prinzip gehandelt. EVA steht für "Eingabe, Verarbeitung, Ausgabe".<br />
{{Absatz}}<br />
<br />
== Interruptgesteuerter Programmablauf ==<br />
<br />
[[Image:Interrupt Programme.gif|left]]<br />
Bei dieser Methode werden beim Programmstart zuerst die gewünschten Interruptquellen aktiviert und dann in eine Endlosschleife gegangen, in welcher Dinge erledigt werden können, welche nicht zeitkritisch sind. Wenn ein Interrupt ausgelöst wird, so wird automatisch die zugeordnete Interruptfunktion ausgeführt.<br />
{{Absatz}}<br />
<br />
= Zugriff auf Register =<br />
<br />
Die AVR-Controller verfügen über eine Vielzahl von Registern. Die meisten<br />
davon sind sogenannte Schreib-/Leseregister. Das heißt, das Programm kann die<br />
Inhalte der Register sowohl auslesen als auch beschreiben.<br />
<br />
Register haben einen besonderen Stellenwert bei den AVR Controllern. Sie dienen dem Zugriff auf die Ports und die Schnittstellen des Controllers. Wir unterscheiden zwischen 8-Bit und 16-Bit Registern. Vorerst behandeln wir die 8-Bit Register.<br />
<br />
Einzelne Register sind bei allen AVRs vorhanden, andere wiederum nur bei bestimmten Typen. So sind beispielsweise die Register, welche für den Zugriff auf den UART notwendig sind, selbstverständlich nur bei denjenigen Modellen vorhanden, welche über einen integrierten Hardware UART bzw. USART verfügen.<br />
<br />
Die Namen der Register sind in den Headerdateien zu den entsprechenden AVR-Typen definiert. Dazu muss man den Namen der controllerspezifischen Headerdatei nicht kennen. Es reicht aus, die allgemeine Headerdatei ''avr/io.h'' einzubinden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
</syntaxhighlight><br />
<br />
Ist im Makefile der MCU-Typ z.&nbsp;B. mit dem Inhalt atmega8 definiert (und wird somit per -mmcu=atmega8 an den Compiler übergeben), wird beim Einlesen der io.h-Datei implizit ("automatisch") auch die iom8.h-Datei mit den Register-Definitionen für den ATmega8 eingelesen.<br />
<br />
<!-- Wohl besser als Anhang - spaeter... --><br />
Intern wird diese "Automatik" wie folgt realisiert: Der Controllertyp wird dem Compiler als Parameter übergeben (vgl. ''avr-gcc -c -mmcu=atmega16 [...]'' im Einführungsbeispiel). Wird ein Makefile nach der WinAVR/mfile-Vorlage verwendet, setzt man die Variable ''MCU'', der Inhalt dieser Variable wird dann an passender Stelle für die Compilerparameter verwendet. Der Compiler definiert intern eine dem mmcu-Parameter zugeordnete "Variable" (genauer: ein Makro) mit dem Namen des Controllers, vorangestelltem ''__AVR_'' und angehängten Unterstrichen (z.&nbsp;B. wird bei ''-mmcu=atmega16'' das Makro ''__AVR_ATmega16__'' definiert). Beim Einbinden der Header-Datei ''avr/io.h'' wird geprüft, ob das jeweilige Makro definiert ist und die zum Controller passende Definitionsdatei eingelesen. Zur Veranschaulichung einige Ausschnitte aus einem Makefile:<br />
<br />
<pre><br />
[...]<br />
# MCU Type ("name") setzen:<br />
MCU = atmega16<br />
[...]<br />
<br />
[...]<br />
## Verwendung des Inhalts von MCU (hier atmega16) fuer die <br />
## Compiler- und Assembler-Parameter<br />
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)<br />
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)<br />
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)<br />
[...]<br />
<br />
[...]<br />
## Aufruf des Compilers:<br />
## mit den Parametern ($(ALL_CFLAGS) ist -mmcu=$(MCU)[...] = -mmcu=atmega16[...]<br />
$(OBJDIR)/%.o : %.c<br />
@echo<br />
@echo $(MSG_COMPILING) $<<br />
$(CC) -c $(ALL_CFLAGS) $< -o $@ <br />
[...]<br />
</pre><br />
<br />
Da --mmcu=atmega16 übergeben wurde, wird __AVR_ATmega16__ definiert und kann in avr/io.h zur Fallunterscheidung genutzt werden:<br />
<br />
<syntaxhighlight lang="c"><br />
// avr/io.h <br />
// (bei WinAVR-Standardinstallation in C:\WinAVR\avr\include\avr)<br />
[...]<br />
#if defined (__AVR_AT94K__)<br />
# include <avr/ioat94k.h><br />
// [...]<br />
#elif defined (__AVR_ATmega16__)<br />
// da __AVR_ATmega16__ definiert ist, wird avr/iom16.h eingebunden:<br />
# include <avr/iom16.h><br />
// [...]<br />
#else<br />
# if !defined(__COMPILING_AVR_LIBC__)<br />
# warning "device type not defined"<br />
# endif<br />
#endif<br />
</syntaxhighlight><br />
<br />
Die Beispiele in den folgenden Abschnitten demonstrieren den Zugriff auf Register anhand der Register für I/O-Ports (PORTx, DDRx, PINx), die Vorgehensweise ist jedoch für alle Register (z.&nbsp;B. die des UART, ADC, SPI) analog.<br />
<br />
== Schreiben in Register ==<br />
<br />
Zum Schreiben kann man Register einfach wie eine Variable setzen.<ref>In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Schreibzugriff über die Funktion outp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt, outp() ist nicht mehr erforderlich.</ref><br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
int main()<br />
{<br />
/* Setzt das Richtungsregister des Ports A auf 0xff <br />
(alle Pins als Ausgang, vgl. Abschnitt Zugriff auf Ports): */<br />
DDRA = 0xff; <br />
<br />
/* Setzt PortA auf 0x03, Bit 0 und 1 "high", restliche "low": */<br />
PORTA = 0x03; <br />
<br />
// Setzen der Bits 0,1,2,3 und 4<br />
// Binär 00011111 = Hexadezimal 1F<br />
DDRB = 0x1F; /* direkte Zuweisung - unübersichtlich */<br />
<br />
/* Ausführliche Schreibweise: identische Funktionalität, mehr Tipparbeit<br />
aber übersichtlicher und selbsterklärend: */<br />
DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4);<br />
<br />
while (1);<br />
}<br />
</syntaxhighlight><br />
<br />
Die ausführliche Schreibweise sollte bevorzugt verwendet werden, da dadurch die Zuweisungen selbsterklärend sind und somit der Code leichter nachvollzogen werden kann. Atmel verwendet sie auch bei Beispielen in Datenblätten und in den allermeisten Quellcodes zu Application-Notes. Mehr zu der Schreibweise mit "|" und "<<" findet man unter [[Bitmanipulation]].<br />
<br />
Der gcc C-Compiler unterstützt ab Version 4.3.0 Konstanten im Binärformat, z.&nbsp;B. DDRB&nbsp;=&nbsp;0b00011111. Diese Schreibweise ist jedoch nur in GNU-C verfügbar und nicht in ISO-C definiert. Man sollte sie daher nicht verwenden, wenn Code mit anderen ausgetauscht oder mit anderen Compilern bzw. älteren Versionen des gcc genutzt werden soll.<br />
<br />
== Verändern von Registerinhalten ==<br />
<br />
Einzelne Bits setzt und löscht man "Standard-C-konform" mittels logischer (Bit-) Operationen. <br />
<br />
<syntaxhighlight lang="c"><br />
x |= (1 << Bitnummer); // Hiermit wird ein Bit in x gesetzt<br />
x &= ~(1 << Bitnummer); // Hiermit wird ein Bit in x geloescht<br />
</syntaxhighlight><br />
<br />
Es wird jeweils nur der Zustand des angegebenen Bits geändert, der vorherige Zustand der anderen Bits bleibt erhalten. <br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
#define MEINBIT 2<br />
...<br />
PORTA |= (1 << MEINBIT); /* setzt Bit 2 an PortA auf 1 */<br />
PORTA &= ~(1 << MEINBIT); /* loescht Bit 2 an PortA */<br />
</syntaxhighlight><br />
<br />
Mit dieser Methode lassen sich auch mehrere Bits eines Registers gleichzeitig setzen und löschen.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
DDRA &= ~( (1<<PA0) | (1<<PA3) ); /* PA0 und PA3 als Eingaenge */<br />
PORTA |= ( (1<<PA0) | (1<<PA3) ); /* Interne Pull-Up fuer beide einschalten */<br />
</syntaxhighlight><br />
<br />
Bei bestimmten AVR Registern mit Bits, die durch Beschreiben mit einer logischen 1 gelöscht werden, muss eine absolute Zuweisung benutzt werden. Ein ODER löscht in diesen Registern ALLE gesetzten Bits!<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
TIFR2 = (1<<OCF2A); // Nur Bit OCF2A löschen<br />
</syntaxhighlight><br />
<br />
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind nicht mehr erforderlich.<br />
<br />
Siehe auch:<br />
* [[Bitmanipulation]]<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers<br />
<br />
== Lesen aus Registern ==<br />
<br />
Zum Lesen kann man auf Register einfach wie auf eine Variable zugreifen. In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Lesezugriff über die Funktion inp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt und inp() ist nicht mehr erforderlich.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdint.h><br />
<br />
uint8_t foo;<br />
<br />
//...<br />
<br />
int main(void)<br />
{<br />
/* kopiert den Status der Eingabepins an PortB <br />
in die Variable foo: */<br />
foo = PINB; <br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Die Abfrage der Zustände von Bits erfolgt durch Einlesen des gesamten Registerinhalts und ausblenden der Bits deren Zustand nicht von Interesse ist. Einige Beispiele zum Prüfen ob Bits gesetzt oder gelöscht sind:<br />
<br />
<syntaxhighlight lang="c"><br />
#define MEINBIT0 0 <br />
#define MEINBIT2 2<br />
<br />
uint8_t i;<br />
<br />
extern test1();<br />
<br />
// Funkion test1 aufrufen, wenn Bit 0 in Register PINA gesetzt (1) ist<br />
i = PINA; // Inhalt in Arbeitsvariable<br />
i = i & 0x01; // alle Bits bis auf Bit 0 ausblenden (bitweise und)<br />
// falls das Bit gesetzt war, hat i den Inhalt 1<br />
if ( i != 0 ) { // Ergebnis ungleich 0 (wahr)? <br />
test1(); // dann muss Bit 0 in i gesetzt sein -> Funktion aufrufen<br />
}<br />
// verkürzt:<br />
if ( ( PINA & 0x01 ) != 0 ) {<br />
test1();<br />
}<br />
// nochmals verkürzt:<br />
if ( PINA & 0x01 ) {<br />
test1();<br />
}<br />
// mit definierter Bitnummer:<br />
if ( PINA & ( 1 << MEINBIT0 ) ) {<br />
test1();<br />
}<br />
<br />
// Funktion aufrufen, wenn Bit 0 und/oder Bit 2 gesetzt ist. (Bit 0 und 2 also Wert 5) <br />
// (Bedenke: Bit 0 hat Wert 1, Bit 1 hat Wert 2 und Bit 2 hat Wert 4)<br />
if ( PINA & 0x05 ) {<br />
test1(); // Vergleich <> 0 (wahr), also mindestens eines der Bits gesetzt<br />
}<br />
// mit definierten Bitnummern:<br />
if ( PINA & ( ( 1 << MEINBIT0 ) | ( 1 << MEINBIT2 ) ) ) {<br />
test1();<br />
}<br />
<br />
// Funktion aufrufen, wenn Bit 0 und Bit 2 gesetzt sind<br />
if ( ( PINA & 0x05 ) == 0x05 ) { // nur wahr, wenn beide Bits gesetzt<br />
test1();<br />
}<br />
<br />
// Funktion test2() aufrufen, wenn Bit 0 gelöscht (0) ist<br />
i = PINA; // einlesen in temporäre Variable<br />
i = i & 0x01; // maskieren von Bit 0<br />
if ( i == 0 ) { // Vergleich ist wahr, wenn Bit 0 nicht gesetzt ist<br />
test2();<br />
}<br />
// analog mit not-Operator<br />
if ( !i ) {<br />
test2();<br />
}<br />
// nochmals verkürzt:<br />
if ( !( PINA & 0x01 ) ) {<br />
test2();<br />
}<br />
</syntaxhighlight><br />
<br />
== Warten auf einen bestimmten Zustand ==<br />
<br />
Es gibt in der Bibliothek avr-libc Funktionen, die warten, bis ein bestimmter Zustand eines Bits erreicht ist. Es ist allerdings normalerweise eine eher unschöne Programmiertechnik, da in diesen Funktionen "blockierend" gewartet wird. Der Programmablauf bleibt also an dieser Stelle stehen, bis das maskierte Ereignis erfolgt ist. Setzt man den [[Watchdog]] ein, muss man darauf achten, dass dieser auch noch getriggert wird (Zurücksetzen des Watchdogtimers). <br />
<br />
Die Funktion '''loop_until_bit_is_set''' wartet in einer Schleife, bis das definierte Bit gesetzt ist. Wenn das Bit beim Aufruf der Funktion bereits gesetzt ist, wird die Funktion sofort wieder verlassen. Das niederwertigste Bit hat die Bitnummer 0. <br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
<br />
/* Warten bis Bit Nr. 2 (das dritte Bit) in Register PINA gesetzt (1) ist */<br />
<br />
#define WARTEPIN PINA<br />
#define WARTEBIT PA2<br />
<br />
// mit der avr-libc Funktion:<br />
loop_until_bit_is_set(WARTEPIN, WARTEBIT);<br />
<br />
// dito in "C-Standard":<br />
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN<br />
// _nicht_ ungleich 0 (also 0) ist.<br />
while ( !(WARTEPIN & (1 << WARTEBIT)) ) {}<br />
...<br />
</syntaxhighlight><br />
<br />
<br />
Die Funktion '''loop_until_bit_is_clear''' wartet in einer Schleife, bis das definierte Bit gelöscht ist. Wenn das Bit beim Aufruf der Funktion bereits gelöscht ist, wird die Funktion sofort wieder verlassen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
<br />
/* Warten bis Bit Nr. 4 (das fuenfte Bit) in Register PINB geloescht (0) ist */<br />
#define WARTEPIN PINB<br />
#define WARTEBIT PB4<br />
<br />
// avr-libc-Funktion:<br />
loop_until_bit_is_clear(WARTEPIN, WARTEBIT);<br />
<br />
// dito in "C-Standard":<br />
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN<br />
// gesetzt (1) ist <br />
while ( WARTEPIN & (1<<WARTEBIT) ) {}<br />
...<br />
</syntaxhighlight><br />
<br />
Universeller und auch auf andere Plattformen besser übertragbar ist die Verwendung von C-Standardoperationen.<br />
<br />
Siehe auch: <br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers<br />
* [[Bitmanipulation]]<br />
<br />
== 16-Bit Register (ADC, ICR1, OCR1x, TCNT1, UBRR) ==<br />
<br />
Einige der Portregister in den AVR-Controllern sind 16 Bit breit. Im Datenblatt sind diese Register üblicherweise mit dem Suffix "L" (Low-Byte) und "H" (High-Byte) versehen. Die avr-libc definiert zusätzlich die meisten dieser Variablen die Bezeichnung ohne "L" oder "H". Auf diese Register kann dann direkt zugegriffen werden. Dies ist zum Beispiel der Fall für Register wie ADC oder TCNT1.<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
uint16_t foo;<br />
<br />
/* setzt die Wort-Variable foo auf den Wert der letzten AD-Wandlung */<br />
foo = ADC; <br />
</syntaxhighlight><br />
<br />
Bei anderen Registern, wie zum Beispiel Baudraten-Register, liegen High- und Low-Teil nicht direkt nebeneinander im SFR-Bereich, so dass ein 16-Bit Zugriff nicht möglich ist und der Zugriff zusammengebastelt werden muss:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
#ifndef F_CPU<br />
#define F_CPU 3686400<br />
#endif<br />
#define UART_BAUD_RATE 9600<br />
<br />
...<br />
uint16_t baud = F_CPU / (UART_BAUD_RATE * 16L) -1;<br />
<br />
UBRRH = (uint8_t) (baud >> 8);<br />
UBRRL = (uint8_t) baud;<br />
...<br />
</syntaxhighlight><br />
<br />
Bei einigen AVR-Typen wie ATmega8 oder ATmega16 teilen sich UBRRH und UCSRC die gleiche Speicher-Adresse. Damit der AVR trotzdem zwischen den beiden Registern unterscheiden kann, bestimmt das Bit7 (URSEL), welches Register tatsächlich beschrieben werden soll. ''1000 0011'' (0x83) adressiert demnach UCSRC und übergibt den Wert ''3''. Und ''0000 0011'' (0x3) adressiert UBRRH und übergibt ebenfalls den Wert ''3''. <br />
<br />
Speziell bei den 16-Bit-Timern und auch beim ADC ist es bei allen Zugriffen auf Datenregister erforderlich, dass diese Daten synchronisiert sind. Wenn z.&nbsp;B. bei einem 16-Bit-Timer das High-Byte des Zählregisters gelesen wurde und vor dem Lesezugriff auf das Low-Byte ein Überlauf des Low-Bytes stattfindet, erhält man einen völlig unsinnigen Wert. Auch die Compare-Register müssen synchron geschrieben werden, da es ansonsten zu unerwünschten Compare-Ereignissen kommen kann. <br />
<br />
Beim ADC besteht das Problem darin, dass zwischen den Zugriffen auf die beiden Teilregister eine Wandlung beendet werden kann und der ADC ein neues Ergebnis in ADCL und ADCH schreiben will, wodurch High- und Low-Byte nicht zusammenpassen.<br />
<br />
Um diese Datenmüllproduktion zu verhindern, gibt es in beiden Fällen eine Synchronisation, die jeweils durch den Zugriff auf das Low-Byte ausgelöst wird:<br />
* Bei den Timer-Registern (das gilt für alle TCNT-, OCR- und ICR-Register bei den 16-Bit-Timern) wird bei einem ''Lesezugriff'' auf das Low-Byte automatisch das High-Byte in ein temporäres Register, das ansonsten nach außen nicht sichtbar ist, geschoben. Greift man nun ''anschließend'' auf das High-Byte zu, dann wird eben dieses temporäre Register gelesen.<br />
* Bei einem ''Schreibzugriff'' auf eines der genannten Register wird das High-Byte in besagtem temporären Register zwischengespeichert und erst beim Schreiben des Low-Bytes werden ''beide'' gleichzeitig in das eigentliche Register übernommen.<br />
<br />
Das bedeutet für die Reihenfolge:<br />
* Lesezugriff: Erst Low-Byte, dann High-Byte<br />
* Schreibzugriff: Erst High-Byte, dann Low-Byte<br />
<br />
Des weiteren ist zu beachten, dass es für all diese 16-Bit-Register nur ein einziges temporäres Register gibt, so dass das Auftreten eines Interrupts, in dessen Handler ein solches Register manipuliert wird, bei einem durch ihn unterbrochenen Zugriff i.d.R. zu Datenmüll führt. 16-Bit-Zugriffe sind generell nicht atomar! Wenn mit Interrupts gearbeitet wird, kann es erforderlich sein, vor einem solchen Zugriff auf ein 16-Bit-Register die Interrupt-Bearbeitung zu deaktivieren.<br />
<br />
Beim ADC-Datenregister ADCH/ADCL ist die Synchronisierung anders gelöst. Hier wird beim Lesezugriff (ADCH/ADCL sind logischerweise read-only) auf das Low-Byte ADCL beide Teilregister für Zugriffe seitens des ADC so lange gesperrt, bis das High-Byte ADCH ausgelesen wurde. Dadurch kann der ADC nach einem Zugriff auf ADCL keinen neuen Wert in ADCH/ADCL ablegen, bis ADCH gelesen wurde. Ergebnisse von Wandlungen, die zwischen einem Zugriff auf ADCL und ADCH beendet werden, gehen verloren!<br />
<br />
Nach einem Zugriff auf ADCL muss grundsätzlich ADCH gelesen werden!<br />
<br />
In beiden Fällen – also sowohl bei den Timern als auch beim ADC – werden vom C-Compiler 16-Bit Pseudo-Register zur Verfügung gestellt (z.&nbsp;B. TCNT1H/TCNT1L → TCNT1, ADCH/ADCL → ADC bzw. ADCW), bei deren Verwendung der Compiler automatisch die richtige Zugriffsreihenfolge regelt. In C-Programmen sollten grundsätzlich diese 16-Bit-Register verwendet werden! Sollte trotzdem ein Zugriff auf ein Teilregister erforderlich sein, sind obige Angaben zu berücksichtigen.<br />
<br />
Es ist darauf zu achten, dass auch ein Zugriff auf die 16-Bit-Register vom Compiler in zwei 8-Bit-Zugriffe aufgeteilt wird und dementsprechend genauso nicht-atomar ist wie die Einzelzugriffe. Auch hier gilt, dass u.U. die Interrupt-Bearbeitung gesperrt werden muss, um Datenmüll zu vermeiden.<br />
<br />
Beim ADC gibt es für den Fall, dass eine Auflösung von 8 Bit ausreicht, die Möglichkeit, das Ergebnis "linksbündig" in ADCH/ADCL auszurichten, so dass die relevanten 8 MSB in ADCH stehen. In diesem Fall muss bzw. sollte nur ADCH ausgelesen werden.<br />
<br />
ADC und ADCW sind unterschiedliche Bezeichner für das selbe Registerpaar. Üblicherweise kann man in C-Programmen ADC verwenden, was analog zu den anderen 16-Bit-Registern benannt ist. ADCW (ADC Word) existiert nur deshalb, weil die Headerdateien auch für Assembler vorgesehen sind und es bereits einen Assembler-Befehl namens ''adc'' gibt. <br />
<br />
Im Umgang mit 16-Bit Registern siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Related Pages/Frequently Asked Questions/Nr. 8<br />
* Datenblatt Abschnitt ''Accessing 16-bit Registers''<br />
<br />
== IO-Register als Parameter und Variablen ==<br />
<br />
Um Register als Parameter für eigene Funktionen übergeben zu können, muss man sie als einen volatile uint8_t Pointer übergeben. Zum Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
uint8_t key_pressed (volatile uint8_t *inputreg, uint8_t inputbit)<br />
{<br />
static uint8_t last_state = 0;<br />
<br />
if (last_state == (*inputreg & (1<<inputbit)))<br />
return 0; /* keine Änderung */<br />
<br />
/* Wenn doch, warten bis etwaiges Prellen vorbei ist: */<br />
_delay_ms(20);<br />
<br />
/* Zustand für nächsten Aufruf merken: */<br />
last_state = *inputreg & (1<<inputbit);<br />
<br />
/* und den entprellten Tastendruck zurückgeben: */<br />
return *inputreg & (1<<inputbit);<br />
}<br />
<br />
/* Beispiel für einen Funktionsaufruf: */<br />
<br />
void foo (void)<br />
{<br />
uint8_t i = key_pressed (&PINB, PB1);<br />
}<br />
</syntaxhighlight><br />
<br />
Ein Aufruf der Funktion mit call by value würde Folgendes bewirken: Beim Funktionseintritt wird nur eine Kopie des momentanen Portzustandes angefertigt, die sich unabhängig vom tatsächlichen Zustand das Ports nicht mehr ändert, womit die Funktion wirkungslos wäre. Die Übergabe eines Zeigers wäre die Lösung, wenn der Compiler nicht optimieren würde. Denn dadurch wird im Programm nicht von der Hardware gelesen, sondern wieder nur von einem Abbild im Speicher. Das Ergebnis wäre das gleiche wie oben. Mit dem Schlüsselwort volatile sagt man nun dem Compiler, dass die entsprechende Variable entweder durch andere Softwareroutinen (Interrupts) oder durch die Hardware verändert werden kann.<br />
<br />
Siehe auch: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass avr-libc FAQ: "How do I pass an IO port as a parameter to a function?"]<br />
<br />
= Zugriff auf IO-Ports =<br />
<br />
Jeder AVR implementiert eine unterschiedliche Menge an GPIO-Registern<br />
(GPIO - General Purpose Input/Output). Diese Register dienen dazu:<br />
* einzustellen welche der Anschlüsse ("Beinchen") des Controllers als Ein- oder Ausgänge dienen<br />
* bei Ausgängen deren Zustand festzulegen<br />
* bei Eingängen deren Zustand zu erfassen<br />
<br />
Mittels GPIO werden digitale Zustände gesetzt und erfasst, d.h. die Spannung an einem Ausgang wird ein- oder ausgeschaltet und an einem Eingang wird erfasst, ob die anliegende Spannung über oder unter einem bestimmten Schwellwert liegt. Im Datenblatt Abschnitt Electrical Characteristics/DC Characteristics finden sich die Spannungswerte (V_OL, V_OH für Ausgänge, V_IL, V_IH für Eingänge).<br />
<br />
Die Verarbeitung von analogen Eingangswerten und die Ausgabe von Analogwerten wird in Kapitel [[AVR-GCC-Tutorial#Analoge_Ein-_und_Ausgabe|Analoge Ein- und Ausgabe]] behandelt.<br />
<br />
Die physischen Ein- und Ausgänge werden bei AVR-Controllern zu logischen Ports gruppiert.<br />
<br />
Alle Ports werden über Register gesteuert. Dazu sind jedem Port 3 Register zugeordnet:<br />
<br />
{| class="wikitable"<br />
|- <br />
! width="10%"| DDRx<br />
| Datenrichtungsregister für Port'''x'''. <br />
'''x''' entspricht '''A''', '''B''', ''' C''' usw. je nach gewünschtem Port. Bit im Register gesetzt (1) für Ausgang, Bit gelöscht (0) für Eingang.<br />
|- <br />
! PINx<br />
| Eingangsadresse für Port'''x'''. <br />
Zustand des Ports. Die Bits in PINx entsprechen dem Zustand der als Eingang definierten Portpins. Bit 1 wenn Pin "high", Bit 0 wenn Portpin low.<br />
|-<br />
! PORTx<br />
| Datenregister für Port'''x'''. <br />
Dieses Register wird verwendet, um die Ausgänge eines Ports anzusteuern. Bei Pins, die mittels DDRx auf Eingang geschaltet wurden, können über PORTx<br />
die internen Pull-Up Widerstände aktiviert oder deaktiviert werden (1 = aktiv).<br />
|}<br />
<br />
Die folgenden Beispiele gehen von einem AVR aus, der sowohl Port A als auch Port B besitzt. Sie müssen für andere AVRs (zum Beispiel ATmega8/48/88/168) entsprechend angepasst werden.<br />
<br />
== Datenrichtung bestimmen ==<br />
<br />
Zuerst muss die Datenrichtung der verwendeten Pins bestimmt werden. Um dies zu erreichen, wird das Datenrichtungsregister des entsprechenden Ports beschrieben.<br />
<br />
Für jeden Pin, der als Ausgang verwendet werden soll, muss dabei das<br />
entsprechende Bit auf dem Port gesetzt werden. Soll der Pin als Eingang<br />
verwendet werden, muss das entsprechende Bit gelöscht sein.<br />
<br />
Beispiel:<br />
Angenommen am Port B sollen die Pins 0 bis 4 als Ausgänge definiert werden, die noch verbleibenden Pins 5 bis 7 sollen als Eingänge fungieren. Dazu ist es daher notwendig, im für das Port B zuständigen Datenrichtungsregister DDRB folgende Bitkonfiguration einzutragen<br />
<br />
+---+---+---+---+---+---+---+---+<br />
| 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |<br />
+---+---+---+---+---+---+---+---+<br />
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |<br />
<br />
In C liest sich das dann so:<br />
<br />
<syntaxhighlight lang="c"><br />
// in io.h wird u.a. DDRB definiert:<br />
#include <avr/io.h><br />
<br />
int main()<br />
{<br />
// Setzen der Bits 0,1,2,3 und 4<br />
// Binaer 00011111 = Hexadezimal 1F<br />
// direkte Zuweisung - standardkonform */<br />
DDRB = 0x1F; /* <br />
<br />
// Uebersichtliche Alternative - Binaerschreibweise, aber kein ISO-C<br />
DDRB = 0b00011111;<br />
<br />
// Ausfuehrliche Schreibweise: identische Funktionalitaet, mehr Tipparbeit<br />
// aber uebersichtlicher und selbsterklaerend:<br />
DDRB |= (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4); <br />
</syntaxhighlight><br />
<br />
Die Pins 5 bis 7 werden (da 0) als Eingänge geschaltet. Weitere Beispiele:<br />
<br />
<syntaxhighlight lang="c"><br />
// Alle Pins des Ports B als Ausgang definieren:<br />
DDRB = 0xff; <br />
// Pin0 wieder auf Eingang und andere im urspruenglichen Zustand belassen:<br />
DDRB &= ~(1 << DDB0);<br />
// Pin 3 und 4 auf Eingang und andere im urspruenglichen Zustand belassen:<br />
DDRB &= ~((1 << DDB3) | (1 << DDB4));<br />
// Pin 0 und 3 wieder auf Ausgang und andere im ursprünglichen Zustand belassen:<br />
DDRB |= (1 << DDB0) | (1 << DDB3);<br />
// Alle Pins auf Eingang:<br />
DDRB = 0x00;<br />
</syntaxhighlight><br />
<br />
== Vordefinierte Bitnummern für I/O-Register ==<br />
<br />
Die Bitnummern (z.&nbsp;B. PCx, PINCx und DDCx für den Port C) sind in den io*.h-Dateien der avr-libc definiert und dienen lediglich der besseren Lesbarkeit. Man muss diese Definitionen nicht verwenden oder kann auch einfach "immer" PAx, PBx, PCx usw. nutzen, auch wenn der Zugriff auf Bits in DDRx- oder PINx-Registern erfolgt. Für den Compiler sind die Ausdrücke (1<<PC7), (1<<DDC7) und (1<<PINC7) identisch zu (1<<7) (genauer: der Präprozessor ersetzt die Ausdrücke (1<<PC7),... zu (1<<7)). Ein Ausschnitt der Definitionen für Port C eines ATmega32 aus der iom32.h-Datei zur Verdeutlichung (analog für die weiteren Ports):<br />
<br />
<syntaxhighlight lang="c"><br />
...<br />
/* PORTC */<br />
#define PC7 7<br />
#define PC6 6<br />
#define PC5 5<br />
#define PC4 4<br />
#define PC3 3<br />
#define PC2 2<br />
#define PC1 1<br />
#define PC0 0<br />
<br />
/* DDRC */<br />
#define DDC7 7<br />
#define DDC6 6<br />
#define DDC5 5<br />
#define DDC4 4<br />
#define DDC3 3<br />
#define DDC2 2<br />
#define DDC1 1<br />
#define DDC0 0<br />
<br />
/* PINC */<br />
#define PINC7 7<br />
#define PINC6 6<br />
#define PINC5 5<br />
#define PINC4 4<br />
#define PINC3 3<br />
#define PINC2 2<br />
#define PINC1 1<br />
#define PINC0 0<br />
</syntaxhighlight><br />
<br />
<br />
== Digitale Signale ==<br />
<br />
Am einfachsten ist es, digitale Signale mit dem Mikrocontroller zu erfassen bzw. auszugeben.<br />
<br />
== Ausgänge ==<br />
Will man als Ausgang definierte Pins (entsprechende DDRx-Bits = 1) auf Logisch 1 setzen, setzt man die entsprechenden Bits im Portregister.<br />
<br />
Mit dem Befehl<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB = 0x04; /* besser PORTB=(1<<PB2) */<br />
<br />
// Uebersichtliche Alternative - Binaerschreibweise<br />
PORTB = 0b00000100; /* direkte Zuweisung - uebersichtlich */<br />
<br />
</syntaxhighlight><br />
wird also der Ausgang an Pin PB2 gesetzt (Beachte, dass die Bits immer ''von 0 an'' gezählt werden, das niederwertigste Bit ist also Bitnummer 0 und nicht etwa Bitnummer 1).<br />
<br />
Man beachte, dass bei der Zuweisung mittels '''=''' immer alle Pins gleichzeitig angegeben werden. Man sollte also, wenn nur bestimmte Ausgänge geschaltet werden sollen, zuerst den aktuellen Wert des Ports einlesen und das Bit des gewünschten Ports in diesen Wert einfließen lassen. Will man also nur den dritten Pin (Bit Nr. 2) an Port B auf "high" setzen und den Status der anderen Ausgänge unverändert lassen, nutze man diese Form:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB = PORTB | 0x04; /* besser: PORTB = PORTB | ( 1<<PB2 ) */<br />
/* vereinfacht durch Nutzung des |= Operators : */<br />
PORTB |= (1<<PB2);<br />
<br />
/* auch mehrere "gleichzeitig": */<br />
PORTB |= (1<<PB4) | (1<<PB5); /* Pins PB4 und PB5 "high" */<br />
</syntaxhighlight><br />
<br />
"Ausschalten", also Ausgänge auf "low" setzen, erfolgt analog:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB &= ~(1<<PB2); /* loescht Bit 2 in PORTB und setzt damit Pin PB2 auf low */ <br />
PORTB &= ~( (1<<PB4) | (1<<PB5) ); /* Pin PB4 und Pin PB5 "low" */<br />
</syntaxhighlight><br />
Siehe auch [[Bitmanipulation]]<br />
<br />
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind in aktuellen Versionen der avr-libc nicht mehr enthalten und auch nicht mehr erforderlich.<br />
<br />
''Falls der Anfangszustand von Ausgängen kritisch ist, muss die Reihenfolge beachtet werden, mit der die Datenrichtung (DDRx) eingestellt und der Ausgabewert (PORTx) gesetzt wird:''<br />
<br />
Für Ausgangspins, die mit Anfangswert "high" initialisiert werden sollen:<br />
* zuerst die Bits im PORTx-Register setzen<br />
* anschließend die Datenrichtung auf Ausgang stellen<br />
<br />
Daraus ergibt sich die Abfolge für einen Pin, der bisher als Eingang mit abgeschaltetem Pull-Up konfiguriert war:<br />
* setze PORTx: interner Pull-Up aktiv<br />
* setze DDRx: Ausgang ("high")<br />
<br />
Bei der Reihenfolge erst DDRx und dann PORTx kann es zu einem kurzen "low-Puls" kommen, der auch externe Pull-Up-Widerstände "überstimmt". Die (ungünstige) Abfolge: Eingang -> setze DDRx: Ausgang (auf "low", da PORTx nach Reset 0) -> setze PORTx: Ausgang auf high. Vergleiche dazu auch das Datenblatt Abschnitt ''Configuring the Pin''.<br />
<br />
== Eingänge (Wie kommen Signale in den &micro;C) ==<br />
<br />
Die digitalen Eingangssignale können auf verschiedene Arten zu unserer Logik gelangen.<br />
<br />
=== Signalkopplung ===<br />
<br />
Am einfachsten ist es, wenn die Signale direkt aus einer anderen digitalen Schaltung übernommen werden können. Hat der Ausgang der entsprechenden Schaltung TTL-Pegel dann können wir sogar direkt den Ausgang der Schaltung mit einem Eingangspin von unserem Controller verbinden.<br />
<br />
Hat der Ausgang der anderen Schaltung keinen TTL-Pegel so müssen wir den Pegel über entsprechende Hardware (z.&nbsp;B. Optokoppler, [[Widerstand#Spannungsteiler|Spannungsteiler]], "Levelshifter" aka [[Pegelwandler]]) anpassen.<br />
<br />
Die Masse der beiden Schaltungen muss selbstverständlich miteinander verbunden werden. Der Software selber ist es natürlich letztendlich egal, wie das Signal eingespeist wird. Wir können ja ohnehin lediglich prüfen, ob an einem Pin unseres Controllers eine logische 1 (Spannung größer ca. 0,7*Vcc) oder eine logische 0 (Spannung kleiner ca. 0,2*Vcc) anliegt. Detaillierte Informationen darüber, ab welcher Spannung ein Eingang als 0 ("low") bzw. 1 ("high") erkannt wird, liefert die Tabelle DC Characteristics im Datenblatt des genutzten Controllers.<br />
<br />
{| class="wikitable" style="text-align:center; width:20em"<br />
|+ '''Logikpegel'''<br />
|-<br />
! VCC [V]<br />
! Low [V]<br />
! High [V]<br />
|-<br />
! 5<br />
| 1,0 || 3,5<br />
|-<br />
! 3,3<br />
| 0,66 || 2,3<br />
|-<br />
! 1,8<br />
| 0,36 || 1,26 <br />
|}<br />
<br />
Die Abfrage der Zustände der Portpins erfolgt direkt über den Registernamen.<br />
<br />
{{Warnung|Dabei ist wichtig, zur Abfrage der Eingänge ''nicht'' etwa Portregister '''PORTx''' zu verwenden, sondern Eingangsregister '''PINx'''. Ansonsten liest man nicht den Zustand der Eingänge, sondern den Status der internen Pull-Up-Widerstände. Die Abfrage der Pinzustände über PORTx statt PINx ist ein häufiger Fehler beim AVR-"Erstkontakt".}}<br />
<br />
Will man also die aktuellen Signalzustände von Port D abfragen und in eine Variable namens bPortD abspeichern, schreibt man folgende Befehlszeilen:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdint.h><br />
...<br />
uint8_t bPortD;<br />
...<br />
bPortD = PIND;<br />
...<br />
</syntaxhighlight><br />
<br />
Mit den C-Bitoperationen kann man den Status der Bits abfragen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */<br />
if ( PINC & (1<<PINC1) ) {<br />
/* Aktion */<br />
}<br />
<br />
/* Fuehre Aktion aus, wenn Bit Nr. 2 (das "dritte" Bit) in PINB geloescht (0) ist */<br />
if ( !(PINB & (1<<PINB2)) ) {<br />
/* Aktion */<br />
}<br />
...<br />
</syntaxhighlight><br />
Siehe auch [[Bitmanipulation#Bits_prüfen]]<br />
<br />
=== Interne Pull-Up Widerstände ===<br />
<br />
Portpins für Ein- und Ausgänge (GPIO) eines AVR verfügen über zuschaltbare interne Pull-Up Widerstände (nominal mehrere 10kOhm, z.&nbsp;B. ATmega16 20-50kOhm). Diese können in vielen Fällen statt externer Widerstände genutzt werden.<br />
<br />
Die internen Pull-Up Widerstände von Vcc zu den einzelnen Portpins werden über das Register ''' PORTx''' aktiviert bzw. deaktiviert, wenn ein Pin als ''' Eingang''' geschaltet ist.<br />
<br />
Wird der Wert des entsprechenden Portpins auf 1 gesetzt, so ist der Pull-Up Widerstand aktiviert. Bei einem Wert von 0 ist der Pull-Up Widerstand nicht aktiv. Man sollte jeweils entweder den internen oder einen externen Pull-Up Widerstand verwenden, aber nicht beide zusammen.<br />
<br />
Im Beispiel werden alle Pins des Ports D als Eingänge geschaltet und alle Pull-Up Widerstände aktiviert. Weiterhin wird Pin PC7 als Eingang geschaltet und dessen interner Pull-Up Widerstand aktiviert, ohne die Einstellungen für die anderen Portpins (PC0-PC6) zu verändern.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
DDRD = 0x00; /* alle Pins von Port D als Eingang */<br />
PORTD = 0xff; /* interne Pull-Ups an allen Port-Pins aktivieren */<br />
...<br />
DDRC &= ~(1<<PC7); /* Pin PC7 als Eingang */<br />
PORTC |= (1<<PC7); /* internen Pull-Up an PC7 aktivieren */<br />
</syntaxhighlight><br />
<br />
=== Taster und Schalter ===<br />
<br />
Der Anschluss mechanischer Kontakte an den Mikrocontroller, ist zwischen zwei unterschiedliche Methoden zu unterscheiden: ''Active Low'' und ''Active High''.<br />
<br />
<gallery widths="300" heights="300" caption="Anschluss mechanischer Kontakte an einen µC"><br />
Image:Active Low.gif|'''Active Low:''' Bei dieser Methode wird der Kontakt zwischen den Eingangspin des Controllers und Masse geschaltet. Damit bei offenem Schalter der Controller kein undefiniertes Signal bekommt, wird zwischen die Versorgungsspannung und den Eingangspin ein sogenannter '''Pull-Up''' Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffnetem Schalter auf logisch 1 zu ziehen.<br />
Image:Active High.gif|'''Active High:''' Hier wird der Kontakt zwischen die Versorgungsspannung und den Eingangspin geschaltet. Damit bei offener Schalterstellung kein undefiniertes Signal am Controller ansteht, wird zwischen den Eingangspin und die Masse ein '''Pull-Down''' Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffneter Schalterstellung auf logisch 0 zu halten. <br />
</gallery><br />
<br />
Der Widerstandswert von Pull-Up- und Pull-Down-Widerständen ist an sich nicht kritisch. Wird er allerdings zu hoch gewählt, ist die Wirkung eventuell nicht gegeben. Als üblicher Wert haben sich 10 kOhm eingebürgert. Die AVRs verfügen an den meisten Pins über zuschaltbare interne Pull-Up Widerstände (vgl. Abschnitt [[AVR-GCC-Tutorial#Interne Pull-Up Widerstände|Interne Pull-Up Widerstände]]), welche insbesondere wie hier bei Tastern und ähnlichen Bauteilen (z.&nbsp;B. Drehgebern) statt externer Bauteile verwendet werden können. Interne Pull-Down-Widerstand sind nicht verfügbar und müssen daher in Form zusätzlicher Bauteile in die Schaltung eingefügt werden.<br />
<br />
==== Taster entprellen ====<br />
<br />
Siehe: ''[[Entprellung#Warteschleifen-Verfahren|Entprellung: Warteschleifen-Verfahren]]<br />
<br />
= Warteschleifen (delay.h) =<br />
<br />
Der Programmablauf kann verschiedene Arten von Wartefunktionen erfordern:<br />
<br />
* Warten im Sinn von Zeitvertrödeln<br />
* Warten auf einen bestimmten Zustand an den I/O-Pins<br />
* Warten auf einen bestimmten Zeitpunkt (siehe Timer)<br />
* Warten auf einen bestimmten Zählerstand (siehe Counter)<br />
<br />
Der einfachste Fall, das Zeitvertrödeln, kann in vielen Fällen und mit großer Genauigkeit anhand der avr-libc Bibliotheksfunktionen _delay_ms() und _delay_us() erledigt werden. Die Bibliotheksfunktionen sind einfachen Zählschleifen (Warteschleifen) vorzuziehen, da leere Zählschleifen ohne besondere Vorkehrungen sonst bei eingeschalteter Optimierung vom avr-gcc-Compiler wegoptimiert werden. Weiterhin sind die Bibliotheksfunktionen bereits darauf vorbereitet, die in F_CPU definierte Taktfrequenz zu verwenden. Außerdem sind die Funktionen der Bibliothek wirklich getestet.<br />
<br />
Einfach!? Schon, aber während gewartet wird, macht der µC nichts anderes mehr (abgesehen von möglicherweise auftretenden Interrupts, falls welche aktiviert sind). Die Wartefunktion blockiert den Programmablauf. Möchte man einerseits warten, um z.&nbsp;B. eine LED blinken zu lassen und gleichzeitig andere Aktionen ausführen z.&nbsp;B. weitere LED bedienen, sollten die Timer/Counter des AVR verwendet werden, siehe Artikel [[Multitasking]].<br />
<br />
Die Bibliotheksfunktionen funktionieren allerdings nur dann korrekt, wenn sie mit zur Übersetzungszeit (beim Compilieren) bekannten konstanten Werten aufgerufen werden. Der Quellcode muss mit eingeschalteter Optimierung übersetzt werden, sonst wird sehr viel Maschinencode erzeugt, und die Wartezeiten stimmen nicht mehr mit dem Parameter überein.<br />
<br />
Eine weitere Einschränkung liegt darin, daß sie möglicherweise länger warten, als erwartet, nämlich in dem Fall, daß Interrupts auftreten und die _delay...()-Funktion unterbrechen. Genau genommen warten diese nämlich nicht eine bestimmte Zeit, sondern verbrauchen eine bestimmte Anzahl von Prozessortakten. Die wiederum ist so bemessen, daß ohne Unterbrechung durch Interrupts die gewünschte Wartezeit erreicht wird.<br />
Wird das Warten aber durch eine oder mehrere ISR unterbrochen, die zusammen 1% Prozessorzeit verbrauchen, dann dauert das Warten etwa 1% länger. Bei 50% Last durch die ISR dauert das Warten doppelt solange wie gewünscht, bei 90% zehnmal solange...<br />
<br />
Abhängig von der Version der Bibliothek verhalten sich die Bibliotheksfunktionen etwas unterschiedlich.<br />
<br />
== avr-libc Versionen bis 1.6 ==<br />
<br />
Die Wartezeit der Funktion _delay_ms() ist auf 262,14ms/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 13,1ms warten. Die Wartezeit der Funktion _delay_us() ist auf 768us/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 38,4µs warten. Längere Wartezeiten müssen dann über einen mehrfachen Aufruf in einer Schleife gelöst werden.<br />
<br />
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#ifndef F_CPU<br />
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert <br />
(z.&nbsp;B. durch Übergabe als Parameter zum Compiler innerhalb <br />
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die<br />
"nachträgliche" Definition hinweist */<br />
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"<br />
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */<br />
#endif<br />
#include <util/delay.h> /* in älteren avr-libc Versionen <avr/delay.h> */ <br />
<br />
/*<br />
lange, variable Verzögerungszeit, Einheit in Millisekunden<br />
<br />
Die maximale Zeit pro Funktionsaufruf ist begrenzt auf <br />
262.14 ms / F_CPU in MHz (im Beispiel: <br />
262.1 / 3.6864 = max. 71 ms) <br />
<br />
Daher wird die kleine Warteschleife mehrfach aufgerufen,<br />
um auf eine längere Wartezeit zu kommen. Die zusätzliche <br />
Prüfung der Schleifenbedingung lässt die Wartezeit geringfügig<br />
ungenau werden (macht hier vielleicht 2-3ms aus).<br />
*/<br />
<br />
void long_delay(uint16_t ms)<br />
{<br />
for(; ms>0; ms--) _delay_ms(1);<br />
}<br />
<br />
int main( void )<br />
{<br />
DDRB = ( 1 << PB0 ); // PB0 an PORTB als Ausgang setzen<br />
<br />
while( 1 ) // Endlosschleife<br />
{ <br />
PORTB ^= ( 1 << PB0 ); // Toggle PB0 z.&nbsp;B. angeschlossene LED<br />
long_delay(1000); // Eine Sekunde warten...<br />
}<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
== avr-libc Versionen ab 1.7 ==<br />
<br />
_delay_ms() kann mit einem Argument bis 6553,5 ms (= 6,5535 Sekunden) benutzt werden. Es ist nicht möglich, eine Variable als Argument zu übergeben. Wird die früher gültige Grenze von 262,14 ms/F_CPU (in MHz) überschritten, so arbeitet _delay_ms() einfach etwas ungenauer und zählt nur noch mit einer Auflösung von 1/10 ms. Eine Verzögerung von 1000,10 ms ließe sich nicht mehr von einer von 1000,19 ms unterscheiden. Ein Verlust, der sich im Allgemeinen verschmerzen lässt. Dem Programmierer wird keine Rückmeldung gegeben, dass die Funktion ggf. gröber arbeitet, d.h. wenn es darauf ankommt, bitte den Parameter wie bisher geschickt wählen.<br />
<br />
Die Funktion _delay_us() wurde ebenfalls erweitert. Wenn deren maximal als genau behandelbares Argument überschritten wird, benutzt diese intern _delay_ms(). Damit gelten in diesem Fall die _delay_ms() Einschränkungen.<br />
<br />
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus, avr-libc ab Version 1.6<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#ifndef F_CPU<br />
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert <br />
(z.B. durch Übergabe als Parameter zum Compiler innerhalb <br />
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die<br />
"nachträgliche" Definition hinweist */<br />
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"<br />
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */<br />
#endif<br />
#include <util/delay.h><br />
<br />
int main( void )<br />
{<br />
DDRB = ( 1 << PB0 ); // PB0 an PORTB als Ausgang setzen<br />
<br />
while( 1 ) { // Endlosschleife<br />
PORTB ^= ( 1 << PB0 ); // Toggle PB0 z.B. angeschlossene LED<br />
_delay_ms(1000); // Eine Sekunde +/-1/10000 Sekunde warten...<br />
// funktioniert nicht mit Bibliotheken vor 1.6<br />
<br />
}<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
Die _delay_ms() und die _delay_us aus '''avr-libc 1.7.0''' sind fehlerhaft. _delay_ms () läuft 4x schneller als erwartet. Abhilfe ist eine korrigierte Includedatei: [http://www.mikrocontroller.net/topic/196738#1943039]<br />
<br />
= Programmieren mit Interrupts =<br />
<br />
<div style="float:right; margin:2em;"><br />
[[Image:Interrupt Programme.gif]]<br />
</div><br />
Nachdem wir nun alles Wissenswerte für die serielle Programmerstellung<br />
gelernt haben nehmen wir jetzt ein völlig anderes Thema in Angriff, nämlich<br />
die Programmierung unter Zuhilfenahme der Interrupts des AVR.<br />
<br />
Tritt ein Interrupt auf, unterbricht (engl. interrupts) der Controller die Verarbeitung des Hauptprogramms und verzweigt zu einer Interruptroutine. Das Hauptprogramm wird also beim Eintreffen eines Interrupts unterbrochen, die Interruptroutine ausgeführt und danach erst wieder das Hauptprogramm an der Unterbrechungsstelle fortgesetzt (vgl. die Abbildung).<br />
<br />
Um Interrupts verarbeiten zu können, ist folgendes zu beachten:<br />
<br />
* Für jede aktivierte Interruptquelle ist eine Funktion zu programmieren, in der die beim Auftreten des jeweiligen Interrupts erforderlichen Verarbeitungsschritte enthalten sind. Für diese Funktion existieren verschiedene Bezeichnungen. Üblich sind die englischen Begriffe Interrupt-Handler oder Interrupt-Service-Routinen (ISR), man findet aber auch die Bezeichnungen Interruptverarbeitungs- oder -behandlungsroutine oder auch kurz Interruptroutine. Zum Beispiel wird üblicherweise in der ISR zur Verarbeitung des Empfangsinterrupts eines UARTs (UART-RX Interrupt) das empfangene Zeichen in einen Zwischenspeicher (FIFO-Buffer) kopiert, dessen Inhalt später von anderen Programmteilen geleert wird. Sofern der Zwischenspeicher ausreichend groß ist, geht also kein Zeichen verloren, auch wenn im Hauptprogramm zeitintensive Operationen durchgeführt werden.<br />
* Die benötigten Interrupts sind in den jeweiligen Funktionsbausteinen einzuschalten. Dies erfolgt über das jeweilige Aktivierungsbit (Interrupt Enable) in einem der Hardwareregister (z.B. RX(Complete)Interrupt Enable eines UARTs)<br />
* Sämtliche Interrupts werden über einen weiteren globalen Schalter aktiviert und deaktiviert. Zur Verarbeitung der Interrupts ist dieser Schalter zu aktivieren (sei(), siehe unten).<br />
<br />
Alle Punkte sind zu beachten. Fehlt z.B. die globale Aktivierung, werden Interruptroutinen auch dann nicht aufgerufen, wenn sie im Funktionsbaustein eingeschaltet sind und eine Behandlungsroutine verhanden ist.<br />
<br />
Siehe auch<br />
<br />
* [http://www.mikrocontroller.net/forum/read-1-235092.html#new Ausführlicher Thread im Forum]<br />
* Artikel [[Interrupt]]<br />
* Artikel [[Multitasking]]<br />
{{Clear}}<br />
<br />
== Anforderungen an Interrupt-Routinen ==<br />
<br />
Um unliebsamen Überraschungen vorzubeugen, sollten einige Grundregeln bei der Implementierung der Interruptroutinen beachtet werden. Interruptroutinen sollten möglichst kurz und schnell abarbeitbar sein, daraus folgt:<br />
<br />
* Keine umfangreichen Berechnungen innerhalb der Interruptroutine. (*)<br />
* Keine langen Programmschleifen.<br />
* Obwohl es möglich ist, während der Abarbeitung einer Interruptroutine andere oder sogar den gleichen Interrupt wieder zuzulassen, wird davon ohne genaue Kenntnis der internen Abläufe dringend abgeraten.<br />
<br />
Interruptroutinen (ISRs) sollten also möglichst kurz sein und keine Schleifen mit vielen Durchläufen enthalten. Längere Operationen können meist in einen "Interrupt-Teil" in einer ISR und einen "Arbeitsteil" im Hauptprogramm aufgetrennt werden. Z.B. Speichern des Zustands aller Eingänge im EEPROM in bestimmten Zeitabständen: ISR-Teil: Zeitvergleich (Timer,RTC) mit Logzeit/-intervall. Bei Übereinstimmung ein globales Flag setzen (volatile bei Flag-Deklaration nicht vergessen, s.u.). Dann im Hauptprogramm prüfen, ob das Flag gesetzt ist. Wenn ja: die Daten im EEPROM ablegen und Flag löschen.<br />
<br />
(*)<br />
Hinweis: <br />
Es gibt allerdings die seltene Situation, dass man gerade eingelesene<br />
ADC-Werte sofort verarbeiten muss. Besonders dann, wenn man mehrere Werte sehr<br />
schnell hintereinander bekommt. Dann bleibt einem nichts anderes übrig, als die<br />
Werte noch in der ISR zu verarbeiten. Kommt aber sehr selten vor und sollte<br />
durch geeignete Wahl des Systemtaktes bzw. Auswahl des Controllers vermieden werden!<br />
<br />
== Interrupt-Quellen ==<br />
<br />
Die folgenden Ereignisse können einen Interrupt auf einem AVR AT90S2313 auslösen, wobei die Reihenfolge der Auflistung auch die Priorität der Interrupts aufzeigt.<br />
<br />
* Reset<br />
* Externer Interrupt 0<br />
* Externer Interrupt 1<br />
* Timer/Counter 1 Capture Ereignis<br />
* Timer/Counter 1 Compare Match<br />
* Timer/Counter 1 Überlauf<br />
* Timer/Counter 0 Überlauf<br />
* UART Zeichen empfangen<br />
* UART Datenregister leer<br />
* UART Zeichen gesendet<br />
* Analoger Komparator<br />
<br />
Die Anzahl der möglichen Interruptquellen variiert zwischen den verschiedenen Microcontroller-Typen. Im Zweifel hilft ein Blick ins Datenblatt ("Interrupt Vectors").<br />
<br />
== Register ==<br />
<br />
Der AT90S2313 verfügt über 2 Register die mit den<br />
Interrupts zusammenhängen.<br />
<br />
{| class="wikitable"<br />
|- <br />
!width="10%"| GIMSK<br />
| '''G'''eneral '''I'''nterrupt '''M'''a'''sk''' Register.<br /><br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit <br />
| 7 || 6|| 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''INT1''' || '''INT0''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-'''<br />
|- <br />
! R/W<br />
| R/W || R/W || R || R || R || R || R || R<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''INT1''' (External '''Int'''errupt Request '''1''' Enable)<br />
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am '''INT1'''-Pin eine steigende oder fallende (je nach Konfiguration im '''MCUCR''') Flanke erkannt wird.<br />
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.<br />
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.<br />
<br />
'''INT0''' (External '''Int'''errupt Request '''0''' Enable)<br />
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am '''INT0'''-Pin eine steigende oder fallende (je nach Konfiguration im '''MCUCR''') Flanke erkannt wird.<br />
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.<br />
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.<br />
<br />
|- <br />
! GIFR<br />
| '''G'''eneral '''I'''nterrupt '''F'''lag '''R'''egister.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''INTF1''' || '''INTF0''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-'''<br />
|- <br />
! R/W<br />
| R/W || R/W || R || R || R || R || R || R<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''INTF1''' (External '''Int'''errupt Flag '''1''')<br />
:Dieses Bit wird gesetzt, wenn am '''INT1'''-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.<br />
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert '''1(!)''' eingeschrieben wird.<br />
<br />
'''INTF0''' (External '''Int'''errupt Flag '''0''')<br />
:Dieses Bit wird gesetzt, wenn am '''INT0'''-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.<br />
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert '''1(!)''' eingeschrieben wird.<br />
|- <br />
! MCUCR<br />
| '''MCU''' '''C'''ontrol '''R'''egister.<br />
<br />
Das MCU Control Register enthält Kontrollbits für allgemeine MCU-Funktionen.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''-'''|| '''-'''|| '''SE'''|| '''SM'''|| '''ISC11'''|| '''ISC10'''|| '''ISC01'''|| '''ISC00'''<br />
|- <br />
! R/W<br />
| R || R || R/W || R/W || R/W || R/W || R/W || R/W<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
<br />
|}<br />
<br />
'''SE''' ('''S'''leep '''E'''nable)<br />
:Dieses Bit muss gesetzt sein, um den Controller mit dem '''SLEEP'''-Befehl in den Schlafzustand versetzen zu können.<br />
:Um den Schlafmodus nicht irrtümlich einzuschalten, wird empfohlen, das Bit erst unmittelbar vor Ausführung des '''SLEEP'''-Befehls zu setzen.<br />
<br />
'''SM''' ('''S'''leep '''M'''ode)<br />
:Dieses Bit bestimmt über den Schlafmodus.<br />
:Ist das Bit gelöscht, so wird der '''Idle'''-Modus ausgeführt. Ist das Bit gesetzt, so wird der '''Power-Down'''-Modus ausgeführt. (für andere AVR Controller siehe Abschnitt "Sleep-Mode")<br />
<br />
'''ISC11''', '''ISC10''' ('''I'''nterrupt '''S'''ense '''C'''ontrol '''1''' Bits)<br />
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am '''INT1'''-Pin ausgewertet wird.<br />
<br />
:{| class="wikitable"<br />
|- <br />
!width="10%"| ISC11 ||width="10%"| ISC10 || Bedeutung<br />
|- <br />
| align="center" | 0<br />
| align="center" | 0<br />
| Low Level an '''INT1''' erzeugt einen Interrupt.<br />
<br />
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.<br />
|- <br />
| align="center" | 0<br />
| align="center" | 1<br />
| Reserviert<br />
|- <br />
| align="center" | 1<br />
| align="center" | 0<br />
| Die fallende Flanke an '''INT1''' erzeugt einen Interrupt.<br />
|- <br />
| align="center" | 1<br />
| align="center" | 1<br />
| Die steigende Flanke an '''INT1''' erzeugt einen Interrupt.<br />
|}<br />
<br />
'''ISC01''', '''ISC00''' ('''I'''nterrupt '''S'''ense '''C'''ontrol '''0''' Bits)<br />
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am '''INT0'''-Pin ausgewertet wird.<br />
<br />
:{| class="wikitable"<br />
|- <br />
!width="10%"| ISC01 ||width="10%"| ISC00 || Bedeutung<br />
|- <br />
| align="center" | 0<br />
| align="center" | 0<br />
| Low Level an '''INT0''' erzeugt einen Interrupt.<br />
<br />
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.<br />
|- <br />
| align="center" | 0<br />
| align="center" | 1<br />
| Reserviert<br />
|- <br />
| align="center" | 1<br />
| align="center" | 0<br />
| Die fallende Flanke an '''INT0''' erzeugt einen Interrupt.<br />
|- <br />
| align="center" | 1<br />
| align="center" | 1<br />
| Die steigende Flanke an '''INT0''' erzeugt einen Interrupt.<br />
|}<br />
<br />
|}<br />
<br />
== Allgemeines über die Interrupt-Abarbeitung ==<br />
<br />
Wenn ein Interrupt eintrifft, wird automatisch das '''Global Interrupt Enable''' Bit im Status Register '''SREG''' gelöscht und alle weiteren Interrupts unterbunden. Dieses wird automatisch wieder gesetzt, wenn die Interruptroutine beendet wird. Wenn in der Zwischenzeit weitere Interrupts eintreffen, werden die zugehörigen Interrupt-Bits gesetzt und die Interrupts bei Beendigung der laufenden Interrupt-Routine in der Reihenfolge ihrer Priorität ausgeführt. Dies kann<br />
eigentlich nur dann zu Problemen führen, wenn ein hoch priorisierter Interrupt ständig und in kurzer Folge auftritt. Dieser sperrt dann möglicherweise alle anderen Interrupts mit niedrigerer Priorität. Dies ist einer der Gründe, weshalb die Interrupt-Routinen sehr kurz gehalten werden sollen. Es ist möglich das GIE-Bit in der ISR zu setzen und so schon wieder weitere Interrupts zuzulassen - allerdings sollte man damit vorsichtig sein und genau wissen was man damit macht. Kritisch wird es vor allem wenn der gleiche Interrupt noch einmal kommt, bevor die ISR abgearbeitet ist. <br />
<br />
<!-- === Das Status-Register ===<br />
<br />
Es gilt auch zu beachten, dass das Status-Register während der Abarbeitung einer Interruptroutine nicht automatisch gesichert wird. Falls notwendig, muss dies vom Programmierer selber vorgesehen werden. --><br />
<br />
== Interrupts mit avr-gcc ==<br />
<br />
<!-- ''Anmerkung eines Nutzers: Ich habe mir das Thema hier angearbeitet und hatte am Anfang starke Probleme: Jeder Interrupt muss nochmals einzeln aktiviert werden. Es reicht nicht nur per ''sei()'' die Interrupts global zu aktiveren.'' - mthomas: Hoffentlich duch die modifizerte Einleitung etwas offensichtlicher erläutert. Ansonsten bitte per Eintrag auf die Diskussionseite nochmals melden) --> <br />
<!-- Selbstverständlich können alle interruptspezifischen Registerzugriffe wie gewohnt über I/O-Adressierung vorgenommen werden. Etwas einfacher geht es jedoch, wenn wir die vom Compiler zur Verfügung gestellten Mittel einsetzen.--><br />
Funktionen zur Interrupt-Verarbeitung werden in den Includedateien ''interrupt.h'' der avr-libc zur Verfügung gestellt (bei älterem Quellcode zusätzlich ''signal.h'').<br />
<br />
<syntaxhighlight lang="c"><br />
// fuer sei(), cli() und ISR():<br />
#include <avr/interrupt.h><br />
</syntaxhighlight><br />
<br />
Das Makro '''sei()''' schaltet die Interrupts ein. Eigentlich wird nichts anderes gemacht, als das '''Global Interrupt Enable''' Bit im Status Register gesetzt.<br />
<br />
<syntaxhighlight lang="c"><br />
sei();<br />
</syntaxhighlight><br />
<br />
Das Makro '''cli()''' schaltet die Interrupts aus, oder anders gesagt, das '''Global Interrupt Enable''' Bit im Status Register wird gelöscht.<br />
<br />
<syntaxhighlight lang="c"><br />
cli();<br />
</syntaxhighlight><br />
<br />
Oft steht man vor der Aufgabe, dass eine Codesequenz nicht unterbrochen werden darf. Es liegt dann nahe, zu Beginn dieser Sequenz ein cli() und am Ende ein sei() einzufügen. Dies ist jedoch ungünstig, wenn die Interrupts vor Aufruf der Sequenz deaktiviert waren und danach auch weiterhin deaktiviert bleiben sollen. Ein sei() würde ungeachtet des vorherigen Zustands die Interrupts aktivieren, was zu unerwünschten Seiteneffekten führen kann. Die aus dem folgenden Beispiel ersichtliche Vorgehensweise ist in solchen Fällen vorzuziehen:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
#include <inttypes.h><br />
<br />
//...<br />
<br />
void NichtUnterbrechenBitte(void)<br />
{<br />
uint8_t tmp_sreg; // temporaerer Speicher fuer das Statusregister<br />
<br />
tmp_sreg = SREG; // Statusregister (also auch das I-Flag darin) sichern<br />
cli(); // Interrupts global deaktivieren<br />
<br />
/* hier "unterbrechnungsfreier" Code */<br />
<br />
/* Beispiel Anfang<br />
JTAG-Interface eines ATmega16 per Software deaktivieren <br />
und damit die JTAG-Pins an PORTC für "general I/O" nutzbar machen<br />
ohne die JTAG-Fuse-Bit zu aendern. Dazu ist eine "timed sequence"<br />
einzuhalten (vgl Datenblatt ATmega16, Stand 10/04, S. 229): <br />
Das JTD-Bit muss zweimal innerhalb von 4 Taktzyklen geschrieben <br />
werden. Ein Interrupt zwischen den beiden Schreibzugriffen wuerde <br />
die erforderliche Sequenz "brechen", das JTAG-Interface bliebe<br />
weiterhin aktiv und die IO-Pins weiterhin für JTAG reserviert. */<br />
<br />
MCUCSR |= (1<<JTD);<br />
MCUCSR |= (1<<JTD); // 2 mal in Folge ,vgl. Datenblatt fuer mehr Information<br />
<br />
/* Beispiel Ende */<br />
<br />
SREG = tmp_sreg; // Status-Register wieder herstellen <br />
// somit auch das I-Flag auf gesicherten Zustand setzen<br />
}<br />
<br />
void NichtSoGut(void)<br />
{<br />
cli();<br />
<br />
/* hier "unterbrechnungsfreier" Code */<br />
<br />
sei();<br />
}<br />
<br />
<br />
int main(void)<br />
{<br />
//...<br />
<br />
cli(); <br />
// Interrupts global deaktiviert <br />
<br />
NichtUnterbrechenBitte();<br />
// auch nach Aufruf der Funktion deaktiviert<br />
<br />
sei();<br />
// Interrupts global aktiviert <br />
<br />
NichtUnterbrechenBitte();<br />
// weiterhin aktiviert<br />
//...<br />
<br />
/* Verdeutlichung der unguenstigen Vorgehensweise mit cli/sei: */<br />
cli(); <br />
// Interrupts jetzt global deaktiviert <br />
<br />
NichtSoGut();<br />
// nach Aufruf der Funktion sind Interrupts global aktiviert <br />
// dies ist mglw. ungewollt!<br />
//...<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<!-- mt: besser so nicht(?), lieber "datenblattkonform"<br />
<br />
<font face="Courier New">'''timer_enable_int (unsigned char ints);<br /><br />
'''</font>Schaltet Timerbezogene Interrupts ein bzw. aus.<br /><br />
Wenn als Argument '''ints''' der Wert 0 übergeben wird so werden alle<br />
Timerinterrupts ausgeschaltet, ansonsten muss in '''ints''' angegeben werden,<br />
welche Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu<br />
setzenden Bits definiert werden.<br /><br />
Beispiel: '''<font face="Courier New">timer_enable_int (1 << TOIE1));<br /><br />
</font>'''Achtung: Wenn ein Timerinterrupt eingeschaltet wird während ein<br />
anderer Timerinterrupt bereits läuft, dann müssen beide Bits angegeben werden<br />
sonst wird der andere Timerinterrupt versehentlich ausgeschaltet.<br />
<br />
<font face="Courier New">'''enable_external_int (unsigned char ints);<br /><br />
'''</font>Schaltet die externen Interrupts ein bzw. aus.<br /><br />
Wenn als Argument '''ints''' der Wert 0 übergeben wird so werden alle externen<br />
Interrrups ausgeschaltet, ansonsten muss in '''ints''' angegeben werden, welche<br />
Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu<br />
setzenden Bits definiert werden.<br /><br />
Beispiel: '''<font face="Courier New">enable_external_int ((1<<br />
</font>'''Schaltet die externen Interrupts 0 und 1 ein.<br />
<br />
Nachdem nun die Interrupts aktiviert sind, braucht es selbstverständlich noch den auszuführenden Code, der ablaufen soll, wenn ein Interrupt eintrifft.<br />
--><br />
Zu den aktivierten Interrupts ist eine Funktion zu programmieren, deren Code aufgerufen wird, wenn der betreffende Interrupt auftritt (Interrupt-Handler, Interrupt-Service-Routine). Dazu existiert die Definition (ein Makro) '''ISR'''.<br />
<br />
=== ISR ===<br />
<br />
(''ISR()'' ersetzt bei neueren Versionen der avr-libc ''SIGNAL()''. SIGNAL sollte nicht mehr genutzt werden, zur Portierung von SIGNAL nach ISR siehe den [[AVR-GCC-Tutorial#Anhang|Anhang]].)<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
//...<br />
ISR(Vectorname) /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */<br />
{<br />
/* Interrupt Code */<br />
}<br />
</syntaxhighlight><br />
<br />
Mit ''ISR'' wird eine Funktion für die Bearbeitung eines Interrupts eingeleitet. Als Argument muss dabei die Benennung des entsprechenden Interruptvektors angegeben werden. Diese sind in den jeweiligen Includedateien IOxxxx.h zu finden. Die Bezeichnung entspricht dem Namen aus dem Datenblatt, bei dem die Leerzeichen durch Unterstriche ersetzt sind und ein ''_vect'' angehängt ist.<br />
<br />
Als Beispiel ein Ausschnitt aus der Datei für den ATmega8 (bei WinAVR Standardinstallation in C:\WinAVR\avr\include\avr\iom8.h) in der neben den aktuellen Namen für ''ISR'' (*_vect) noch die Bezeichnungen für das inzwischen nicht mehr aktuelle ''SIGNAL'' (SIG_*) enthalten sind.<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
/* $Id: iom8.h,v 1.13 2005/10/30 22:11:23 joerg_wunsch Exp $ */<br />
<br />
/* avr/iom8.h - definitions for ATmega8 */<br />
//...<br />
<br />
/* Interrupt vectors */<br />
<br />
/* External Interrupt Request 0 */<br />
#define INT0_vect _VECTOR(1)<br />
#define SIG_INTERRUPT0 _VECTOR(1)<br />
<br />
/* External Interrupt Request 1 */<br />
#define INT1_vect _VECTOR(2)<br />
#define SIG_INTERRUPT1 _VECTOR(2)<br />
<br />
/* Timer/Counter2 Compare Match */<br />
#define TIMER2_COMP_vect _VECTOR(3)<br />
#define SIG_OUTPUT_COMPARE2 _VECTOR(3)<br />
<br />
/* Timer/Counter2 Overflow */<br />
#define TIMER2_OVF_vect _VECTOR(4)<br />
#define SIG_OVERFLOW2 _VECTOR(4)<br />
<br />
/* Timer/Counter1 Capture Event */<br />
#define TIMER1_CAPT_vect _VECTOR(5)<br />
#define SIG_INPUT_CAPTURE1 _VECTOR(5)<br />
<br />
/* Timer/Counter1 Compare Match A */<br />
#define TIMER1_COMPA_vect _VECTOR(6)<br />
#define SIG_OUTPUT_COMPARE1A _VECTOR(6)<br />
<br />
/* Timer/Counter1 Compare Match B */<br />
#define TIMER1_COMPB_vect _VECTOR(7)<br />
#define SIG_OUTPUT_COMPARE1B _VECTOR(7)<br />
<br />
//...<br />
</syntaxhighlight><br />
<br />
<!--Vor Nutzung von SIGNAL muss ebenfalls die Header-Datei signal.h eingebunden werden.--> <br />
Mögliche Funktionsrümpfe für Interruptfunktionen sind zum Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
/* veraltet: #include <avr/signal.h> */<br />
<br />
ISR(INT0_vect) /* veraltet: SIGNAL(SIG_INTERRUPT0) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
ISR(TIMER0_OVF_vect) /* veraltet: SIGNAL(SIG_OVERFLOW0) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
ISR(USART_RXC_vect) /* veraltet: SIGNAL(SIG_UART_RECV) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
// und so weiter und so fort...<br />
</syntaxhighlight><br />
<br />
Auf die korrekte Schreibweise der Vektorbezeichnung ist zu achten. Der gcc-Compiler prüft erst ab Version 4.x, ob ein Signal/Interrupt der angegebenen Bezeichnung tatsächlich in der Includedatei definiert ist und gibt andernfalls eine Warnung aus. Bei WinAVR (ab 2/2005) wurde die Überprüfung auch in den mitgelieferten Compiler der Version 3.x integriert. Aus dem gcc-Quellcode Version 3.x selbst erstellte Compiler enthalten die Prüfung nicht (vgl. [[AVR-GCC]]). <br />
<br />
Während der Ausführung der Funktion sind alle weiteren Interrupts automatisch gesperrt. Beim Verlassen der Funktion werden die Interrupts wieder zugelassen.<br />
<br />
Sollte während der Abarbeitung der Interruptroutine ein weiterer Interrupt (gleiche oder andere Interruptquelle) auftreten, so wird das entsprechende Bit im zugeordneten Interrupt Flag Register gesetzt und die entsprechende Interruptroutine automatisch nach dem Beenden der aktuellen Funktion aufgerufen.<br />
<br />
Ein Problem ergibt sich eigentlich nur dann, wenn während der Abarbeitung der aktuellen Interruptroutine mehrere gleichartige Interrupts auftreten. Die entsprechende Interruptroutine wird im Nachhinein zwar aufgerufen jedoch wissen wir nicht, ob nun der entsprechende Interrupt einmal, zweimal oder gar noch öfter aufgetreten ist. Deshalb soll hier noch einmal betont werden, dass Interruptroutinen so schnell wie nur irgend möglich wieder verlassen werden sollten.<br />
<br />
=== Unterbrechbare Interruptroutinen ===<br />
<br />
"Faustregel": im Zweifel '''ISR'''. Die nachfolgend beschriebene Methode nur dann verwenden, wenn man sich über die unterschiedliche Funktionsweise im Klaren ist.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
<br />
ISR(XXX,ISR_NOBLOCK) /* veraltet: INTERRUPT(SIG_OVERFLOW0) */<br />
{<br />
/* Interrupt-Code */<br />
}<br />
</syntaxhighlight><br />
<br />
Hierbei steht XXX für den oben beschriebenen Namen des Vektors (also z.&nbsp;B. ''TIMER0_OVF_vect''). Der Unterschied im Vergleich zu einer herkömmlichen ISR ist, dass hier beim Aufrufen der Funktion das '''Global Enable Interrupt''' Bit durch Einfügen einer SEI-Anweisung direkt wieder gesetzt und somit alle Interrupts zugelassen werden &ndash; auch XXX-Interrupts. <br />
<br />
Bei unsachgemässer Handhabung kann dies zu erheblichen Problemen durch Rekursion wie einem Stack-Overflow oder anderen unerwarteten Effekten führen und sollte wirklich nur dann eingesetzt werden, wenn man sich sicher ist, das Ganze auch im Griff zu haben.<br />
<br />
Insbesondere sollte möglichst am ISR-Anfang die auslösende IRQ-Quelle deaktiviert und erst am Ende der ISR wieder aktiviert werden. Robuster als die Verwendung einer NOBLOCK-ISR ist daher folgender ISR-Aufbau:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
<br />
ISR (XXX) <br />
{<br />
// Implementiere die ISR ohne zunaechst weitere IRQs zuzulassen<br />
<br />
<<Deaktiviere die XXX-IRQ>><br />
<br />
// Erlaube alle Interrupts (ausser XXX)<br />
sei();<br />
<br />
//... Code ...<br />
<br />
// IRQs global deaktivieren um die XXX-IRQ wieder gefahrlos <br />
// aktivieren zu koennen<br />
cli();<br />
<br />
<<Aktiviere die XXX-IRQ>><br />
}<br />
</syntaxhighlight><br />
Auf diese Weise kann sich die XXX-IRQ nicht selbst unterbrechen, was zu einer Art Endlosschleife führen würde.<br />
<br />
Siehe auch: Hinweise in [[AVR-GCC]]<br />
<br />
siehe dazu: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html<br />
<br />
== Datenaustausch mit Interrupt-Routinen ==<br />
<br />
Variablen, die sowohl in Interrupt-Routinen (ISR = Interrupt Service Routine(s)) als auch vom übrigen Programmcode geschrieben oder gelesen werden, müssen mit einem '''volatile''' deklariert werden. Damit wird dem Compiler mitgeteilt, dass der Inhalt der Variablen vor jedem Lesezugriff aus dem Speicher gelesen und nach jedem Schreibzugriff in den Speicher geschrieben wird. Ansonsten könnte der Compiler den Code so optimieren, dass der Wert der Variablen nur in Prozessorregistern zwischengespeichert wird, die nichts von der Änderung woanders mitbekommen.<br />
<br />
Zur Veranschaulichung ein Codefragment für eine Tastenentprellung mit Erkennung einer "lange gedrückten" Taste.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
#include <stdint.h><br />
//...<br />
<br />
// Schwellwerte<br />
// Entprellung: <br />
#define CNTDEBOUNCE 10<br />
// "lange gedrueckt:"<br />
#define CNTREPEAT 200<br />
<br />
// hier z.&nbsp;B. Taste an Pin2 PortA "active low" = 0 wenn gedrueckt<br />
#define KEY_PIN PINA<br />
#define KEY_PINNO PA2<br />
<br />
// beachte: volatile! <br />
volatile uint8_t gKeyCounter;<br />
<br />
// Timer-Compare Interrupt ISR, wird z.B. alle 10ms ausgefuehrt<br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
// hier wird gKeyCounter veraendert. Die übrigen<br />
// Programmteile müssen diese Aenderung "sehen":<br />
// volatile -> aktuellen Wert immer in den Speicher schreiben<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
if (gKeyCounter < CNTREPEAT) gKeyCounter++;<br />
}<br />
else {<br />
gKeyCounter = 0;<br />
}<br />
}<br />
<br />
//...<br />
<br />
int main(void)<br />
{<br />
//...<br />
/* hier: Initialisierung der Ports und des Timer-Interrupts */<br />
//... <br />
// hier wird auf gKeyCounter zugegriffen. Dazu muss der in der<br />
// ISR geschriebene Wert bekannt sein:<br />
// volatile -> aktuellen Wert immer aus dem Speicher lesen<br />
if ( gKeyCounter > CNTDEBOUNCE ) { // Taste mind. 10*10 ms "prellfrei"<br />
if (gKeyCounter == CNTREPEAT) {<br />
/* hier: Code fuer "Taste lange gedrueckt" */<br />
}<br />
else {<br />
/* hier: Code fuer "Taste kurz gedrueckt" */<br />
}<br />
}<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Wird innerhalb einer ISR mehrfach auf eine mit volatile deklarierte Variable zugegriffen, wirkt sich dies ungünstig auf die Verarbeitungsgeschwindigkeit aus, da bei jedem Zugriff mit dem Speicherinhalt abgeglichen wird. Da bei AVR-Controllern ''innerhalb'' einer ISR keine Unterbrechungen zu erwarten sind, bietet es sich an, einen Zwischenspeicher in Form einer lokalen Variable zu verwenden, deren Inhalt zu Beginn und am Ende mit dem der volatile Variable synchronisiert wird. Lokale Variable werden bei eingeschalteter Optimierung mit hoher Wahrscheinlichkeit in Prozessorregistern verwaltet und der Zugriff darauf ist daher nur mit wenigen internen Operationen verbunden. Die ISR aus dem vorherigen Beispiel lässt sich so optimieren:<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
uint8_t tmp_kc;<br />
<br />
tmp_kc = gKeyCounter; // Uebernahme in lokale Arbeitsvariable<br />
<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
if (tmp_kc < CNTREPEAT) {<br />
tmp_kc++;<br />
}<br />
}<br />
else {<br />
tmp_kc = 0;<br />
}<br />
<br />
gKeyCounter = tmp_kc; // Zurueckschreiben<br />
}<br />
//...<br />
</syntaxhighlight><br />
<br />
Zum Vergleich die Disassemblies (Ausschnitte der "lss-Dateien", compiliert für ATmega162) im Anschluss. Man erkennt den viermaligen Zugriff auf die Speicheraddresse von ''gKeyCounter'' (hier 0x032A) in der ISR ohne "Cache"-Variable und den zweimaligen Zugriff in der Variante mit Zwischenspeicher. Im Beispiel ist der Vorteil gering, bei komplexeren Routinen kann die Zwischenspeicherung in lokalen Variablen jedoch zu deutlicheren Verbesserungen führen.<br />
<br />
<pre><br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
86a: 1f 92 push r1<br />
86c: 0f 92 push r0<br />
86e: 0f b6 in r0, 0x3f ; 63<br />
870: 0f 92 push r0<br />
872: 11 24 eor r1, r1<br />
874: 8f 93 push r24<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
876: ca 99 sbic 0x19, 2 ; 25<br />
878: 0a c0 rjmp .+20 ; 0x88e <__vector_13+0x24><br />
if (gKeyCounter < CNTREPEAT) gKeyCounter++;<br />
87a: 80 91 2a 03 lds r24, 0x032A<br />
87e: 88 3c cpi r24, 0xC8 ; 200 <br />
880: 40 f4 brcc .+16 ; 0x892 <__vector_13+0x28><br />
882: 80 91 2a 03 lds r24, 0x032A<br />
886: 8f 5f subi r24, 0xFF ; 255<br />
888: 80 93 2a 03 sts 0x032A, r24<br />
88c: 02 c0 rjmp .+4 ; 0x892 <__vector_13+0x28><br />
}<br />
else {<br />
gKeyCounter = 0;<br />
88e: 10 92 2a 03 sts 0x032A, r1<br />
892: 8f 91 pop r24<br />
894: 0f 90 pop r0<br />
896: 0f be out 0x3f, r0 ; 63<br />
898: 0f 90 pop r0<br />
89a: 1f 90 pop r1<br />
89c: 18 95 reti<br />
</pre><br />
<br />
<pre><br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
86a: 1f 92 push r1<br />
86c: 0f 92 push r0<br />
86e: 0f b6 in r0, 0x3f ; 63<br />
870: 0f 92 push r0<br />
872: 11 24 eor r1, r1<br />
874: 8f 93 push r24<br />
uint8_t tmp_kc;<br />
<br />
tmp_kc = gKeyCounter;<br />
876: 80 91 2a 03 lds r24, 0x032A<br />
<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
87a: ca 9b sbis 0x19, 2 ; 25<br />
87c: 02 c0 rjmp .+4 ; 0x882 <__vector_13+0x18><br />
87e: 80 e0 ldi r24, 0x00 ; 0<br />
880: 03 c0 rjmp .+6 ; 0x888 <__vector_13+0x1e><br />
if (tmp_kc < CNTREPEAT) {<br />
882: 88 3c cpi r24, 0xC8 ; 200<br />
884: 08 f4 brcc .+2 ; 0x888 <__vector_13+0x1e><br />
tmp_kc++;<br />
886: 8f 5f subi r24, 0xFF ; 255<br />
}<br />
}<br />
else {<br />
tmp_kc = 0;<br />
}<br />
<br />
gKeyCounter = tmp_kc;<br />
888: 80 93 2a 03 sts 0x032A, r24<br />
88c: 8f 91 pop r24<br />
88e: 0f 90 pop r0<br />
890: 0f be out 0x3f, r0 ; 63<br />
892: 0f 90 pop r0<br />
894: 1f 90 pop r1<br />
896: 18 95 reti<br />
</pre><br />
<br />
=== volatile und Pointer ===<br />
<br />
Bei '''volatile''' in Verbindung mit Pointern ist zu beachten, ob der Pointer selbst oder die Variable, auf die der Pointer zeigt, '''volatile''' ist.<br />
<br />
<syntaxhighlight lang="c"><br />
volatile uint8_t *a; // das Ziel von a ist volatile<br />
<br />
uint8_t *volatile a; // a selbst ist volatile<br />
</syntaxhighlight><br />
<br />
Falls der Pointer volatile ist (zweiter Fall im Beispiel), ist zu beachten, dass der Wert des Pointers, also eine Speicheradresse, intern in mehr als einem Byte verwaltet wird. Lese- und Schreibzugriffe im Hauptprogramm (außerhalb von Interrupt-Routinen) sind daher so zu implementieren, dass alle Teilbytes der Adresse konsistent bleiben, vgl. dazu den folgenden Abschnitt.<br />
<br />
=== Variablen größer 1 Byte ===<br />
<br />
Bei Variablen größer ein Byte, auf die in Interrupt-Routinen und im Hauptprogramm zugegriffen wird, muss darauf geachtet werden, dass die Zugriffe auf die einzelnen Bytes außerhalb der ISR nicht durch einen Interrupt unterbrochen werden. (Allgemeinplatz: AVRs sind 8-bit Controller). Zur Veranschaulichung ein Codefragment:<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
volatile uint16_t gMyCounter16bit;<br />
//...<br />
ISR(...)<br />
{<br />
//...<br />
gMyCounter16Bit++;<br />
//...<br />
}<br />
<br />
int main(void)<br />
{<br />
uint16_t tmpCnt;<br />
//...<br />
// nicht gut: Mglw. hier ein Fehler, wenn ein Byte von MyCounter <br />
// schon in tmpCnt kopiert ist aber vor dem Kopieren des zweiten Bytes <br />
// ein Interrupt auftritt, der den Inhalt von MyCounter verändert.<br />
tmpCnt = gMyCounter16bit; <br />
<br />
<br />
// besser: Änderungen "außerhalb" verhindern -> alle "Teilbytes"<br />
// bleiben konsistent<br />
cli(); // Interrupts deaktivieren<br />
tmpCnt = gMyCounter16Bit;<br />
sei(); // wieder aktivieren<br />
<br />
// oder: vorheriger Status des globalen Interrupt-Flags bleibt erhalten<br />
uint8_t sreg_tmp;<br />
sreg_tmp = SREG; /* Sichern */<br />
cli()<br />
tmpCnt = gMyCounter16Bit;<br />
SREG = sreg_tmp; /* Wiederherstellen */<br />
<br />
// oder: mehrfach lesen, bis man konsistente Daten hat<br />
uint16_t count1 = gMyCounter16Bit;<br />
uint16_t count2 = gMyCounter16Bit;<br />
while (count1 != count2) {<br />
count1 = count2;<br />
count2 = gMyCounter16Bit;<br />
}<br />
tmpCnt = count1;<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Die avr-libc bietet ab Version 1.6.0(?) einige Hilfsfunktionen/Makros, mit der im Beispiel oben gezeigten Funktionalität, die zusätzlich auch sogenannte [http://en.wikipedia.org/wiki/Memory_barrier memory barriers] beinhalten. Diese stehen nach #include <util/atomic.h> zur Verfügung.<br />
<syntaxhighlight lang="c"><br />
//...<br />
#include <util/atomic.h><br />
//...<br />
<br />
// analog zu cli, Zugriff, sei:<br />
ATOMIC_BLOCK(ATOMIC_FORCEON) {<br />
tmpCnt = gMyCounter16Bit;<br />
}<br />
<br />
// oder:<br />
<br />
// analog zu Sicherung des SREG, cli, Zugriff und Zurückschreiben des SREG:<br />
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />
tmpCnt = gMyCounter16Bit;<br />
}<br />
<br />
//...<br />
</syntaxhighlight><br />
<br />
* siehe auch [http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html Dokumentation der avr-libc zu atomic.h]<br />
<br />
== Interrupt-Routinen und Registerzugriffe ==<br />
<br />
Falls Register sowohl im Hauptprogramm als auch in Interrupt-Routinen verändert werden, ist darauf zu achten, dass diese Zugriffe sich nicht überlappen. Nur wenige Anweisungen lassen sich in sogenannte "atomare" Zugriffe übersetzen, die nicht von Interrupt-Routinen unterbrochen werden können. <br />
<br />
Zur Veranschaulichung eine Anweisung, bei der ein Bit und im Anschluss drei Bits in einem Register gesetzt werden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
int main(void)<br />
{<br />
//...<br />
PORTA |= (1<<PA0);<br />
<br />
PORTA |= (1<<PA2)|(1<<PA3)|(1<<PA4);<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Der Compiler übersetzt diese Anweisungen für einen ATmega128 bei Optimierungsstufe "S" nach:<br />
<br />
<div class="code"><pre><br />
...<br />
PORTA |= (1<<PA0);<br />
d2: d8 9a sbi 0x1b, 0 ; 27 (a)<br />
<br />
PORTA |= (1<<PA2)|(1<<PA3)|(1<<PA4);<br />
d4: 8b b3 in r24, 0x1b ; 27 (b)<br />
d6: 8c 61 ori r24, 0x1C ; 28 (c)<br />
d8: 8b bb out 0x1b, r24 ; 27 (d)<br />
...<br />
</pre></div><br />
<br />
Das Setzen des einzelnen Bits wird bei eingeschalteter Optimierung für Register im unteren Speicherbereich in eine einzige Assembler-Anweisung (sbi) übersetzt und ist nicht anfällig für Unterbrechungen durch Interrupts. Die Anweisung zum Setzen von drei Bits wird jedoch in drei abhängige Assembler-Anweisungen übersetzt und bietet damit zwei "Angriffspunkte" für Unterbrechungen. Eine Interrupt-Routine könnte nach dem Laden des Ausgangszustands in den Zwischenspeicher (hier Register 24) den Wert des Registers ändern, z.&nbsp;B. ein Bit löschen. Damit würde der Zwischenspeicher nicht mehr mit dem tatsächlichen Zustand übereinstimmen aber dennoch nach der Bitoperation (hier ori) in das Register zurückgeschrieben. <br />
<br />
Beispiel: PORTA sei anfangs 0b00000000. Die erste Anweisung (a) setzt Bit 0 auf '''1''', PORTA ist danach 0b0000000'''1'''. Nun wird im ersten Teil der zweiten Anweisung der Portzustand in ein Register eingelesen (b). Unmittelbar darauf (vor (c)) "feuert" ein Interrupt, in dessen Interrupt-Routine Bit 0 von PORTA gelöscht wird. Nach Verlassen der Interrupt-Routine hat PORTA den Wert 0b00000000. In den beiden noch folgenden Anweisungen des Hauptprogramms wird nun der zwischengespeicherte "alte" Zustand 0b00000001 mit 0b00011100 logisch-'''ODER'''-verknüft (c) und das Ergebnis 0b00011101 in PortA geschrieben (d). Obwohl zwischenzeitlich Bit 0 gelöscht wurde, ist es nach (d) wieder gesetzt. <br />
<br />
Lösungsmöglichkeiten:<br />
* Register ohne besondere Vorkehrungen nicht in Interruptroutinen ''und'' im Hauptprogramm verändern.<br />
* Interrupts vor Veränderungen in Registern, die auch in ISRs verändert werden, deaktivieren ("cli").<br />
* Bits einzeln löschen oder setzen. sbi und cbi können nicht unterbrochen werden. Vorsicht: nur Register im unteren Speicherbereich sind mittels sbi/cbi ansprechbar. Der Compiler kann nur für diese sbi/cbi-Anweisungen generieren. Für Register außerhalb dieses Adressbereichs ("Memory-Mapped"-Register) werden auch zur Manipulation einzelner Bits abhängige Anweisungen erzeugt (lds,...,sts).<br />
<br />
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Frequently asked Questions/Fragen Nr. 1 und 8. (Stand: avr-libc Vers. 1.0.4)<br />
<br />
== Interruptflags löschen ==<br />
<br />
Beim Löschen von Interruptflags haben AVRs eine Besonderheit, die auch im Datenblatt beschrieben ist: Es wird zum Löschen eine 1 in das betreffende Bit geschrieben. <br />
<br />
Hinweis:<br /><br />
Bei Registern mit mehreren Interrupt-Flag-Bits (wie die Timer Interrupt Flag Register) '''nicht''' die übliche bitweise VerODERung nehmen, sondern eine direkte Zuweisung machen. Da sonst weitere Flags, als nur das gewünschte, ebenfalls gelöscht werden könnten.<br /><br />
([http://www.mikrocontroller.net/topic/171148#1640133 Erklärung]).<br />
<br />
== Was macht das Hauptprogramm? ==<br />
<br />
Im einfachsten (Ausnahme-)Fall gar nichts mehr. Es ist also durchaus denkbar, ein Programm zu schreiben, welches in der main-Funktion lediglich noch die Interrupts aktiviert und dann in einer Endlosschleife verharrt. Sämtliche Funktionen werden dann in den ISRs abgearbeitet. Diese Vorgehensweise ist jedoch bei den meisten Anwendungen schlecht: man verschenkt eine Verarbeitungsebene und hat außerdem möglicherweise Probleme durch Interruptroutinen, die zu viel Verarbeitungszeit benötigen.<br />
<br />
Normalerweise wird man in den Interruptroutinen nur die bei Auftreten des jeweiligen Interruptereignisses unbedingt notwendigen Operationen ausführen lassen. Alle weniger kritischen Aufgaben werden dann im Hauptprogramm abgearbeitet.<br />
<br />
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Interrupts and Signals<br />
<br />
= Sleep-Modes =<br />
<br />
AVR Controller verfügen über eine Reihe von sogenannten [[Sleep Mode |''Sleep-Modes'']] ("Schlaf-Modi"). Diese ermöglichen es, Teile des Controllers abzuschalten. Zum Einen kann damit besonders bei Batteriebetrieb Strom gespart werden, zum Anderen können Komponenten des Controllers deaktiviert werden, die die Genauigkeit des Analog-Digital-Wandlers bzw. des Analog-Comparators negativ beeinflussen. Der Controller wird durch Interrupts aus dem Schlaf geweckt. Welche Interrupts den jeweiligen Schlafmodus beenden, ist einer Tabelle im Datenblatt des jeweiligen Controllers zu entnehmen.<br />
Die Funktionen (eigentlich Makros) der avr-libc stehen nach Einbinden der header-Datei ''sleep.h'' zur Verfügung.<br />
<br />
;set_sleep_mode (uint8_t mode): Setzt den Schlafmodus, der bei Aufruf von sleep() aktiviert wird. In sleep.h sind einige Konstanten definiert (z.&nbsp;B. SLEEP_MODE_PWR_DOWN). Die definierten Modi werden jedoch nicht alle von sämtlichten AVR-Controllern unterstützt.<br />
;sleep_enable(): Aktiviert den gesetzten Schlafmodus, versetzt den Controller aber noch nicht in den Schlafmodus<br />
;sleep_cpu(): Versetzt den Controller in den Schlafmodus .sleep_cpu wird im Prinzip durch die Assembler-Anweisung ''sleep'' ersetzt.<br />
;sleep_disable(): Deaktiviert den gesetzten Schlafmodus<br />
;sleep_mode(): Versetzt den Controller in den mit set_sleep_mode gewählten Schlafmodus. Das Makro entspricht sleep_enable()+sleep_cpu()+sleep_disable(), beinhaltet also nicht die Aktivierung von Interrupts (besser nicht benutzen).<br />
<br />
Bei Anwendung von sleep_cpu() müssen Interrupts also bereits freigeben sein (sei()), da der Controller sonst nicht mehr "aufwachen" kann. sleep_mode() ist nicht geeignet für die Verwendung in ISR Interrupt-Service-Routinen, da bei deren Abarbeitung Interrupts global deaktiviert sind und somit auch die möglichen "Aufwachinterrupts". Abhilfe: stattdessen sleep_enable(), sei(), sleep_cpu(), sleep_disable() und evtl. cli() verwenden (vgl. Dokumentation der avr-libc).<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/sleep.h><br />
<br />
int main(void)<br />
{<br />
...<br />
<br />
while (1) {<br />
...<br />
set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br />
sleep_mode();<br />
<br />
// Code hier wird erst nach Auftreten eines entsprechenden<br />
// "Aufwach-Interrupts" verarbeitet<br />
...<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
In älteren Versionenen der avr-libc wurden nicht alle AVR-Controller durch die sleep-Funktionen richtig angesteuert. Mit avr-libc 1.2.0 wurde die Anzahl der unterstützten Typen jedoch deutlich erweitert. Bei nicht-unterstützten Typen erreicht man die gewünschte Funktionalität durch direkte "[[Bitmanipulation]]" der entsprechenden Register (vgl. Datenblatt) und Aufruf des Sleep-Befehls via Inline-Assembler oder sleep_cpu():<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
// Sleep-Mode "Power-Save" beim ATmega169 "manuell" aktivieren<br />
SMCR = (3<<SM0) | (1<<SE);<br />
asm volatile ("sleep"::); // alternativ sleep_cpu() aus sleep.h<br />
...<br />
</syntaxhighlight><br />
<br />
== Sleep-Modi ==<br />
Die vielen Prozessoren aus der AVR-Familie unterstützen unterschiedliche Sleep-Modi, gefächert nach Vorhandensein von Funktionsblöcken im Controller. Konkrete und verläßliche Auskunft über die tatsächlichen Gegebenheiten finden sich wie immer in den jeweiligen Datenblättern. Die Modi unterscheiden sich darin, welche Funktionsbereiche zum Energiesparen abgeschaltet werden. Davon hängt auch ab, mit welchen Mitteln der Prozessor aus der jeweiligen Schlaftiefe wieder aufgeweckt werden kann.<br />
<br />
;Idle Mode (SLEEP_MODE_IDLE): Die CPU kann durch SPI, USART, Analog Comperator, ADC, TWI, Timer, Watchdog und irgendeinen anderen Interrupt wieder aufgeweckt werden.<br />
<br />
;ADC Noise Reduction Mode (SLEEP_MODE_ADC): In diesem Modus liegt das Hauptaugenmerk darauf, die CPU soweit stillzulegen, dass der ADC möglichst keine Störungen aus dem inneren der CPU auffangen kann, die das Meßergebnis negativ beeinflussen können. Das Aufwachen aus diesem Modus kann ausgelöst werden durch den ADC, externe Interrupts, TWI, Timer und Watchdog.<br />
<br />
;Power-Down Mode (SLEEP_MODE_PWR_DOWN): In diesem Modus wird ein externer Oszillator (Quarz, Quarzoszillator), wenn vorhanden. gestoppt. Geweckt werden kann die CPU durch einen externen Level-Interrupt, TWI, Watchdog, Brown-Out-Reset.<br />
<br />
;Power-Save-Mode (SLEEP_MODE_PWR_SAVE): Power-Save ist identisch zu Power-Down mit einer Ausnahme: Ist der Timer 2 auf die Verwendung eines externen Taktes konfiguriert, so läuft dieser Timer auch im Power-Save weiter und kann die CPU mit einem Interrupt aufwecken.<br />
<br />
;Standby-Mode (SLEEP_MODE_STANDBY, SLEEP_MODE_EXT_STANDBY): Voraussetzung für den Standby-Modus ist die Verwendung eines Quarzes oder eines Quarzoszillators, also einer externen Taktquelle. Ansonsten ist dieser Modus identisch zum Power-Down Modus. Vorteil dieses Modus' ist eine kürzere Aufwachzeit.<br />
<br />
;Abschalten des Brownout Detect (BOD) während der Sleep-Phase (nur P-Typen): Zur Stromersparnis bieten die P-Typen die Möglichkeit den BOD während der Sleep-Phase abzuschalten. Bei einem Atmega88PA beispielsweise, kann dadurch der Stromverbrauch im SLEEP_MODE_PWR_SAVE mit Timer2 im Asynchronmodus mit Uhrenquarz und periodischer Selbstaufweckung um ca. 50% gesenkt werden.<br />
Das Einschalten dieser Funktion geschieht in einer Timed Sequence.<br />
<br />
<syntaxhighlight lang="c"><br />
unsigned char temp0 = MCUCR;<br />
unsigned char temp1 = MCUCR;<br />
temp0 |= (1 << BODS) | (1 << BODSE);<br />
temp1 |= (1 << BODS);<br />
MCUCR = temp0;<br />
MCUCR = temp1;<br />
sleep_cpu();<br />
</syntaxhighlight><br />
<br />
Hierbei ist unbedingt zu beachten, dass das BODS-Bit 3 Takte nach dem Setzen wieder gelöscht wird. Daher muss der Aufruf des Sleep unmittelbar nach dem Setzen erfolgen und das BODS-Bit muss jedes Mal vor einem Sleep Aufruf erneut gesetzt werden.<br />
<br />
<br />
Siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Power Management and Sleep-Modes<br />
* [http://www.mikrocontroller.net/topic/96369#832712 Forenbeitrag] zur "Nichtverwendung" von sleep_mode in ISRs.<br />
<br />
= Zeiger =<br />
Zeiger (engl. ''Pointer'') sind Variablen, die die Adresse von Daten oder Funktionen enthalten und belegen 16 Bits. Die Größe hängt mit dem adressierbaren Speicherbereich zusammen und der GCC reserviert dann den entsprechenden Platz.<br />
Ggf. ist es also günstiger, Indizes auf Arrays (Listen) zu verwenden, so dass der GCC für die Zeigerarithmetik den erforderlichen RAM nur temporär benötigt.<br />
<br />
Siehe auch: [[Zeiger]]<br />
<br />
= Speicherzugriffe =<br />
<br />
Atmel AVR-Controller verfügen typisch über drei Speicher:<br />
<br />
* [[RAM]]: Im RAM (genauer statisches RAM/SRAM) wird vom gcc-Compiler Platz für Variablen reserviert. Auch der Stack befindet sich im RAM. Dieser Speicher ist "flüchtig", d.h. der Inhalt der Variablen geht beim Ausschalten oder einem Zusammenbruch der Spannungsversorgung verloren.<br />
<br />
* Programmspeicher: Ausgeführt als FLASH-Speicher, seitenweise wiederbeschreibbar. Darin ist das Anwendungsprogramm abgelegt.<br />
<br />
* [[EEPROM]]: Nichtflüchtiger Speicher, d.h. der einmal geschriebene Inhalt bleibt auch ohne Stromversorgung erhalten. Byte-weise schreib/lesbar. Im EEPROM werden typischerweise gerätespezifische Werte wie z.&nbsp;B. Kalibrierungswerte von Sensoren abgelegt.<br />
<br />
Einige AVRs besitzen keinen RAM-Speicher, lediglich die Register können als "Arbeitsvariablen"<br />
genutzt werden. Da die Anwendung des avr-gcc auf solch "kleinen" Controllern ohnehin selten sinnvoll ist und auch nur bei einigen RAM-losen Typen nach [http://lightner.net/avr/ATtinyAvrGcc.html "Bastelarbeiten"] möglich ist, werden diese Controller hier nicht weiter berücksichtigt. Auch EEPROM-Speicher ist nicht auf allen Typen verfügbar. Generell sollten die nachfolgenden Erläuterungen auf alle ATmega-Controller und die größeren AT90-Typen übertragbar sein. Für die Typen ATtiny2313, ATtiny26 und viele weitere der "ATtiny-Reihe" gelten die Ausführungen ebenfalls.<br />
<br />
Siehe auch:<br />
* [[Binäre Daten zum Programm hinzufügen]]<br />
== RAM ==<br />
<br />
Die Verwaltung des RAM-Speichers erfolgt durch den Compiler, im Regelfall ist beim Zugriff auf Variablen im RAM nichts Besonderes zu beachten. Die Erläuterungen in jedem brauchbaren C-Buch gelten auch für den vom avr-gcc-Compiler erzeugten Code.<br />
<br />
Um Speicher dynamisch (während der Laufzeit) zu reservieren, kann '''malloc()''' verwendet werden. malloc(size) "alloziert" (~reserviert) einen gewissen Speicherblock mit '''size''' Bytes. Ist kein Platz für den neuen Block, wird NULL (0) zurückgegeben.<br />
<br />
Wird der angelegte Block zu klein (groß), kann die Größe mit realloc() verändert werden. Den allozierten Speicherbereich kann man mit free() wieder freigeben. Wenn das Freigeben eines Blocks vergessen wird spricht man von einem "Speicherleck" (memory leak).<br />
<br />
malloc() legt Speicherblöcke im '''Heap''' an, belegt man zuviel Platz, dann wächst der Heap zu weit nach oben und überschreibt den Stack, und der Controller kommt in Teufels Küche. Das kann leider nicht nur passieren wenn man insgesamt zu viel Speicher anfordert, sondern auch wenn man Blöcke unterschiedlicher Größe in ungünstiger Reihenfolge alloziert/freigibt (siehe Artikel [[Heap-Fragmentierung]]). Aus diesem Grund sollte man malloc() auf Mikrocontrollern sehr sparsam (am besten gar nicht) verwenden.<br />
<br />
Beispiel zur Verwendung von malloc():<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
<br />
void foo(void) {<br />
// neuen speicherbereich anlegen,<br />
// platz für 10 uint16<br />
uint16_t* pBuffer = malloc(10 * sizeof(uint16_t));<br />
<br />
// darauf zugreifen, als wärs ein gewohnter Buffer<br />
pBuffer[2] = 5;<br />
<br />
// Speicher (unbedingt!) wieder freigeben<br />
free(pBuffer);<br />
}<br />
</syntaxhighlight><br />
<br />
Wenn (wie in obigem Beispiel) dynamischer Speicher nur für die Dauer einer Funktion benötigt und am Ende wieder freigegeben wird, bietet es sich an, statt malloc() '''alloca()''' zu verwenden. Der Unterschied zu malloc() ist, dass der Speicher auf dem Stack reserviert wird, und beim Verlassen der Funktion automatisch wieder freigegeben wird. Es kann somit kein Speicherleck und keine Fragmentierung entstehen.<br />
<br />
siehe auch:<br />
* http://www.nongnu.org/avr-libc/user-manual/malloc.html<br />
<br />
== Flash mit PROGMEM und pgm_read ==<br />
<br />
→ [http://nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html avr-libc: Doku zu avr/pgmspace.h]<br />
<br />
Ein Zugriff auf Konstanten im Programmspeicher ist mittels avr-gcc erst ab Version 4.7 "transparent" möglich. Um Daten aus dem Flash zu lesen, muss die AVR-Instruktion LPM (''Load from Program Memory'') erzeugt werden, bei Controllern mit mehr als 64kiB Flash auch ELPM.<br />
<br />
Dazu gibt es das AVR-spezifische GCC-Attribut <tt>progmem</tt>, mit dem eine Variablendeklaration im ''static storage''<ref>Variablen der Speicherklasse ''static storage'' haben eine unbegrenzte Lebensdauer. Beispiel für solche Variablen sind globale Variablen, aber auch static-Variablen innerhalb einer Funktion gehören dazu. Beispiele für Variablen, die nicht ''static storage'' sind: auto-Variablen ("normale" lokale Variablen), register-Variablen, durch malloc geschaffene Objekte, etc.</ref> markiert werden kann:<br />
<syntaxhighlight lang="c"><br />
const int value __attribute__((progmem)) = 1;<br />
</syntaxhighlight><br />
<br />
Effekt ist, dass die so markierte Variable nicht im RAM sondern im Flash angelegt wird. Wird durch "normalen" C-Code auf solch eine Variable zugegriffen, wird jedoch aus der gleichen Adresse aus dem RAM gelesen und nicht aus dem Flash! Das ist ein Fehler, den der Compiler aber nicht anzeigt!<br />
<br />
<syntaxhighlight lang="c"><br />
int test = value; // Fehler! PROGMEM Konstanten müssen mit den pgm_read-Funktionen gelesen werden!<br />
</syntaxhighlight><br />
<br />
Zum Lesen aus dem Flash stellt die avr-libc daher zahlreiche Makros zur Verfügung. Zudem wird das Makro <tt>PROGMEM</tt> definiert, das etwas Tipparbeit spart:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
const int value PROGMEM = 1;<br />
</syntaxhighlight><br />
<br />
<tt>progmem</tt> funktioniert im Wesentlichen wie ein Section-Attribut, das die Daten in der Section <tt>.progmem.data</tt> ablegt. Im Gegensatz zum Section-Attribut werden jedoch noch weitere Prüfungen unternommen, ab avr-gcc 4.6 etwa muss die entsprechende Variable <tt>const</tt> sein.<br />
<br />
=== Integer und float ===<br />
<br />
Zum Lesen von Skalaren stellt die avr-libc folgende Makros zu Verfügung, die jeweils ein Argument erhalten: Die 16-Bit Adresse des zu lesenden Wertes<ref>Damit ist der mögliche Speicherbereich für Flash-Konstanten auf 64kiB begrenzt. Einige pgmspace-Funktionen ermöglichen den Lesezugriff auf den gesamten Flash-Speicher, intern via Assembler-Anweisung ELPM. Die Initialisierungswerte des Speicherinhalts jenseits der 64kiB-Marke müssen dann jedoch auf anderem Weg angelegt werden, d.h. nicht per PROGMEM. Evtl. eigene Section und Linker-Optionen. Alt und nicht ganz korrekt: Die avr-libc pgmspace-Funktionen unterstützen nur die unteren 64kiB Flash bei Controllern mit mehr als 64kiB.</ref><br />
<br />
:{| {{Tabelle}}<br />
|+ Übersicht der <tt>pgm_read</tt> Funktionen aus<br/>dem Header <tt>avr/pgmspace.h</tt> der avr-libc<br />
|-<br />
! Gelesener Wert || <tt>pgm_read_xxx</tt> || Anzahl Bytes<br />
|-<br />
| <tt>uint8_t</tt> || <tt>pgm_read_byte</tt> || 1<br />
|-<br />
| <tt>uint16_t</tt> || <tt>pgm_read_word</tt> || 2<br />
|-<br />
| <tt>uint32_t</tt> || <tt>pgm_read_dword</tt> || 4<br />
|-<br />
| <tt>float</tt> || <tt>pgm_read_float</tt><ref>ab avr-libc 1.7.0</ref> || 4<br />
|}<br />
<br />
Soll ein Zeiger gelesen werden, so verwendet man <tt>pgm_read_word</tt> und castet das Ergebnis zum gewünschten Zeiger-Typ.<br />
<br />
;Beispiele:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
/* Byte */<br />
const uint8_t aByte PROGMEM = 123;<br />
<br />
/* int-Array */<br />
const int anArray[] PROGMEM = { 18, 3 ,70 };<br />
<br />
void foo (void)<br />
{<br />
/* Zeiger */<br />
static const uint8_t* const aPointer PROGMEM = &aByte;<br />
<br />
uint8_t a = pgm_read_byte (&aByte);<br />
int a2 = (int) pgm_read_word (&anArray[2]);<br />
const uint8_t* p = (const uint8_t*) pgm_read_word (&aPointer);<br />
}<br />
</syntaxhighlight><br />
<br />
=== Blöcke ===<br />
<br />
In den Flash-Funktionen der avr-libc sind keine der pgm_read_xxxx Nomenklatur folgenden Funktionen, die Speicherblöcke auslesen oder vergleichen. Die enstprechende Funktionen sind Varianten von <tt>memcpy</tt>, <tt>memcmp</tt> und heißt <tt>memcpy_P</tt>, <tt>memcmp_P</tt>, usw. Für weitere Funktionen und deren Prototypen siehe die Dokumentation der avr-libc.<br />
<br />
=== Strings ===<br />
<br />
Strings sind in C nichts anderes als eine Abfolge von Zeichen und einem <tt>'\0'</tt> als Stringende. Der prinzipielle Weg ist daher identisch zum Lesen von Bytes, wobei auf die [[FAQ#Wie funktioniert String-Verarbeitung in C?|Besonderheiten von Strings]] wie 0-Terminierung geachtet werden muss.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
size_t my_string_length (const char *addr)<br />
{<br />
size_t length = 0;<br />
<br />
while (pgm_read_byte (addr++))<br />
{<br />
length++;<br />
}<br />
return length;<br />
}<br />
</syntaxhighlight><br />
<br />
Zur Unterstützung des Programmierers steht das Repertoire der str-Funktionen auch in jeweils eine Variante zur Verfügung, die mit dem Flash-Speicher arbeiten kann. Die Funktionsnamen tragen den Suffix <tt>_P</tt>. Darüber hinaus gibt es das Makro <tt>PSTR</tt>, das ein String-Literal im Flash-Speicher ablegt und die Adresse des Strings liefert:<br />
<br />
Die nachfolgende Funktion liefert 0 zurück, wenn string_im_ram gleich "Hallo Welt" ist. Mit strcmp (String Compare) können wir zwei Strings vergleichen. Der Rückgabewert kann hierbei folgende Werte haben:<br><br />
0 die Strings sind gleich<br />
>0 das erste ungleiche Zeichen in string_im_ram ist größer als in "Hallo Welt"<br />
<0 das erste ungleiche Zeichen in string_im_ram ist kleiner als in "Hallo Welt"<br />
<br><br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
int foo (const char *string_im_ram)<br />
{<br />
return strcmp_P (string_im_ram, PSTR ("Hallo Welt"));<br />
}<br />
</syntaxhighlight><br />
<br />
Zu beachten ist, dass <tt>PSTR</tt> nur innerhalb von Funktionen verwendet werden kann.<br />
<br />
; Array aus Strings:<br />
<br />
Arrays aus Strings im Flash-Speicher werden in zwei Schritten angelegt:<br />
<br />
# Zuerst die einzelnen Elemente des Arrays und<br />
# im Anschluss ein Array, in dem die Startaddressen der Strings abgelegt werden.<br />
<br />
Zum Auslesen wird zuerst die Adresse des gewünschten Elements aus dem Array im Flash-Speicher gelesen, die im Anschluss dazu genutzt wird, um auf das Element (den String) selbst zuzugreifen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
static const char str1[] PROGMEM = "Hund";<br />
static const char str2[] PROGMEM = "Katze";<br />
static const char str3[] PROGMEM = "Maus";<br />
<br />
const char * const array[] PROGMEM = <br />
{<br />
str1, str2, str3<br />
};<br />
<br />
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]<br />
void read_string (char *buf, size_t i)<br />
{<br />
// Lese die Adresse des i-ten Strings aus array[]<br />
const char *parray = (const char*) pgm_read_ptr (&array[i]);<br />
<br />
// Kopiere den Inhalt der Zeichenkette vom Flash ins RAM<br />
strcpy_P (buf, parray);<br />
}<br />
</syntaxhighlight><br />
<br />
Eine weitere Möglichkeit ist, die Strings in einem 2-dimensionalen char-Array abzulegen anstatt deren Adresse in einem 1-dimensionalen Adress-Array zu speichern.<br />
<br />
Vorteil ist, dass der Code einfacher wird. Nachteil ist, dass bei unterschiedlich langen Strings Speicherplatz verschwendet wird, weil sich die Array-Dimension and der Länge des längsten Strings orientieret. Bei in etwa gleich langen Strings kann es aber sogar Speicherplatz sparen, denn es die Adressen der einzelnen Strings müssen nicht abgespeichert werden.<ref>In unserem Hund-Katze-Maus Beispiel belegt die erste Variante 22 Bytes Daten und 18 Bytes Code, die zweite Variante mit 2-dimensionalem Array belegt 18 Bytes Daten und 20 Bytes Code. Gemessen wurde mit avr-gcc 4.8 -Os für ATmega8.</ref><br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
// Die "6" ist 1 plus die Länge des längsten Strings ("Katze")<br />
const char array[][6] PROGMEM = <br />
{<br />
"Hund", "Katze", "Maus"<br />
};<br />
<br />
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]<br />
void read_string (char *buf, size_t i)<br />
{<br />
// Kopiere den Inhalt der i-ten Zeichenkette vom Flash ins RAM<br />
strcpy_P (buf, array[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Siehe dazu auch die avr-libc FAQ: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array How do I put an array of strings completely in ROM?]<br />
<br />
=== Warum so kompliziert? ===<br />
<br />
Zu dem Thema, warum die Verabeitung von Werten aus dem Flash-Speicher so kompliziert ist, sei hier nur kurz erläutert: Die Harvard-Architektur des AVR weist getrennte Adressräume für Programm (Flash) und Datenspeicher (RAM) auf. Der C-Standard sieht keine unterschiedlichen Adressräume vor.<br />
<br />
Hat man zum Beispiel eine Funktion string_an_uart (const char* s) und übergibt an diese Funktion die Adresse einer Zeichenkette, dann weiß die Funktion nicht, ob die Adresse in den Flash-Speicher oder das RAM zeigt. Weder aus dem Pointer-Wert, also dem Zahlenwert, noch aus dem "const" kann auf den Ort der Ablage geschlossen werden.<br />
<br />
Einige AVR-Compiler bilden die Harvard-Architektur ab, indem sie in einen Pointer nicht nur die Adresse speichern, sondern auch den Ablageort wie ''Flash'' oder ''RAM''. In einem Aufruf einer Funktion wird dann bei Pointer-Parametern neben der Adresse auch der Speicherbereich, auf den der Pointer zeigt, übergeben.<br />
<br />
Dies hat jedoch auch Nachteile, denn bei jedem Zugriff über einen Zeiger muss zur ''Laufzeit'' entschieden werden, wie der Zugriff auszuführen ist und entsprechend länglicher und langsamer wird der erzeugte Code.<br />
<br />
Siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitte Modules/Program Space String Utilities und Abschnitt Modules/Bootloader Support Utilities<br />
<br />
=== Variablenzugriff >64kB ===<br />
<br />
Die Zeiger beim avr-gcc sind nur 16 Bit breit, können somit also nur 64kiB Datenspeicher adressieren. Darauf sind auch alle Funktion der libc ausgelegt, welche auf _P enden. Als Funktionspointer können sie beim AVR bis zu 128 kiB Programmspeicher adressieren, weil Funktionsadressen immer 16-Bit Worte adressieren und nicht Bytes. Um Flashzugriff jenseits von 64KiB zu bewerkstelligen gibt es mehrere Möglichkeiten:<br />
<br />
* Address-Spaces wie <tt>__flash1</tt> oder <tt>__memx</tt>, siehe Abschnitt "[[#Jenseits von flash|Jenseits von __flash]]".<br />
* Die Funktionen bzw. Makros <tt>pgm_read_xxx_far</tt> der AVR-Libc ab Version 1.8.0, wie im folgenden beschrieben. Dafür gibt es die Funktion pgm_get_far_address(), um 24-Bit Pointer eines Objekts zu erhalten (intern als 32 Bit gespeichert).<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/pgmspace.h><br />
<br />
//===================================================================<br />
// Define a section above 64kiB (FAR_SECTION)<br />
// add the required linker argument below<br />
// -Wl,--section-start=.far_section=0x10000<br />
//--------------------------------------------------------------------<br />
#define FAR_SECTION __attribute__((__section__(".far_section")))<br />
//--------------------------------------------------------------------<br />
<br />
//====================================================================<br />
// Just a Sample<br />
//--------------------------------------------------------------------<br />
<br />
const char MyString[] FAR_SECTION = "Hier liegt mein FAR-Teststring!";<br />
const char MyBmp64[] FAR_SECTION = {0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x00};<br />
<br />
int main(void)<br />
{<br />
char MyChar;<br />
DDRC = 0xFF;<br />
do<br />
{<br />
MyChar = pgm_read_byte_far(FAR(MyBmp64));<br />
PORTC = MyChar;<br />
}<br />
while(MyChar);<br />
}<br />
</syntaxhighlight><br />
<br />
D.h. man muss<br />
* Die Definition der neuen Section <tt>FAR_SECTION</tt> einfügen<br />
* Die Variablen mit dieser Section kennzeichnen<br />
* Dem Linker mittels Kommandozeilenoption die Startadrese dieser Section mitteilen<br />
<br />
Der Zugriff auf diese Variablen kann nur mittels direkter Pointerarithmetik erfolgen, eine Indizierung von Arrays mit variablem Index ist nicht möglich. Dabei muss die Größe des Datentyps immer manuell berücksichtigt werden, denn der Pointer ist immer ein Bytepointer!<br />
<br />
<syntaxhighlight lang="c"><br />
int n=3;<br />
MyChar = pgm_read_byte_far(FAR(MyBmp64)+n*sizeof(char));<br />
</syntaxhighlight><br />
<br />
Dabei gibt es einige praktische Probleme.<br />
* Beim recht alten AVR-Studio 4.18 wird die Größe des belegten FLASH-Speichers nicht korrekt angezeigt, die Daten landen aber im HEX-File.<br />
* beim moderneren Atmelstudio 6.2 sieht man in der Consolenausgabe die richtige Größe, welche von avr-size ermittelt wurde, diese wird aber dann in der 2. Ausgabe durch Atmelstudio falsch dargestellt<br />
* Die Arduino-IDE rechnet richtig, siehe dieser [https://www.mikrocontroller.net/topic/511511?goto=6558318#6558318 Forumsbeitrag].<br />
<br />
== Flash mit __flash und Embedded-C ==<br />
<br />
Ab Version 4.7 unterstützt avr-gcc ''Adress-Spaces'' gemäß dem Embedded-C Dokument ISO/IEC TR18037. Der geläufigste Adress-Space ist <tt>__flash</tt>, der im Gegensatz zu <tt>progmem</tt> kein GCC-Attribut ist, sondern ein Qualifier und damit syntaktisch ähnlich verwendet wird wie <tt>const</tt> oder <tt>volatile</tt>.<br />
<br />
GCC kennt keine eigene Option zum Aktivieren von Embedded-C, es wird als GNU-C Erweiterung behandelt. Daher müssen C-Module, die Address-Spaces verwenden, mit <tt>-std=gnu99</tt> o.ä. compiliert werden.<br />
<br />
<syntaxhighlight lang="c"><br />
static const __flash int value = 10;<br />
<br />
int get_value (void)<br />
{<br />
return value;<br />
}<br />
</syntaxhighlight><br />
<br />
# Im Gegensatz zu <tt>progmem</tt> sind keine speziellen Bibliotheksfunktionen oder -makros für den Zugriff mehr notwendig: Der Code zum Lesen der Variable ist "normales" C.<br />
# Die Variable wird im richtigen Speicherbereich (Flash) angelegt.<br />
# <tt>__flash</tt> ist nur zusammen mit read-only Objekten oder Zeigern, d.h. nur zusammen mit <tt>const</tt>, erlaubt.<br />
# Zugriffe wie im obigen Beispiel können (weg)optimiert werden. Das Beispiel entspricht einem "<tt>return 10</tt>". Es besteht keine Notwendigkeit, für <tt>value</tt> überhaupt Flash-Speicher zu reservieren.<br />
<br />
Auch Zeiger-Indirektionen sind problemlos möglich. Zu beachten ist, dass <tt>__flash</tt> auf der richtigen Seite des "<tt>*</tt>" in der Zeigerdeklaration bzw. -definition steht:<br />
* '''Rechts vom <tt>*</tt>:''' Der Zeiger selbst liegt im Flash<br />
* '''Links vom <tt>*</tt>:''' Der Zeiger enthält eine Flash-Adresse<br />
<br />
<syntaxhighlight lang="c"><br />
// val ist eine Variable im Flash<br />
const __flash int val = 42;<br />
<br />
// pval liegt auch im Flash und enthält die Adresse von val<br />
const __flash int* const __flash pval = &val;<br />
<br />
char get_val (void)<br />
{<br />
// liest den Wert von val über die in pval abgelegte Adresse<br />
return *pval;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Blöcke ===<br />
<br />
Um Speicherbereiche vom Flash in den RAM zu kopieren, gibt es zwei Möglichkeiten: Zum einen können wie bei <tt>progmem</tt> beschreiben die Funktionen der avr-libc wie <tt>memcpy_P</tt>, <tt>memcmp_P</tt>, <tt>movmem_P</tt>, etc. verwendet werden:<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
// Eine Datenstruktur<br />
typedef struct<br />
{<br />
int id;<br />
char buf[10];<br />
} data_t;<br />
<br />
extern void uart_send (const void*, size_t);<br />
<br />
void send_data (const __flash data_t *pdata)<br />
{<br />
// buf wird auf dem Stack angelegt<br />
data_t buf;<br />
<br />
// Kopiere Daten vom Flash nach buf ins RAM<br />
memcpy_P (&buf, pdata, sizeof (data_t));<br />
<br />
// Sende die Daten in buf<br />
uart_send (&buf, sizeof (data_t));<br />
}<br />
</syntaxhighlight><br />
<br />
Zum anderen kann eine Struktur auch über direktes Kopieren ins RAM geladen werden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
<br />
// Eine Datenstruktur<br />
typedef struct<br />
{<br />
int id;<br />
char buf[10];<br />
} data_t;<br />
<br />
extern void uart_send (const void*, size_t);<br />
<br />
void send_data (const __flash data_t *pdata)<br />
{<br />
// Kopiere Daten ins RAM. buf wird auf dem Stack angelegt<br />
const data_t buf = *pdata;<br />
<br />
// Verwendet die Daten in buf<br />
uart_send (&buf, sizeof (data_t));<br />
}<br />
</syntaxhighlight><br />
<br />
=== Strings ===<br />
<br />
Natürlich können auch Strings im Flash abgelegt werden und auch mit Funktionen wie <tt>strcpy_P</tt> aus der avr-libc verarbeitet werden. Zudem ist es möglich, Flash-Zeiger mit der Adresse eines String-Literals zu initialisieren:<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
#define FSTR(X) ((const __flash char[]) { X } )<br />
<br />
const __flash char * const __flash array[] = <br />
{<br />
FSTR ("Hund"), FSTR ("Katze"), FSTR ("Maus")<br />
};<br />
<br />
size_t get_len (uint8_t tier)<br />
{<br />
return strlen_P (array[tier]);<br />
}<br />
</syntaxhighlight><br />
<br />
Leider sieht der Embedded-C Draft nicht vor, String-Literale direkt in einem anderen Adress-Space als ''generic'' anzulegen, so dass hier der Umweg über <tt>FSTR</tt> genommen werden muss. Dieses Konstrukt ist nur ausserhalb von Funktionen möglich und kann daher nicht als Ersatz für <tt>PSTR</tt> aus der avr-libc dienen.<br />
<br />
Soll <tt>array</tt> ein 2-dimensonales Array sein anstatt ein 1-dimensionales Array von Zeigern, dann geht das ohne große Verrenkungen:<br />
<br />
<syntaxhighlight lang="c"><br />
// Die 6 ergibt sich aus 1 plus der Länge des längsten Strings "Katze"<br />
const __flash char array[][6] = <br />
{<br />
"Hund", "Katze", "Maus"<br />
};<br />
</syntaxhighlight><br />
<br />
Weiters besteht die Möglichkeit, <tt>array</tt> analog anzulegen, wie man es mit <tt>PROGMEM</tt> machen würde: Jeder String wird explizit angelegt und seine Adresse bei der Initialisierung von <tt>array</tt> verwendet. Dies entspricht dem ersten Beispiel eines 1-dimensionalen Zeigerarrays:<br />
<br />
<syntaxhighlight lang="c"><br />
static const __flash char strHund[] = "Hund";<br />
static const __flash char strKatze[] = "Katze";<br />
static const __flash char strMaus[] = "Maus";<br />
<br />
const __flash char * const __flash array[] = <br />
{<br />
strHund, strKatze, strMaus<br />
};<br />
</syntaxhighlight><br />
<br />
=== Casts ===<br />
<br />
Embedded C fordert, dass zwei Adress-Spaces entweder disjunkt sind – d.h. sie enthalten keine gemeinsamen Adressen – oder aber ein Space komplett im anderen enthalten ist, also eine Teilmengen-Beziehung besteht. Die Adress-Spaces von avr-gcc sind so implementiert, dass jeder Space Teilmenge jedes anderes ist. Zwar haben Spaces wie RAM und Flash physikalisch keinen Speicherbereich gemein, allerdings ermöglicht diese Implementierung das Casten von Zeigern zu unterschiedlichen Adress-Spaces<ref>Im Gegensatz zu einem Attribute wie <tt>progmem</tt> ist ein (Adress Space) Qualifier Teil des Zeiger-Typs.</ref>: <br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdbool.h><br />
<br />
char read_char (const char *address, bool data_in_flash)<br />
{<br />
if (data_in_flash)<br />
return *(const __flash char*) address;<br />
else<br />
return *address;<br />
}<br />
</syntaxhighlight><br />
<br />
Der Cast selbst erzeugt keinen zusätzlichen Code, da eine RAM-Adresse und eine Flash-Adresse die gleiche Binärdarstellung haben. Allerdings wird über den nach <tt>__flash</tt> gecasteten Zeiger anders zugegriffen, nämlich per LPM.<br />
<br />
=== Jenseits von __flash ===<br />
<br />
Ausser <tt>__flash</tt> gibt es auch folgende Address-Spaces:<br />
<br />
==== <tt>__flash</tt>''N'' ====<br />
<br />
<tt>__flash</tt>''N'' mit ''N'' = 1..5 sind fünf weitere Spaces, die analog zu <tt>__flash</tt> funktionieren und deren Zeiger ebenfalls 16 Bit breit sind. avr-gcc erwartet, dass die zugehörigen Daten, welche in die Section <tt>.progmem</tt>''N''<tt>.data</tt> abgelegt werden, so lokatiert sind, dass das high-Byte der Adresse (Bits 16..23) gerade ''N'' ist.<br />
<br />
Weil Daten- und Code-Layout höchst projektspezifisch sind, werden diese Sections im Standard Linker-Skript nicht beschrieben. Um funktionsfähigen Code zu erhalten, muss daher ein eigenes Linker-Skript zur Verfügung gestellt werden, das diese Sections beschreibt, oder es kann eine Erweiterung des Standard Skripts bereitgestellt werden falls dies möglich ist.<br />
<br />
;Beispiel: Eine Applikation, die <tt>__flash2</tt> verwendet. Die zugehörende Section <tt>.progmem2.data</tt> wird hinter <tt>.text</tt> angeordnet aber vor den Initializern für <tt>.data</tt>. Dazu wird beim Linken das ld-Skript Fragment per <tt>-Tflash12.ld</tt> angegeben, welches dann an der gewünschten Stelle in das default Skript eingefügt wird:<br />
:{| <!-- Tabelle bitte für korrekte Einrückung belassen --><br />
|-<br />
|<pre><br />
SECTIONS<br />
{<br />
.flash2 :<br />
{<br />
. = MAX (ABSOLUTE(0x20000), .);<br />
PROVIDE (__flash2_start = .);<br />
. = ALIGN(2);<br />
*(.flash2.text*)<br />
*(.progmem2.data*)<br />
PROVIDE (__flash2_end = .);<br />
<br />
ASSERT (__flash2_start == __flash2_end || __flash2_start >= ABSOLUTE(0x20000),<br />
"__flash2 data in .progmem2.data below 0x20000");<br />
ASSERT (__flash2_start == __flash2_end || __flash2_end <= ABSOLUTE(0x30000),<br />
"__flash2 data in .progmem2.data exceeds 0x30000");<br />
}<br />
}<br />
INSERT AFTER .text<br />
</pre><br />
|}<br />
<br />
==== <tt>__memx</tt> ====<br />
<br />
Dieser Address-Space implementiert 3-Byte Zeiger und unterstützt Lesen über 64KiB-Segmentgrenzen hinweg. Das MSB (Bit 23) gibt dabei an, ob der <tt>__memx</tt>-Zeiger eine Flash-Adresse enthält (Bit23 = 0) oder eine RAM-Adresse (Bit23 = 1), was folgenden Code erlaubt:<br />
<br />
<syntaxhighlight lang="c"><br />
const __memx int a_flash = 42;<br />
const int a_ram = 100;<br />
<br />
int get_a (const __memx int* pa)<br />
{<br />
return *pa;<br />
}<br />
<br />
int main (void)<br />
{<br />
return get_a (&a_flash) + get_a (&a_ram);<br />
}</syntaxhighlight><br />
<br />
Dies bedeutet, dass erst zur ''Laufzeit'' entschieden werden kann, ob <tt>get_a</tt> die Daten aus dem RAM oder aus dem Flash lesen soll, was <tt>__memx</tt> im Vergleich zu den anderen Address-Spaces langsamer macht. Ausserdem ist zu beachten, dass <tt>__memx</tt>-Zeiger zwar 24-Bit Zeiger sind, die zugrundeliegende Adress-Arithmetik jedoch gemäß dem C-Standard erfolgt, also als 16-Bit Arithmetik. Bestehende Funktion der avr-libc wie z.B. printf_P funktionieren damit ebensowenig wie printf! Wenn man <tt>__memx</tt> verwenden will, braucht man dafür eigene Funktionen.<br />
<br />
=== __flash, progmem und Portierbarkeit ===<br />
<br />
Da ab er aktuellen Compilerversion 4.7 sowohl <tt>__flash</tt> als auch <tt>PROGMEM</tt> und die <tt>pgm_read</tt>-Funktionen zur Verfügung stehen, ergibt sich die Frage, welche Variante "besser" ist und wie zwischen ihnen hin- und her zu portieren ist.<br />
<br />
Zunächst sei erwähnt, dass <tt>__flash</tt> kein Ersatz für <tt>PROGMEM</tt> ist, sondern lediglich eine Alternative dazu. Das "alte" progmem wird weiterhin mir gleicher Semantik unterstützt, so dass alter Code ohne Änderungen mit den neueren Compilerversionen übersetzbar bleibt.<br />
<br />
Von der Codegüte her dürften sich keine großen Unterschiede ergeben. Es ist nicht zu erwarten, dass die eine oder die andere Variante wesentlich besseren oder schlechteren Code erzeugt — von einer Ausnahme abgesehen: Der Wert beim Zugriff ist zur Compilezeit bekannt und kann daher eliminiert werden.<br />
<syntaxhighlight lang="c"><br />
static const __flash char x[] = { 'A', 'V', 'R' };<br />
<br />
char foo (void)<br />
{<br />
return x[2];<br />
}<br />
</syntaxhighlight><br />
Dies wird übersetzt wie "<tt>return 'R';</tt>", und das Array <tt>x[]</tt> kann komplett wegoptimiert werden und entfallen.<br />
<br />
==== progmem → __flash ====<br />
<br />
Portierung in diese Richtung bedeutet, alten Code anzupassen. Zwingend ist die Portierung nicht, da <tt>progmem</tt> weiterhin unterstützt wird.<br />
Allerdings ist eine Quelle mit <tt>__flash</tt> besser lesbar, denn der Code wird von den <tt>pgm_read</tt>-Funktionen befreit, die vor allem bei Mehrfach-Indirektion den Code ziemlich verunstalten und unleserlich machen können.<br />
Weiterer Vorteil von <tt>_flash</tt> ist, daß eine striktere Typprüfung erfolgen kann.<br />
<br />
Eine Portierung wird man in zwei Schritten vornehmen:<br />
<br />
;1. Definitionen von Flash-Variablen werden angepasst:<br />
<br />
Vorher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
static const char hund[] PROGMEM = "Hund";<br />
static const char katze[] PROGMEM = "Katze";<br />
static const char maus[] PROGMEM = "Maus";<br />
<br />
const char * const tier[] PROGMEM = <br />
{<br />
hund, katze, maus<br />
};<br />
</syntaxhighlight><br />
|}<br />
<br />
Nachher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
static const __flash char hund[] = "Hund";<br />
static const __flash char katze[] = "Katze";<br />
static const __flash char maus[] = "Maus";<br />
<br />
const __flash char * const __flash tier[] = <br />
{<br />
hund, katze, maus<br />
};<br />
</syntaxhighlight><br />
|}<br />
<br />
Der Header <tt>avr/pgmspace.h</tt> wird nicht mehr benötigt. Im Gegensatz zu <tt>progmem</tt> müssen Qualifier immer links von der definierten Variablen stehen; bei Attributen wie <tt>progmem</tt> ist das mehr oder weniger egal.<br />
<br />
Nachdem diese Anpassung erfolgreich abgeschlossen ist, folgt Schritt<br />
<br />
; 2. Der Code wird von <tt>pgm_read</tt>-Aufrufen bereinigt:<br />
<br />
Vorher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
extern const char *tier[];<br />
<br />
char first_letter (uint8_t i)<br />
{<br />
const char* ptier = (const char*) pgm_read_word (&tier[i]);<br />
return (char) pgm_read_byte (&ptier[0]);<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
Nachher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <stdint.h><br />
<br />
extern const __flash char * const __flash tier[];<br />
<br />
char first_letter (uint8_t i)<br />
{<br />
return tier[i][0];<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
== Dateien direkt im Flash einbinden ==<br />
<br />
Wenn man größere Dateien direkt im Programm einbinden will, ohne sie vorher in C Quelltext umzuwandeln, muss man das mit dem Linker machen. Wie das geht steht hier.<br />
<br />
* [http://www.atmel.com/webdoc/avrlibcreferencemanual/FAQ_1faq_binarydata.html Atmel, avr gcc Dokumentation]<br />
* [http://nongnu.org/avr-libc/user-manual/FAQ.html#faq_binarydata Nongnu avr gcc Dokumentation]<br />
<br />
Wie man das dann praktisch umsetzt, sieht man in diesem Beitrag.<br />
<br />
* [https://www.mikrocontroller.net/topic/361429?goto=4056910#4056910 Forumsbeitrag]: Binärdateien mittels Linker einbinden<br />
* [https://www.mikrocontroller.net/topic/361429?goto=4056910#4056947 Forumsbeitrag]: Ein kleines Tool zum Umwandeln von Binärdateien in C-Quelltext.<br />
<br />
== Flash in der Anwendung schreiben ==<br />
<br />
Bei AVRs mit "self-programming"-Option – auch bekannt als [[Bootloader]]-Support – können Teile des Flash-Speichers vom Anwendungsprogramm beschrieben werden. Dies ist nur möglich, wenn die Schreibfunktion in einem besonderen Speicherbereich, der Boot-Section des Programmspeichers/Flash, abgelegt ist.<br />
<br />
Bei einigen kleinen AVRs gibt es keine gesonderte Boot-Section, bei diesen kann der Flashspeicher von jeder Stelle des Programms geschrieben werden. Für Details sei hier auf das jeweilige Controller-Datenblatt und die Erläuterungen zum Modul boot.h der avr-libc verwiesen. Es existieren auch Application-Notes dazu bei atmel.com, die auf avr-gcc-Code übertragbar sind.<br />
<br />
Siehe auch: <br />
* Forumsbeitrag [http://www.mikrocontroller.net/topic/163632#1561622 Daten in Programmspeicher speichern]<br />
<br />
== EEPROM ==<br />
<br />
Möchte man Werte aus einem Programm heraus so speichern, dass sie auch nach dem Abschalten der Versorgungsspannung noch erhalten bleiben und nach dem Wiederherstellen der Versorgungsspannung bei erneutem Programmstart wieder zur Verfügung stehen, dann benutzt man das EEPROM.<br />
<br />
Schreib- und Lesezugriffe auf den EEPROM-Speicher erfolgen über die im Modul eeprom.h der avr-libc definierten Funktionen. Mit diesen Funktionen können einzelne Bytes, Datenworte (16 Bit), Fließkommawerte (32 Bit, single-precision, float) und Datenblöcke geschrieben und gelesen werden.<br />
<br />
Diese Funktionen kümmern sich auch um diverse Details, die bei der Benutzung des EEPROMs normalerweise notwendig sind:<br />
* EEPROM-Operationen sind im Vergleich relativ langsam. Man muss daher darauf achten, dass eine vorhergehende Operation abgeschlossen ist, ehe die nächste Operation mit dem EEPROM gestartet wird. Die in der avr-libc implementierten Funktionen aus eeprom.h berücksichtigten dies. Soll beim Aufruf einer EEPROM-Funktion sichergestellt werden, dass diese nicht intern in einer Warteschleife auf den Abschluss der vorherigen Operation wartet, kann vorher per eeprom_is_ready testen, ob der Zugriff auf den EEPROM-Speicher sofort möglich ist.<br />
* Es ist darauf zu achten, dass die EEPROM-Funktionen nicht durch einen Interrupt unterbrochen werden. Einige Phasen des Zugriffs sind zeitkritisch und müssen in einer definierten bzw. begrenzten Anzahl von Takten durchgeführt werden. Durch einen unterbrechenden Interrupt würde diese Restriktion nicht mehr eingehalten. Auch dieses Detail wird von den avr-libc Funktionen berücksichtigt, so dass man sich als C-Programmierer nicht darum kümmern muss. Innerhalb der Funktionen werden Interrupts vor der "EEPROM-Sequenz" global deaktiviert und im Anschluss, falls vorher auch schon eingeschaltet, wieder aktiviert.<br />
<br />
Man beachte, dass der EEPROM-Speicher nur eine begrenzte Anzahl von Schreibzugriffen zulässt. Beschreibt man eine EEPROM-Zelle öfter als die im Datenblatt zugesicherte Anzahl (typisch 100.000), wird die Funktion der Zelle nicht mehr garantiert. Dies gilt für jede einzelne Zelle. <br />
<br />
Bei geschickter Programmierung (z.&nbsp;B. Ring-Puffer), bei der die zu beschreibenden Zellen regelmäßig gewechselt werden, kann man eine deutlich höhere Anzahl an Schreibzugriffen, bezogen auf den gesamten EEPROM-Speicher, erreichen. Auf jeden Fall sollte man aber eine Abschätzung über die zu erwartende Lebensdauer des EEPROM durchführen. Wird ein Wert im EEPROM im Durchschnitt nur einmal pro Woche verändert, wird die garantierte Anzahl der Schreibzyklen innerhalb der voraussichtlichen Verwendungszeit des Controllers sicherlich nicht erreicht werden. Welcher Controller ist schon 100000 / 52 = 1923 Jahre im Einsatz? In diesem Fall lohnt es sich daher nicht, erweiterte Programmfunktionen zu implementieren, mit denen die Anzahl der Schreibzugriffe minimiert wird.<br />
<br />
Eine weitere Möglichkeit, Schreibzyklen einzusparen, besteht in der Vorabprüfung, ob der zu speichernde Wert im EEPROM bereits enthalten ist und nur veränderte Werte zu schreiben. In aktuelleren Versionen der avr-libc sind bereits Funktionen enthalten, die solche Prüfungen enthalten (eeprom_update_*).<br />
<br />
Eine dritte Möglichkeit speichert alle Daten zunächst im RAM, wo sie beliebig oft beschrieben werden können. Nur beim Ausschalten oder beim Ausfall der Stromversorgung werden die Daten in den EEPROM geschrieben. Wie man das richtig macht sieht man im Artikel [[Speicher#EEPROM Schreibzugriffe minimieren | Speicher]].<br />
<br />
Lesezugriffe können beliebig oft durchgeführt werden. Sie unterliegen keinen Einschränkungen in Bezug auf deren Anzahl. <br />
<br />
=== EEMEM ===<br />
Um eine Variable im EEPROM anzulegen, stellt die avr-libc das Makro EEMEM zur Verfügung:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdint.h><br />
#include <avr/eeprom.h><br />
<br />
/* Byte */<br />
uint8_t eeFooByte EEMEM = 123;<br />
<br />
/* Wort */<br />
uint16_t eeFooWord EEMEM = 12345;<br />
<br />
/* float */<br />
float eeFooFloat EEMEM;<br />
<br />
/* Byte-Array */<br />
uint8_t eeFooByteArray1[] EEMEM = { 18, 3, 70 };<br />
uint8_t eeFooByteArray2[] EEMEM = { 30, 7, 79 };<br />
<br />
/* 16-bit unsigned short feld */<br />
uint16_t eeFooWordArray1[4] EEMEM;<br />
</syntaxhighlight><br />
<br />
Die grundsätzliche Vorgehensweise ist identisch zur Verwendung von PROGMEM. Auch hier erzeugt man sich spezielle attributierte Variablen (EEMEM erledigt das), die vom Compiler/Linker nicht wie normale Variablen behandelt werden. Compiler/Linker kümmern sich zwar darum, dass diesen Variablen eine Adresse zugewiesen wird, diese Adresse ist dann aber die Adresse der 'Variablen' im EEPROM. Um die dort gespeicherten Werte zu lesen bzw. zu schreiben, übergibt man diese Adresse an spezielle Funktionen, die die entsprechenden Werte aus dem EEPROM holen bzw. das EEPROM neu beschreiben.<br />
<br />
Die mittels EEMEM erzeugten 'Variablen' sind also mehr als Platzhalter zu verstehen, denn als echte Variablen. Es geht nur darum, im C-Programm symbolische Namen zur Verfügung zu haben, anstatt mit echten EEPROM-Adressen hantieren zu müssen, etwas, das grundsätzlich aber auch genauso gut möglich ist. Nur muss man sich in diesem Fall dann selbst darum kümmern, dass mehrere 'Variablen' ohne Überschneidung im EEPROM angeordnet werden.<br />
<br />
=== Bytes lesen/schreiben ===<br />
<br />
Die avr-libc Funktion zum Lesen eines Bytes heißt eeprom_read_byte. Parameter ist die Adresse des Bytes im EEPROM. Geschrieben wird über die Funktion eeprom_write_byte mit den Parametern Adresse und Inhalt. Anwendungsbeispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#define EEPROM_DEF 0xFF<br />
<br />
void eeprom_example (void)<br />
{<br />
uint8_t myByte;<br />
<br />
// myByte lesen (Wert = 123)<br />
myByte = eeprom_read_byte (&eeFooByte);<br />
<br />
// der Wert 99 wird im EEPROM an die Adresse der<br />
// Variablen eeFooByte geschrieben<br />
myByte = 99;<br />
eeprom_write_byte(&eeFooByte, myByte); // schreiben<br />
<br />
myByte = eeprom_read_byte (&eeFooByteArray1[1]); <br />
// myByte hat nun den Wert 3<br />
<br />
// Beispiel fuer eeprom_update_byte: die EEPROM-Zelle wird nur<br />
// dann beschrieben, wenn deren Inhalt sich vom Parameterwert<br />
// unterscheidet. In diesem Beispiel erfolgt also kein Schreib-<br />
// zugriff, da die Werte gleich sind.<br />
eeprom_update_byte(&eeFooByte, myByte);<br />
<br />
<br />
// Beispiel zur "Sicherung" gegen leeres EEPROM nach "Chip Erase"<br />
// (z. B. wenn die .eep-Datei nach Programmierung einer neuen Version<br />
// des Programms nicht in den EEPROM uebertragen wurde und EESAVE<br />
// deaktiviert ist (unprogrammed/1)<br />
// <br />
// Vorsicht: wenn EESAVE "programmed" ist, hilft diese Sicherung nicht<br />
// weiter, da die Speicheraddressen in einem neuen/erweiterten Programm<br />
// moeglicherweise verschoben wurden. An der Stelle &eeFooByte steht<br />
// dann u.U. der Wert einer anderen Variable aus einer "alten" Version.<br />
<br />
uint8_t fooByteDefault = 222;<br />
if ((myByte = eeprom_read_byte (&eeFooByte)) == EEPROM_DEF)<br />
{<br />
myByte = fooByteDefault;<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
=== Wort lesen/schreiben ===<br />
<br />
Schreiben und Lesen von Datenworten erfolgt analog zur Vorgehensweise bei Bytes:<br />
<br />
<syntaxhighlight lang="c"><br />
// lesen<br />
uint16_t myWord = eeprom_read_word (&eeFooWord);<br />
<br />
// schreiben<br />
eeprom_write_word (&eeFooWord, 2222);<br />
</syntaxhighlight><br />
<br />
=== Block lesen/schreiben ===<br />
<br />
Lesen und Schreiben von Datenblöcken erfolgt über die Funktionen <code>eeprom_read_block()</code> bzw. <code>eeprom_write_block()</code>. Die Funktionen erwarten drei Parameter: die Adresse der Quell- bzw. Zieldaten im RAM, die EEPROM-Adresse und die Länge des Datenblocks in Bytes als <code>size_t</code>.<br />
<syntaxhighlight lang="c"><br />
uint8_t myByteBuffer[3];<br />
uint16_t myWordBuffer[4];<br />
<br />
void eeprom_block_example (void)<br />
{<br />
/* Datenblock aus EEPROM lesen */<br />
<br />
/* liest 3 Bytes ab der von eeFooByteArray1 definierten EEPROM-Adresse<br />
in das RAM-Array myByteBuffer */<br />
eeprom_read_block (myByteBuffer, eeFooByteArray1, 3);<br />
<br />
/* dito mit etwas Absicherung betr. der Länge */<br />
eeprom_read_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));<br />
<br />
/* und nun mit 16-Bit Array */<br />
eeprom_read_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));<br />
<br />
/* Datenblock in EEPROM schreiben */<br />
eeprom_write_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));<br />
eeprom_write_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));<br />
}<br />
</syntaxhighlight><br />
<br />
=== Fließkommawerte lesen/schreiben ===<br />
<br />
In der avr-libc stehen auch EEPROM-Funktionen für Variablen des Typs float (Fließkommazahlen mit "einfacher" Genauigkeit) zur Verfügung.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/eeprom.h><br />
<br />
float eeFloat EEMEM = 12.34f;<br />
<br />
float void eeprom_float_example(float value)<br />
{<br />
/* float in EEPROM schreiben */<br />
eeprom_write_float(&eeFloat, value);<br />
<br />
/* float aus EEPROM lesen */<br />
return eeprom_read_float(&eeFloat);<br />
}</syntaxhighlight><br />
<br />
=== EEPROM-Speicherabbild in .eep-Datei ===<br />
<br />
Mit den zum Compiler gehörenden Werkzeugen kann der aus den Variablendeklarationen abgeleitete EEPROM-Inhalt in eine Datei geschrieben werden. Die übliche Dateiendung ist .eep, Daten im Intel Hex-Format. Damit können Standardwerte für den EEPROM-Inhalt im Quellcode definiert werden. <br />
<br />
Makefiles nach WinAVR/MFile-Vorlage enthalten bereits die notwendigen Einstellungen, siehe dazu die Erläuterungen im [[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]].<br />
<br />
Der Inhalt der eep-Datei muss ebenfalls zum Mikrocontroller übertragen werden, wenn die Initialisierungswerte aus der Deklaration vom Programm erwartet werden. Ansonsten enthält der EEPROM-Speicher nach der Übertragung des Programmers mittels ISP abhängig von der Einstellung der EESAVE-Fuse<ref>vgl. Datenblatt Abschnitt Fuse Bits</ref> nicht die korrekten Werte:<br />
; EESAVE = 0 (programmed): Die Daten im EEPROM bleiben erhalten. Werden sie nicht neu geschrieben, so enthält das EEPROM evtl. Daten, die nicht mehr zum Programm passen.<br />
; EESAVE = 1 (unprogrammed): Beim Programmieren werden die Daten im EEPROM gelöscht, also auf 0xff gesetzt.<br />
<br />
Als Sicherung kann man im Programm nochmals die Standardwerte vorhalten, beim Lesen auf 0xFF prüfen und gegebenenfalls einen Standardwert nutzen. Das geht natürlich nur, wenn 0xFF selbst nicht als Datenwert vorkommen kann.<br />
<syntaxhighlight lang="c"><br />
#define DUTY_CYCLE_DEFAULT 0x80<br />
<br />
uint8_t eeDutyCycle EEMEM; // Platzhalter für EEPROM<br />
uint8_t DutyCycle; // die echte Variable<br />
<br />
<br />
int main(void)<br />
{<br />
DutyCycle = eeprom_read_byte( &eeDutyCycle );<br />
if( DutyCycle == 0xFF ) // das allererste mal. Im EEPROM steht noch kein gültiger Wert<br />
{<br />
DutyCycle = DUTY_CYCLE_DEFAULT;<br />
eeprom_writeByte( &eeDutyCycle, DutyCycle );<br />
}<br />
<br />
...<br />
</syntaxhighlight><br />
<br />
=== Direkter Zugriff auf EEPROM-Adressen ===<br />
<br />
Will man direkt auf bestimmte EEPROM Adressen zugreifen, dann sind folgende IAR-kompatiblen Makros <tt>_EEGET</tt> und <tt>_EEPUT</tt> hilfreich, um sich die Typecasts zu ersparen.<br />
<br />
;Hinweis: Die nachfolgend gezeigten Makros und Zugriffe auf absolute Adressen sind in Normalfall nicht nötig und nur auf sehr wenige, spezielle Fälle beschränkt! Im Normalfall sollte man auf absolute Adressen möglichst nicht zugreifen und den Compiler seine Arbeit machen lassen, der verwaltet die Variablen und deren Adressen meist besser als der Programmierer. Der Zugriff auf Variablen im EEPROM sollte immer über ihren Namen erfolgen.<br />
<br />
Verwendung:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/eeprom.h><br />
<br />
_EEPUT (0x20, 128); // Byte-Wert 128 an Adresse 0x20 schreiben<br />
...<br />
uint8_t val = _EEGET (0x20); // EEPROM-Wert von Adresse 0x20 lesen<br />
</syntaxhighlight><br />
<br />
=== Was steckt dahinter? - EEPROM-Register ===<br />
Auch wenn es normalerweise keinen Grund gibt, in C selbst an den Steuerregistern herumzuschrauben - die eeprom Funktionen erledigen das alles zuverlässig - der Vollständigkeit halber der registermässige technische Unterbau.<br />
Um das EEPROM anzusteuern, sind drei Register von Bedeutung:<br />
;EEAR: Hier werden die Adressen eingetragen zum Schreiben oder Lesen. Dieses Register unterteilt sich nochmal in EEARH und EEARL, da in einem 8-Bit-Register keine 512 Adressen adressiert werden können.<br />
;EEDR: Hier werden die Daten eingetragen, die geschrieben werden sollen, bzw. es enthält die gelesenen Daten.<br />
;EECR: Ist das Kontrollregister für das EEPROM<br />
<br />
Das EECR steuert den Zugriff auf das EEPROM und ist wie folgt aufgebaut:<br />
<br />
:{| class="wikitable" style="text-align:center"<br />
|+ '''Aufbau des EECR-Registers'''<br />
|-<br />
!Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|-<br />
! Name<br />
| - || - || - ||- || EERIE || EEMWE || EEWE || EERE<br />
|-<br />
! Read/Write<br />
| R || R || R || R || R/W || R/W || R/W || R/W<br />
|-<br />
!Init Value<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''Bedeutung der Bits'''<br />
<br />
;Bit 4-7: nicht belegt<br />
<br />
;Bit 3 (EERIE): ''EEPROM Ready Interrupt Enable'': Wenn das Bit gesetzt ist und globale Interrupts erlaubt sind in Register SREG (Bit 7), wird ein Interrupt ausgelöst nach Beendigung des Schreibzyklus (EEPROM Ready Interrupt). Ist einer der beiden Bits 0, wird kein Interrupt ausgelöst.<br />
<br />
;Bit 2 EEMWE): ''EEPROM Master Write Enable'': Dieses Bit bestimmt, dass, wenn EEWE = 1 gesetzt wird (innerhalb von 4 Taktzyklen), das EEPROM beschrieben wird mit den Daten in EEDR bei Adresse EEAR. Wenn EEMWE = 0 ist und EEWE = 1 gesetzt wird, hat das keine Auswirkungen. Der Schreibvorgang wird dann nicht ausgelöst. Nach 4 Taktzyklen wird das Bit EEMWE automatisch wieder auf 0 gesetzt. Dieses Bit löst den Schreibvorgang nicht aus, es dient sozusagen als Sicherungsbit für EEWE.<br />
<br />
;Bit 1 (EEWE): ''EEPROM Write Enable'': Dieses Bit löst den Schreibvorgang aus, wenn es auf 1 gesetzt wird, sofern vorher EEMWE gesetzt wurde und seitdem nicht mehr als 4 Taktzyklen vergangen sind. Wenn der Schreibvorgang abgeschlossen ist, wird dieses Bit automatisch wieder auf 0 gesetzt und, sofern EERIE gesetzt ist, ein Interrupt ausgelöst. Ein Schreibvorgang sieht typischerweise wie folgt aus:<br />
:# EEPROM-Bereitschaft abwarten (EEWE=0) <br />
:# Adresse übergeben an EEAR<br />
:# Daten übergeben an EEDR<br />
:# Schreibvorgang auslösen in EECR mit Bit EEMWE=1 und EEWE=1<br />
:# (Optional) Warten, bis Schreibvorgang abgeschlossen ist<br />
<br />
;Bit 0 EERE: ''EEPROM Read Enable'': Wird dieses Bit auf 1 gesetzt wird das EEPROM an der Adresse in EEAR ausgelesen und die Daten in EEDR gespeichert. Das EEPROM kann nicht ausgelesen werden, wenn bereits eine Schreiboperation gestartet wurde. Es ist daher zu empfehlen, die Bereitschaft vorher zu prüfen. Das EEPROM ist lesebereit, wenn das Bit EEWE=0 ist. Ist der Lesevorgang abgeschlossen, wird das Bit wieder auf 0 gesetzt, und das EEPROM ist für neue Lese- und Schreibbefehle wieder bereit. Ein typischer Lesevorgang kann wie folgt aufgebaut sein:<br />
:# Bereitschaft zum Lesen prüfen (EEWE=0)<br />
:# Adresse übergeben an EEAR<br />
:# Lesezyklus auslösen mit EERE = 1<br />
:# Warten, bis Lesevorgang abgeschlossen EERE = 0<br />
:# Daten abholen aus EEDR<br />
<br />
= Die Nutzung von sprintf und printf =<br />
<br />
Um komfortabel, d.h. formatiert, Ausgaben auf ein Display oder die serielle Schnittstelle zu tätigen, bieten sich '''sprintf''' oder '''printf''' an. Alle *printf-Varianten sind jedoch ziemlich speicherintensiv und der Einsatz in einem Mikrocontroller mit knappem Speicher muss sorgsam abgewogen werden.<br />
<br />
Bei '''sprintf''' wird die Ausgabe zunächst in einem Puffer vorbereitet und anschließend mit einfachen Funktionen zeichenweise ausgegeben. Es liegt in der Verantwortung des Programmierers, genügend Platz im Puffer für die erwarteten Zeichen bereitzuhalten.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdio.h><br />
#include <stdint.h><br />
<br />
// ...<br />
// nicht dargestellt: Implementierung von uart_puts (vgl. Abschnitt UART)<br />
// ...<br />
<br />
uint16_t counter;<br />
<br />
// Ausgabe eines unsigned Integerwertes<br />
void uart_puti( uint16_t value )<br />
{<br />
uint8_t puffer[20];<br />
<br />
sprintf( puffer, "Zählerstand: %u", value );<br />
uart_puts( puffer );<br />
}<br />
<br />
int main()<br />
{<br />
counter = 5;<br />
<br />
uart_puti( counter );<br />
uart_puti( 42 );<br />
}<br />
</syntaxhighlight><br />
<br />
Eine weitere elegante Möglichkeit besteht darin, den STREAM stdout (Standardausgabe) auf eine eigene Ausgabefunktion umzuleiten. Dazu wird dem Ausgabemechanismus der C-Bibliothek eine neue Ausgabefunktion bekannt gemacht, deren Aufgabe es ist, ein einzelnes Zeichen auszugeben. Wohin die Ausgabe dann tatsächlich stattfindet, ist Sache der Ausgabefunktion. Im Beispiel unten wird auf UART ausgegeben. Alle anderen, höheren Funktionen wie z.&nbsp;B. '''printf''', greifen letztendlich auf diese primitive Ausgabefunktion zurück. <br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdio.h><br />
<br />
void uart_init(void);<br />
<br />
// a. Deklaration der primitiven Ausgabefunktion<br />
int uart_putchar(char c, FILE *stream);<br />
<br />
// b. Umleiten der Standardausgabe stdout (Teil 1)<br />
static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );<br />
<br />
// c. Definition der Ausgabefunktion<br />
int uart_putchar( char c, FILE *stream )<br />
{<br />
if( c == '\n' )<br />
uart_putchar( '\r', stream );<br />
<br />
loop_until_bit_is_set( UCSRA, UDRE );<br />
UDR = c;<br />
return 0;<br />
}<br />
<br />
void uart_init(void)<br />
{<br />
/* hier µC spezifischen Code zur Initialisierung */<br />
/* des UART einfügen... s.o. im AVR-GCC-Tutorial */<br />
<br />
// Beispiel: <br />
//<br />
// myAVR Board 1.5 mit externem Quarz Q1 3,6864 MHz<br />
// 9600 Baud 8N1<br />
<br />
#ifndef F_CPU<br />
#define F_CPU 3686400<br />
#endif<br />
#define UART_BAUD_RATE 9600<br />
<br />
// Hilfsmakro zur UBRR-Berechnung ("Formel" laut Datenblatt)<br />
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)<br />
<br />
UCSRB |= (1<<TXEN) | (1<<RXEN); // UART TX und RX einschalten<br />
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 <br />
<br />
UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );<br />
UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );<br />
}<br />
<br />
int main(void)<br />
{<br />
int16_t antwort = 42;<br />
uart_init();<br />
<br />
// b. Umleiten der Standardausgabe stdout (Teil 2)<br />
stdout = &mystdout;<br />
<br />
// Anwendung<br />
printf( "Die Antwort ist %d.\n", antwort );<br />
return 0;<br />
}<br />
<br />
// Quelle: avr-libc-user-manual-1.4.3.pdf, S.74<br />
// + Ergänzungen<br />
</syntaxhighlight><br />
<br />
<br />
Sollen Fließkommazahlen ausgegeben werden, muss im Makefile eine andere (größere) Version der [[FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio|printflib]] eingebunden werden.<br />
<br />
= Anmerkungen =<br />
<references/><br />
<br />
= TODO =<br />
* Aktualisierung Register- und Bitbeschreibungen an aktuelle AVR<br />
* "naked"-Funktionen [http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html][http://arduino.stackexchange.com/questions/8758/arduino-interruption-on-pin-change]<br />
<br />
[[Kategorie:avr-gcc Tutorial| ]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=102524
Avr-gcc Bugs
2020-11-24T21:04:09Z
<p>Gjlayde: /* Fixed */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| [https://www.bountysource.com/issues/84630749-avr-convert-the-backend-to-mode_cc-so-it-can-be-kept-in-future-releases Bounty]<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| [http://gcc.gnu.org/gcc-10/changes.html#avr 10.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| [http://gcc.gnu.org/gcc-8/changes.html#avr 8.0]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| [http://gcc.gnu.org/gcc-7/changes.html#avr 7.0]<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=102523
Avr-gcc Bugs
2020-11-24T19:47:59Z
<p>Gjlayde: </p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92729 92729] || Switch from cc0 to CCmode so avr-gcc can be kept in GCC v11+<br />
| [https://www.bountysource.com/issues/84630749-avr-convert-the-backend-to-mode_cc-so-it-can-be-kept-in-future-releases Bounty]<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
| [https://savannah.nongnu.org/bugs/?57071 &rarr;57071]<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
| Patch<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| 10.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| 8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=IRMP&diff=102063
IRMP
2020-06-22T09:52:17Z
<p>Gjlayde: /* Fernbedienungen */ +Bleil</p>
<hr />
<div>Von '''Frank M. ([http://www.mikrocontroller.net/user/show/ukw ukw])'''<br />
<br />
[[Datei:irmp-title.png| |Scan eines NEC-kompatiblen Fernbedienungssignals]]<br />
<br />
'''[[IRMP_-_english#top|You will find the English documentation here.]]'''<br />
<br />
Da RC5 nicht nur veraltet, sondern mittlerweile obsolet ist und immer mehr die elektronischen Geräte der fernöstlichen Unterhaltungsindustrie in unseren Haushalten Einzug finden, ist es an der Zeit, einen IR-Decoder zu entwickeln, der ca. 90% aller bei uns im täglichen Leben zu findenden IR-Fernbedienungen "versteht". <br />
<br />
Im folgenden wird IRMP als "Infrarot-Multiprotokoll-Decoder" in allen Einzelheiten vorgestellt. Das Gegenstück, nämlich '''[[IRSND]]''' als IR-Encoder, wird in einem gesonderten [[IRSND|Artikel]] behandelt.<br />
<br />
= IRMP - Infrarot-Multiprotokoll-Decoder =<br />
<br />
[[Datei:irmp-empfaenger.png|miniatur|Anschluß eines IR-Empfängers an µC]]<br />
<br />
=== Unterstützte µCs ===<br />
<br />
[[IRMP#top|IRMP]] ist auf verschiedenen Mikrocontroller-Familien lauffähig.<br />
<br />
'''AVR'''<br />
<br />
* ATtiny87, ATtiny167<br />
* ATtiny45, ATtiny85<br />
* ATtiny44, ATtiny84<br />
* ATmega8, ATmega16, ATmega32<br />
* ATmega162<br />
* ATmega164, ATmega324, ATmega644, ATmega644P, ATmega1284<br />
* ATmega88, ATmega88P, ATmega168, ATmega168P, ATmega328P<br />
<br />
'''XMega'''<br />
<br />
* ATXmega128<br />
<br />
'''PIC''' (CCS- und XC8/C18-Compiler)<br />
<br />
* PIC12F1840<br />
* PIC18F4520<br />
<br />
'''STM32'''<br />
<br />
* STM32F4xx (getestet auf STM32F401RE/F411RE Nucleo, STM32F4 Discovery)<br />
* STM32F10x (getestet auf STM32F103C8T6 Mini Development Board)<br />
* STM32 mit HAL-Library '''(NEU!)'''<br />
<br />
'''STM8'''<br />
<br />
* STM8S103F3<br />
<br />
'''TI Stellaris'''<br />
<br />
* LM4F120 Launchpad (ARM Cortex M4)<br />
<br />
'''ESP8266 (NEU!)'''<br />
<br />
* ESP8266-EVB<br />
<br />
'''TEENSY 3.0 (NEU!)'''<br />
<br />
* MK20DX256VLH7 (ARM Cortex-M4 72MHz)<br />
<br />
'''MBED (NEU!)'''<br />
<br />
* LPC1347 Cortex-M3 mit 72 MHz<br />
* LPC4088 (Embedded Artists)<br />
<br />
'''ChibiOS HAL (NEU!)'''<br />
<br />
* Verschiedene ARM-Cortex-µCs, wie z.B. STM32, Kinetis, NRF5 etc.<br />
* [https://sourceforge.net/p/chibios/svn2/HEAD/tree/trunk/os/hal/ports/ Offiziell unterstützte µC-Serien]<br />
* [https://github.com/ChibiOS/ChibiOS-Contrib/tree/master/os/hal/ports weitere µC-Serien, von der Community unterstützt]<br />
<br />
=== Unterstützte IR-Protokolle ===<br />
<br />
[[IRMP#top|IRMP]] - der Infrarot-Fernbedienungsdecoder, der mehrere Protokolle auf einmal decodieren kann, beherrscht folgende Protokolle (in alphabetischer Reihenfolge):<br />
<br />
{| {{Tabelle}}<br />
|+ '''Unterstützte IR-Protokolle'''<br />
|- style="background-color:#eeeeee"<br />
! style="width:15%" | Protokoll || Hersteller<br />
|-<br />
| [[IRMP#A1TVBOX|A1TVBOX]] || ADB (Advanced Digital Broadcast), z.B. A1 TV Box<br />
|-<br />
| [[IRMP#APPLE|APPLE]] || Apple<br />
|-<br />
| [[IRMP#ACP24|ACP24]] || Stiebel Eltron<br />
|-<br />
| [[IRMP#B&O|B&O]] || Bang & Olufsen<br />
|-<br />
| [[IRMP#BOSE|BOSE]] || Bose<br />
|-<br />
| [[IRMP#DENON|DENON]] || Denon, Sharp<br />
|-<br />
| [[IRMP#FAN|FAN]] || FAN, Fernsteuerung für Ventilatoren<br />
|-<br />
| [[IRMP#FDC|FDC]] || FDC Keyboard<br />
|-<br />
| [[IRMP#GRUNDIG_+_NOKIA|GRUNDIG]] || Grundig<br />
|-<br />
| [[IRMP#GRUNDIG_+_NOKIA|NOKIA]] || Nokia, z.B. D-Box<br />
|-<br />
| [[IRMP#IR60 (SDA2008)|IR60 (SDA2008)]] || Diverse europäische Hersteller<br />
|-<br />
| [[IRMP#JVC|JVC]] || JVC<br />
|-<br />
| [[IRMP#KASEIKYO|KASEIKYO]] || Panasonic, Technics, Denon und andere japanische Hersteller, welche Mitglied der "Japan's Association for Electric Home Application" sind.<br />
|-<br />
| [[IRMP#KATHREIN|KATHREIN]] || KATHREIN<br />
|-<br />
| [[IRMP#LEGO|LEGO]] || Lego<br />
|-<br />
| [[IRMP#LGAIR|LGAIR]] || LG Air Conditioner<br />
|-<br />
| [[IRMP#MITSU_HEAVY|MITSU_HEAVY]] || Mitsubishi Air Conditioner<br />
|-<br />
| [[IRMP#MATSUSHITA|MATSUSHITA]] || Matsushita<br />
|-<br />
| [[IRMP#NEC16|NEC16]] || JVC, Daewoo<br />
|-<br />
| [[IRMP#NEC42|NEC42]] || JVC<br />
|-<br />
| [[IRMP#MERLIN|MERLIN]] || MERLIN Fernbedienung (Pollin Bestellnummer: 620 185)<br />
|-<br />
| [[IRMP#NEC_+_extended_NEC|NEC]] || NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC, Pioneer, Toshiba, Xoro, Orion, NoName und viele weitere japanische Hersteller.<br />
|-<br />
| [[IRMP#NETBOX|NETBOX]] || Netbox<br />
|-<br />
| [[IRMP#NIKON|NIKON]] || NIKON<br />
|-<br />
| [[IRMP#NUBERT|NUBERT]] || Nubert, z.B. Subwoofer System<br />
|-<br />
| [[IRMP#ORTEK|ORTEK]] || Ortek, Hama<br />
|-<br />
| [[IRMP#PANASONIC|PANASONIC]] || PANASONIC Beamer<br />
|-<br />
| [[IRMP#PENTAX|PENTAX]] || PENTAX<br />
|-<br />
| [[IRMP#RC5_+_RC5X|RC5]] || Philips und andere europäische Hersteller<br />
|-<br />
| [[IRMP#RC6_+_RC6A|RC6A]] || Philips, Kathrein und andere Hersteller, z.B. XBOX<br />
|-<br />
| [[IRMP#RC6_+_RC6A|RC6]] || Philips und andere europäische Hersteller<br />
|-<br />
| [[IRMP#RCCAR|RCCAR]] || RC Car: IR Fernbedienung für Modellfahrzeuge <br />
|-<br />
| [[IRMP#RCII|RCII]] || T+A ('''NEU!''')<br />
|-<br />
| [[IRMP#RECS80|RECS80]] || Philips, Nokia, Thomson, Nordmende, Telefunken, Saba<br />
|-<br />
| [[IRMP#RECS80EXT|RECS80EXT]] || Philips, Technisat, Thomson, Nordmende, Telefunken, Saba<br />
|-<br />
| [[IRMP#RCMM|RCMM]] || Fujitsu-Siemens z.B. Activy keyboard<br />
|-<br />
| [[IRMP#ROOMBA|ROOMBA]] || iRobot Roomba Staubsauger<br />
|-<br />
| [[IRMP#S100|S100]] || Ähnlich zu RC5, aber 14 statt 13 Bits und 56kHz Modulation. Hersteller unbekannt.<br />
|-<br />
| [[IRMP#SAMSUNG32|SAMSUNG32]] || Samsung<br />
|-<br />
| [[IRMP#SAMSUNG48|SAMSUNG48]] || Div. Klimaanlagen Hersteller<br />
|-<br />
| [[IRMP#SAMSUNG|SAMSUNG]] || Samsung<br />
|-<br />
| [[IRMP#SIEMENS_+_RUWIDO|RUWIDO]] || RUWIDO (z.B. T-Home-Mediareceiver, MERLIN-Tastatur (Pollin))<br />
|-<br />
| [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]] || Siemens, z.B. Gigaset M740AV<br />
|-<br />
| [[IRMP#SIRCS|SIRCS]] || Sony<br />
|-<br />
| [[IRMP#SPEAKER|SPEAKER]] || Lautsprecher Systeme wie z.B. X-Tensions<br />
|-<br />
| [[IRMP#TECHNICS|TECHNICS]] || Technics<br />
|-<br />
| [[IRMP#TELEFUNKEN|TELEFUNKEN]] || Telefunken<br />
|-<br />
| [[IRMP#THOMSON|THOMSON]] || Thomson<br />
|-<br />
| [[IRMP#VINCENT|VINCENT]] || Vincent<br />
|}<br />
<br />
'''NEU'''<br />
<br />
'''Ab Version 3.2 kann IRMP auch RF-Funkprotokolle (433 MHz) dekodieren.'''<br />
<br />
{| {{Tabelle}}<br />
|+ '''Unterstützte IR-Protokolle'''<br />
|- style="background-color:#eeeeee"<br />
! style="width:25%" | Protokoll || Hersteller<br />
|-<br />
| [[IRMP#RF_GEN24|RF_GEN24]] || Generisches 24 Bit Format, z.B. Pollin 550666 Funksteckdose<br />
|-<br />
| [[IRMP#RF_X10|RF_X10]] || X10 PC Funkfernbedienung (Medion), Pollin 721815<br />
|-<br />
<br />
Jedes dieser Protokolle ist einzeln aktivierbar. Wer möchte, kann alle Protokolle aktivieren. Wer nur ein Protokoll braucht, kann alle anderen deaktivieren. Es wird nur das vom Compiler übersetzt, was auch benötigt wird.<br />
<br />
Zu beachten:<br />
<br />
* Sollen Funk-Protokolle decodiert werden, sind sämtliche IR-Protokolle zu deaktivieren.<br />
* Sollen IR-Protokolle decodiert werden, sind sämtliche RF-Protokolle (Funk) zu deaktivieren.<br />
<br />
=== Entstehung ===<br />
<br />
Der auf AVR- und PIC-µCs einsetzbare Source zu [[IRMP#top|IRMP]] entstand im Rahmen des [[Word Clock]] Projektes.<br />
<br />
=== Thread im Forum ===<br />
<br />
'''Anlass für einen eigenen [[IRMP#top|IRMP]]-Artikel ist folgender Thread in der Codesammlung: [http://www.mikrocontroller.net/topic/162119 Beitrag: IRMP - Infrared Multi Protocol Decoder]'''<br />
<br />
== IR-Protokolle ==<br />
<br />
[[Datei:nec-protocol.png|miniatur|NEC-Protokoll, Reichelt RGB-LED-Fernbedienung, T->A: 9,14ms, A->B: 4,42ms, B->C: 660us]]<br />
<br />
Einige Hersteller verwenden ihr eigenes hausinterne Protokoll, dazu gehören u.a. Sony, Samsung und Matsushita. Philips hat [[IRMP#RC5 + RC5X|RC5]] entwickelt und natürlich auch selbst benutzt. [[IRMP#RC5 + RC5X|RC5]] galt damals in Europa als ''das'' Standard-IR-Protokoll, welches von vielen europäischen Herstellern übernommen wurde. Mittlerweile ist [[IRMP#RC5 + RC5X|RC5]] fast gar nicht mehr anzutreffen - man kann es eigentlich als "ausgestorben" abhaken. Der Nachfolger [[IRMP#RC6_+_RC6A|RC6]] wird zwar noch in einigen aktuellen europäischen Geräten eingesetzt, ist aber auch nur vereinzelt vorzufinden.<br />
<br />
Auch die japanischen Hersteller haben versucht, einen eigenen Standard zu etablieren, nämlich das sog. [[IRMP#KASEIKYO|Kaseikyo]]- (oder auch "Japan-") Protokoll. Dieses ist mit einer Bitlänge von 48 sehr universell und allgemein verwendbar. Richtig durchgesetzt hat es sich aber bis heute nicht - auch wenn man es hier und da im heimischen Haushalt vorfindet.<br />
<br />
Heutzutage wird (auch vornehmlich bei japanischen Geräten) das [[IRMP#NEC_+_extended_NEC|NEC]]-Protokoll verwendet - und zwar von den unterschiedlichsten (Marken- und auch Noname-)Herstellern. Ich schätze den "Marktanteil" auf ca. 80% beim [[IRMP#NEC_+_extended_NEC|NEC]]-Protokoll. Fast alle Fernbedienungen im alltäglichen Einsatz verwenden bei mir den [[IRMP#NEC_+_extended_NEC|NEC]]-IR-Code. Das fängt beim Fernseher an, geht über vom DVD-Player zur Notebook-Fernbedienung und reicht bis zur Noname-MultiMedia-Festplatte - um nur einige Beispiele zu nennen.<br />
<br />
== Kodierungen ==<br />
<br />
[[IRMP#top|IRMP]] unterstützt folgende IR-Codings:<br />
<br />
* [[IRMP#Pulse Distance|Pulse Distance]], typ. Beispiel: [[IRMP#NEC_+_extended_NEC|NEC]]<br />
* [[IRMP#Pulse Width|Pulse Width]], typ. Beispiel: [[IRMP#SIRCS|Sony SIRCS]]<br />
* [[IRMP#Biphase|Biphase (Manchester)]], typ. Beispiel: Philips [[IRMP#RC5_+_RC5X|RC5]], [[IRMP#RC6_+_RC6A|RC6]]<br />
* [[IRMP#Pulse Position|Pulse Position (NRZ)]], typ. Beispiel: [[IRMP#NETBOX|Netbox]]<br />
* [[IRMP#Pulse Distance Width|Pulse Distance Width]], typ. Beispiel: [[IRMP#NUBERT|Nubert]]<br />
<br />
Die Pulse werden dabei moduliert - üblicherweise mit 36kHz oder 38kHz - um Umwelteinflüsse wie Raum- oder Sonnenlicht ausfiltern zu können.<br />
<br />
=== Pulse Distance ===<br />
<br />
[[Datei:Pulse-Distance.png|miniatur|Pulse Distance Coding]]<br />
<br />
Eine Pulse Distance Kodierung erkennt man an der folgenden Regel:<br />
<br />
* es gibt nur '''eine Pulslänge''' und '''zwei verschiedene Pausenlängen.'''<br />
<br />
=== Pulse Width ===<br />
<br />
[[Datei:Pulse-Width.png|miniatur|Pulse Width Coding]]<br />
<br />
Bei der Pulse Width Kodierung gilt die Regel:<br />
<br />
* es gibt '''zwei verschiedene Pulslängen''' und nur '''eine Pausenlänge'''<br />
<br />
=== Pulse Distance Width ===<br />
<br />
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse Distance Width Coding]]<br />
<br />
Dies ist ein Mischmasch aus Pulse Distance und Pulse Width Coding.<br />
<br />
Also:<br />
<br />
* es gibt '''zwei verschiedene Pulslängen''' und '''zwei verschiedene Pausenlängen.'''<br />
<br />
=== Biphase ===<br />
<br />
[[Datei:Biphase-Coding.png|miniatur|Biphase Coding]]<br />
<br />
Bei der Biphase Kodierung entscheidet die Reihenfolge von Puls und Pause über den Wert des Bits.<br />
<br />
Damit erkennt man ein Biphase-Coding an folgendem Kriterium:<br />
<br />
* es kommen genau '''eine''' Pausen- und eine Pulslänge, sowie jeweils die '''doppelten''' Puls-/Pausenlängen vor<br />
<br />
Normalerweise sind die Längen für die Pulse und Pausen gleich, d.h. die Signalform ist symmetrisch. IRMP erkennt aber auch Protokolle, die mit unterschiedlichen Puls-/Pause-Längen arbeiten. Dies ist zum Beispiel bei dem [[IRMP#A1TVBOX|A1TVBOX]]-Protokoll der Fall.<br />
<br />
=== Pulse Position ===<br />
<br />
[[Datei:Pulse-Position.png|miniatur|Pulse Position Coding]]<br />
<br />
Die Pulse Position Kodierung kennt man von den üblichen UARTs. Hier hat jedes Bit eine feste Länge. Je nach Wert (0 oder 1) ist es ein Puls oder eine Pause.<br />
<br />
Typisches Kriterium für ein '''Pulse Position Protokoll''' ist:<br />
<br />
* es kommen '''Vielfache''' einer Grund-Puls-/Pausenlänge vor<br />
<br />
'''Eine tabellarische Aufstellung der verschiedenen IR-Protokolle findet man hier: [[IRMP#Die_IR-Protokolle_im_Detail|Die IR-Protokolle im Detail]].'''<br />
<br />
Die dort angegebenen Timingwerte sind Idealwerte. Bei einigen Fernbedienungen in der Praxis weichen sie um bis zu 40% voneinander ab. Deshalb arbeitet [[IRMP#top|IRMP]] mit Minimum-/Maximumsgrenzen, um bzgl. des Zeitverhaltens tolerabel zu sein.<br />
<br />
== Protokoll-Erkennung ==<br />
<br />
Die meisten der von [[IRMP#top|IRMP]] decodierten Protokolle haben etwas gemeinsames: Sie weisen ein Start-Bit auf, welches vom Timing her ausgezeichnet, d.h. einmalig ist.<br />
<br />
Anhand dieses Start-Bit-Timings werden meistens die verschiedenen Protokolle unterschieden. [[IRMP#top|IRMP]] misst also das Timing des Start-Bits und stellt dann "on-the-fly" seine Timingtabellen auf das erkannte Protokoll um, damit die nach dem Start-Bit gesandten Daten in einem Rutsch eingelesen werden können, ohne das komplette Telegramm (Frame) erst speichern zu müssen. [[IRMP#top|IRMP]] wartet also nicht darauf, dass ein kompletter Frame eingelesen wurde, sondern legt direkt nach der ersten Pulserkennung los.<br />
<br />
Ist das gelesene Start-Bit nicht eindeutig, fährt [[IRMP#top|IRMP]] "mehrspurig", d.h. es werden zum Beispiel zwei mögliche Protokolle gleichzeitig verfolgt. Sobald aus Plausibilitätsgründen eines der beiden Protokolle nicht mehr möglich sein kann, wird komplett auf das andere Protokoll gewechselt.<br />
<br />
Realisiert wird die Erkennung über eine [[Statemachine]], die [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|timergesteuert]] über eine [[Interrupt|Interruptroutine]] in regelmäßigen Abständen (üblicherweise 15.000 mal in der Sekunde) aufgerufen wird. Die [[Statemachine]] kennt (unter anderem) folgende Zustände:<br />
<br />
* Erkenne den ersten Puls des Start-Bits<br />
* Erkenne die Pause des Start-Bits<br />
* Erkenne den Puls des ersten Datenbits<br />
<br />
Danach sind die Puls/Pause-Längen des Startbits bekannt. Nun werden alle vom Anwender aktivierten Protokolle nach diesen Längen durchsucht. Wurde ein Protokoll gefunden, werden die Timing-Tabellen dieses Protokolls geladen und im weiteren geprüft, ob die nachfolgenden Puls-/Pause-Zeiten innerhalb der geladenen Werte übereinstimmen.<br />
<br />
Es geht also weiter in der [[Statemachine]] mit folgenden Zuständen<br />
<br />
* Erkenne die Pausen der Datenbits<br />
* Erkenne die Pulse der Datenbits<br />
* Prüfe Timing. Wenn abweichend, schalte um auf ein anderes noch in Frage kommendes IR-Protokoll, ansonsten schalte [[Statemachine]] komplett zurück<br />
* Erkenne das Stop-Bit, falls das Protokoll eines vorsieht<br />
* Prüfe Daten auf Plausibilität, wie CRC oder andere redundante Datenbits<br />
* Wandle die Daten in Geräte-Adresse und Kommando<br />
* Erkenne Wiederholungen durch längere Tastendrücke, setze entsprechendes Flag<br />
<br />
Tatsächlich ist die [[Statemachine]] noch etwas komplizierter, da manche Protokolle gar kein Start-Bit (z.B. [[IRMP#DENON|Denon]]) bzw. mehrere Start-Bits (z.B. 4 bei [[IRMP#B.26O|B&O]]) haben bzw. mitten im Frame ein weiteres Synchronisierungs-Bit (z.B. [[IRMP#SAMSUNG|Samsung]]) vorsehen. Diese besonderen Bedingungen werden durch protokollspezifische "Spezialbehandlungen" im Code abgefangen.<br />
<br />
Das Umschalten auf ein anderes Protokoll kann mehrfach während des Empfangs des Frames geschehen, z.B. von [[IRMP#NEC42|NEC42]] (42 Bit) auf [[IRMP#NEC16|NEC16]] (8 Bit + Sync-Bit + 8 Bit), wenn vorzeitig ein zusätzliches Synchronisierungsbit erkannt wurde, oder von [[IRMP#NEC + extended NEC|NEC]]/[[IRMP#NEC42|NEC42]] (32/42 Bit) auf [[IRMP#JVC|JVC]] (16 Bit), wenn das Stop-Bit vorzeitig auftrat. Schwierig wird es dann, wenn zwei mögliche Protokolle nach Erkennung des Start-Bits unterschiedliche Kodierungen verwenden, z.B. wenn das eine Protokoll ein [[IRMP#Pulse Distance|Pulse Distance Coding]] und das andere ein [[IRMP#Biphase|Biphase Coding (Manchester)]] benutzt. Hier speichert [[IRMP#top|IRMP]] die jeweils völlig verschieden ermittelten Bits für beide Codierungen, um dann später die einen oder anderen<br />
Werte wieder zu verwerfen.<br />
<br />
Desweiteren senden einige Fernbedienungen bei bestimmten Protokollen aus Gründen der Redundanz (Fehlererkennung) oder wegen längeren Tastendrucks Wiederholungsframes. Diese werden von IRMP unterschieden: Die für die Fehlererkennung zuständigen Frames werden von IRMP geprüft, aber nicht an die Anwendung zurückgegeben, die anderen werden als langer Tastendruck erkannt und entsprechend von IRMP gekennzeichnet.<br />
<br />
== Download ==<br />
<br />
Version 3.2.0, Stand vom 22.06.2020<br />
<br />
Download Stable Version: [http://www.mikrocontroller.net/wikifiles/7/79/Irmp.zip Irmp.zip] <br />
<br />
Aktuelle Entwicklungsversion von [[IRMP#top|IRMP]] & [[IRSND#top|IRSND]]:<br />
<br />
* SVN-Link: [svn://mikrocontroller.net/irmp/ SVN]<br />
* SVN-Browser: [http://www.mikrocontroller.net/svnbrowser/irmp/ IRMP im SVN]<br />
* Download Tarball: [http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar Tarball]<br />
<br />
Download als Arduino Library: [https://github.com/ukw100/IRMP GitHub] oder in der Arduino IDE "''Tools / Manage Libraries...''" benutzen und nach "''IRMP''" suchen. Dies ist eine speziell an Arduino angepasste Version. Diese Variante hinkt manchmal der aktuellen Version etwas hinterher.<br />
<br />
'''Die Software-Änderungen kann man sich hier anschauen: [http://www.mikrocontroller.net/articles/IRMP#Software-Historie_IRMP Software-Historie IRMP]'''<br />
<br />
== Lizenz ==<br />
<br />
IRMP ist Open Source Software und wird unter der [https://www.gnu.org/licenses/old-licenses/gpl-2.0.html GPL v2] (oder jeder höheren Version) freigegeben.<br />
<br />
== Source-Code ==<br />
<br />
Der Source-Code lässt sich einfach für AVR-µCs übersetzen, indem man unter Windows die Projekt-Datei irmp.aps in das AVR Studio 4 lädt.<br />
<br />
Für andere Entwicklungsumgebungen ist leicht ein Projekt bzw. Makefile angelegt. Zum Source gehören:<br />
<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] - Der eigentliche IR-Decoder<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h] - Sämtliche Definitionen zu den IR-Protokollen<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpsystem.h?view=markup irmpsystem.h] - Vom Zielsystem abhängige Definitionen für AVR/PIC/STM32<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.h?view=markup irmp.h] - Include-Datei für die Applikation<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] - Anzupassende Konfigurationsdatei <br />
<br />
Beispiel Anwendungen (main-Funktionen und nötige Timer-Initialisierungen):<br />
<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] - AVR<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr-uart.c?view=markup irmp-main-avr-uart.c] - AVR mit UART-Ausgabe<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-xc8.c?view=markup irmp-main-pic-xc8.c] - PIC18F4520<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-pic-12F1840.c?view=markup irmp-main-pic-12F1840.c] - PIC12F1840<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stm32.c?view=markup irmp-main-stm32.c] - STM32<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stellaris-arm.c?view=markup irmp-main-stellaris-arm.c] - TI Stellaris LM4F120 Launchpad<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-esp8266.c?view=markup irmp-main-esp8266.c] - ESP8266<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-mbed.cpp?view=markup irmp-main-mbed.cpp] - MBED<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/examples/Arduino/Arduino.ino?view=markup examples/Arduino/Arduino.ino] - Teensy 3.x<br />
* [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c] - ChibiOS<br />
<br />
{{Warnung|<br />
;WICHTIG: Im Applikations-Source sollte nur irmp.h per include eingefügt werden, also lediglich:<br />
<syntaxhighlight lang="c"><br />
#include "irmp.h"<br />
</syntaxhighlight><br />
<br />
Alle anderen Include-Dateien werden automatisch über irmp.h "eingefügt". Siehe dazu auch die Beispieldatei irmp-main-avr.c.<br />
<br />
Desweiteren muss die Preprocessor-Konstante '''F_CPU im Projekt bzw. Makefile''' gesetzt werden. Diese sollte mindestens den Wert 8000000UL haben, der Prozessor sollte also zumindest mit 8 MHz laufen.<br />
}}<br />
<br />
Auch auf PIC-Prozessoren ist [[IRMP#top|IRMP]] lauffähig. Für den PIC-CCS-Compiler sind entsprechende Preprocessor-Konstanten bereits gesetzt, so dass man [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] direkt in der CCS-Entwicklungsumgebung verwenden kann. Lediglich eine kleine Interrupt-Routine wie<br />
<br />
<syntaxhighlight lang="c"><br />
void TIMER2_isr(void) <br />
{<br />
irmp_ISR ();<br />
}<br />
</syntaxhighlight><br />
<br />
ist hinzuzufügen, wobei man den Interrupt auf 66µs (also 15kHz) stellt. <br />
<br />
Für AVR-Prozessoren ist ein Beispiel für die Anwendung von [[IRMP#top|IRMP]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] zu finden - im wesentlichen geht es da um die [[AVR-GCC-Tutorial/Die_Timer_und_Zähler_des_AVR|Timer]]-Initialisierung und den Abruf der empfangenen IR-Telegramme. Das empfangene Protokoll, die Geräte-Adresse und der Kommando-Code wird dann in der AVR-Version auf dem HW-UART ausgegeben.<br />
<br />
Für das Stellaris LM4F120 Launchpad von TI (ARM Cortex M4) ist eine entsprechende Timer-Initialisierungsfunktion in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-stellaris-arm.c?view=markup irmp-main-stellaris-arm.c] bereits integriert.<br />
<br />
Ebenso kann [[IRMP#top|IRMP]] auf STM32-Mikroprozessoren eingesetzt werden.<br />
<br />
=== avr-gcc-Optimierungen ===<br />
<br />
Ab Version avr-gcc 4.7.x kann die [https://gcc.gnu.org/onlinedocs/gccint/LTO.html#LTO LTO-Option] genutzt werden, um den Aufruf der externen Funktion irmp_ISR() aus der eigentlichen ISR effizienter zu machen. Das verbessert das Zeitverhalten der ISR etwas.<br />
<br />
Zu den sonst schon üblichen Compiler- und Linker-Optionen kommen noch folgende dazu:<br />
<br />
* Zusätzliche Compiler-Option: -flto<br />
* Zusätzliche Linker-Optionen: -flto -Os<br />
<br />
Vergisst man (unter Windows?) die zusätzliche Linker-Option -Os, wird das Binary allerdings wesentlich größer, da dann nicht mehr optimiert wird. Auch muss -flto an den Linker übergeben werden, weil sonst die LTO-Optimierung nicht mehr greift.<br />
<br />
=== Konfiguration ===<br />
<br />
Die Konfiguration von [[IRMP#top|IRMP]] wird über Parameter in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] vorgenommen, nämlich:<br />
<br />
* [[IRMP#F_INTERRUPTS|Anzahl Interrupts pro Sekunde]]<br />
* [[IRMP#IRMP_SUPPORT_xxx_PROTOCOL|Unterstützte IR-Protokolle]]<br />
* [[IRMP#IRMP_PORT_LETTER + IRMP_BIT_NUMBER|Hardware-Pin zum IR-Empfänger]]<br />
* [[IRMP#IRMP_LOGGING|IR-Logging]]<br />
<br />
=== Einstellungen in irmpconfig.h ===<br />
<br />
[[IRMP#top|IRMP]] decodiert sämtliche oben aufgelisteten Protokolle in einer ISR. Dafür sind einige Angaben nötig. Diese werden in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] eingestellt.<br />
<br />
==== F_INTERRUPTS ====<br />
<br />
Anzahl der Interrupts pro Sekunde. Der Wert kann zwischen 10000 und 20000 eingestellt werden. Je höher der Wert, desto besser die Auflösung und damit die Erkennung. Allerdings erkauft man sich diesen Vorteil mit erhöhter CPU-Last. Der Wert 15000 ist meist ein guter Kompromiss.<br />
<br />
Standardwert:<br />
<syntaxhighlight lang="c"><br />
#define F_INTERRUPTS 15000 // interrupts per second<br />
</syntaxhighlight><br />
<br />
Auf AVR-Prozessoren wird in der Beispielroutine in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c] der Timer1 mit 16-Bit-Genauigkeit verwendet. Sollte der Timer1 aus irgendwelchen Gründen nicht verfügbar sein, kann man alternativ auch den Timer2 mit 8-Bit-Genauigkeit verwenden.<br />
<br />
In diesem Fall wird dieser dann konfiguriert über:<br />
<br />
Für ATmega8/ATmega16/ATmega32:<br />
<syntaxhighlight lang="c"><br />
OCR2 = (uint8_t) ((F_CPU / F_INTERRUPTS) / 8) - 1 + 0.5); // Compare Register OCR2<br />
TCCR2 = (1 << WGM21) | (1 << CS21); // CTC Mode, prescaler = 8<br />
TIMSK = 1 << OCIE2; // enable timer2 interrupt<br />
<br />
ISR(TIMER2_COMP_vect)<br />
{<br />
(void) irmp_ISR(); <br />
}<br />
</syntaxhighlight><br />
<br />
Für ATmega88/ATmega168/ATmega328:<br />
<syntaxhighlight lang="c"><br />
OCR2A = (uint8_t) ((F_CPU / F_INTERRUPTS) / 8) - 1 + 0.5); // Compare Register OCR2<br />
TCCR2A = (1 << WGM21); // CTC Mode, prescaler = 8 <br />
TCCR2B = (1 << CS21); // CTC Mode, prescaler = 8<br />
TIMSK2 = 1 << OCIE2A; // enable timer2 interrupt<br />
<br />
ISR(TIMER2_COMPA_vect)<br />
{<br />
(void) irmp_ISR(); <br />
}<br />
</syntaxhighlight><br />
<br />
Bei anderen AVR-µCs empfiehlt sich ein Blick ins Datenblatt.<br />
<br />
Man sollte in diesem Fall nicht vergessen, auch die Interrupt-Routine an den Timer2 anzupassen:<br />
<br />
==== IRMP_SUPPORT_xxx_PROTOCOL ====<br />
<br />
Hier lässt sich einstellen, welche Protokolle von [[IRMP#top|IRMP]] unterstützt werden sollen. Die Standardprotokolle sind bereits aktiv. Möchte man weitere Protokolle einschalten bzw. einige aus Speicherplatzgründen deaktivieren, sind die entsprechenden Werte in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] anzupassen.<br />
<br />
<syntaxhighlight lang="c"><br />
// typical protocols, disable here! Enable Remarks F_INTERRUPTS Program Space<br />
#define IRMP_SUPPORT_SIRCS_PROTOCOL 1 // Sony SIRCS >= 10000 ~150 bytes<br />
#define IRMP_SUPPORT_NEC_PROTOCOL 1 // NEC + APPLE >= 10000 ~300 bytes<br />
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL 1 // Samsung + Samsung32 >= 10000 ~300 bytes<br />
#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL 1 // Matsushita >= 10000 ~50 bytes<br />
#define IRMP_SUPPORT_KASEIKYO_PROTOCOL 1 // Kaseikyo >= 10000 ~250 bytes<br />
<br />
// more protocols, enable here! Enable Remarks F_INTERRUPTS Program Space<br />
#define IRMP_SUPPORT_DENON_PROTOCOL 0 // DENON, Sharp >= 10000 ~250 bytes<br />
#define IRMP_SUPPORT_RC5_PROTOCOL 0 // RC5 >= 10000 ~250 bytes<br />
#define IRMP_SUPPORT_RC6_PROTOCOL 0 // RC6 & RC6A >= 10000 ~250 bytes<br />
#define IRMP_SUPPORT_JVC_PROTOCOL 0 // JVC >= 10000 ~150 bytes<br />
#define IRMP_SUPPORT_NEC16_PROTOCOL 0 // NEC16 >= 10000 ~100 bytes<br />
#define IRMP_SUPPORT_NEC42_PROTOCOL 0 // NEC42 >= 10000 ~300 bytes<br />
#define IRMP_SUPPORT_IR60_PROTOCOL 0 // IR60 (SDA2008) >= 10000 ~300 bytes<br />
#define IRMP_SUPPORT_GRUNDIG_PROTOCOL 0 // Grundig >= 10000 ~300 bytes<br />
#define IRMP_SUPPORT_SIEMENS_PROTOCOL 0 // Siemens Gigaset >= 15000 ~550 bytes<br />
#define IRMP_SUPPORT_NOKIA_PROTOCOL 0 // Nokia >= 10000 ~300 bytes<br />
<br />
// exotic protocols, enable here! Enable Remarks F_INTERRUPTS Program Space<br />
#define IRMP_SUPPORT_BOSE_PROTOCOL 0 // BOSE >= 10000 ~150 bytes<br />
#define IRMP_SUPPORT_KATHREIN_PROTOCOL 0 // Kathrein >= 10000 ~200 bytes<br />
#define IRMP_SUPPORT_NUBERT_PROTOCOL 0 // NUBERT >= 10000 ~50 bytes<br />
#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL 0 // Bang & Olufsen >= 10000 ~200 bytes<br />
#define IRMP_SUPPORT_RECS80_PROTOCOL 0 // RECS80 (SAA3004) >= 15000 ~50 bytes<br />
#define IRMP_SUPPORT_RECS80EXT_PROTOCOL 0 // RECS80EXT (SAA3008) >= 15000 ~50 bytes<br />
#define IRMP_SUPPORT_THOMSON_PROTOCOL 0 // Thomson >= 10000 ~250 bytes<br />
#define IRMP_SUPPORT_NIKON_PROTOCOL 0 // NIKON camera >= 10000 ~250 bytes<br />
#define IRMP_SUPPORT_NETBOX_PROTOCOL 0 // Netbox keyboard >= 10000 ~400 bytes (PROTOTYPE!)<br />
#define IRMP_SUPPORT_ORTEK_PROTOCOL 0 // ORTEK (Hama) >= 10000 ~150 bytes<br />
#define IRMP_SUPPORT_TELEFUNKEN_PROTOCOL 0 // Telefunken 1560 >= 10000 ~150 bytes<br />
#define IRMP_SUPPORT_FDC_PROTOCOL 0 // FDC3402 keyboard >= 10000 (better 15000) ~150 bytes (~400 in combination with RC5)<br />
#define IRMP_SUPPORT_RCCAR_PROTOCOL 0 // RC Car >= 10000 (better 15000) ~150 bytes (~500 in combination with RC5)<br />
#define IRMP_SUPPORT_ROOMBA_PROTOCOL 0 // iRobot Roomba >= 10000 ~150 bytes<br />
#define IRMP_SUPPORT_RUWIDO_PROTOCOL 0 // RUWIDO, T-Home >= 15000 ~550 bytes<br />
#define IRMP_SUPPORT_A1TVBOX_PROTOCOL 0 // A1 TV BOX >= 15000 (better 20000) ~300 bytes<br />
#define IRMP_SUPPORT_LEGO_PROTOCOL 0 // LEGO Power RC >= 20000 ~150 bytes<br />
#define IRMP_SUPPORT_RCMM_PROTOCOL 0 // RCMM 12,24, or 32 >= 20000 ~150 bytes<br />
</syntaxhighlight><br />
<br />
Jedes von [[IRMP#top|IRMP]] unterstützte IR-Protokoll "verbrät" ungefähr den oben angegebenen Speicher an Code. Hier kann man Optimierungen vornehmen: Zum Beispiel ist die Modulationsfrequenz von 455kHz beim [[IRMP#B&O|B&O]]-Protokoll weitab von den Frequenzen, die von den anderen Protokollen verwendet werden. Hier braucht man evtl. andere IR-Empfänger, anderenfalls kann man diese Protokolle einfach deaktiveren. Zum Beispiel kann man mit einem TSOP1738 kein [[IRMP#B&O|B&O]]-Protokoll (455kHz) mehr empfangen. <br />
<br />
Ausserdem werden die Protokolle [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]]/[[IRMP#FDC|FDC]]/[[IRMP#RCCAR|RCCAR]] erst ab einer Scan-Frequenz von ca. 15kHz zuverlässig erkannt. Bei [[IRMP#LEGO|LEGO]] sind es sogar 20kHz. Wenn man also diese Protokolle nutzen will, muss man [[IRMP#F_INTERRUPTS|F_INTERRUPTS]] entsprechend anpassen, sonst erscheint beim Übersetzen eine entsprechende Warnung und die entsprechenden Protokolle werden dann automatisch abgeschaltet.<br />
<br />
==== IRMP_PORT_LETTER + IRMP_BIT_NUMBER ====<br />
<br />
Über diese Konstanten wird der Pin am µC beschrieben, an welchem der IR-Empfänger angeschlossen ist.<br />
<br />
Standardwert ist PORT B6:<br />
<syntaxhighlight lang="c"><br />
/*----------------------------------------------------------------------------------------------------------------<br />
* Change hardware pin here for ATMEL AVR<br />
*----------------------------------------------------------------------------------------------------------------<br />
*/<br />
#if defined (ATMEL_AVR) // use PB6 as IR input on AVR<br />
# define IRMP_PORT_LETTER B<br />
# define IRMP_BIT_NUMBER 6<br />
</syntaxhighlight><br />
<br />
Diese beiden Werte sind an den tatsächlichen Hardware-Pin des µCs anzupassen. <br />
<br />
Dies gilt ebenso für die STM32-µCs:<br />
<br />
<syntaxhighlight lang="c"><br />
/*----------------------------------------------------------------------------------------------------------------<br />
* Change hardware pin here for ARM STM32<br />
*----------------------------------------------------------------------------------------------------------------<br />
*/<br />
#elif defined (ARM_STM32) // use C13 as IR input on STM32<br />
# define IRMP_PORT_LETTER C<br />
# define IRMP_BIT_NUMBER 13<br />
</syntaxhighlight><br />
<br />
Wird die STM32-HAL Library verwendet, definiert man die beiden Konstanten IRSND_Transmit_GPIO_Port und IRSND_Transmit_Pin in STM32Cube (Main.h). In diesem Fall ist hier nichts weiter anzupassen:<br />
<syntaxhighlight lang="c"><br />
/*----------------------------------------------------------------------------------------------------------------<br />
* ARM STM32 with HAL section - don't change here, define IRSND_Transmit_GPIO_Port & IRSND_Transmit_Pin in STM32Cube (Main.h)<br />
*----------------------------------------------------------------------------------------------------------------<br />
*/<br />
#elif defined (ARM_STM32_HAL) // IRSND_Transmit_GPIO_Port & IRSND_Transmit_Pin must be defined in STM32Cube<br />
# define IRSND_PORT_LETTER IRSND_Transmit_GPIO_Port//Port of Transmit PWM Pin e.g.<br />
# define IRSND_BIT_NUMBER IRSND_Transmit_Pin //Pim of Transmit PWM Pin e.g.<br />
# define IRSND_TIMER_HANDLER htim2 //Handler of Timer e.g. htim (see tim.h)<br />
# define IRSND_TIMER_CHANNEL_NUMBER TIM_CHANNEL_2 //Channel of the used Timer PWM Pin e.g. TIM_CHANNEL_2<br />
# define IRSND_TIMER_SPEED_APBX 64000000 //Speed of the corresponding APBx. (see STM32CubeMX: Clock Configuration)<br />
</syntaxhighlight><br />
<br />
Hier der entsprechende Abschnitt für STM8-µCs:<br />
<br />
<syntaxhighlight lang="c"><br />
/*----------------------------------------------------------------------------------------------------------------<br />
* Change hardware pin here for STM8<br />
*----------------------------------------------------------------------------------------------------------------<br />
*/<br />
#elif defined (SDCC_STM8) // use PA1 as IR input on STM8<br />
# define IRMP_PORT_LETTER A<br />
# define IRMP_BIT_NUMBER 1<br />
</syntaxhighlight><br />
<br />
Bei den PIC-Prozessoren gibt es lediglich die anzupassende Konstante '''IRMP_PIN''' - je nach Compiler:<br />
<br />
<syntaxhighlight lang="c"><br />
/*----------------------------------------------------------------------------------------------------------------<br />
* Change hardware pin here for PIC C18 compiler<br />
*----------------------------------------------------------------------------------------------------------------<br />
*/<br />
#elif defined (PIC_C18) // use RB4 as IR input on PIC<br />
# define IRMP_PIN PORTBbits.RB4<br />
<br />
/*----------------------------------------------------------------------------------------------------------------<br />
* Change hardware pin here for PIC CCS compiler<br />
*----------------------------------------------------------------------------------------------------------------<br />
*/<br />
#elif defined (PIC_CCS) // use PB4 as IR input on PIC<br />
# define IRMP_PIN PIN_B4<br />
</syntaxhighlight><br />
<br />
Bei ChibiOS HAL definiert man in der Board-Config (board.chcfg) von ChibiOS einen Pin mit dem Namen '''IR_IN''' und generiert die Boarddatei neu. Wenn man einen anderen Namen für den Pin verwenden möchte, kann man auch die Konstante '''IRMP_PIN''' <br />
in der irmpconfig.h anpassen. Vor den Namen des Pins aus der Board-Config dann "LINE_" voranstellen, da in IRMP die <br />
"Line"-Variante der PAL-Schnittstelle verwendet wird:<br />
<br />
<syntaxhighlight lang="c"><br />
/*----------------------------------------------------------------------------------------------------------------<br />
* Change hardware pin here for ChibiOS HAL<br />
*----------------------------------------------------------------------------------------------------------------<br />
*/<br />
#elif defined(_CHIBIOS_HAL_)<br />
# define IRMP_PIN LINE_IR_IN // use pin names as defined in the board config file, prefixed with "LINE_"<br />
</syntaxhighlight><br />
<br />
==== IRMP_HIGH_ACTIVE ====<br />
<br />
Standardwert:<br />
<syntaxhighlight lang="c"><br />
# define IRMP_HIGH_ACTIVE 0 // set to 1 if you use a RF receiver!<br />
</syntaxhighlight><br />
<br />
Setzt man einen Funkempfänger statt einem IR-Sensor ein, um Funkprotokolle zu decodieren, so arbeiten diese in der Regel mit aktivem High-Pegel. Deshalb sollte man diesen Wert dann auf 1 setzen.<br />
<br />
==== IRMP_USE_CALLBACK ====<br />
<br />
Standardwert:<br />
<syntaxhighlight lang="c"><br />
#define IRMP_USE_CALLBACK 0 // flag: 0 = don't use callbacks, 1 = use callbacks, default is 0<br />
</syntaxhighlight><br />
<br />
Wenn man Callbacks einschaltet, wird bei jeder Pegeländerung des Eingangs eine Callback-Funktion aufgerufen. Dies kann zum Beispiel dafür verwendet werden, das eingehende IR-Signal sichtbar zu machen, also als Signal an einem weiteren Pin auszugeben.<br />
<br />
Hier ein Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#define LED_PORT PORTD // LED at PD6<br />
#define LED_DDR DDRD<br />
#define LED_PIN 6<br />
<br />
/*------------------------------------------------------------------------------------------------------------<br />
* Called (back) from IRMP module<br />
* This example switches a LED (which is connected to Vcc)<br />
*-------------------------------------------------------------------------------------------------------------<br />
*/<br />
void<br />
led_callback (uint_fast8_t on)<br />
{<br />
if (on)<br />
{<br />
LED_PORT &= ~(1 << LED_PIN);<br />
}<br />
else<br />
{<br />
LED_PORT |= (1 << LED_PIN);<br />
}<br />
}<br />
<br />
int<br />
main ()<br />
{<br />
...<br />
irmp_init ();<br />
<br />
LED_DDR |= (1 << LED_PIN); // LED pin to output<br />
LED_PORT |= (1 << LED_PIN); // switch LED off (active low)<br />
irmp_set_callback_ptr (led_callback);<br />
<br />
sei ();<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
==== IRMP_USE_IDLE_CALL ====<br />
<br />
Normalerweise wird die Funktion irmp_ISR() ständig mit der Frequenz F_INTERRUPTS (10-20kHz) aufgerufen. Der Controller<br />
kann daher kaum in einen energiesparenden Sleep-Modus wechseln, bzw. muss ständig aus diesem wieder aufwachen. Kommt<br />
es auf den Stromverbrauch an, wie z.B. bei Batteriebetrieb, ist diese Vorgehensweise nicht optimal.<br />
<br />
Wenn man '''IRMP_USE_IDLE_CALL''' aktiviert, erkennt IRMP wenn kein IR-Empfang im Gange ist und ruft dann die Funktion <br />
'''irmp_idle()''' auf. Diese ist controllerspezifisch und muss vom Nutzer bereitgestellt und hinzugelinkt werden. Dort kann dann in den Empfangspausen der Controller schlafen gelegt und so der Energieverbrauch reduziert werden.<br />
<br />
Empfohlen wird in der irmp_idle() den Timer-Interrupt zu deaktivieren und statt dessen einen Pinchange-Interrupt zu aktivieren. Danach kann der Controller schlafen geschickt werden. Wird eine fallende Flanke auf dem IR-Eingang erkannt, wird der Pinchange-Interrupt deaktiviert, der Timer wieder aktiviert und sofort irmp_ISR() aufgerufen. Ein Beispiel für die Verwendung von irmp_idle() findet sich in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-chibios.c?view=markup irmp-main-chibios.c].<br />
<br />
IRMP rein anhand von Pinchange-Interrupts und ohne Timer-Interrupts zu betreiben ist nicht vorgesehen.<br />
<br />
==== IRMP_USE_EVENT ====<br />
<br />
Wenn man IRMP zusammen mit ChibiOS/RT oder ChibiOS/NIL verwendet, kann man deren Event-System verwenden um einen<br />
Thread aufzuwecken sobald neue IR-Daten empfangen und decodiert wurden.<br />
<br />
Dazu setzt man in der irmpconfig.h die Konstante '''IRMP_USE_EVENT''' auf 1. '''IRMP_EVENT_BIT''' definiert den<br />
Bitwert in der Event-Bitmaske, der den IRMP-Event symbolisieren soll. Mit '''IRMP_EVENT_THREAD_PTR''' wird der<br />
Variablenname des Threadpointers festgelegt, an den der Event gesendet wird.<br />
<br />
In der irmpconfig.h sieht das in der Praxis so aus:<br />
<syntaxhighlight lang="c"><br />
/*------------------------------------------------------------------------------------------------------------<br />
* Use ChibiOS Events to signal that valid IR data was received<br />
*------------------------------------------------------------------------------------------------------------<br />
*/<br />
#if defined(_CHIBIOS_RT_) || defined(_CHIBIOS_NIL_)<br />
<br />
# ifndef IRMP_USE_EVENT<br />
# define IRMP_USE_EVENT 1 // 1: use event. 0: do not. default is 0<br />
# endif<br />
<br />
# if IRMP_USE_EVENT == 1 && !defined(IRMP_EVENT_BIT)<br />
# define IRMP_EVENT_BIT 1 // event flag or bit to send<br />
# endif<br />
# if IRMP_USE_EVENT == 1 && !defined(IRMP_EVENT_THREAD_PTR)<br />
# define IRMP_EVENT_THREAD_PTR ir_receive_thread_p // pointer to the thread to send the event to<br />
extern thread_t *IRMP_EVENT_THREAD_PTR; // the pointer must be defined and initialized elsewhere<br />
# endif<br />
<br />
#endif // _CHIBIOS_RT_ || _CHIBIOS_NIL_<br />
</syntaxhighlight><br />
<br />
In seinem ChibiOS-Projekt verwendet man das dann so:<br />
<syntaxhighlight lang="c"><br />
thread_t *ir_receive_thread_p = NULL;<br />
<br />
static THD_FUNCTION(IRThread, arg)<br />
{<br />
ir_receive_thread_p = chThdGetSelfX();<br />
[...]<br />
while (true)<br />
{<br />
// wait for event sent from irmp_ISR<br />
chEvtWaitAnyTimeout(ALL_EVENTS,TIME_INFINITE);<br />
<br />
if (irmp_get_data (&irmp_data))<br />
// Daten aus irmp_data verwenden<br />
</syntaxhighlight><br />
<br />
==== IRMP_LOGGING ====<br />
<br />
Mit IRMP_LOGGING kann das Protokollieren von eingehenden IR-Frames eingeschaltet werden.<br />
<br />
Standardwert:<br />
<syntaxhighlight lang="c"><br />
#define IRMP_LOGGING 0 // 1: log IR signal (scan), 0: do not. default is 0<br />
</syntaxhighlight><br />
<br />
Weitere Erläuterungen siehe [[IRMP#Scannen_von_unbekannten_IR-Protokollen|Scannen von unbekannten IR-Protokollen]].<br />
<br />
=== Anwendung von IRMP ===<br />
<br />
Die von [[IRMP#top|IRMP]] unterstützten Protokolle weisen Bitlängen - teilweise variabel, teilweise fest - von 2 bis 48 Bit auf. Diese werden über Preprocessor-Defines beschrieben.<br />
<br />
[[IRMP#top|IRMP]] trennt diese IR-Telegramme prinzipiell in 3 Bereiche:<br />
<br />
1. ID für verwendetes Protokoll<br />
2. Adresse bzw. Herstellercode<br />
3. Kommando<br />
<br />
Mittels der Funktion<br />
<br />
irmp_get_data (IRMP_DATA * irmp_data_p)<br />
<br />
kann man ein decodiertes Telegramm abrufen. Der Return-Wert ist 1, wenn ein Telegramm eingelesen wurde, sonst 0. Im ersten Fall werden die Struct-Members<br />
<br />
<syntaxhighlight lang="c"><br />
irmp_data_p->protocol (8 Bit)<br />
irmp_data_p->address (16 Bit)<br />
irmp_data_p->command (16 Bit)<br />
irmp_data_p->flags (8 Bit)<br />
</syntaxhighlight><br />
<br />
gefüllt.<br />
<br />
Das heisst: am Ende bekommt man dann über irmp_get_data() einfach drei<br />
Werte (Protokoll, Adresse und Kommando-Code), die man über ein if oder switch checken kann, z.&nbsp;B. hier eine Routine, welche die Tasten 1-9 auf einer Fernbedienung auswertet:<br />
<br />
<syntaxhighlight lang="c"><br />
IRMP_DATA irmp_data;<br />
<br />
if (irmp_get_data (&irmp_data))<br />
{<br />
if (irmp_data.protocol == IRMP_NEC_PROTOCOL && // NEC-Protokoll<br />
irmp_data.address == 0x1234) // Adresse 0x1234<br />
{<br />
switch (irmp_data.command)<br />
{<br />
case 0x0001: key1_pressed(); break; // Taste 1<br />
case 0x0002: key2_pressed(); break; // Taste 2<br />
...<br />
case 0x0009: key9_pressed(); break; // Taste 9<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Hier die möglichen Werte für irmp_data.protocol, siehe auch [http://www.mikrocontroller.net/svnbrowser/irmp/irmpprotocols.h?view=markup irmpprotocols.h]:<br />
<br />
<syntaxhighlight lang="c"><br />
#define IRMP_SIRCS_PROTOCOL 1 // Sony<br />
#define IRMP_NEC_PROTOCOL 2 // NEC, Pioneer, JVC, Toshiba, NoName etc.<br />
#define IRMP_SAMSUNG_PROTOCOL 3 // Samsung<br />
#define IRMP_MATSUSHITA_PROTOCOL 4 // Matsushita<br />
#define IRMP_KASEIKYO_PROTOCOL 5 // Kaseikyo (Panasonic etc)<br />
#define IRMP_RECS80_PROTOCOL 6 // Philips, Thomson, Nordmende, Telefunken, Saba<br />
#define IRMP_RC5_PROTOCOL 7 // Philips etc<br />
#define IRMP_DENON_PROTOCOL 8 // Denon, Sharp<br />
#define IRMP_RC6_PROTOCOL 9 // Philips etc<br />
#define IRMP_SAMSUNG32_PROTOCOL 10 // Samsung32: no sync pulse at bit 16, length 32 instead of 37<br />
#define IRMP_APPLE_PROTOCOL 11 // Apple, very similar to NEC<br />
#define IRMP_RECS80EXT_PROTOCOL 12 // Philips, Technisat, Thomson, Nordmende, Telefunken, Saba<br />
#define IRMP_NUBERT_PROTOCOL 13 // Nubert<br />
#define IRMP_BANG_OLUFSEN_PROTOCOL 14 // Bang & Olufsen<br />
#define IRMP_GRUNDIG_PROTOCOL 15 // Grundig<br />
#define IRMP_NOKIA_PROTOCOL 16 // Nokia<br />
#define IRMP_SIEMENS_PROTOCOL 17 // Siemens, e.g. Gigaset<br />
#define IRMP_FDC_PROTOCOL 18 // FDC keyboard<br />
#define IRMP_RCCAR_PROTOCOL 19 // RC Car<br />
#define IRMP_JVC_PROTOCOL 20 // JVC (NEC with 16 bits)<br />
#define IRMP_RC6A_PROTOCOL 21 // RC6A, e.g. Kathrein, XBOX<br />
#define IRMP_NIKON_PROTOCOL 22 // Nikon<br />
#define IRMP_RUWIDO_PROTOCOL 23 // Ruwido, e.g. T-Home Mediareceiver<br />
#define IRMP_IR60_PROTOCOL 24 // IR60 (SDA2008)<br />
#define IRMP_KATHREIN_PROTOCOL 25 // Kathrein<br />
#define IRMP_NETBOX_PROTOCOL 26 // Netbox keyboard (bitserial)<br />
#define IRMP_NEC16_PROTOCOL 27 // NEC with 16 bits (incl. sync)<br />
#define IRMP_NEC42_PROTOCOL 28 // NEC with 42 bits<br />
#define IRMP_LEGO_PROTOCOL 29 // LEGO Power Functions RC<br />
#define IRMP_THOMSON_PROTOCOL 30 // Thomson<br />
#define IRMP_BOSE_PROTOCOL 31 // BOSE<br />
#define IRMP_A1TVBOX_PROTOCOL 32 // A1 TV Box<br />
#define IRMP_ORTEK_PROTOCOL 33 // ORTEK - Hama<br />
#define IRMP_TELEFUNKEN_PROTOCOL 34 // Telefunken (1560)<br />
#define IRMP_ROOMBA_PROTOCOL 35 // iRobot Roomba vacuum cleaner<br />
#define IRMP_RCMM32_PROTOCOL 36 // Fujitsu-Siemens (Activy remote control)<br />
#define IRMP_RCMM24_PROTOCOL 37 // Fujitsu-Siemens (Activy keyboard)<br />
#define IRMP_RCMM12_PROTOCOL 38 // Fujitsu-Siemens (Activy keyboard)<br />
#define IRMP_SPEAKER_PROTOCOL 39 // Another loudspeaker protocol, similar to Nubert<br />
#define IRMP_LGAIR_PROTOCOL 40 // LG air conditioner<br />
#define IRMP_SAMSUNG48_PROTOCOL 41 // air conditioner with SAMSUNG protocol (48 bits)<br />
#define IRMP_MERLIN_PROTOCOL 42 // Merlin (Pollin 620 185)<br />
#define IRMP_PENTAX_PROTOCOL 43 // Pentax camera<br />
#define IRMP_FAN_PROTOCOL 44 // FAN (ventilator), very similar to NUBERT, but last bit is data bit instead of stop bit<br />
#define IRMP_S100_PROTOCOL 45 // very similar to RC5, but 14 instead of 13 data bits<br />
#define IRMP_ACP24_PROTOCOL 46 // Stiebel Eltron ACP24 air conditioner<br />
#define IRMP_TECHNICS_PROTOCOL 47 // Technics, similar to Matsushita, but 22 instead of 24 bits<br />
#define IRMP_PANASONIC_PROTOCOL 48 // Panasonic (Beamer), start bits similar to KASEIKYO<br />
#define IRMP_MITSU_HEAVY_PROTOCOL 49 // Mitsubishi-Heavy Aircondition, similar timing as Panasonic beamer<br />
#define IRMP_VINCENT_PROTOCOL 50 // Vincent<br />
#define IRMP_SAMSUNGAH_PROTOCOL 51 // SAMSUNG AH<br />
#define IRMP_IRMP16_PROTOCOL 52 // IRMP specific protocol for data transfer, e.g. between two microcontrollers via IR<br />
#define IRMP_GREE_PROTOCOL 53 // Gree climate<br />
#define IRMP_RCII_PROTOCOL 54 // RC II Infra Red Remote Control Protocol for FM8<br />
#define IRMP_METZ_PROTOCOL 55 // METZ<br />
#define IRMP_ONKYO_PROTOCOL 56 // Onkyo<br />
<br />
#define RF_GEN24_PROTOCOL 57 // RF Generic, 24 Bits (Pollin 550666)<br />
#define RF_X10_PROTOCOL 58 // RF PC X10 Remote Control (Medion, Pollin 721815)<br />
<br />
</syntaxhighlight><br />
<br />
Die Werte für die Adresse und das Kommando muss man natürlich einmal für eine unbekannte Fernbedienung auslesen und dann über ein UART oder LC-Display ausgeben, um sie dann im Programm hart zu kodieren. Oder man hat eine kleine Anlernroutine, wo man einmal die gewünschten Tasten drücken muss, um sie anschließend im EEPROM abzuspeichern. Ein Beispiel dazu findet man im Artikel [http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP Lernfähige IR-Fernbedienung mit IRMP].<br />
<br />
Eine weitere [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup Beispiel-Main-Funktion] ist im Zip-File enthalten, da sieht man dann auch die Initialisierung des Timers.<br />
<br />
=== "Entprellen" von Tasten ===<br />
<br />
Um zu unterscheiden, ob eine Taste lange gedrückt wurde oder lediglich einzeln, dient das Bit IRMP_FLAG_REPETITION. Dieses wird im Struct-Member '''flags''' gesetzt, wenn eine Taste auf der Fernbedienung längere Zeit gedrückt wurde und dadurch immer wieder dasselbe Kommando innerhalb kurzer Zeitabstände ausgesandt wird.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
if (irmp_data.flags & IRMP_FLAG_REPETITION)<br />
{<br />
// Benutzer hält die Taste länger runter<br />
// entweder:<br />
// ich ignoriere die (Wiederholungs-)Taste<br />
// oder:<br />
// ich benutze diese Info, um einen Repeat-Effekt zu nutzen<br />
}<br />
else<br />
{<br />
// Es handelt sich um eine neue Taste<br />
}<br />
</syntaxhighlight><br />
<br />
Dies kann zum Beispiel dafür genutzt werden, um die Tasten 0-9 zu "entprellen", indem man Kommandos mit gesetztem Bit IRMP_FLAG_REPETITION ignoriert. Bei dem Drücken auf die Tasten VOLUME+ oder VOLUME- kann die wiederholte Auswertung ein und desselben Kommandos aber durchaus gewünscht sein - zum Beispiel, um [[LED-Fading|LEDs zu faden]].<br />
<br />
Wenn man nur Einzeltasten auswerten will, kann man obigen IF-Block reduzieren auf:<br />
<br />
<syntaxhighlight lang="c"><br />
if (! (irmp_data.flags & IRMP_FLAG_REPETITION))<br />
{<br />
// Es handelt sich um eine neue Taste<br />
// ACTION!<br />
}<br />
</syntaxhighlight><br />
<br />
== Arbeitsweise ==<br />
<br />
Das "Working Horse" von [[IRMP#top|IRMP]] ist die Interrupt Service Routine irmp_ISR() welche 15.000 mal pro Sekunde aufgerufen werden sollte. Weicht dieser Wert ab, muss die Preprocessor-Konstante [[IRMP#F_INTERRUPTS|F_INTERRUPTS]] in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] angepasst werden. Der Wert kann zwischen 10kHz und 20kHz eingestellt werden.<br />
<br />
irmp_ISR() detektiert zunächst die Länge und die Form des/der Startbits und ermittelt daraus das verwendete Protokoll. Sobald das Protokoll erkannt wurde, werden die weiter einzulesenden Bits parametrisiert, um dann möglichst effektiv in den weiteren Aufrufen das komplette IR-Telegramm einzulesen.<br />
<br />
Um direkt Kritikern den Wind aus den Segeln zu nehmen:<br />
<br />
Ich weiss, die ISR ist ziemlich groß. Aber da sie sich wie eine State Machine verhält, ist der tatsächlich ausgeführte Code pro Durchlauf relativ gering. Solange es "dunkel" ist (und das ist es ja die meiste Zeit ;-)) ist die aufgewendete Zeit sogar verschwindend gering. Im WordClock-Projekt werden mit ein- und demselben Timer 8 ISRs aufgerufen, davon ist die irmp_ISR() nur eine unter vielen. Bei mindestens 8 MHz CPU-Takt traten bisher keine Timing-Probleme auf. Daher sehe ich bei der Länge von irmp_ISR überhaupt kein Problem.<br />
<br />
Ein Quarz ist nicht unbedingt notwendig, es funktioniert auch mit dem internen Oszillator des AVRs, wenn man die Prescaler-Fuse entsprechend gesetzt hat, dass die CPU auch mit 8MHz rennt ... Die Fuse-Werte für einen ATMEGA88 findet man in [http://www.mikrocontroller.net/svnbrowser/irmp/irmp-main-avr.c?view=markup irmp-main-avr.c].<br />
<br />
== Scannen von unbekannten IR-Protokollen ==<br />
<br />
Stellt man in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] in der Zeile<br />
<br />
<syntaxhighlight lang="c"><br />
#define IRMP_LOGGING 0 // 1: log IR signal (scan), 0: do not (default)<br />
</syntaxhighlight><br />
<br />
den Wert für [[IRMP#IRMP_LOGGING|IRMP_LOGGING]] auf 1, wird in [[IRMP#top|IRMP]] eine Protokollierung eingeschaltet: Es werden dann die Hell- und Dunkelphase auf dem UART des Microntrollers mit 9600Bd ausgegeben: 1=Dunkel, 0=Hell. Eventuell müssen dann die Konstanten in den Funktionen uart_init() und uart_putc() angepasst werden; das kommt auf den verwendeten AVR-µC an.<br />
<br />
'''Hinweis: Für PIC-Prozessoren gibt es ein eigenes Logging-Modul namens [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]. Dieses ermöglicht das Logging über USB. Für AVR-Prozessoren ist [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c] irrelevant'''<br />
<br />
Nimmt man diese Protokoll-Scans mit einem Terminal-Emulationsprogramm auf und speichert sie dann als normale Datei ab, kann man diese Scan-Dateien zur Analyse verwenden, um damit [[IRMP#top|IRMP]] an das unbekannte Protokoll anzupassen - siehe nächstes Kapitel.<br />
<br />
Wer eine Fernbedienung hat, die nicht von [[IRMP#top|IRMP]] unterstützt wird, kann mir ([http://www.mikrocontroller.net/user/show/ukw ukw]) gern die Scan-Dateien zuschicken. Ich schaue dann, ob das Protokoll in das IRMP-Konzept passt und passe gegebenenfalls den Source an.<br />
<br />
== IRMP unter Linux und Windows ==<br />
<br />
=== Übersetzen ===<br />
<br />
[http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] lässt sich auch unter Linux direkt kompilieren, um damit Infrarot-Scans, welche in Dateien gespeichert sind, direkt zu testen. Im Unterordner IR-Data finden sich solche Dateien, die man dem [[IRMP#top|IRMP]] direkt zum "Fraß" vorwerfen kann. <br />
<br />
Das Übersetzen von [[IRMP#top|IRMP]] geht folgendermaßen:<br />
<br />
make -f makefile.lnx<br />
<br />
Dabei werden 3 IRMP-Versionen erzeugt:<br />
<br />
* irmp-10kHz: Version für 10kHz Scans<br />
* irmp-15kHz: Version für 15kHz Scans<br />
* irmp-20kHz: Version für 20kHz Scans<br />
<br />
=== Aufruf von IRMP ===<br />
<br />
Der Aufruf geschieht dann über:<br />
<br />
./irmp-nnkHz [-l|-p|-a|-v] < scan-file<br />
<br />
Die angegebenen Optionen schließen sich aus, das heisst, es kann jeweils nur eine Option zu einer Zeit angegeben werden:<br />
<br />
Option:<br />
<br />
-l List gibt eine Liste der Pulse und Pausen aus<br />
-a analyze analysiert die Puls-/Pausen und schreibt ein "Spektrum" in ASCII-Form<br />
-v verbose ausführliche Ausgabe<br />
-p Print Timings gibt für alle Protokolle eine Timing-Tabelle aus<br />
<br />
Beispiele:<br />
<br />
=== Normale Ausgabe ===<br />
<br />
./irmp-10kHz < IR-Data/orion_vcr_07660BM070.txt<br />
<br />
<syntaxhighlight lang="c"><br />
-------------------------------------------------------------------------<br />
# Taste 1<br />
00000001110111101000000001111111 p = 2, a = 0x7b80, c = 0x0001, f = 0x00<br />
-------------------------------------------------------------------------<br />
# Taste 2<br />
00000001110111100100000010111111 p = 2, a = 0x7b80, c = 0x0002, f = 0x00<br />
-------------------------------------------------------------------------<br />
# Taste 3<br />
00000001110111101100000000111111 p = 2, a = 0x7b80, c = 0x0003, f = 0x00<br />
-------------------------------------------------------------------------<br />
# Taste 4<br />
00000001110111100010000011011111 p = 2, a = 0x7b80, c = 0x0004, f = 0x00<br />
-------------------------------------------------------------------------<br />
...<br />
</syntaxhighlight><br />
<br />
=== Listen-Ausgabe ===<br />
<br />
./irmp-10kHz -l < IR-Data/orion_vcr_07660BM070.txt<br />
<br />
<syntaxhighlight lang="c"><br />
# Taste 1<br />
pulse: 91 pause: 44<br />
pulse: 6 pause: 5<br />
pulse: 6 pause: 6<br />
pulse: 6 pause: 5<br />
pulse: 6 pause: 5<br />
pulse: 6 pause: 5<br />
pulse: 6 pause: 6<br />
pulse: 6 pause: 5<br />
pulse: 6 pause: 16<br />
...<br />
</syntaxhighlight><br />
<br />
=== Analyse ===<br />
<br />
./irmp-10kHz -a < IR-Data/orion_vcr_07660BM070.txt<br />
<br />
<pre><br />
-------------------------------------------------------------------------------<br />
START PULSES:<br />
90 o 1<br />
91 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 33<br />
92 ooo 2<br />
pulse avg: 91.0=9102.8 us, min: 90=9000.0 us, max: 92=9200.0 us, tol: 1.1%<br />
-------------------------------------------------------------------------------<br />
START PAUSES:<br />
43 oo 1<br />
44 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 25<br />
45 oooooooooooooooooooooooo 10<br />
pause avg: 44.2=4425.0 us, min: 43=4300.0 us, max: 45=4500.0 us, tol: 2.8%<br />
-------------------------------------------------------------------------------<br />
PULSES:<br />
5 o 17<br />
6 ooooooooooooooooooooooooooooooooooooooooooooooooooooooo 562<br />
7 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 609<br />
pulse avg: 6.5= 649.8 us, min: 5= 500.0 us, max: 7= 700.0 us, tol: 23.1%<br />
-------------------------------------------------------------------------------<br />
PAUSES:<br />
4 ooooooooooooooooooooooo 169<br />
5 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 412<br />
6 oooo 31<br />
pause avg: 4.8= 477.5 us, min: 4= 400.0 us, max: 6= 600.0 us, tol: 25.7%<br />
15 oooooo 43<br />
16 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 425<br />
17 oooooooooo 72<br />
pause avg: 16.1=1605.4 us, min: 15=1500.0 us, max: 17=1700.0 us, tol: 6.6%<br />
-------------------------------------------------------------------------------<br />
</pre><br />
<br />
Hier sieht man die gemessenen Zeiten aller Pulse und Pausen als (liegende) Glockenkurven, welche natürlich wegen der ASCII-Darstellung nicht gerade einer Idealkurve entsprechen. Je schmaler die gemessenen Kanäle, desto besser ist das Timing der Fernbedienung.<br />
<br />
Aus obigem Output kann man herauslesen:<br />
<br />
* Das Start-Bit hat eine Pulslänge zwischen 9000 und 9200 usec, im Mittel sind es 9102 usec. Die Abweichung von diesem Mittelwert liegt bei 1,1 Prozent.<br />
<br />
* Das Start-Bit hat eine Pausenlänge zwischen 4300 usec und 4500 usec, der Mittelwert beträgt 4424 usec. Der Fehler liegt bei 2,8 Prozent.<br />
<br />
* Die Pulslänge eines Datenbits liegt zwischen 500 usec und 700 usec, im Mittel sind es 650 usec, der Fehler liegt bei (stolzen) 23,1 Prozent!<br />
<br />
Desweiteren gibt es noch 2 verschieden lange Pausen (für die Bits 0 und 1), das Ablesen der Werte überlasse ich dem geneigten Leser ;-)<br />
<br />
=== Ausführliche Ausgabe ===<br />
<br />
./irmp-10kHz -v < IR-Data/orion_vcr_07660BM070.txt<br />
<br />
<pre><br />
-------------------------------------------------------------------------------<br />
# 1 - IR-cmd: 0x0001<br />
0.200ms [starting pulse]<br />
13.700ms [start-bit: pulse = 91, pause = 44]<br />
protocol = NEC, start bit timings: pulse: 62 - 118, pause: 30 - 60<br />
pulse_1: 3 - 8<br />
pause_1: 11 - 23<br />
pulse_0: 3 - 8<br />
pause_0: 3 - 8<br />
command_offset: 16<br />
command_len: 16<br />
complete_len: 32<br />
stop_bit: 1<br />
14.800ms [bit 0: pulse = 6, pause = 5] 0<br />
16.000ms [bit 1: pulse = 6, pause = 6] 0<br />
17.100ms [bit 2: pulse = 6, pause = 5] 0<br />
18.200ms [bit 3: pulse = 6, pause = 5] 0<br />
19.300ms [bit 4: pulse = 6, pause = 5] 0<br />
20.500ms [bit 5: pulse = 6, pause = 6] 0<br />
21.600ms [bit 6: pulse = 6, pause = 5] 0<br />
23.800ms [bit 7: pulse = 6, pause = 16] 1<br />
26.100ms [bit 8: pulse = 6, pause = 17] 1<br />
28.300ms [bit 9: pulse = 6, pause = 16] 1<br />
29.500ms [bit 10: pulse = 6, pause = 6] 0<br />
31.700ms [bit 11: pulse = 6, pause = 16] 1<br />
34.000ms [bit 12: pulse = 6, pause = 17] 1<br />
36.200ms [bit 13: pulse = 6, pause = 16] 1<br />
38.500ms [bit 14: pulse = 6, pause = 17] 1<br />
39.600ms [bit 15: pulse = 6, pause = 5] 0<br />
41.900ms [bit 16: pulse = 6, pause = 17] 1<br />
43.000ms [bit 17: pulse = 6, pause = 5] 0<br />
44.100ms [bit 18: pulse = 6, pause = 5] 0<br />
45.200ms [bit 19: pulse = 6, pause = 5] 0<br />
46.400ms [bit 20: pulse = 7, pause = 5] 0<br />
47.500ms [bit 21: pulse = 6, pause = 5] 0<br />
48.600ms [bit 22: pulse = 6, pause = 5] 0<br />
49.800ms [bit 23: pulse = 6, pause = 6] 0<br />
50.900ms [bit 24: pulse = 5, pause = 6] 0<br />
53.100ms [bit 25: pulse = 6, pause = 16] 1<br />
55.400ms [bit 26: pulse = 6, pause = 17] 1<br />
57.600ms [bit 27: pulse = 6, pause = 16] 1<br />
59.900ms [bit 28: pulse = 6, pause = 17] 1<br />
62.100ms [bit 29: pulse = 6, pause = 16] 1<br />
64.400ms [bit 30: pulse = 6, pause = 17] 1<br />
66.700ms [bit 31: pulse = 6, pause = 17] 1<br />
stop bit detected<br />
67.300ms code detected, length = 32<br />
67.300ms p = 2, a = 0x7b80, c = 0x0001, f = 0x00<br />
-------------------------------------------------------------------------------<br />
</pre><br />
<br />
=== Aufruf unter Windows ===<br />
<br />
[[IRMP#top|IRMP]] kann man auch unter Windows nutzen, nämlich folgendermaßen:<br />
<br />
* Eingabeaufforderung starten<br />
* In das Verzeichnis irmp wechseln<br />
* Aufruf von:<br />
irmp-10kHz.exe < IR-Data\rc5x.txt<br />
<br />
Es gelten dieselben Optionen wie für die Linux-Version.<br />
<br />
=== Längere Ausgaben ===<br />
<br />
Da manche Ausgaben sehr lang werden, empfiehlt es sich auch hier, die Ausgabe in eine Datei zu lenken oder in einen Pager weiterzuleiten, damit man seitenweise blättern kann:<br />
<br />
Linux:<br />
<br />
./irmp-10kHz < IR-Data/rc5x.txt | less<br />
<br />
Windows:<br />
<br />
irmp-10kHz.exe < IR-Data\rc5x.txt | more<br />
<br />
== Fernbedienungen ==<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! Protokoll || Bezeichnung || Gerät || Device Address<br />
|-<br />
| [[IRMP#NEC_+_extended_NEC|NEC]] || Toshiba CT-9859 || Fernseher || 0x5F40<br />
|-<br />
| || Toshiba VT-728G || V-728G Videorekorder || 0x5B44<br />
|-<br />
| || Elta 8848 MP 4 || DVD-Player || 0x7F00<br />
|-<br />
| || AS-218 || Askey TV-View CHP03X (TV-Karte) || 0x3B86<br />
|-<br />
| || Cyberhome ??? || Cyberhome DVD Player || 0x6D72<br />
|-<br />
| || WD TV Live || Western Digital Multimediaplayer || 0x1F30<br />
|-<br />
| || Canon WL-DC100 || Kamera Canon PowerShot G5 || 0xB1CA<br />
|-<br />
| || Bleil LED Flex-Band RGB || RGB-LED Band mit IR-Controller || 0xFE00<br />
|-<br />
| [[IRMP#NEC16|NEC16]] || Daewoo || Videorekorder || 0x0015<br />
|-<br />
| [[IRMP#KASEIKYO|KASEIKYO]] || Technics EUR646497 || AV Receiver SA-AX 730 || 0x2002<br />
|-<br />
| || Panasonic TV || Fernseher TX-L32EW6 || 0x2002<br />
|-<br />
| [[IRMP#RC5_+_RC5X|RC5]] || Loewe Assist/RC3/RC4 || Fernseher (FB auf TV-Mode) || 0x0000<br />
|-<br />
| [[IRMP#RC6_+_RC6A|RC6]] || Philips Television || Fernseher (FB auf TV-Mode) || 0x0000<br />
|-<br />
| [[IRMP#SIRCS|SIRCS]] || Sony RM-816 || Fernseher (FB auf TV-Mode) || 0x0000<br />
|-<br />
| [[IRMP#DENON|DENON]] || DENON RC970 || AVR3805 (Verstärker) || 0x0008<br />
|-<br />
| || DENON RC970 || DVD/CD-Player || 0x0002<br />
|-<br />
| || DENON RC970 || Tuner || 0x0006<br />
|-<br />
| [[IRMP#SAMSUNG32|SAMSUNG32]] || Samsung AA59-00484A || LE40D550 Fernseher || 0x0707<br />
|-<br />
| || LG AKB72033901 || Blu-Ray Player BD370 || 0x2D2D<br />
|-<br />
| [[IRMP#APPLE|APPLE]] || Apple || Apple Dock (iPod 2) || 0x0020<br />
|-<br />
|}<br />
<br />
----<br />
<br />
== Kameras ==<br />
<br />
[[Datei:Irmp-pentax.png|miniatur|Pentax-Protokoll]]<br />
<br />
[[IRMP#top|IRMP]] unterstützt zunehmend auch die Fernsteuerung von Kameras, nämlich:<br />
<br />
* [[IRMP#PENTAX|PENTAX]]<br />
* [[IRMP#NIKON|NIKON]]<br />
<br />
Die Kommando-Vielfalt ist nicht gerade groß. Normalerweise verstehen die Kameras gerade mal das Kommando "Auslösen".<br />
<br />
Hier eine kleine Tabelle für [[IRMP#PENTAX|PENTAX]]-Kameras:<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! Kommando || Funktion<br />
|-<br />
| 0x0000 || Auslösen<br />
|-<br />
| 0x0001 || Zoomlevel umschalten<br />
|-<br />
|}<br />
<br />
Da keine Adresse im [[IRMP#PENTAX|PENTAX]]-Protokoll vorgesehen ist, sollte man am diese beim Senden mittels [[IRSND]] am besten auf 0x0000 setzen. Ebenso sollte man in diesem Fall einen Quarz verwenden, da gerade die Nikons bezüglich des Timings sehr penibel sind.<br />
<br />
== IR-Tastaturen ==<br />
<br />
[[Datei:irmp-fdc3402.jpg|miniatur|FDC-3402-Tastatur]]<br />
<br />
[[IRMP#top|IRMP]] unterstützt ab Version 1.7.0 auch IR-Tastaturen, nämlich die Infrarot-Tastatur FDC-3402 - <s>erhältlich bei Pollin (Art. 711 056) für weniger als 2 EUR.</s> (Vergriffen, Stand 19.09.2017)<br />
<br />
Beim Erkennen einer Taste gibt [[IRMP#top|IRMP]] folgende Daten zurück:<br />
<br />
Protokoll-Nummer (irmp_data.protocol): 18<br />
Addresse (irmp_data.address): 0x003F<br />
<br />
Als Kommando (irmp_data.command) werden folgende Werte zurückgeliefert:<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste || Code || Taste<br />
|-<br />
| 0x0000 || || 0x0010 || TAB || 0x0020 || 's' || 0x0030 || 'c' || 0x0040 || || 0x0050 || HOME || 0x0060 || || 0x0070 || MENUE<br />
|-<br />
| 0x0001 || '^' || 0x0011 || 'q' || 0x0021 || 'd' || 0x0031 || 'v' || 0x0041 || || 0x0051 || END || 0x0061 || || 0x0071 || BACK<br />
|-<br />
| 0x0002 || '1' || 0x0012 || 'w' || 0x0022 || 'f' || 0x0032 || 'b' || 0x0042 || || 0x0052 || || 0x0062 || || 0x0072 || FORWARD<br />
|-<br />
| 0x0003 || '2' || 0x0013 || 'e' || 0x0023 || 'g' || 0x0033 || 'n' || 0x0043 || || 0x0053 || UP || 0x0063 || || 0x0073 || ADDRESS<br />
|-<br />
| 0x0004 || '3' || 0x0014 || 'r' || 0x0024 || 'h' || 0x0034 || 'm' || 0x0044 || || 0x0054 || DOWN || 0x0064 || || 0x0074 || WINDOW<br />
|-<br />
| 0x0005 || '4' || 0x0015 || 't' || 0x0025 || 'j' || 0x0035 || ',' || 0x0045 || || 0x0055 || PAGE_UP || 0x0065 || || 0x0075 || 1ST_PAGE<br />
|-<br />
| 0x0006 || '5' || 0x0016 || 'z' || 0x0026 || 'k' || 0x0036 || '.' || 0x0046 || || 0x0056 || PAGE_DOWN || 0x0066 || || 0x0076 || STOP<br />
|-<br />
| 0x0007 || '6' || 0x0017 || 'u' || 0x0027 || 'l' || 0x0037 || '-' || 0x0047 || || 0x0057 || || 0x0067 || || 0x0077 || MAIL<br />
|-<br />
| 0x0008 || '7' || 0x0018 || 'i' || 0x0028 || 'ö' || 0x0038 || || 0x0048 || || 0x0058 || || 0x0068 || || 0x0078 || FAVORITES<br />
|-<br />
| 0x0009 || '8' || 0x0019 || 'o' || 0x0029 || 'ä' || 0x0039 || SHIFT_RIGHT || 0x0049 || || 0x0059 || RIGHT || 0x0069 || || 0x0079 || NEW_PAGE<br />
|-<br />
| 0x000A || '9' || 0x001A || 'p' || 0x002A || '#' || 0x003A || CTRL || 0x004A || || 0x005A || || 0x006A || || 0x007A || SETUP<br />
|-<br />
| 0x000B || '0' || 0x001B || 'ü' || 0x002B || CR || 0x003B || || 0x004B || INSERT || 0x005B || || 0x006B || || 0x007B || FONT<br />
|-<br />
| 0x000C || 'ß' || 0x001C || '+' || 0x002C || SHIFT_LEFT || 0x003C || ALT_LEFT || 0x004C || DELETE || 0x005C || || 0x006C || || 0x007C || PRINT<br />
|-<br />
| 0x000D || '´' || 0x001D || || 0x002D || '<' || 0x003D || SPACE || 0x004D || || 0x005D || || 0x006D || || 0x007D ||<br />
|-<br />
| 0x000E || || 0x001E || CAPSLOCK || 0x002E || 'y' || 0x003E || ALT_RIGHT || 0x004E || || 0x005E || || 0x006E || ESCAPE || 0x007E || ON_OFF<br />
|-<br />
| 0x000F || BACKSPACE || 0x001F || 'a' || 0x002F || 'x' || 0x003F || || 0x004F || LEFT || 0x005F || || 0x006F || || 0x007F ||<br />
|-<br />
|}<br />
<br />
Zusatztasten links:<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! Code || Taste<br />
|-<br />
|-<br />
| 0x0400 || KEY_MOUSE_1<br />
|-<br />
| 0x0800 || KEY_MOUSE_2<br />
|}<br />
<br />
Dabei gelten die obigen Werte für das Drücken einer Taste. Wird die Taste wieder losgelassen, setzt [[IRMP#top|IRMP]] zusätzlich das 8. Bit im Kommando.<br />
<br />
Beispiel:<br />
<br />
Taste 'a' drücken: 0x001F<br />
Taste 'a' loslassen: 0x009F<br />
<br />
Ausnahme ist die EIN/AUS-Taste: Diese sendet nur beim Drücken einen Code, nicht beim Loslassen.<br />
<br />
Wird eine Taste länger gedrückt, wird das in irmp_data.flag angezeigt.<br />
<br />
Beispiel:<br />
<br />
command flag<br />
Taste 'a' drücken: 0x001F 0x00<br />
Taste 'a' drücken: 0x001F 0x01<br />
Taste 'a' drücken: 0x001F 0x01<br />
Taste 'a' drücken: 0x001F 0x01<br />
....<br />
Taste 'a' loslassen: 0x009F 0x00<br />
<br />
<br />
Werden Tastenkombinationen (zum Beispiel für ein großes 'A') gedrückt, dann sind die Rückgabewerte von [[IRMP#top|IRMP]] in folgendem Ablauf zu sehen:<br />
<br />
Linke SHIFT-Taste drücken: 0x0002<br />
Taste 'a' drücken: 0x001F<br />
Taste 'a' loslassen: 0x009F<br />
Linke SHIFT-Taste loslassen: 0x0082<br />
<br />
In [http://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=markup irmp.c] findet man für die LINUX-Version eine Funktion get_fdc_key(), welche als Vorlage dienen mag, die Keycodes einer FDC-Tastatur in die entsprechenden ASCII-Codes umzuwandeln. Diese Funktion kann man entweder lokal auf dem µC nutzen, um die Keycodes zu decodieren, oder auf einem Hostsystem (z.B. PC), an welches die IRMP-Data-Struktur gesandt wird. Dafür sollte man die Funktion incl. der dazugehörenden Preprozessor-Konstanten in seinen Applikations-Quelltext kopieren.<br />
<br />
Hier der entsprechende Auszug:<br />
<syntaxhighlight lang="c"><br />
#define STATE_LEFT_SHIFT 0x01<br />
#define STATE_RIGHT_SHIFT 0x02<br />
#define STATE_LEFT_CTRL 0x04<br />
#define STATE_LEFT_ALT 0x08<br />
#define STATE_RIGHT_ALT 0x10<br />
<br />
#define KEY_ESCAPE 0x1B // keycode = 0x006e<br />
#define KEY_MENUE 0x80 // keycode = 0x0070<br />
#define KEY_BACK 0x81 // keycode = 0x0071<br />
#define KEY_FORWARD 0x82 // keycode = 0x0072<br />
#define KEY_ADDRESS 0x83 // keycode = 0x0073<br />
#define KEY_WINDOW 0x84 // keycode = 0x0074<br />
#define KEY_1ST_PAGE 0x85 // keycode = 0x0075<br />
#define KEY_STOP 0x86 // keycode = 0x0076<br />
#define KEY_MAIL 0x87 // keycode = 0x0077<br />
#define KEY_FAVORITES 0x88 // keycode = 0x0078<br />
#define KEY_NEW_PAGE 0x89 // keycode = 0x0079<br />
#define KEY_SETUP 0x8A // keycode = 0x007a<br />
#define KEY_FONT 0x8B // keycode = 0x007b<br />
#define KEY_PRINT 0x8C // keycode = 0x007c<br />
#define KEY_ON_OFF 0x8E // keycode = 0x007c<br />
<br />
#define KEY_INSERT 0x90 // keycode = 0x004b<br />
#define KEY_DELETE 0x91 // keycode = 0x004c<br />
#define KEY_LEFT 0x92 // keycode = 0x004f<br />
#define KEY_HOME 0x93 // keycode = 0x0050<br />
#define KEY_END 0x94 // keycode = 0x0051<br />
#define KEY_UP 0x95 // keycode = 0x0053<br />
#define KEY_DOWN 0x96 // keycode = 0x0054<br />
#define KEY_PAGE_UP 0x97 // keycode = 0x0055<br />
#define KEY_PAGE_DOWN 0x98 // keycode = 0x0056<br />
#define KEY_RIGHT 0x99 // keycode = 0x0059<br />
#define KEY_MOUSE_1 0x9E // keycode = 0x0400<br />
#define KEY_MOUSE_2 0x9F // keycode = 0x0800<br />
<br />
static uint8_t<br />
get_fdc_key (uint16_t cmd)<br />
{<br />
static uint8_t key_table[128] =<br />
{<br />
// 0 1 2 3 4 5 6 7 8 9 A B C D E F<br />
0, '^', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 0xDF, '´', 0, '\b',<br />
'\t', 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', 0xFC, '+', 0, 0, 'a',<br />
's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 0xF6, 0xE4, '#', '\r', 0, '<', 'y', 'x',<br />
'c', 'v', 'b', 'n', 'm', ',', '.', '-', 0, 0, 0, 0, 0, ' ', 0, 0,<br />
<br />
0, '°', '!', '"', '§', '$', '%', '&', '/', '(', ')', '=', '?', '`', 0, '\b',<br />
'\t', 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', 'O', 'P', 0xDC, '*', 0, 0, 'A',<br />
'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 0xD6, 0xC4, '\'', '\r', 0, '>', 'Y', 'X',<br />
'C', 'V', 'B', 'N', 'M', ';', ':', '_', 0, 0, 0, 0, 0, ' ', 0, 0<br />
};<br />
static uint8_t state;<br />
<br />
uint8_t key = 0;<br />
<br />
switch (cmd)<br />
{<br />
case 0x002C: state |= STATE_LEFT_SHIFT; break; // pressed left shift<br />
case 0x00AC: state &= ~STATE_LEFT_SHIFT; break; // released left shift<br />
case 0x0039: state |= STATE_RIGHT_SHIFT; break; // pressed right shift<br />
case 0x00B9: state &= ~STATE_RIGHT_SHIFT; break; // released right shift<br />
case 0x003A: state |= STATE_LEFT_CTRL; break; // pressed left ctrl<br />
case 0x00BA: state &= ~STATE_LEFT_CTRL; break; // released left ctrl<br />
case 0x003C: state |= STATE_LEFT_ALT; break; // pressed left alt<br />
case 0x00BC: state &= ~STATE_LEFT_ALT; break; // released left alt<br />
case 0x003E: state |= STATE_RIGHT_ALT; break; // pressed left alt<br />
case 0x00BE: state &= ~STATE_RIGHT_ALT; break; // released left alt<br />
<br />
case 0x006e: key = KEY_ESCAPE; break;<br />
case 0x004b: key = KEY_INSERT; break;<br />
case 0x004c: key = KEY_DELETE; break;<br />
case 0x004f: key = KEY_LEFT; break;<br />
case 0x0050: key = KEY_HOME; break;<br />
case 0x0051: key = KEY_END; break;<br />
case 0x0053: key = KEY_UP; break;<br />
case 0x0054: key = KEY_DOWN; break;<br />
case 0x0055: key = KEY_PAGE_UP; break;<br />
case 0x0056: key = KEY_PAGE_DOWN; break;<br />
case 0x0059: key = KEY_RIGHT; break;<br />
case 0x0400: key = KEY_MOUSE_1; break;<br />
case 0x0800: key = KEY_MOUSE_2; break;<br />
<br />
default:<br />
{<br />
if (!(cmd & 0x80)) // pressed key<br />
{<br />
if (cmd >= 0x70 && cmd <= 0x7F) // function keys<br />
{<br />
key = cmd + 0x10; // 7x -> 8x<br />
}<br />
else if (cmd < 64) // key listed in key_table<br />
{<br />
if (state & (STATE_LEFT_ALT | STATE_RIGHT_ALT))<br />
{<br />
switch (cmd)<br />
{<br />
case 0x0003: key = 0xB2; break; // ²<br />
case 0x0008: key = '{'; break;<br />
case 0x0009: key = '['; break;<br />
case 0x000A: key = ']'; break;<br />
case 0x000B: key = '}'; break;<br />
case 0x000C: key = '\\'; break;<br />
case 0x001C: key = '~'; break;<br />
case 0x002D: key = '|'; break;<br />
case 0x0034: key = 0xB5; break; // µ<br />
}<br />
}<br />
else if (state & (STATE_LEFT_CTRL))<br />
{<br />
if (key_table[cmd] >= 'a' && key_table[cmd] <= 'z')<br />
{<br />
key = key_table[cmd] - 'a' + 1;<br />
}<br />
else<br />
{<br />
key = key_table[cmd];<br />
}<br />
}<br />
else<br />
{<br />
int idx = cmd + ((state & (STATE_LEFT_SHIFT | STATE_RIGHT_SHIFT)) ? 64 : 0);<br />
<br />
if (key_table[idx])<br />
{<br />
key = key_table[idx];<br />
}<br />
}<br />
}<br />
}<br />
break;<br />
}<br />
}<br />
<br />
return (key);<br />
}<br />
</syntaxhighlight><br />
<br />
Als letztes noch ein Beispiel einer Anwendung der Funktion get_fdc_key():<br />
<br />
<syntaxhighlight lang="c"><br />
if (irmp_get_data (&irmp_data))<br />
{<br />
uint8_t key;<br />
<br />
if (irmp_data.protocol == IRMP_FDC_PROTOCOL &&<br />
(key = get_fdc_key (irmp_data.command)) != 0)<br />
{<br />
if ((key >= 0x20 && key < 0x7F) || key >= 0xA0) // show only printable characters<br />
{<br />
printf ("ascii-code = 0x%02x, character = '%c'\n", key, key);<br />
}<br />
else // it's a non-printable key<br />
{<br />
printf ("ascii-code = 0x%02x\n", key);<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Alle nicht-druckbaren Zeichen werden dabei folgendermaßen codiert:<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! Taste || Konstante || Wert<br />
|-<br />
| ESC || KEY_ESCAPE || 0x1B<br />
|-<br />
| Menü || KEY_MENUE || 0x80<br />
|-<br />
| Zurück || KEY_BACK || 0x81<br />
|-<br />
| Vorw. || KEY_FORWARD || 0x82<br />
|-<br />
| Adresse || KEY_ADDRESS || 0x83<br />
|-<br />
| Fenster || KEY_WINDOW || 0x84<br />
|-<br />
| 1. Seite || KEY_1ST_PAGE || 0x85<br />
|-<br />
| Stop || KEY_STOP || 0x86<br />
|-<br />
| Mail || KEY_MAIL || 0x87<br />
|-<br />
| Fav. || KEY_FAVORITES || 0x88<br />
|-<br />
| Neue Seite || KEY_NEW_PAGE || 0x89<br />
|-<br />
| Setup || KEY_SETUP || 0x8A<br />
|-<br />
| Schrift || KEY_FONT || 0x8B<br />
|-<br />
| Druck || KEY_PRINT || 0x8C<br />
|-<br />
| Ein/Aus || KEY_ON_OFF || 0x8E<br />
|-<br />
| Backspace || '\b' || 0x08<br />
|-<br />
| CR/ENTER || '\r' || 0x0C<br />
|-<br />
| TAB || '\t' || 0x09<br />
|-<br />
| Einfg || KEY_INSERT || 0x90<br />
|-<br />
| Entf || KEY_DELETE || 0x91<br />
|-<br />
| Cursor links || KEY_LEFT || 0x92<br />
|-<br />
| Pos1 || KEY_HOME || 0x93<br />
|-<br />
| Ende || KEY_END || 0x94<br />
|-<br />
| Cursor rechts || KEY_UP || 0x95<br />
|-<br />
| Cursor runter || KEY_DOWN || 0x96<br />
|-<br />
| Bild hoch || KEY_PAGE_UP || 0x97<br />
|-<br />
| Bild runter || KEY_PAGE_DOWN || 0x98<br />
|-<br />
| Cursor links || KEY_RIGHT || 0x99<br />
|-<br />
| Linke Maustaste || KEY_MOUSE_1 || 0x9E<br />
|-<br />
| Rechte Maustaste || KEY_MOUSE_2 || 0x9F<br />
|-<br />
|}<br />
<br />
Die Funktion get_fdc_key berücksichtigt das Gedrückthalten der Shift-, Strg- und ALT-Tasten. Damit funktioniert nicht nur das Schreiben von Großbuchstaben, sondern auch das Auswählen der Sonderzeichen mit der Tastenkombination ALT + Taste, z.B. ALT + m = µ oder ALT + q = @. Ebenso kann man mit der Strg-Taste die Control-Zeichen CTRL-A bis CTRL-Z senden. Die CapsLock-Taste wird ignoriert, da ich sie sowieso für die überflüssigste Taste überhaupt halte ;-)<br />
<br />
= Anhang =<br />
<br />
== Die IR-Protokolle im Detail ==<br />
<br />
=== Pulse Distance Protokolle ===<br />
[[Datei:Pulse-Distance.png|miniatur|Pulse Distance Coding]]<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
<br />
==== NEC + extended NEC ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#NEC-Protokoll|NEC + extended NEC]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 36 kHz / 38 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten NEC || 8 Adress-Bits + 8 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits<br />
|-<br />
| Daten ext. NEC || 16 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits<br />
|-<br />
| Start-Bit || 9000µs Puls, 4500µs Pause<br />
|-<br />
| 0-Bit || 560µs Puls, 560µs Pause<br />
|-<br />
| 1-Bit || 560µs Puls, 1690µs Pause<br />
|-<br />
| Stop-Bit || 560µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || 9000µs Puls, 2250µs Pause, 560µs Puls, ~100ms Pause<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== ONKYO ====<br />
<br />
Wie [[IRMP#NEC|ext. NEC]], jedoch 16 unabhängige Datenbits, also:<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#ONKYO-Protokoll|ONKYO]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Daten ONKYO || 16 Adress-Bits + 16 Kommando-Bits<br />
|-<br />
|}<br />
<br />
==== JVC ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#NEC16-Protokoll (JVC)|JVC]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 16 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 4 Adress-Bits + 12 Kommando-Bits<br />
|-<br />
| Start-Bit || 9000µs Puls, 4500µs Pause, 6000µs Pause bei Tasten-Wiederholung<br />
|-<br />
| 0-Bit || 560µs Puls, 560µs Pause<br />
|-<br />
| 1-Bit || 560µs Puls, 1690µs Pause<br />
|-<br />
| Stop-Bit || 560µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || Wiederholung nach Pause von 25ms<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== NEC16 ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''NEC16''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 8 Adress-Bits + 1 Sync-Bit + 8 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Start-Bit || 9000µs Puls, 4500µs Pause<br />
|-<br />
| Sync-Bit || 560µs Puls, 4500µs Pause<br />
|-<br />
| 0-Bit || 560µs Puls, 560µs Pause<br />
|-<br />
| 1-Bit || 560µs Puls, 1690µs Pause<br />
|-<br />
| Stop-Bit || 560µs Puls<br />
|-<br />
| Wiederholung || keine/eine/zwei nach 25ms?<br />
|-<br />
| Tasten-Wiederholung || Wiederholung nach Pause von 25ms?<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== NEC42 ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''NEC42''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 42 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 13 Adress-Bits + 13 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits<br />
|-<br />
| Start-Bit || 9000µs Puls, 4500µs Pause<br />
|-<br />
| 0-Bit || 560µs Puls, 560µs Pause<br />
|-<br />
| 1-Bit || 560µs Puls, 1690µs Pause<br />
|-<br />
| Stop-Bit || 560µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || nach 110ms (ab Start-Bit), 9000µs Puls, 2250µs Pause, 560µs Puls<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== ACP24 ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#ACP24-Protokoll|ACP24]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 70 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 0 Adress-Bits + 70 Kommando-Bits<br />
|-<br />
| Start-Bit || 390µs Puls, 950µs Pause<br />
|-<br />
| 0-Bit || 390µs Puls, 950µs Pause<br />
|-<br />
| 1-Bit || 390µs Puls, 1300µs Pause<br />
|-<br />
| Stop-Bit || 390µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || unbekannt<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== LGAIR ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#LGAIR-Protokoll|LGAIR]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 28 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 8 Adress-Bits + 16 Kommando-Bits + 4 Checksum-Bits<br />
|-<br />
| Start-Bit || 9000µs Puls, 4500µs Pause (identisch mit [[IRMP#NEC_.2B_extended_NEC|NEC]])<br />
|-<br />
| 0-Bit || 560µs Puls, 560µs Pause (identisch mit [[IRMP#NEC_.2B_extended_NEC|NEC]])<br />
|-<br />
| 1-Bit || 560µs Puls, 1690µs Pause (identisch mit [[IRMP#NEC_.2B_extended_NEC|NEC]])<br />
|-<br />
| Stop-Bit || 560µs Puls (identisch mit [[IRMP#NEC_.2B_extended_NEC|NEC]])<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || unbekannt<br />
|-<br />
| Bit-Order || MSB first ('''abweichend''' zu [[IRMP#NEC_.2B_extended_NEC|NEC]])<br />
|-<br />
|}<br />
<br />
==== SAMSUNG ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#SAMSUNG-Protokoll|SAMSUNG]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || ?? kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 16 Daten(1)-Bits + 1 Sync-Bit + 20 Daten(2)-Bits + 1 Stop-Bit<br />
|-<br />
| Daten(1) || 16 Adress-Bits<br />
|-<br />
| Daten(2) || 4 ID-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits<br />
|-<br />
| Start-Bit || 4500µs Puls, 4500µs Pause<br />
|-<br />
| 0-Bit || 550µs Puls, 550µs Pause<br />
|-<br />
| 1-Bit || 550µs Puls, 1650µs Pause<br />
|-<br />
| Sync-Bit || 550µs Puls, 4500µs Pause<br />
|-<br />
| Stop-Bit || 550µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== SAMSUNG32 ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''SAMSUNG32''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 16 Adress-Bits + 16 Kommando-Bits<br />
|-<br />
| Start-Bit || 4500µs Puls, 4500µs Pause<br />
|-<br />
| 0-Bit || 550µs Puls, 550µs Pause<br />
|-<br />
| 1-Bit || 550µs Puls, 1650µs Pause<br />
|-<br />
| Stop-Bit || 550µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || Wiederholung nach ca. 47msec<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== SAMSUNG48 ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''SAMSUNG48''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 48 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 16 Adress-Bits + 32 Kommando-Bits<br />
|-<br />
| Kommando || 8 Bits + 8 invertierte Bits + 8 Bits + 8 invertierte Bits<br />
|-<br />
| Start-Bit || 4500µs Puls, 4500µs Pause<br />
|-<br />
| 0-Bit || 550µs Puls, 550µs Pause<br />
|-<br />
| 1-Bit || 550µs Puls, 1650µs Pause<br />
|-<br />
| Stop-Bit || 550µs Puls<br />
|-<br />
| Wiederholung || eine nach ca. 5 msec<br />
|-<br />
| Tasten-Wiederholung || dritter, fünfter, siebter usw. identischer Frame<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== MATSUSHITA ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#MATSUHITA-Protokoll|MATSUSHITA]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 36 kHz<br />
|-<br />
| Kodierung || Pulse Distance, Timing identisch mit [[IRMP#TECHNICS|TECHNICS]]<br />
|-<br />
| Frame || 1 Start-Bit + 24 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 6 Hersteller-Bits + 6 Kommando-Bits + 12 Adress-Bits<br />
|-<br />
| Start-Bit || 3488µs Puls, 3488µs Pause<br />
|-<br />
| 0-Bit || 872µs Puls, 872µs Pause<br />
|-<br />
| 1-Bit || 872µs Puls, 2616µs Pause<br />
|-<br />
| Stop-Bit || 872µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames nach 40ms Pause<br />
|-<br />
| Bit-Order || LSB first?<br />
|-<br />
|}<br />
<br />
==== TECHNICS ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''TECHNICS''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 36 kHz?<br />
|-<br />
| Kodierung || Pulse Distance, Timing identisch mit [[IRMP#MATSUSHITA|MATSUSHITA]]<br />
|-<br />
| Frame || 1 Start-Bit + 22 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 11 Kommando-Bits + 11 invertierte Kommando-Bits<br />
|-<br />
| Start-Bit || 3488µs Puls, 3488µs Pause<br />
|-<br />
| 0-Bit || 872µs Puls, 872µs Pause<br />
|-<br />
| 1-Bit || 872µs Puls, 2616µs Pause<br />
|-<br />
| Stop-Bit || 872µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames nach 40ms Pause<br />
|-<br />
| Bit-Order || LSB first?<br />
|-<br />
|}<br />
<br />
==== KASEIKYO ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#KASEIKYO-Protokoll (auch "Japan-Protokoll")|KASEIKYO]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 48 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 16 Hersteller-Bits + 4 Parity-Bits + 4 Genre1-Bits + 4 Genre2-Bits + 10 Kommando-Bits + 2 ID-Bits + 8 Parity-Bits<br />
|-<br />
| Start-Bit || 3380µs Puls, 1690µs Pause<br />
|-<br />
| 0-Bit || 423µs Puls, 423µs Pause<br />
|-<br />
| 1-Bit || 423µs Puls, 1269µs Pause<br />
|-<br />
| Stop-Bit || 423µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames nach ca. 80ms Pause<br />
|-<br />
| Bit-Order || LSB first?<br />
|-<br />
|}<br />
<br />
==== RECS80 ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#RECS80- und RECS80-Extended-Protokoll|RECS80]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bits + 10 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 1 Toggle-Bit + 3 Adress-Bits + 6 Kommando-Bits<br />
|-<br />
| Start-Bit || 158µs Puls, 7432µs Pause<br />
|-<br />
| 0-Bit || 158µs Puls, 4902µs Pause<br />
|-<br />
| 1-Bit || 158µs Puls, 7432µs Pause<br />
|-<br />
| Stop-Bit || 158µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== RECS80EXT ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#RECS80- und RECS80-Extended-Protokoll|RECS80EXT]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 2 Start-Bits + 11 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 1 Toggle-Bit + 4 Adress-Bits + 6 Kommando-Bits<br />
|-<br />
| Start-Bit || 158µs Puls, 3637µs Pause<br />
|-<br />
| 0-Bit || 158µs Puls, 4902µs Pause<br />
|-<br />
| 1-Bit || 158µs Puls, 7432µs Pause<br />
|-<br />
| Stop-Bit || 158µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== DENON ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#Denon-Protokoll|DENON]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz (in der Praxis, lt. Dokumentation: 32 kHz)<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 0 Start-Bits + 15 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 5 Address-Bits + 10 Kommando-Bits<br />
|-<br />
| Kommando || 6 Datenbits + 2 Extension Bits + 2 Data Construction Bits (normal: 00, invertiert: 11)<br />
|-<br />
| Start-Bit || kein Start-Bit<br />
|-<br />
| 0-Bit || 310µs Puls, 745µs Pause (in der Praxis, lt. Doku: 275µs Puls, 775µs Pause)<br />
|-<br />
| 1-Bit || 310µs Puls, 1780µs Pause (in der Praxis, lt. Doku: 275µs Puls, 1900µs Pause)<br />
|-<br />
| Stop-Bit || 310µs Puls (310µs Puls, 745µs Pause (in der Praxis, lt. Doku: 275µs Puls)<br />
|-<br />
| Wiederholung || Nach 65ms Wiederholung des Frames mit invertieren Kommando-Bits (Data Construction Bits = 11)<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung der beiden Original-Frames nach 65ms<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== APPLE ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''APPLE''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 16 Adress-Bits + 11100000 + 8 Kommando-Bits<br />
|-<br />
| Start-Bit || siehe [[IRMP#NEC_+_extended_NEC|NEC]]<br />
|-<br />
| 0-Bit || siehe [[IRMP#NEC_+_extended_NEC|NEC]]<br />
|-<br />
| 1-Bit || siehe [[IRMP#NEC_+_extended_NEC|NEC]]<br />
|-<br />
| Stop-Bit || siehe [[IRMP#NEC_+_extended_NEC|NEC]]<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== BOSE ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''BOSE''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 16 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 0 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits<br />
|-<br />
| Start-Bit || 1060µs Puls, 1425µs Pause<br />
|-<br />
| 0-Bit || 550µs Puls, 437µs Pause<br />
|-<br />
| 1-Bit || 550µs Puls, 1425µs Pause<br />
|-<br />
| Stop-Bit || 550µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || noch ungeklärt<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== B&O ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#Bang & Olufsen|B&O]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 455 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 4 Start-Bits + 16 Daten-Bits + 1 Trailer-Bit + 1 Stop-Bit<br />
|-<br />
| Daten || 0 Adress-Bits + 16 Kommando-Bits<br />
|-<br />
| Start-Bit 1 || 200µs Puls, 2925µs Pause<br />
|-<br />
| Start-Bit 2 || 200µs Puls, 2925µs Pause<br />
|-<br />
| Start-Bit 3 || 200µs Puls, 15425µs Pause<br />
|-<br />
| Start-Bit 4 || 200µs Puls, 2925µs Pause<br />
|-<br />
| 0-Bit || 200µs Puls, 2925µs Pause<br />
|-<br />
| 1-Bit || 200µs Puls, 9175µs Pause<br />
|-<br />
| R-Bit || 200µs Puls, 6050µs Pause, wiederholt das letzte Bit (repetition)<br />
|-<br />
| Trailer-Bit || 200µs Puls, 12300µs Pause<br />
|-<br />
| Stop-Bit || 200µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== FDC ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''FDC''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 40 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 8 Adress-Bits + 12 x 0-Bits + 4 Press/Release-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits<br />
|-<br />
| Start-Bit || 2085µs Puls, 966µs Pause<br />
|-<br />
| 0-Bit || 300µs Puls, 220µs Pause<br />
|-<br />
| 1-Bit || 300µs Puls, 715µs Pause<br />
|-<br />
| Stop-Bit || 300µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Drücken || Press/Release-Bits = 0000<br />
|-<br />
| Tasten-Loslassen || Press/Release-Bits = 1111<br />
|-<br />
| Tasten-Wiederholung || Wiederholung nach Pause von 60ms<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== NIKON ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''NIKON''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 2 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 2 Kommando-Bits<br />
|-<br />
| Start-Bit || 2200µs Puls, 27100µs Pause<br />
|-<br />
| 0-Bit || 500µs Puls, 1500µs Pause<br />
|-<br />
| 1-Bit || 500µs Puls, 3500µs Pause<br />
|-<br />
| Stop-Bit || 500µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || unbekannt<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== PANASONIC ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''PANASONIC''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 56 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 24 Bits (010000000000010000000001) + 16 Adress-Bits + 16 Kommando-Bits<br />
|-<br />
| Start-Bit || 3600µs Puls, 1600µs Pause<br />
|-<br />
| 0-Bit || 565µs Puls, 316µs Pause<br />
|-<br />
| 1-Bit || 565µs Puls, 1140µs Pause<br />
|-<br />
| Stop-Bit || 565µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || unbekannt<br />
|-<br />
| Bit-Order || LSB first?<br />
|-<br />
|}<br />
<br />
==== PENTAX ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''PENTAX''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 6 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 6 Kommando-Bits<br />
|-<br />
| Start-Bit || 2200µs Puls, 27100µs Pause<br />
|-<br />
| 0-Bit || 1000µs Puls, 1000µs Pause<br />
|-<br />
| 1-Bit || 1000µs Puls, 3000µs Pause<br />
|-<br />
| Stop-Bit || 1000µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || unbekannt<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== KATHREIN ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''KATHREIN''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 11 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 4 Adress-Bits + 7 Kommando-Bits<br />
|-<br />
| Start-Bit || 210µs Puls, 6218µs Pause<br />
|-<br />
| 0-Bit || 210µs Puls, 1400µs Pause<br />
|-<br />
| 1-Bit || 210µs Puls, 3000µs Pause<br />
|-<br />
| Stop-Bit || 210µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || nach 35ms?<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== LEGO ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#LEGO Power Functions RC|LEGO]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 16 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 16 Kommando-Bits<br />
|-<br />
| Start-Bit || 158µs Puls, 1026µs Pause<br />
|-<br />
| 0-Bit || 158µs Puls, 263µs Pause<br />
|-<br />
| 1-Bit || 158µs Puls, 553µs Pause<br />
|-<br />
| Stop-Bit || 158µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || unbekannt<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== VINCENT ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#VINCENT|VINCENT]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 16 Adress- und 8 Kommando-Bits + 8 wiederholte Kommando-Bits<br />
|-<br />
| Start-Bit || 2500µs Puls, 4600µs Pause<br />
|-<br />
| 0-Bit || 550µs Puls, 550µs Pause<br />
|-<br />
| 1-Bit || 550µs Puls, 1540µs Pause<br />
|-<br />
| Stop-Bit || 550µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || unbekannt<br />
|-<br />
| Bit-Order || MSB first?<br />
|-<br />
|}<br />
<br />
==== THOMSON ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''THOMSON''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 33 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 0 Start-Bits + 12 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 4 Adress-Bits + 1 Toggle-Bit + 7 Kommando-Bits<br />
|-<br />
| 0-Bit || 550µs Puls, 2000µs Pause<br />
|-<br />
| 1-Bit || 550µs Puls, 4500µs Pause<br />
|-<br />
| Stop-Bit || 550µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || Framewiederholung nach 35ms<br />
|-<br />
| Bit-Order || vermutlich MSB first<br />
|-<br />
|}<br />
<br />
==== TELEFUNKEN ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''TELEFUNKEN''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 15 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 0 Adress-Bits + 15 Kommando-Bits<br />
|-<br />
| Start-Bit || 600µs Puls, 1500µs Pause<br />
|-<br />
| 0-Bit || 600µs Puls, 600µs Pause<br />
|-<br />
| 1-Bit || 600µs Puls, 1500µs Pause<br />
|-<br />
| Stop-Bit || 600µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || unbekannt<br />
|-<br />
| Bit-Order || vermutlich MSB first<br />
|-<br />
|}<br />
<br />
==== RCCAR ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''RCCAR''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame || 1 Start-Bit + 13 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 13 Kommando-Bits<br />
|-<br />
| Start-Bit || 2000µs Puls, 2000µs Pause<br />
|-<br />
| 0-Bit || 600µs Puls, 900µs Pause<br />
|-<br />
| 1-Bit || 600µs Puls, 450µs Pause<br />
|-<br />
| Stop-Bit || 600µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || nach 40ms?<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
<br />
==== RCMM ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#RCMM-Protokoll|RCMM]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 36 kHz<br />
|-<br />
| Kodierung || Pulse Distance<br />
|-<br />
| Frame RCMM32 || 1 Start-Bit + 32 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Frame RCMM24 || 1 Start-Bit + 24 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Frame RCMM12 || 1 Start-Bit + 12 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten RCMM32 || 16 Adress-Bits (= 4 Mode-Bits + 12 Device-Bits) + 1 Toggle-Bit + 15 Kommando-Bits<br />
|-<br />
| Daten RCMM24 || 16 Adress-Bits (= 4 Mode-Bits + 12 Device-Bits) + 1 Toggle-Bit + 7 Kommando-Bits<br />
|-<br />
| Daten RCMM12 || 4 Adress-Bits (= 2 Mode-Bits + 2 Device-Bits) + 8 Kommando-Bits<br />
|-<br />
| Start-Bit || 500µs Puls, 220µs Pause<br />
|-<br />
| 00-Bits || 230µs Puls, 220µs Pause<br />
|-<br />
| 01-Bits || 230µs Puls, 380µs Pause<br />
|-<br />
| 10-Bits || 230µs Puls, 550µs Pause<br />
|-<br />
| 11-Bits || 230µs Puls, 720µs Pause<br />
|-<br />
| Stop-Bit || 230µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || nach 80ms<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
=== Pulse Width Protokolle ===<br />
[[Datei:Pulse-Width.png|miniatur|Pulse Width Coding]]<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
<br />
==== SIRCS ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#SIRCS-Protokoll|SIRCS]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
|Frequenz ||40 kHz<br />
|-<br />
| Kodierung || Pulse Width<br />
|-<br />
| Frame || 1 Start-Bit + 12-20 Daten-Bits, kein Stop-Bit<br />
|-<br />
| Daten || 7 Kommando-Bits + 5 Adress-Bits + bis zu 8 zusätzliche Bits<br />
|-<br />
| Start-Bit || 2400µs Puls, 600µs Pause<br />
|-<br />
| 0-Bit || 600µs Puls, 600µs Pause<br />
|-<br />
| 1-Bit || 1200µs Puls, 600µs Pause<br />
|-<br />
| Wiederholung || zweimalig nach ca. 25ms, d.h. 2. und 3. Frame<br />
|-<br />
| Tasten-Wiederholung || ab dem 4. identischen Frame, Abstand ca. 25ms<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
=== Pulse Distance Width Protokolle ===<br />
[[Datei:Pulse-Distance-Width.png|miniatur|Pulse Distance Width Coding]]<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
<br />
==== NUBERT ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''NUBERT''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 36 kHz?<br />
|-<br />
| Kodierung || Pulse Distance Width<br />
|-<br />
| Frame || 1 Start-Bit + 10 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 0 Adress-Bits + 10 Kommando-Bits ?<br />
|-<br />
| Start-Bit || 1340µs Puls, 340µs Pause<br />
|-<br />
| 0-Bit || 500µs Puls, 1300µs Pause<br />
|-<br />
| 1-Bit || 1340µs Puls, 340µs Pause<br />
|-<br />
| Stop-Bit || 500µs Puls<br />
|-<br />
| Wiederholung || einmalig nach 35ms<br />
|-<br />
| Tasten-Wiederholung || dritter, fünfter, siebter usw. identischer Frame<br />
|-<br />
| Bit-Order || MSB first?<br />
|-<br />
|}<br />
<br />
==== FAN ====<br />
<br />
Das Protokoll ist sehr ähnlich zu [[IRMP#NUBERT|NUBERT]], jedoch wird nur ein Frame gesandt. Außerdem werden 11 statt 10 Datenbits verwendet und kein Stop-Bit versandt. Die Pause zwischen Frame-Wiederholungen ist wesentlich geringer.<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''FAN ''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 36 kHz<br />
|-<br />
| Kodierung || Pulse Distance Width<br />
|-<br />
| Frame || 1 Start-Bit + 11 Daten-Bits + 0 Stop-Bits<br />
|-<br />
| Daten || 0 Adress-Bits + 11 Kommando-Bits<br />
|-<br />
| Start-Bit || 1280µs Puls, 380µs Pause<br />
|-<br />
| 0-Bit || 380µs Puls, 1280µs Pause<br />
|-<br />
| 1-Bit || 1280µs Puls, 380µs Pause<br />
|-<br />
| Stop-Bit || 500µs Puls<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || nach 6,6ms Pause<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== SPEAKER ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''SPEAKER''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance Width<br />
|-<br />
| Frame || 1 Start-Bit + 10 Daten-Bits + 1 Stop-Bit<br />
|-<br />
| Daten || 0 Adress-Bits + 10 Kommando-Bits ?<br />
|-<br />
| Start-Bit || 440µs Puls, 1250µs Pause<br />
|-<br />
| 0-Bit || 440µs Puls, 1250µs Pause<br />
|-<br />
| 1-Bit || 1250µs Puls, 440µs Pause<br />
|-<br />
| Stop-Bit || 440µs Puls<br />
|-<br />
| Wiederholung || einmalig nach ca. 38ms<br />
|-<br />
| Tasten-Wiederholung || dritter, fünfter, siebter usw. identischer Frame<br />
|-<br />
| Bit-Order || MSB first?<br />
|-<br />
|}<br />
<br />
==== ROOMBA ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''ROOMBA''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Distance Width<br />
|-<br />
| Frame || 1 Start-Bit + 7 Daten-Bits + 0 Stop-Bit<br />
|-<br />
| Daten || 0 Adress-Bits + 7 Kommando-Bits<br />
|-<br />
| Start-Bit || 2790µs Puls, 930µs Pause<br />
|-<br />
| 0-Bit || 930µs Puls, 2790µs Pause<br />
|-<br />
| 1-Bit || 2790µs Puls, 930µs Pause<br />
|-<br />
| Stop-Bit || kein Stop-Bit<br />
|-<br />
| Wiederholung || dreimalig nach jeweils 18ms?<br />
|-<br />
| Tasten-Wiederholung || noch unbekannt<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
=== Biphase Protokolle ===<br />
[[Datei:Biphase-Coding.png|miniatur|Biphase Coding]]<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
<br />
==== RC5 + RC5X ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#RC5- und RC5x-Protokoll|RC5 + RC5X]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 36 kHz<br />
|-<br />
| Kodierung || Biphase (Manchester)<br />
|-<br />
| Frame RC5 || 2 Start-Bits + 12 Daten-Bits + 0 Stop-Bits<br />
|-<br />
| Daten RC5 || 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits<br />
|-<br />
| Frame RC5X || 1 Start-Bit + 13 Daten-Bits + 0 Stop-Bit<br />
|-<br />
| Daten RC5X || 1 invertiertes Kommando-Bit + 1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits<br />
|-<br />
| Start-Bit || 889µs Pause, 889µs Puls<br />
|-<br />
| 0-Bit || 889µs Puls, 889µs Pause<br />
|-<br />
| 1-Bit || 889µs Pause, 889µs Puls<br />
|-<br />
| Stop-Bit || kein Stop-Bit<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== RCII ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''RCII''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 31.25 kHz<br />
|-<br />
| Kodierung || Biphase (Manchester)<br />
|-<br />
| Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits + 0 Stop-Bits<br />
|-<br />
| Daten || 0 Adress-Bits + 9 Kommando-Bits<br />
|-<br />
| Pre-Bit || 512µs Puls, 2560µs Pause<br />
|-<br />
| Start-Bit || 1024µs Puls, '''keine Pause'''<br />
|-<br />
| 0-Bit || 512µs Pause, 512µs Puls<br />
|-<br />
| 1-Bit || 512µs Puls, 512µs Pause<br />
|-<br />
| Stop-Bit || kein Stop-Bit<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames nach 118ms<br />
|-<br />
| Bemerkung || Beim Tasten-Loslassen wird ein Frame mit Kommando 111111111 = 0x1FF gesandt<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== S100 ====<br />
<br />
Ähnlich zu RC5x, aber 14 statt 13 Daten-Bits und 56kHz Modulation<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''S100''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 56 kHz<br />
|-<br />
| Kodierung || Biphase (Manchester)<br />
|-<br />
| Frame || 1 Start-Bit + 14 Daten-Bits + 0 Stop-Bit<br />
|-<br />
| Daten || 1 invertiertes Kommando-Bit + 1 Toggle-Bit + 5 Adress-Bits + 7 Kommando-Bits<br />
|-<br />
| Start-Bit || 889µs Pause, 889µs Puls<br />
|-<br />
| 0-Bit || 889µs Puls, 889µs Pause<br />
|-<br />
| 1-Bit || 889µs Pause, 889µs Puls<br />
|-<br />
| Stop-Bit || kein Stop-Bit<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== RC6 + RC6A ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#RC6 und RC6A-Protokoll|RC6 + RC6A]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 36 kHz<br />
|-<br />
| Kodierung || Biphase (Manchester)<br />
|-<br />
| Frame RC6 || 1 Start-Bit + 1 Bit "1" + 3 Mode-Bits (000) + 1 Toggle-Bit + 16 Daten-Bits + 2666µs pause<br />
|-<br />
| Frame RC6A || 1 Start-Bit + 1 Bit "1" + 3 Mode-Bits (110) + 1 Toggle-Bit + 31 Daten-Bits + 2666µs pause<br />
|-<br />
| Daten RC6 || 8 Adress-Bits + 8 Kommando Bits<br />
|-<br />
| Daten RC6A || "1" + 14 Hersteller-Bits + 8 System-Bits + 8 Kommando-Bits<br />
|-<br />
| Daten RC6A Pace (Sky) || "1" + 3 Mode-Bits ("110") + 1 Toggle-Bit(UNUSED "0") + 16 Bit + 1 Toggle(!) + 15 Kommando-Bits<br />
|-<br />
| Start-Bit || 2666µs Puls, 889µs Pause<br />
|-<br />
| Toggle 0-Bit || 889µs Pause, 889µs Puls<br />
|-<br />
| Toggle 1-Bit || 889µs Puls, 889µs Pause<br />
|-<br />
| 0-Bit || 444µs Pause, 444µs Puls<br />
|-<br />
| 1-Bit || 444µs Puls, 444µs Pause<br />
|-<br />
| Stop-Bit || kein Stop-Bit<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== GRUNDIG + NOKIA ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#Grundig-Protokoll|GRUNDIG + NOKIA]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz (?)<br />
|-<br />
| Kodierung || Biphase (Manchester)<br />
|-<br />
| Frame-Paket || 1 Start-Frame + 19,968ms Pause + N Info-Frames + 117,76ms Pause + 1 Stop-Frame<br />
|-<br />
| Start-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits (alle 1) + 0 Stop-Bits<br />
|-<br />
| Info-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits + 0 Stop-Bits<br />
|-<br />
| Stop-Frame || 1 Pre-Bit + 1 Start-Bit + 9 Daten-Bits (alle 1) + 0 Stop-Bits<br />
|-<br />
| Daten Grundig || 9 Kommando-Bits + 0 Adress-Bits<br />
|-<br />
| Daten Nokia || 8 Kommando-Bits + 8 Adress-Bits<br />
|-<br />
| Pre-Bit || 528µs Puls, 2639µs Pause<br />
|-<br />
| Start-Bit || 528µs Puls, 528µs Pause<br />
|-<br />
| 0-Bit || 528µs Pause, 528µs Puls<br />
|-<br />
| 1-Bit || 528µs Puls, 528µs Pause<br />
|-<br />
| Stop-Bit || kein Stop-Bit<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Info-Frames mit einem Pausenabstand von 117,76ms<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== IR60 (SDA2008) ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''[[IRMP#IR60 (SDA2008 bzw. MC14497P)|IR60 (SDA2008)]]''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 30 kHz<br />
|-<br />
| Kodierung || Biphase (Manchester)<br />
|-<br />
| Start Frame || 1 Start-Bit + 101111 + 0 Stop-Bits + 22ms Pause<br />
|-<br />
| Daten Frame || 1 Start-Bit + 7 Daten-Bits + 0 Stop-Bits<br />
|-<br />
| Daten || 0 Adress-Bits + 7 Kommando-Bits<br />
|-<br />
| Start-Bit || 528µs Puls, 2639µs Pause<br />
|-<br />
| 0-Bit || 528µs Pause, 528µs Puls<br />
|-<br />
| 1-Bit || 528µs Puls, 528µs Pause<br />
|-<br />
| Stop-Bit || kein Stop-Bit<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Info-Frames mit einem Pausenabstand von 117,76ms<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
==== SIEMENS + RUWIDO ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''SIEMENS + RUWIDO''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 36 kHz? (Merlin-Tastatur mit Ruwido-Protokoll: 56 kHz)<br />
|-<br />
| Kodierung || Biphase (Manchester)<br />
|-<br />
| Frame Siemens || 1 Start-Bit + 22 Daten-Bits + 0 Stop-Bits<br />
|-<br />
| Frame Ruwido || 1 Start-Bit + 17 Daten-Bits + 0 Stop-Bits<br />
|-<br />
| Daten Siemens || 11 Adress-Bits + 10 Kommando-Bits + 1 invertiertes Bit (letztes Bit davor nochmal invertiert)<br />
|-<br />
| Daten Ruwido || 9 Adress-Bits + 7 Kommando-Bits + 1 invertiertes Bit (letztes Bit davor nochmal invertiert)<br />
|-<br />
| Start-Bit || 275µs Puls, 275µs Pause<br />
|-<br />
| 0-Bit || 275µs Pause, 275µs Puls<br />
|-<br />
| 1-Bit || 275µs Puls, 275µs Pause<br />
|-<br />
| Stop-Bit || kein Stop-Bit<br />
|-<br />
| Wiederholung || 1-malige Wiederholung mit gesetztem Repeat-Bit (?)<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des Original-Frames innerhalb von 100ms (?)<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== A1TVBOX ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''A1TVBOX''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Biphase (Manchester) asymmetrisch<br />
|-<br />
| Frame || 2 Start-Bits + 16 Daten-Bits + 0 Stop-Bits<br />
|-<br />
| Daten || 8 Adress-Bits + 8 Kommando-Bits<br />
|-<br />
| Start-Bits || "10", also 250µs Puls, 150µs + 150µs Pause, 250µs Puls<br />
|-<br />
| 0-Bit || 150µs Pause, 250µs Puls<br />
|-<br />
| 1-Bit || 250µs Puls, 150µs Pause<br />
|-<br />
| Stop-Bit || kein Stop-Bit<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || unbekannt<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== MERLIN ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''MERLIN''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 56 kHz<br />
|-<br />
| Kodierung || Biphase (Manchester) asymmetrisch<br />
|-<br />
| Frame || 2 Start-Bits + 18 Daten-Bits + 0 Stop-Bits<br />
|-<br />
| Daten || 8 Adress-Bits + 10 Kommando-Bits<br />
|-<br />
| Start-Bits || "10", also 210µs Puls, 210µs + 210µs Pause, 210µs Puls<br />
|-<br />
| 0-Bit || 210µs Pause, 210µs Puls<br />
|-<br />
| 1-Bit || 210µs Puls, 210µs Pause<br />
|-<br />
| Stop-Bit || kein Stop-Bit<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || unbekannt<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
==== ORTEK ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''ORTEK''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Biphase (Manchester) symmetrisch<br />
|-<br />
| Frame || 2 Start-Bits + 18 Daten-Bits + 0 Stop-Bits<br />
|-<br />
| Daten || 6 Adress-Bits + 2 Spezial-Bits + 6 Kommando-Bits + 4 Spezial-Bits<br />
|-<br />
| Start-Bit || 2000µs Puls, 1000µs Pause<br />
|-<br />
| 0-Bit || 500µs Pause, 500µs Puls<br />
|-<br />
| 1-Bit || 500µs Puls, 500µs Pause<br />
|-<br />
| Stop-Bit || kein Stop-Bit<br />
|-<br />
| Wiederholung || 2 zusätzliche Frames mit gesetzten Spezial-Bits<br />
|-<br />
| Tasten-Wiederholung || N-fache Wiederholung des 2. Frames<br />
|-<br />
| Bit-Order || MSB first<br />
|-<br />
|}<br />
<br />
=== Pulse Position Protokolle ===<br />
<br />
[[Datei:Pulse-Position.png|miniatur|Pulse Position Coding]]<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
''' '''<br />
<br />
==== NETBOX ====<br />
<br />
{| {{Tabelle}}<br />
|- style="background-color:#eeeeee"<br />
! '''NETBOX''' || Wert<br />
|-<br />
|style="width: 15em"|<br />
|style="width: 50em"|<br />
|-<br />
| Frequenz || 38 kHz?<br />
|-<br />
| Kodierung || Pulse Position<br />
|-<br />
| Frame || 1 Start-Bit + 16 Daten-Bits, kein Stop-Bit<br />
|-<br />
| Daten || 3 Adress-Bits + 13 Kommando-Bits<br />
|-<br />
| Start-Bit || 2400µs Puls, 800µs Pause<br />
|-<br />
| Bitlänge || 800µs<br />
|-<br />
| Wiederholung || keine<br />
|-<br />
| Tasten-Wiederholung || Abstand ca. 35ms?<br />
|-<br />
| Bit-Order || LSB first<br />
|-<br />
|}<br />
<br />
== Software-Historie IRMP ==<br />
<br />
Änderungen IRMP in 3.2.x:<br />
<br />
* 22.06.2020: Unterstützung von 433MHz Funkprotokollen (RF)<br />
* 22.06.2020: "Neues Protokoll:" [[IRMP#RF_GEN24|RF_GEN24]]<br />
* 22.06.2020: "Neues Protokoll:" [[IRMP#X10|X10]]<br />
<br />
Ältere Versionen:<br />
<br />
* 26.08.2019: '''Neues Protokoll:''' [[IRMP#METZ|METZ]]<br />
* 26.08.2019: '''Neues Protokoll:''' [[IRMP#ONKYO|ONKYO]]<br />
* 10.09.2018: '''Neues Protokoll:''' [[IRMP#RCII|RCII]]<br />
* 06.09.2018: Support für STM32 mit HAL-Library<br />
* 30.08.2018: Neue Option: IRMP_USE_IDLE_CALL<br />
* 29.08.2018: Portierung auf ChibiOS<br />
* 29.08.2018: Neues Protokoll: GREE<br />
* 19.02.2018: Korrektur bei der Behandlung von irmp_flags nach ungültigen IR-Frames<br />
* 25.08.2017: Neues Protokoll: IRMP16 zwecks transparenter Datenübertragung von 16-Bit-Daten<br />
* Neues Protokoll: SAMSUNGAH<br />
* Verbesserte ESP8266-Unterstützung<br />
* 16.12.2016: Unterstützung von Nicht-Standard Nec-Repetition-Frames (4500us Pause statt 2250us)<br />
* 18.11.2016: Buffer Overflow in irmp-main-avr-uart.c korrigiert<br />
* 19.09.2016: Neues Protokoll [[IRMP#VINCENT|VINCENT]]<br />
* 09.09.2016: Neues Protokoll [[IRMP#MITSU_HEAVY|Mitsubishi Heavy (Klimaanlage)]]<br />
* 09.09.2016: Anpassungen an Compiler PIC C18<br />
* 12.01.2016: Korrektur Portierung auf ESP8266<br />
* 12.01.2016: Portierung auf MBED<br />
* 12.01.2016: Mehrere plattformabhängige Beispiel-Main-Dateien hinzugefügt<br />
<br />
* 17.11.2015: '''Neues Protokoll''': [[IRMP#PANASONIC|PANASONIC (Beamer)]]<br />
* 17.11.2015: Portierung auf ESP8266<br />
* 17.11.2015: Portierung auf Teensy (3.x)<br />
* 10.11.2015: Unterstützung für STM8 Mikrcontroller<br />
* 20.09.2015: '''Neues Protokoll''': [[IRMP#TECHNICS|TECHNICS]]<br />
* 15.06.2015: '''Neues Protokoll''': [[IRMP#ACP24|ACP24]]<br />
* 29.05.2015: '''Neues Protokoll''': [[IRMP#S100|S100]]<br />
* 29.05.2015: Kleinere Korrekturen<br />
* 28.05.2015: Logging für XMega hinzugefügt<br />
* 28.05.2015: Timing-Korrekturen für FAN-Protokoll<br />
* 27.05.2015: '''Neues Protokoll''': [[IRMP#MERLIN|MERLIN]]<br />
* 27.05.2015: '''Neues Protokoll''': [[IRMP#FAN|FAN]]<br />
* 18.05.2015: F_CPU Macro für STM32L1XX hinzugefügt<br />
* 18.05.2015: Korrekturen zur XMega-Portierung<br />
* 23.04.2015: '''Neues Protokoll''': [[IRMP#PENTAX|PENTAX]]<br />
* 23.04.2015: Portierung auf AVR XMega<br />
* 19.09.2014: Kleineren Bug behoben: Fehlendes Newline vor #else eingefügt<br />
* 18.09.2014: Logging für ARM STM32F10X hinzugefügt<br />
* 17.09.2014: PROGMEM-Zugriff für Array irmp_protocol_names[] korrigiert.<br />
* 15.09.2014: Timing-Toleranzen für [[IRMP#KASEIKYO|KASEIKYO]]-Protokoll vergrößert<br />
* 15.09.2014: Wechsel von irmp_protocol_names auf PROGMEM, zusätzliche UART Routinen in irmp-main-avr-uart.c<br />
* 21.07.2014: Portierung auf PIC 12F1840<br />
* 09.07.2014: '''Neues Protokoll''': [[IRMP#SAMSUNG48|SAMSUNG48]]<br />
* 09.07.2014: Kleine Syntaxfehlerkorrektur<br />
* 01.07.2014: Logging für ARM_STM32F4XX eingebaut<br />
* 01.07.214: IRMP port für PIC XC8 compiler, Variadic Macros herausgenommen wg. dummen XC8-Compiler :-(<br />
* 05.06.2014: '''Neues Protokoll''': [[IRMP#LGAIR|LGAIR]]<br />
* 30.05.2014: '''Neues Protokoll''': [[IRMP#SPEAKER|SPEAKER]]<br />
* 30.05.2014: Timings für [[IRMP#SAMSUNG|SAMSUNG]]-Protokolle optimiert<br />
* 20.02.2014: Fehlerhaftes Decodieren des [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]]-Protokolls korrigiert<br />
* 19.02.2014: '''Neue Protokolle''': [[IRMP#RCMM|RCMM32, RCMM24 und RCMM12]]<br />
* 17.09.2014: Timing für [[IRMP#ROOMBA|ROOMBA]] verbessert<br />
* 09.04.2013: '''Neues Protokoll''': [[IRMP#ROOMBA|ROOMBA]]<br />
* 09.04.2013: Verbesserte Frame-Erkennung für [[IRMP#ORTEK|ORTEK (Hama)]]<br />
* 19.03.2013: '''Neues Protokoll''': [[IRMP#ORTEK|ORTEK (Hama)]]<br />
* 19.03.2013: '''Neues Protokoll''': [[IRMP#TELEFUNKEN|TELEFUNKEN]]<br />
* 12.03.2013: Geänderte Timing-Toleranzen für [[IRMP#RECS80|RECS80]]- und [[IRMP#RECS80EXT|RECS80EXT]]-Protokoll<br />
* 21.01.2013: Korrekturen Erkennung des Wiederholungsframes beim [[IRMP#DENON|DENON]]-Protokoll<br />
* 17.01.2013: Korrekturen Frame-Erkennung beim [[IRMP#DENON|DENON]]-Protokoll<br />
* 11.12.2012: '''Neues Protokoll''': [[IRMP#A1TVBOX|A1TVBOX]]<br />
* 07.12.2012: Verbesserte Erkennung von [[IRMP#DENON|DENON]]-Wiederholungsframes<br />
* 19.11.2012: Portierung auf Stellaris LM4F120 Launchpad von TI (ARM Cortex M4)<br />
* 06.11.2012: Korrektur [[IRMP#DENON|DENON]]-Frame-Erkennung<br />
* 26.10.2012: Einige Timer-Korrekturen, Anpassungen an Arduino<br />
* 11.07.2012: '''Neues Protokoll''': [[IRMP#BOSE|BOSE]]<br />
* 18.06.2012: Unterstützung für ATtiny87/167 hinzugefügt<br />
* 05.06.2012: Kleinere Korrekturen Portierung auf ARM STM32<br />
* 05.06.2012: Include-Korrektur in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpextlog.c?view=markup irmpextlog.c]<br />
* 05.06.2012: Bugfix, wenn nur [[IRMP#NEC_+_extended_NEC|NEC]] und [[IRMP#NEC42|NEC42]] aktiviert<br />
* 23.05.2012: Portierung auf ARM STM32<br />
* 23.05.2012: Bugfix Frame-Erkennung beim [[IRMP#DENON|DENON]]-Protokoll<br />
* 27.02.2012: Bug in IR60-Decoder behoben<br />
* 27.02.2012: Bug in CRC-Berechnung von [[IRMP#KASEIKYO|KASEIKYO]]-Frames behoben<br />
* 27.02.2012: Portierung auf C18 Compiler für PIC-Mikroprozessoren<br />
* 13.02.2012: Bugfix: oberstes Bit in Adresse falsch bei [[IRMP#NEC_+_extended_NEC|NEC]]-Protokoll, wenn auch [[IRMP#NEC42|NEC42]]-Protokoll eingeschaltet ist.<br />
* 13.02.2012: Timing von [[IRMP#SAMSUNG|SAMSUNG]]- und [[IRMP#SAMSUNG32|SAMSUNG32]]-Protokoll korrigiert<br />
* 13.02.2012: [[IRMP#KASEIKYO|KASEIKYO]]: Genre2-Bits werden nun im oberen Nibble von flags gespeichert.<br />
* 20.09.2011: '''Neues Protokoll''': [[IRMP#KATHREIN|KATHREIN]]<br />
* 20.09.2011: '''Neues Protokoll''': [[IRMP#SIEMENS_+_RUWIDO|RUWIDO]]<br />
* 20.09.2011: '''Neues Protokoll''': [[IRMP#THOMSON|THOMSON]]<br />
* 20.09.2011: '''Neues Protokoll''': [[IRMP#IR60 (SDA2008)|IR60 (SDA2008)]]<br />
* 20.09.2011: '''Neues Protokoll''': [[IRMP#LEGO|LEGO]]<br />
* 20.09.2011: '''Neues Protokoll''': [[IRMP#NEC16|NEC16]]<br />
* 20.09.2011: '''Neues Protokoll''': [[IRMP#NEC42|NEC42]]<br />
* 20.09.2011: '''Neues Protokoll''': [[IRMP#NETBOX|NETBOX]]<br />
* 20.09.2011: Portierung auf ATtiny84 und ATtiny85<br />
* 20.09.2011: Verbesserung von Tastenwiederholungen bei [[IRMP#RC5_+_RC5X|RC5]]<br />
* 20.09.2011: Verbessertes Decodieren von [[IRMP#Biphase|Biphase]]-Protokollen<br />
* 20.09.2011: Korrekturen am [[IRMP#RECS80|RECS80]]-Decoder<br />
* 20.09.2011: Korrekturen beim Erkennen von zusätzlichen Bits im SIRCS-Protocol<br />
* 18.01.2011: Korrekturen für [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]]-Protokoll<br />
* 18.01.2011: '''Neues Protokoll''': [[IRMP#NIKON|NIKON]]<br />
* 18.01.2011: Speichern der zusätzlichen Bits (>12) im [[IRMP#SIRCS|SIRCS]]-Protokoll in der Adresse<br />
* 18.01.2011: Timing-Korrekturen für [[IRMP#DENON|DENON]]-Protokoll<br />
* 04.09.2010: Bugfix für F_INTERRUPTS >= 16000<br />
* 02.09.2010: '''Neues Protokoll''': [[IRMP#RC6_+_RC6A|RC6A]]<br />
* 29.08.2010: '''Neues Protokoll''': [[IRMP#JVC|JVC]]<br />
* 29.08.2010: [[IRMP#KASEIKYO|KASEIKYO]]-Protokoll: Berücksichtigung der Genre-Bits. '''ACHTUNG: dadurch neue Command-Codes!'''<br />
* 29.08.2010: [[IRMP#KASEIKYO|KASEIKYO]]-Protokoll: Verbesserte Behandlung von Wiederholungs-Frames<br />
* 29.08.2010: Verbesserte Unterstützung des [[IRMP#APPLE|APPLE]]-Protokolls. '''ACHTUNG: dadurch neue Adress-Codes!'''<br />
* 01.07.2010: Bugfix: Einführen eines Timeouts für [[IRMP#NEC_+_extended_NEC|NEC]]-Repetition-Frames, um "Geisterkommandos" zu verhindern.<br />
* 26.06.2010: Bugfix: Deaktivieren von [[IRMP#RECS80|RECS80]], [[IRMP#RECS80EXT|RECS80EXT]] & [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]] bei geringer Interrupt-Rate<br />
* 25.06.2010: '''Neues Protokoll''': [[IRMP#RCCAR|RCCAR]]<br />
* 25.06.2010: Tastenerkennung für [[IRMP#FDC|FDC]]-Protokoll (IR-keyboard) erweitert<br />
* 25.06.2010: Interrupt-Frequenz nun bis zu 20kHz möglich<br />
* 09.06.2010: '''Neues Protokoll''': [[IRMP#FDC|FDC]] (IR-keyboard)<br />
* 09.06.2010: Timing für [[IRMP#DENON|DENON]]-Protokoll korrigiert<br />
* 02.06.2010: '''Neues Protokoll''': [[IRMP#SIEMENS_+_RUWIDO|SIEMENS]] (Gigaset)<br />
* 26.05.2010: '''Neues Protokoll''': [[IRMP#GRUNDIG_+_NOKIA|NOKIA]]<br />
* 26.05.2010: Bugfix Auswertung von langen Tastendrücken bei [[IRMP#GRUNDIG_+_NOKIA|GRUNDIG]]-Protokoll<br />
* 17.05.2010: Bugfix [[IRMP#SAMSUNG32|SAMSUNG32]]-Protokoll: Kommando-Bit-Maske korrigiert<br />
* 16.05.2010: '''Neues Protokoll''': [[IRMP#GRUNDIG_+_NOKIA|GRUNDIG]]<br />
* 16.05.2010: Behandlung von automatischen Frame-Wiederholungen beim [[IRMP#SIRCS|SIRCS]]-, [[IRMP#SAMSUNG32|SAMSUNG32]]- und [[IRMP#NUBERT|NUBERT]]-Protokoll verbessert.<br />
* 28.04.2010: Nur einige kosmetische Code-Optimierungen<br />
* 16.04.2010: Sämtliche Timing-Toleranzen angepasst/optimiert<br />
* 12.04.2010: '''Neues Protokoll''': [[IRMP#B&O|Bang & Olufsen]]<br />
* 29.03.2010: Bugfix beim Erkennen von mehrfachen [[IRMP#NEC_+_extended_NEC|NEC]]-Repetition-Frames<br />
* 29.03.2010: Konfiguration in [http://www.mikrocontroller.net/svnbrowser/irmp/irmpconfig.h?view=markup irmpconfig.h] ausgelagert<br />
* 29.03.2010: Einführung einer Programmversion in README.txt: Version 1.0<br />
* 17.03.2010: '''Neues Protokoll''': [[IRMP#NUBERT|NUBERT]]<br />
* 16.03.2010: Korrektur der RECS80-Startbit-Timings<br />
* 16.03.2010: '''Neues Protokoll''': [[IRMP#RECS80EXT|RECS80 Extended]]<br />
* 15.03.2010: Codeoptimierung<br />
* 14.03.2010: Portierung auf PIC<br />
* 11.03.2010: Anpassungen an verschiedene ATMega-Typen durchgeführt<br />
* 07.03.2010: Bugfix: Zurücksetzen der Statemachine nach einem unvollständigen [[IRMP#RC5_+_RC5X|RC5]]-Frame<br />
* 05.03.2010: '''Neues Protokoll''': [[IRMP#APPLE|APPLE]]<br />
* 05.03.2010: Die Daten irmp_data.addr + irmp_data.command werden nun in der jeweiligen Bit-Order des verwendeten Protokolls gespeichert<br />
* 04.03.2010: '''Neues Protokoll''': [[IRMP#SAMSUNG32|SAMSUNG32]] (Mix aus [[IRMP#SAMSUNG|SAMSUNG]] & [[IRMP#NEC_+_extended_NEC|NEC]]-Protokoll)<br />
* 04.03.2010: Änderung der [[IRMP#SIRCS|SIRCS]]- und [[IRMP#KASEIKYO|KASEIKYO]]-Toleranzen<br />
* 02.03.2010: [[IRMP#SIRCS|SIRCS]]: Korrekte Erkennung und Unterdrückung von automatischen Frame-Wiederholungen<br />
* 02.03.2010: [[IRMP#SIRCS|SIRCS]]: Device-ID-Bits werden nun in irmp_data.command und nicht mehr in irmp_data.address gespeichert<br />
* 02.03.2010: Vergrößerung des Scan Buffers (zwecks Protokollierung)<br />
* 24.02.2010: Neue Variable flags in IRMP_DATA zur Erkennung von langen Tastendrücken<br />
* 20.02.2010: Bugfix [[IRMP#DENON|DENON]]-Protokoll: Wiederholungsframe grundsätzlich invertiert<br />
* 19.02.2010: Erkennung von [[IRMP#NEC_+_extended_NEC|NEC]]-Protokoll-Varianten, z.&nbsp;B. [[IRMP#APPLE|APPLE]]-Fernbedienung<br />
* 19.02.2010: Erkennung von [[IRMP#RC6_+_RC6A|RC6]]- und [[IRMP#DENON|DENON]]-Protokoll<br />
* 19.02.2010: Verbesserung des [[IRMP#RC5_+_RC5X|RC5]]-Decoders (Bugfixes)<br />
* 13.02.2010: Bugfix: Puls/Pausen-Counter um 1 zu niedrig, nun bessere Erkennung bei Protokollen mit sehr kurzen Pulszeiten<br />
* 13.02.2010: Erkennung der [[IRMP#NEC_+_extended_NEC|NEC]]-Wiederholungssequenz<br />
* 12.02.2010: [[IRMP#RC5_+_RC5X|RC5]]-Protokoll-Decoder hinzugefügt<br />
* 05.02.2010: Konflikt zwischen [[IRMP#SAMSUNG|SAMSUNG]]- und [[IRMP#MATSUSHITA|MATSUSHITA]]-Protokoll beseitigt<br />
* 07.01.2010: Erste Version<br />
<br />
== Literatur ==<br />
<br />
=== IR-Übersicht ===<br />
<br />
* http://www.sbprojects.com/knowledge/ir/index.php<br />
* http://www.epanorama.net/links/irremote.html<br />
* http://www.elektor.de/jahrgang/2008/juni/cc2-avr-projekt-%283%29-unsichtbare-kommandos.497184.lynkx?tab=4 (IR Übersicht & RC5)<br />
<br />
=== SIRCS-Protokoll ===<br />
<br />
* http://www.sbprojects.com/knowledge/ir/sirc.php<br />
* http://www.ustr.net/infrared/sony.shtml<br />
* http://users.telenet.be/davshomepage/sony.htm<br />
* http://picprojects.org.uk/projects/sirc/<br />
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf<br />
<br />
=== NEC-Protokoll ===<br />
<br />
* http://www.sbprojects.com/knowledge/ir/nec.php<br />
* http://www.ustr.net/infrared/nec.shtml<br />
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf<br />
<br />
=== ACP24-Protokoll ===<br />
<br />
Das ACP24-Protokoll wird von Stiebel-Eltron-Klimaanlagen verwendet.<br />
<br />
Die 70 Datenbits sind folgendermaßen aufgebaut:<br />
<br />
1 2 3 4 5 6<br />
0123456789012345678901234567890123456789012345678901234567890123456789<br />
N VVMMM ? ??? t vmA x y TTTT<br />
0011001000000111000010001010000000000000000010000000000000000000001111on, temp=30<br />
<br />
Diese werden in die folgenden 16 Bits von irmp_data.command gewandelt:<br />
<br />
5432109876543210<br />
NAVVvMMMmtxyTTTT<br />
<br />
Bedeutung der Symbole:<br />
<br />
TTTT = Temperatur + 15 Grad<br />
TTTT<br />
----------<br />
0000 ???<br />
0001 ???<br />
0010 ???<br />
0011 18 Grad<br />
0100 19 Grad<br />
0101 20 Grad<br />
0110 21 Grad<br />
...<br />
1111 30 Grad<br />
<br />
N = Nacht-Modus<br />
N<br />
----------<br />
0 aus<br />
1 ein<br />
<br />
VV = Luefter-Stufe, v muss 1 sein!<br />
VV v<br />
----------<br />
00 1 Stufe 1<br />
01 1 Stufe 2<br />
10 1 Stufe 3<br />
11 1 Automatik<br />
<br />
MMM = Modus<br />
MMM m<br />
----------<br />
000 0 Ausschalten<br />
001 0 Einschalten<br />
001 1 Kuehlen<br />
010 1 Lueften<br />
011 1 Entfeuchten<br />
100 1 ???<br />
101 1 ---<br />
110 1 ---<br />
111 1 ---<br />
<br />
A = Automatik-Programm<br />
A<br />
----------<br />
0 aus<br />
1 ein<br />
<br />
t = Timer<br />
t x y<br />
----------<br />
1 1 0 Timer 1<br />
1 0 1 Timer 2<br />
<br />
Um die Klimaanlage mittels [[IRSND]] anzusteuern, kann man folgende Funktionen verwenden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include "irmp.h"<br />
#include "irsnd.h"<br />
<br />
#define IRMP_ACP24_TEMPERATURE_MASK 0x000F // TTTT<br />
<br />
#define IRMP_ACP24_SET_TIMER_MASK (1<<6) // t<br />
#define IRMP_ACP24_TIMER1_MASK (1<<5) // x<br />
#define IRMP_ACP24_TIMER2_MASK (1<<4) // y<br />
<br />
#define IRMP_ACP24_SET_MODE_MASK (1<<7) // m<br />
#define IRMP_ACP24_MODE_POWER_ON_MASK (1<<8) // MMMm = 0010 Einschalten<br />
#define IRMP_ACP24_MODE_COOLING_MASK (IRMP_ACP24_SET_MODE_MASK | (1<<8)) // MMMm = 0011 Kuehlen<br />
#define IRMP_ACP24_MODE_VENTING_MASK (IRMP_ACP24_SET_MODE_MASK | (1<<9)) // MMMm = 0101 Lueften<br />
#define IRMP_ACP24_MODE_DEMISTING_MASK (IRMP_ACP24_SET_MODE_MASK | (1<<10) | (1<<8)) // MMMm = 1001 Entfeuchten<br />
<br />
#define IRMP_ACP24_SET_FAN_STEP_MASK (1<<11) // v<br />
#define IRMP_ACP24_FAN_STEP_MASK 0x3000 // VV<br />
#define IRMP24_ACP_FAN_STEP_BIT 12 // VV<br />
#define IRMP_ACP24_AUTOMATIC_MASK (1<<14) // A<br />
#define IRMP_ACP24_NIGHT_MASK (1<<15) // N<br />
<br />
<br />
// possible values for acp24_set_mode();<br />
#define ACP24_MODE_COOLING 1<br />
#define ACP24_MODE_VENTING 2<br />
#define ACP24_MODE_DEMISTING 3<br />
<br />
static uint8_t temperature = 18; // 18 degrees<br />
<br />
static void<br />
acp24_send (uint16_t cmd)<br />
{<br />
IRMP_DATA irmp_data;<br />
<br />
cmd |= (temperature - 15) & IRMP_ACP24_TEMPERATURE_MASK;<br />
<br />
irmp_data.protocol = IRMP_ACP24_PROTOCOL;<br />
irmp_data.address = 0x0000;<br />
irmp_data.command = cmd;<br />
irmp_data.flags = 0;<br />
<br />
irsnd_send_data (&irmp_data, 1);<br />
}<br />
<br />
void<br />
acp24_set_temperature (uint8_t temp)<br />
{<br />
uint16_t cmd = IRMP_ACP24_MODE_POWER_ON_MASK;<br />
<br />
temperature = temp;<br />
acp24_send (cmd);<br />
}<br />
<br />
void<br />
acp24_off (void)<br />
{<br />
uint16_t cmd = 0;<br />
acp24_send (cmd);<br />
}<br />
<br />
#define ACP_FAN_STEP1 0<br />
#define ACP_FAN_STEP2 1<br />
#define ACP_FAN_STEP3 2<br />
#define ACP_FAN_AUTOMATIC 3<br />
<br />
void<br />
acp24_fan (uint8_t fan_step)<br />
{<br />
uint16_t cmd = IRMP_ACP24_MODE_POWER_ON_MASK;<br />
<br />
cmd |= IRMP_ACP24_SET_FAN_STEP_MASK | ((fan_step << IRMP24_ACP_FAN_STEP_BIT) & IRMP_ACP24_FAN_STEP_MASK);<br />
<br />
acp24_send (cmd);<br />
}<br />
<br />
void<br />
acp24_set_mode (uint8_t mode)<br />
{<br />
uint16_t cmd = 0;<br />
<br />
switch (mode)<br />
{<br />
case ACP24_MODE_COOLING: cmd = IRMP_ACP24_MODE_COOLING_MASK; break;<br />
case ACP24_MODE_VENTING: cmd = IRMP_ACP24_MODE_VENTING_MASK; break;<br />
case ACP24_MODE_DEMISTING: cmd = IRMP_ACP24_MODE_DEMISTING_MASK; break;<br />
default: return;<br />
}<br />
acp24_send (cmd);<br />
}<br />
<br />
void<br />
acp24_program_automatic (void)<br />
{<br />
uint16_t cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_AUTOMATIC_MASK;<br />
acp24_send (cmd);<br />
}<br />
<br />
void<br />
acp24_program_night (void)<br />
{<br />
uint16_t cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_NIGHT_MASK;<br />
acp24_send (cmd);<br />
}<br />
</syntaxhighlight><br />
<br />
=== LGAIR-Protokoll ===<br />
<br />
Der LG Air Conditioner ist eine Klimaanlage, die durch eine "intelligente" Fernbedienung gesteuert wird.<br />
Dies sind die "entschlüsselten" Daten:<br />
<br />
<code><br />
Befehl AAAAAAAA PW Z S T mmm tttt vvvv PPPP<br />
--------------------------------------------------------------------<br />
ON 23C 10001000 00 0 0 0 000 1000 0100 1100<br />
ON 26C 10001000 00 0 0 0 000 1011 0100 1111<br />
<br />
OFF 10001000 11 0 0 0 000 0000 0101 0001<br />
TURN OFF 10001000 11 0 0 0 000 0000 0101 0001 (18C currently, identical with off)<br />
<br />
TEMP DOWN 23C 10001000 00 0 0 1 000 1000 0100 0100<br />
MODE (to mode0, 23C) 10001000 00 0 0 1 000 1000 0100 0100<br />
<br />
TEMP UP (24C) 10001000 00 0 0 1 000 1001 0100 0101<br />
TEMP DOWN 24C 10001000 00 0 0 1 000 1001 0100 0101<br />
<br />
TEMP UP (25C) 10001000 00 0 0 1 000 1010 0100 0110<br />
TEMP DOWN 25C 10001000 00 0 0 1 000 1010 0100 0110<br />
<br />
TEMP UP (26C) 10001000 00 0 0 1 000 1011 0100 0111<br />
<br />
MODE 10001000 00 0 0 1 011 0111 0100 0110 (to mode1, 22C - when switching to mode1 temp automaticall sets to 22C)<br />
ON (mode1, 22C) 10001000 00 0 0 0 011 0111 0100 1110<br />
<br />
MODE 10001000 00 0 0 1 001 1000 0100 0101 (to mode2, no temperature displayed)<br />
ON (mode2) 10001000 00 0 0 0 001 1000 0100 1101<br />
MODE (to mode3, 23C) 10001000 00 0 0 1 100 1000 0100 1000<br />
ON (mode3, 23C) 10001000 00 0 0 0 100 1000 0100 0000<br />
<br />
VENTILATION SLOW 10001000 00 0 0 1 000 0011 0000 1011<br />
VENTILATION MEDIUM 10001000 00 0 0 1 000 0011 0010 1101<br />
VENTILATION HIGH 10001000 00 0 0 1 000 0011 0100 1111<br />
VENTILATION LIGHT 10001000 00 0 0 1 000 0011 0101 0000<br />
<br />
SWING ON/OFF 10001000 00 0 1 0 000 0000 0000 0001<br />
<br />
<br />
Format: 1 start bit + 8 address bits + 16 data bits + 4 checksum bits + 1 stop bit<br />
<br />
Address: AAAAAAAA = 0x88 (8 bits)<br />
<br />
Data: PW Z S T MMM tttt vvvv PPPP (16 bits)<br />
<br />
PW: Power: 00 = On, 11 = Off<br />
<br />
Z: N/A: Always 0<br />
<br />
S: Swing: 1 = Toggle swing, all other data bits are zeros.<br />
<br />
T: Temp/Vent: 1 = Set temperature and ventilation<br />
<br />
MMM: Mode, can be combined with temperature<br />
000=Mode 0<br />
001=Mode 2<br />
010=????<br />
011=Mode 1<br />
100=Mode 3<br />
101=???<br />
111=???<br />
<br />
tttt: Temperature:<br />
0000=used by OFF command<br />
0001=????<br />
0010=????<br />
0011=18°C<br />
0100=19°C<br />
0101=20°C<br />
0110=21°C<br />
0111=22°C<br />
1000=23°C<br />
1001=24°C<br />
1010=25°C<br />
1011=26°C<br />
1011=27°C<br />
1100=28°C<br />
1101=29°C<br />
1111=30°C<br />
<br />
vvvv: Ventilation:<br />
0000=slow<br />
0010=medium<br />
0011=????<br />
0100=high<br />
0101=light<br />
0110=????<br />
0111=????<br />
...<br />
1111=????<br />
<br />
Checksum: PPPP = (DataNibble1 + DataNibble2 + DataNibble3 + DataNibble4) & 0x0F<br />
</code><br />
<br />
=== NEC16-Protokoll (JVC) ===<br />
<br />
* http://www.sbprojects.com/knowledge/ir/jvc.php<br />
* http://www.ustr.net/infrared/jvc.shtml<br />
<br />
=== SAMSUNG-Protokoll ===<br />
<br />
(wurde aus diversen Protokollen (Daewoo u.ä.) zusammengereimt, daher kein direkter Link auf irgendwelche SAMSUNG-Dokumentation verfügbar)<br />
<br />
Hier ein Link zum Daewoo-Protokoll, welches dasselbe Prinzip des Sync-Bits in der Mitte eines Frames nutzt, jedoch mit anderen Timing-Werten arbeitet:<br />
<br />
* http://users.telenet.be/davshomepage/daewoo.htm<br />
<br />
=== MATSUHITA-Protokoll ===<br />
<br />
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf<br />
<br />
=== KASEIKYO-Protokoll (auch "Japan-Protokoll") ===<br />
<br />
* http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf<br />
* http://www.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf<br />
<br />
=== RECS80- und RECS80-Extended-Protokoll ===<br />
<br />
* http://www.sbprojects.com/knowledge/ir/recs80.php<br />
<br />
=== RC5- und RC5x-Protokoll ===<br />
<br />
* http://www.sbprojects.com/knowledge/ir/rc5.php<br />
* http://users.telenet.be/davshomepage/rc5.htm<br />
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf<br />
* http://www.opendcc.de/info/rc5/rc5.html<br />
<br />
=== Denon-Protokoll ===<br />
<br />
* http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON<br />
* http://www.manualowl.com/m/Denon/AVR-3803/Manual/170243<br />
<br />
=== RC6 und RC6A-Protokoll ===<br />
<br />
* http://www.sbprojects.com/knowledge/ir/rc6.php<br />
* http://www.picbasic.nl/info_rc6_uk.htm<br />
<br />
=== Bang & Olufsen ===<br />
<br />
* http://www.mikrocontroller.net/attachment/33137/datalink.pdf<br />
<br />
=== Grundig-Protokoll ===<br />
<br />
* http://www.see-solutions.de/sonstiges/Grundig_10bit.pdf<br />
<br />
=== Nokia-Protokoll ===<br />
<br />
* http://www.sbprojects.com/knowledge/ir/nrc17.php<br />
<br />
=== IR60 (SDA2008 bzw. MC14497P) ===<br />
<br />
* http://www.datasheetcatalog.org/datasheet/motorola/MC14497P.pdf<br />
<br />
=== LEGO Power Functions RC ===<br />
<br />
* http://www.philohome.com/pf/LEGO_Power_Functions_RC_v110.pdf<br />
* http://www.philohome.com/pf/LEGO_Power_Functions_RC_v120.pdf<br />
<br />
=== RCMM-Protokoll ===<br />
<br />
* http://www.sbprojects.com/knowledge/ir/rcmm.php<br />
<br />
=== Diverse Protokolle ===<br />
<br />
* http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf<br />
* http://www.celadon.com/infrared_protocol/infrared_protocols_samples.pdf<br />
* http://www.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf<br />
<br />
== IRMP auf Youtube ==<br />
<br />
Einige Videos zu [[IRMP#top|IRMP]] habe ich auf Youtube gefunden:<br />
<br />
* IRMP. AVR (atmega8, avr-gcc) IR decoder. http://www.youtube.com/watch?v=Q7DJvLIyTEI<br />
<br />
* Room-fillig powerful 100W RGB LED mood light - Raumfüllendes Stimmungslicht http://www.youtube.com/watch?v=W4tI2axR3-w<br />
<br />
* ir steckdose mit teachin http://www.youtube.com/watch?v=SRs98dIe2WE<br />
<br />
* RGB-LED mit iR Fernbedienung und Atmega8 / irmp steuern https://www.youtube.com/watch?v=Lf1Z318NKic<br />
<br />
== Weitere Artikel zu IRMP ==<br />
<br />
[http://www.infineon.com/dgdl/RF2ir+WhitePaper+V1.0.pdf?folderId=db3a3043191a246301192dd3ee2c2ae4&fileId=db3a30432b57a660012b5c16272c2e81 Whitepaper von Martin Gotschlich, Infineon Technologies AG]<br />
<br />
== Hardware / IRMP-Projekte ==<br />
<br />
=== Remote IRMP ===<br />
<br />
Netzwerkfähiger Infrarot-Sender und Empfänger mit Android Handy als Fernbedienung:<br />
<br />
* http://www.mikrocontroller.net/articles/Remote_IRMP<br />
<br />
=== IR-Tester mit AVR-NET-IO ===<br />
<br />
Implementierung für Pollin AVR-NET-IO mit Pollin ADD-ON Board:<br />
* http://son.ffdf-clan.de/include.php?path=forumsthread&threadid=703<br />
<br />
=== USB IR Remote Receiver ===<br />
<br />
USB IR Remote Receiver von Hugo Portisch:<br />
* http://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver<br />
<br />
=== USB IR Empfänger/Sender/Einschalter mit Wakeup-Timer ===<br />
<br />
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/123572-fertig-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/<br />
<br />
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_ein_USB_IR_Empf%C3%A4nger/Sender/Einschalter_mit_Wakeup-Timer<br />
<br />
=== USBASP ===<br />
<br />
IR-Einschalter auf Grundlage des USBasp<br />
* http://wiki.easy-vdr.de/index.php?title=USBASP_Einschalter<br />
<br />
=== Servo-gesteuerter IR-Sender ===<br />
<br />
Servo-gesteuerter IR-Sender mit Anlernfunktion von Stefan Pendsa:<br />
* http://forum.mikrokopter.de/topic-21060.html<br />
* [http://svn.mikrokopter.de/listing.php?repname=Projects&path=%2FServo-Controlled+IR-Transmitter%2F&#Ad2417800d6aa14bf08c571a896e9def7 SVN]<br />
<br />
=== Lernfähige IR-Fernbedienung ===<br />
<br />
Lernfähige IR-Fernbedienung von Robert und Frank M.<br />
* http://www.mikrocontroller.net/articles/DIY_Lernfähige_Fernbedienung_mit_IRMP<br />
<br />
=== AVR Moodlight ===<br />
<br />
AVR Moodlight von Axel Schwenke<br />
* http://www.mikrocontroller.net/topic/244768<br />
<br />
RGB Moodlight mit STM8 von Axel Schwenke<br />
* https://www.mikrocontroller.net/topic/380098<br />
<br />
=== Infinity-Mirror-LED-Deckenlampe ===<br />
<br />
Infinity-Mirror-LED-Deckenlampe mit Fernbedienung von Philipp Meißner<br />
* http://digital-nw.de/Infinity-Mirror.htm<br />
<br />
=== Kinosteuerung ===<br />
<br />
Kinosteuerung von Owagner<br />
* http://ccc.zerties.org/index.php/Benutzer:Owagner<br />
<br />
=== Phasenanschnittsdimmer ===<br />
<br />
Phasenanschnittsdimmer - steuerbar über IR-Fernbedienung:<br />
<br />
* http://flosserver.dyndns.org/phasenanschnittsdimmer.php<br />
<br />
=== IRDioder – Ikea Dioder Hack ===<br />
<br />
Ikea Dioder Hack mit Atmel und Infrarotempfaenger:<br />
<br />
* http://marco-difeo.de/tag/infrared/<br />
<br />
=== Expedit Coffee Bar ===<br />
<br />
Ikea Expedit Regal - umgebaut zur Kaffee-Bar:<br />
<br />
* http://chaozlabs.blogspot.de/2013/09/expedit-coffee-bar.html<br />
<br />
=== Arduino als IR-Empfänger ===<br />
<br />
Arduino als IR-Empfänger:<br />
<br />
* http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/110918-arduino-als-ir-empf%C3%A4nger-einsetzen/<br />
<br />
Weitere Beispiele aus der Arduino Library:<br />
<br />
* https://github.com/ukw100/IRMP/tree/master/examples<br />
<br />
=== IR-Lautstärkesteuerung mit Stellaris Launchpad ===<br />
<br />
IR-Lautstärkesteuerung mit Stellaris Launchpad (ARM Cortex-M4F):<br />
<br />
* http://www.anthonyvh.com/2013/03/31/ir-volume-control/<br />
<br />
=== RemotePi Board ===<br />
<br />
Herunterfahren eines RaspPI mittels Fernbedienung:<br />
<br />
* http://www.msldigital.com/pages/more-information<br />
<br />
=== Ethernut & IRMP ===<br />
<br />
IRMP unter dem RTOS Ethernut:<br />
<br />
* http://www.klkl.de/ethernut.html<br />
<br />
=== LED strip Remote Control ===<br />
<br />
LED-Beleuchtung per Fernbedienung steuern:<br />
<br />
* http://www.solderlab.de/index.php/misc/led-strip-remote-control<br />
<br />
=== ADAT Audio Mixer ===<br />
<br />
Audio Mixer:<br />
<br />
* http://mailtonne.de/adat-audio-mixer/<br />
<br />
=== Ethersex & IRMP ===<br />
<br />
IRMP + IRSND Modul in Ethersex, einer modularen Firmware für AVR MCUs<br />
<br />
* http://ethersex.de/index.php/IRMP<br />
<br />
=== Mastermind Solver ===<br />
<br />
Mastermind-Solver mit LED-Streifen und IR-Fernbedienung <br />
<br />
* http://www.mystrobl.de/Plone/basteleien/weitere-bulls-and-cows-mastermind-implementationen/mm-v1821/mastermind-solver-mit-led-streifen-und-ir-fernbedienung<br />
<br />
=== A MythTV Remote Control without LIRC ===<br />
<br />
PC Remote Control mit ATtiny85<br />
<br />
* http://tomscircuits.blogspot.de/2014/12/a-mythtv-remote-control-without-lirc.html<br />
<br />
=== IRMP2Keyboard infrared remote to PS2/USB keyboard converter ===<br />
<br />
IRMP2Keyboard infrared remote to PS2/USB keyboard converter<br />
<br />
https://github.com/M-Reimer/irmp2keyboard<br />
<br />
=== IRMP + IRSND Library für STM32F4 ===<br />
<br />
IRMP für STM32F4<br />
<br />
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1516<br />
<br />
IRSND für STM32F4<br />
<br />
* http://mikrocontroller.bplaced.net/wordpress/?page_id=1940<br />
<br />
=== IRMP auf STM32 - Bauanleitung ===<br />
<br />
* http://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_Bauanleitung<br />
<br />
=== Studienarbeit - Erweiterung der Arduino Plattform ===<br />
<br />
* http://www.eislab.fim.uni-passau.de/files/publications/2010/StudentDiener_ErweiterungDerArduinoPlattform.pdf<br />
<br />
=== IRMP und IRSND über Funkstrecke ===<br />
<br />
* https://www.mikrocontroller.net/topic/444061<br />
<br />
== Danksagung ==<br />
<br />
Ganz herzlich bedanken möchte ich mich bei Vlad Tepesch, Klaus Leidinger und Peter K., die mich mit Scan-Dateien ihrer Infrarot-Fernbedienungen versorgt haben. Dank auch an Klaus für seine nächtelangen Tests von [[IRMP#top|IRMP]] & [[IRSND#top|IRSND]].<br />
<br />
Ebenso bedanken möchte ich mich bei Christian F. für seine Tipps zur PIC-Portierung. Vielen Dank auch an gera für die Portierung auf den PIC-C18 Compiler. Für die Portierung auf ARM STM32 bedanke ich mich herzlich bei kichi (Michael K.). Vielen Dank auch an Markus Schuster für die Portierung auf Stellaris LM4F120 Launchpad von TI (ARM Cortex M4). Danke an Matthias Frank für die Portierung auf XMega. Vielen Dank auch an Wolfgang S. für die Portierung auf ESP8266, Achill Hasler für die Portierung auf Teensy. Und zuletzt noch Dank an Axel Schwenke für den Port auf STM8.<br />
<br />
Mein Dank geht auch an Dániel Körmendi, welcher mich nicht nur immer wieder fleißig mit Scans versorgt, sondern auch das LG-AIR-Protokoll in den [[IRSND]] eingebaut hat. Danke auch hier an Ulrich v.d. Kammer für die [[IRSND]]-Variante des Pentax-Protokolls.<br />
<br />
Als letztes möchte ich mich bedanken bei Jojo S., der den größten Teil dieser Dokumentation ins Englische übersetzt hat. Great Job, Jojo!<br />
<br />
== Diskussion ==<br />
<br />
Meinungen, Verbesserungsvorschläge, harsche Kritik und ähnliches kann im [http://www.mikrocontroller.net/topic/162119 Beitrag: Infrared Multi Protocol Decoder] geäussert werden.<br />
<br />
Viel Spaß mit IRMP!<br />
<br />
[[Kategorie:Infrarot]]<br />
[[Kategorie:AVR-Projekte]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=101360
Avr-gcc Bugs
2019-12-12T21:41:04Z
<p>Gjlayde: /* Binutils / avr-libc */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57114 57114] || Do not #define abs / labs<br />
|<br />
|-<br />
| [https://savannah.nongnu.org/bugs/?57071 57071] || Fix math.h and function names that block 64-bit double<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| 8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=101268
Avr-gcc Bugs
2019-10-31T16:20:09Z
<p>Gjlayde: /* Optimierung */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR90706 90706] || Useless code generated for stack / register operations<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| 8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=101218
Avr-gcc Bugs
2019-10-13T09:16:38Z
<p>Gjlayde: /* Bugs */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR92055 92055] || Support 64-bit double<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
| patch<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| 8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=101217
Avr-gcc Bugs
2019-10-13T09:14:31Z
<p>Gjlayde: /* Optimierung */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR91189 91189] || 20% binary size regression in v9.1.0 from v8.3.0<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| 8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial&diff=100753
AVR-GCC-Tutorial
2019-07-31T18:03:59Z
<p>Gjlayde: /* Register */ Typo</p>
<hr />
<div>Dieses Tutorial soll den Einstieg in die Programmierung von Atmel [[AVR]]-Mikrocontrollern in der Programmiersprache [[C]] mit dem freien C-Compiler [[avr-gcc]] aus der [http://gcc.gnu.org/ GNU Compiler Collection] (GCC) erleichtern.<br />
<br />
Vorausgesetzt werden Grundkenntnisse der Programmiersprache C. Diese Kenntnisse kann man sich online erarbeiten, z. B. mit dem [http://www.schellong.de/c.htm C Tutorial von Helmut Schellong] ([[C|Liste von C-Tutorials]]). Nicht erforderlich sind Vorkenntnisse in der Programmierung von Mikrocontrollern.<br />
<br />
= Vorwort =<br />
<br />
In diesem Text wird häufig auf die Standardbibliothek avr-libc verwiesen, für die es eine [http://www.nongnu.org/avr-libc/user-manual/index.html Online-Dokumentation] gibt, in der sich auch viele nützliche Informationen zum Compiler und zur Programmierung von AVR-Controllern finden. Beim Paket [[WinAVR]] gehört die avr-libc Dokumentation zum Lieferumfang und wird mitinstalliert.<br />
<br />
Der Compiler und die Standardbibliothek avr-libc werden ständig weiterentwickelt. Einige Unterschiede, die sich im Verlauf der Entwicklung ergeben haben, werden hier und im Artikel [[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen]] zwar angesprochen, Anfängern und Umsteigern sei jedoch empfohlen, eine aktuelle Versionen zu nutzen.<br />
<br />
Das ursprüngliche Tutorial stammt von Christian Schifferle, viele neue Abschnitte und aktuelle Anpassungen von Martin Thomas.<br />
<br />
Dieses Tutorial ist in [[Media:AVR-GCC-Tutorial.pdf|PDF-Form]] erhältlich (zur Zeit nur eine sehr veraltete Version).<br />
<br />
== Weiterführende Kapitel ==<br />
<br />
Um dieses riesige Tutorial etwas überschaubarer zu gestalten, wurden einige Kapitel ausgelagert, die nicht unmittelbar mit den Grundlagen von avr-gcc in Verbindung stehen. All diese Seiten gehören zur [[:Kategorie:avr-gcc Tutorial]].<br />
<br />
;UART: → Hauptartikel: ''[[AVR-GCC-Tutorial/Der UART|Der UART]]''<br />
<br />
;ADC: → Hauptartikel: ''[[AVR-GCC-Tutorial/Analoge Ein- und Ausgabe|Analoge Ein- und Ausgabe (ADC)]]''<br />
<br />
;Timer: → Hauptartikel: ''[[AVR-GCC-Tutorial/Die Timer und Zähler des AVR|Die Timer und Zähler des AVR]]''<br />
<br />
;LCD: → Hauptartikel: ''[[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Ansteuerung]]''<br />
<br />
;Watchdog: → Hauptartikel: ''[[AVR-GCC-Tutorial/Der Watchdog|Der Watchdog]]''<br />
<br />
;Assembler: → Hauptartikel: ''[[AVR-GCC-Tutorial/Assembler und Inline-Assembler|Assembler und Inline-Assembler]]''<br />
<br />
;alte Quellen anpassen: → Hauptartikel: ''[[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen anpassen]]''<br />
<br />
;Makefiles: → Hauptartikel: ''[[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]]'' sowie als Alternative für sehr kleine Projekte → Hauptartikel: ''[[C ohne Makefile]]''<br />
<br />
= Benötigte Werkzeuge =<br />
<br />
Um eigene Programme für AVRs mittels einer AVR-Toolchain zu erstellen wird folgende Hard- und Software benötigt:<br />
<br />
* Eine AVR-Toolchain bestehend aus avr-gcc, den avr-Binutils (Assembler, Linker, etc) und einer Standard-C Bibliothek. Üblich ist die AVR-LibC, die auch quasi in allen avr-gcc Distributionen enthalten ist.<br />
<br />
Hardware wird keine benötigt – bis auf einen PC natürlich, auf dem der Compiler ablaufen kann. Selbst ohne AVR-Hardware kann man also bereits C-Programme für AVRs schreiben, compiliern und sich das Look-and-Feel von avr-gcc sowie von IDEs wie [[Atmel Studio]], Eclipse oder leichtgewichtigeren Entwicklungsumbgebungen anschauen. Selbst das Debuggen und Simulieren ist mithilfe entsprechender Tools wie Debugger und Simulator in gewissen Grenzen möglich.<br />
<br />
Um Programme für AVRs mittels einer AVR-Toolchain zu testen, wird folgende Hard- und Software benötigt:<br />
<br />
* Platine oder Versuchsaufbau für die Aufnahme eines AVR-Controllers, der vom avr-gcc Compiler unterstützt wird.<ref>Für eine Liste der unterstützten COntroller siehe die Dokumentation des Compilers oder [http://www.nongnu.org/avr-libc/user-manual/index.html#supported_devices AVR-Libc: Supported Devices].</ref> Dieses Testboard kann durchaus auch selbst gelötet oder auf einem Steckbrett aufgebaut werden. Einige Registerbeschreibungen dieses Tutorials beziehen sich auf den inzwischen veralteten AT90S2313. Der weitaus größte Teil des Textes ist aber für alle Controller der AVR-Familie gültig. <br />
<br />
:Brauchbare Testplattformen sind auch das [[STK500]] und der [[AVR Butterfly]] von Atmel. Weitere Infos findet man in den Artikeln [[AVR#Starterkits|AVR Starterkits]] und [[AVR-Tutorial: Equipment]].<br />
<br />
* Programmiersoftware und -[[AVR In System Programmer |hardware]] z. B. PonyProg (siehe auch: [[Pony-Prog Tutorial]]) oder [[AVRDUDE]] mit [[STK200]]-Dongle oder die von Atmel verfügbare Hard- und Software ([[STK500]], Atmel AVRISP, [[AVR-Studio]]).<br />
<br />
* Nicht unbedingt erforderlich, aber zur Simulation und zum Debuggen unter MS-Windows recht nützlich: [[AVR-Studio]].<br />
<br />
* Wer unter Windows und Linux gleichermassen entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] ansehen. Beide sind unter Windows und Linux einfach zu installieren, siehe auch [[AVR Eclipse]]. Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks]<ref>Aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar.</ref>. Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins "AVR-Projekte" angelegt werden. Für Linux gibt es auch noch das [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=25220 KontrollerLab].<br />
<br />
= Was tun, wenn's nicht klappt? =<br />
<br />
* Herausfinden, ob es tatsächlich ein avr(-gcc) spezifisches Problem ist oder nur die eigenen C-Kenntnisse einer Auffrischung bedürfen. Allgemeine C-Fragen kann man eventuell "beim freundlichen Programmierer zwei Büro-, Zimmer- oder Haustüren weiter" loswerden. Ansonsten: [[C]]-Buch (gibt's auch "gratis" online) lesen.<br />
<br />
* Die [[AVR Checkliste]] durcharbeiten.<br />
<br />
* Die '''[http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc]''' lesen, vor allem (aber nicht nur) den Abschnitt Related Pages/'''Frequently Asked Questions''' = Oft gestellte Fragen (und Antworten dazu). Z.Zt leider nur in englischer Sprache verfügbar.<br />
<br />
* Den Artikel [[AVR-GCC]] in diesem Wiki lesen.<br />
<br />
* Das [http://www.mikrocontroller.net/forum/gcc GCC-Forum auf www.mikrocontroller.net] nach vergleichbaren Problemen absuchen.<br />
<br />
* Das avr-gcc-Forum bei [http://www.avrfreaks.net AVRfreaks] nach vergleichbaren Problemen absuchen.<br />
<br />
* Das [http://lists.gnu.org/archive/html/avr-gcc-list/ Archiv der avr-gcc Mailing-Liste] nach vergleichbaren Problemen absuchen.<br />
<br />
* Nach Beispielcode suchen. Vor allem im ''Projects''-Bereich von [http://www.avrfreaks.net AVRfreaks] (anmelden).<br />
<br />
* Google oder yahoo befragen schadet nie.<br />
<br />
* Bei Problemen mit der Ansteuerung interner AVR-Funktionen mit C-Code: das Datenblatt des Controllers lesen (ganz und am Besten zweimal). Datenblätter sind auf den [http://www.atmel.com Atmel Webseiten] als pdf-Dateien verfügbar. Das komplette Datenblatt (complete) und nicht die Kurzfassung (summary) verwenden.<br />
<br />
* Die Beispielprogramme im [[AVR-Tutorial]] sind zwar in AVR-Assembler verfasst, Erläuterungen und Vorgehensweisen sind aber auch auf C-Programme übertragbar.<br />
<br />
* Einen Beitrag in eines der Foren oder eine Mail an die Mailing-Liste schreiben. Dabei möglichst viel Information geben: Controller, Compilerversion, genutzte Bibliotheken, Ausschnitte aus dem Quellcode oder besser ein [http://www.mikrocontroller.net/topic/72767#598986 Testprojekt] mit allen notwendigen Dateien, um das Problem nachzuvollziehen, sowie genaue Fehlermeldungen bzw. Beschreibung des Fehlverhaltens. Bei Ansteuerung externer Geräte die Beschaltung beschreiben oder skizzieren (z. B. mit [http://www.tech-chat.de/ Andys ASCII Circuit]). Siehe dazu auch: '''[http://www.tty1.net/smart-questions_de.html "Wie man Fragen richtig stellt"]'''.<br />
<br />
= Erzeugen von Maschinencode =<br />
<br />
Aus dem C-Quellcode erzeugt der avr-gcc Compiler (zusammen mit Hilfsprogrammen wie z.&nbsp;B. Präprozessor, Assembler und Linker) Maschinencode für den AVR-Controller. Üblicherweise liegt dieser Code dann im Intel Hex-Format vor ("Hex-Datei"). Die Programmiersoftware (z.&nbsp;B. [[AVRDUDE]], PonyProg oder AVRStudio/STK500-plugin) liest diese Datei ein und überträgt die enthaltene Information (den Maschinencode) in den Speicher des Controllers. Im Prinzip sind also "nur" der avr-gcc-Compiler (und wenige Hilfsprogramme) mit den "richtigen" Optionen aufzurufen, um aus C-Code eine "Hex-Datei" zu erzeugen. Grundsätzlich stehen dazu drei verschiedene Ansätze zur Verfügung:<br />
<br />
* Die Verwendung einer integrierten Entwicklungsumgebung (IDE = '''I'''ntegrated '''D'''evelopment '''E'''nvironment), bei der alle Einstellungen z.&nbsp;B. in Dialogboxen durchgeführt werden können. Unter Anderem kann AVRStudio ab Version 4.12 (kostenlos auf [http://www.atmel.com/ atmel.com]) zusammen mit WinAVR als integrierte Entwicklungsumgebung für den Compiler avr-gcc genutzt werden (dazu müssen AVRStudio und WinAVR auf dem Rechner installiert sein). Weitere IDEs (ohne Anspruch auf Vollständigkeit): [http://www.eclipse.org/ Eclipse for C/C++ Developers] (d.h. inkl. CDT) und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] (für diverse Plattformen, u.a. Linux und MS Windows, IDE und Plugin kostenlos), [http://sourceforge.net/projects/kontrollerlab KontrollerLab] (Linux/KDE, kostenlos). [http://www.atmanecl.com/EnglishSite/SoftwareEnglish.htm AtmanAvr] (MS Windows, relativ günstig), KamAVR (MS-Windows, kostenlos, wird augenscheinlich nicht mehr weiterentwickelt), [http://www.amctools.com/vmlab.htm VMLab] (MS Windows, ab Version 3.12 ebenfalls kostenlos). Integrierte Entwicklungsumgebungen unterscheiden sich stark in Ihrer Bedienung und stehen auch nicht für alle Plattformen zur Verfügung, auf denen der Compiler ausführbar ist (z.&nbsp;B. AVRStudio nur für MS-Windows). Zur Anwendung des avr-gcc Compilers mit IDEs sei hier auf deren Dokumentation verwiesen. <br />
<br />
* Die Nutzung des Programms make mit passenden Makefiles. In den folgenden Abschnitten wird die Generierung von Maschinencode für einen AVR ("hex-Datei") aus C-Quellcode ("c-Dateien") anhand von "make" und den "Makefiles" näher erläutert. Viele der darin beschriebenen Optionen findet man auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio (AVRStudio generiert ein makefile in einem Unterverzeichnis des Projektverzeichnisses). <br />
<br />
* Das Generieren des Programms ohne IDE und ohne Makefile. In diesem Fall muss die Quellcodedatei durch eine vorgefertigte Kommandofolge an den Compiler übergeben werden. Der Artikel [[C ohne Makefile]] zeigt, wie das funktioniert. Diese Vorgehensweise empfiehlt sich jedoch nur für kleine Programme, die nicht auf verschiedene Quellcodedateien verteilt sind.<br />
<br />
Beim Wechsel vom makefile-Ansatz nach WinAVR-Vorlage zu AVRStudio ist darauf zu achten, dass AVRStudio (Stand: AVRStudio Version 4.13) bei einem neuen Projekt die Optimierungsoption (vgl. Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|AVR-GCC-Tutorial/Exkurs: Makefiles]], typisch: -Os) nicht einstellt und die mathematische Bibliothek der avr-libc (libm.a, Linker-Option -lm) nicht einbindet. (Hinweis: Bei Version 4.16 wird beides bereits gesetzt). Beides ist Standard bei Verwendung von makefiles nach WinAVR-Vorlage und sollte daher auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio "manuell" eingestellt werden, um auch mit AVRStudio kompakten Code zu erzeugen.<br />
<br />
= Einführungsbeispiel =<br />
<br />
Zum Einstieg ein kleines Beispiel, an dem die Nutzung des Compilers und der Hilfsprogramme (der sogenannten ''Toolchain'') demonstriert wird. Detaillierte Erläuterungen folgen in den weiteren Abschnitten dieses Tutorials.<br />
<br />
Das Programm soll auf einem AVR Mikrocontroller einige Ausgänge ein- und andere ausschalten. Das Beispiel ist für einen ATmega16 programmiert ([http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf Datenblatt]), kann aber sinngemäß für andere Controller der AVR-Familie modifiziert werden. <br />
<br />
Ein kurzes Wort zur Hardware: Bei diesem Programm werden alle Pins von PORTB auf Ausgang gesetzt, und einige davon werden auf HIGH andere auf LOW gesetzt. Das kann je nach angeschlossener Hardware an diesen Pins kritisch sein. Am ungefährlichsten ist es, wenn nichts an den Pins angeschlossen ist und man die Funktion des Programmes durch eine Spannungsmessung mit einem Multimeter kontrolliert. Die Spannung wird dabei zwischen GND-Pin und den einzelnen Pins von PORTB gemessen.<br />
<br />
Zunächst der Quellcode der Anwendung, der in einer Text-Datei mit dem Namen ''main.c'' abgespeichert wird.<br />
<br />
<syntaxhighlight lang="c"><br />
/* Alle Zeichen zwischen Schrägstrich-Stern <br />
und Stern-Schrägstrich sind Kommentare */<br />
<br />
// Zeilenkommentare sind ebenfalls möglich<br />
// alle auf die beiden Schrägstriche folgenden<br />
// Zeichen einer Zeile sind Kommentar<br />
<br />
#include <avr/io.h> // (1)<br />
<br />
int main (void) { // (2)<br />
<br />
DDRB = 0xFF; // (3)<br />
PORTB = 0x03; // (4)<br />
<br />
while(1) { // (5)<br />
/* "leere" Schleife*/ // (6)<br />
} // (7)<br />
<br />
/* wird nie erreicht */<br />
return 0; // (8)<br />
}<br />
</syntaxhighlight><br />
<br />
# In dieser Zeile wird eine sogenannte Header-Datei eingebunden. In <code>avr/io.h</code> sind die Registernamen definiert, die im späteren Verlauf genutzt werden. Auch unter Windows wird ein&nbsp;<code>/</code> zur Kennzeichnung von Unterverzeichnissen in Include-Dateinamen verwendet und kein&nbsp;<code>\</code>.<br />
# Hier beginnt das eigentliche Programm. Jedes C-Programm beginnt mit den Anweisungen in der Funktion <code>main</code>.<br />
# Die Anschlüsse eines AVR (Pins) werden zu Blöcken zusammengefasst, einen solchen Block bezeichnet man als Port. Beim ATmega16 hat jeder Port 8 Anschlüsse, bei kleineren AVRs können einem Port auch weniger als 8 Anschlüsse zugeordnet sein. Da per Definition (Datenblatt) alle gesetzten Bits in einem Datenrichtungsregister den entsprechenden Anschluss auf Ausgang schalten, werden mit DDRB=0xff alle Anschlüsse des Ports B als Ausgänge eingestellt.<br />
# Die den ersten beiden Bits des Ports zugeordneten Anschlüsse (PB0 und PB1) werden 1, alle anderen Anschlüsse des Ports B (PB2-PB7) zu 0. Aktivierte Ausgänge (logisch 1 oder "high") liegen auf Betriebsspannung (VCC, meist 5 Volt), nicht aktivierte Ausgänge führen 0 Volt (GND, Bezugspotential). Es ist sinnvoll, sich möglichst frühzeitig eine alternative Schreibweise beizubringen, die wegen der leichteren Überprüfbarkeit und Portierbarkeit oft im weiteren Tutorial und in Forenbeiträgen benutzt wird. Die Zuordnung sieht in diesem Fall so aus, Näheres dazu im Artikel [[Bitmanipulation]]:<syntaxhighlight lang="c">PORTB = (1<<PB1) | (1<<PB0);</syntaxhighlight><br />
# ist der Beginn der sogenannte ''Hauptschleife'' (main-loop). Dies ist eine Endlosschleife, welche kontinuierlich wiederkehrende Befehle enthält.<br />
# In diesem Beispiel ist die Hauptschleife leer. Der Controller durchläuft die Schleife immer wieder, ohne dass etwas passiert. Eine solche Schleife ist notwendig, da es auf dem Controller kein Betriebssystem gibt, das nach Beendigung des Programmes die Kontrolle übernehmen könnte. Ohne diese Schleife kehrt das Programm aus <code>main</code> zurück, alle Interrupts werden deaktiviert und eine Endlosschleife betreten.<br />
# Ende der Hauptschleife und Sprung zur passenden, öffnenden Klammer, also zu 5.<br />
# ist das Programmende. Die Zeile ist nur aus Gründen der C-Kompatibilität enthalten: <syntaxhighlight lang="c">int main(void)</syntaxhighlight> besagt, dass die Funktion einen int-Wert zurückgibt. Die Anweisung wird aber nicht erreicht, da das Programm die Hauptschleife nie verlässt.<br />
<br />
Um diesen Quellcode in ein lauffähiges Programm zu übersetzen, wird hier ein Makefile genutzt. Das verwendete Makefile findet sich auf der Seite [[Beispiel Makefile]] und basiert auf der Vorlage, die in WinAVR mitgeliefert wird und wurde bereits angepasst (Controllertyp ATmega16). Man kann das Makefile bearbeiten und an andere Controller anpassen oder sich mit dem Programm MFile menügesteuert ein Makefile "zusammenklicken". Das Makefile speichert man unter dem Namen <code>Makefile</code> (ohne Endung) im selben Verzeichnis, in dem auch die Datei <code>main.c</code> mit dem Programmcode abgelegt ist. Detailliertere Erklärungen zur Funktion von Makefiles finden sich im Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|Exkurs: Makefiles]].<br />
<br />
<pre><br />
D:\beispiel>dir<br />
<br />
Verzeichnis von D:\beispiel<br />
<br />
28.11.2006 22:53 <DIR> .<br />
28.11.2006 22:53 <DIR> ..<br />
28.11.2006 20:06 118 main.c<br />
28.11.2006 20:03 16.810 Makefile<br />
2 Datei(en) 16.928 Bytes<br />
</pre><br />
<br />
Nun gibt man ''make all'' ein. Falls das mit WinAVR installierte Programmers Notepad genutzt wird, gibt es dazu einen Menüpunkt im Tools Menü. Sind alle Einstellungen korrekt, entsteht eine Datei <code>main.hex</code>, in welcher der Code für den AVR enthalten ist. <br />
<pre><br />
D:\beispiel>make all<br />
<br />
-------- begin --------<br />
avr-gcc (GCC) 3.4.6<br />
Copyright (C) 2006 Free Software Foundation, Inc.<br />
This is free software; see the source for copying conditions. There is NO<br />
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.<br />
<br />
Compiling C: main.c<br />
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -f<br />
unsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef<br />
-Wa,-adhlns=obj/main.lst -std=gnu99 -Wundef -MD -MP -MF .dep/main.o.d main.c -<br />
o obj/main.o<br />
<br />
Linking: main.elf<br />
avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funs<br />
igned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -W<br />
a,-adhlns=obj/main.o -std=gnu99 -Wundef -MD -MP -MF .dep/main.elf.d obj/main.o<br />
--output main.elf -Wl,-Map=main.map,--cref -lm<br />
<br />
Creating load file for Flash: main.hex<br />
avr-objcopy -O ihex -R .eeprom main.elf main.hex<br />
</pre><br />
<br />
Der Inhalt der hex-Datei kann nun zum Controller übertragen werden. Dies kann z.&nbsp;B. über In-System-Programming ([[ISP]]) erfolgen, das im [[AVR-Tutorial: Equipment]] beschrieben ist. Makefiles nach der WinAVR/MFile-Vorlage sind für die Nutzung des Programms [[AVRDUDE]] vorbereitet. Wenn man den Typ und Anschluss des Programmiergerätes richtig eingestellt hat, kann mit ''make program'' die Übertragung mittels AVRDUDE gestartet werden. Jede andere Software, die hex-Dateien lesen und zu einem AVR übertragen kann<ref>z.&nbsp;B. [[Pony-Prog_Tutorial|Ponyprog]], yapp, AVRStudio</ref>, kann natürlich ebenfalls genutzt werden.<br />
<br />
Startet man nun den Controller (Reset-Taster oder Stromzufuhr aus/an), werden vom Programm die Anschlüsse PB0 und PB1 auf 1 gesetzt. Man kann mit einem Messgerät nun an diesem Anschluss die Betriebsspannung messen oder eine [[LED]] leuchten lassen (Anode an den Pin, Vorwiderstand nicht vergessen). An den Anschlüssen PB2-PB7 misst man 0 Volt. Eine mit der Anode mit einem dieser Anschlüsse verbundene LED leuchtet nicht.<br />
<br />
= Ganzzahlige Datentypen (Integer) =<br />
<br />
Bei der Programmierung von Mikrokontrollern ist die Definition einiger ganzzahliger Datentypen sinnvoll, an denen eindeutig die Bit-Länge abgelesen werden kann.<br />
<br />
Standardisierte Datentypen werden in der Header-Datei <code>stdint.h</code> definiert, die folgendermaßen eingebunden werden kann:<br />
<syntaxhighlight lang="c">#include <stdint.h></syntaxhighlight><br />
<br />
{| {{Tabelle}}<br />
|+ '''int-Typen aus <code>stdint.h</code> (C99)'''<br/>&nbsp;<br />
|- bgcolor="#d0d0ff"<br />
!colspan="5"| Vorzeichenbehaftete int-Typen<br />
|- bgcolor="#e8e8ff"<br />
! Typname || Bit-Breite ||colspan="2"| Wertebereich<br />
|align="center| '''C-Entsprechung''' (avr-gcc)<br />
|-<br />
|<code>int8_t</code> ||align="right"| 8 || −128 ⋯ 127 || −2<sup>7</sup> ⋯ 2<sup>7</sup>−1 || <code>signed char</code><br />
|-<br />
|<code>int16_t</code> ||align="right"| 16 || −32768 ⋯ 32767 || −2<sup>15</sup> ⋯ 2<sup>15</sup>−1 || <code>signed short</code>, <code>signed int</code><br />
|-<br />
|<code>int32_t</code> ||align="right"| 32 || −2147483648 ⋯ 2147483647 || −2<sup>31</sup> ⋯ 2<sup>31</sup>−1 || <code>signed long</code><br />
|-<br />
|<code>int64_t</code> ||align="right"| 64 || −9223372036854775808 ⋯ 9223372036854775807 || −2<sup>63</sup> ⋯ 2<sup>63</sup>−1 || <code>signed long long</code><br />
|- bgcolor="#d0d0ff"<br />
!colspan="5"| Vorzeichenlose int-Typen<br />
|- bgcolor="#e8e8ff"<br />
! Typname || Bit-Breite ||colspan="2"| Wertebereich<br />
|align="center| '''C-Entsprechung''' (avr-gcc)<br />
|-<br />
|<code>uint8_t</code> ||align="right"| 8 || 0 ⋯ 255 || 0 ⋯ 2<sup>8</sup>−1 || <code>unsigned char</code><br />
|-<br />
|<code>uint16_t</code> ||align="right"| 16 || 0 ⋯ 65535 || 0 ⋯ 2<sup>16</sup>−1 || <code>unsigned short</code>, <code>unsigned int</code><br />
|-<br />
|<code>uint32_t</code> ||align="right"| 32 || 0 ⋯ 4294967295 || 0 ⋯ 2<sup>32</sup>−1 || <code>unsigned long</code><br />
|-<br />
|<code>uint64_t</code> ||align="right"| 64 || 0 ⋯ 18446744073709551615 || 0 ⋯ 2<sup>64</sup>−1 || <code>unsigned long long</code><br />
|}<br />
<br />
Neben den Typen gibt es auch Makros für die Bereichsgrenzen wie <code>INT8_MIN</code> oder <code>UINT16_MAX</code>. Siehe dazu auch: [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdint.html Dokumentation der avr-libc: Standard Integer Types].<br />
<br />
= Grundsätzlicher Programmaufbau eines µC-Programms =<br />
<br />
Wir unterscheiden zwischen 2 verschiedenen Methoden, um ein<br />
Mikrocontroller-Programm zu schreiben, und zwar völlig unabhängig davon, in<br />
welcher Programmiersprache das Programm geschrieben wird.<br />
<br />
== Sequentieller Programmablauf ==<br />
<br />
[[Image:Sequentielle Programme.gif|left]]<br />
Bei dieser Programmiertechnik wird eine Endlosschleife programmiert, welche im<br />
Wesentlichen immer den gleichen Aufbau hat. Es wird hier nach dem sogenannten EVA-Prinzip gehandelt. EVA steht für "Eingabe, Verarbeitung, Ausgabe".<br />
{{Absatz}}<br />
<br />
== Interruptgesteuerter Programmablauf ==<br />
<br />
[[Image:Interrupt Programme.gif|left]]<br />
Bei dieser Methode werden beim Programmstart zuerst die gewünschten Interruptquellen aktiviert und dann in eine Endlosschleife gegangen, in welcher Dinge erledigt werden können, welche nicht zeitkritisch sind. Wenn ein Interrupt ausgelöst wird, so wird automatisch die zugeordnete Interruptfunktion ausgeführt.<br />
{{Absatz}}<br />
<br />
= Zugriff auf Register =<br />
<br />
Die AVR-Controller verfügen über eine Vielzahl von Registern. Die meisten<br />
davon sind sogenannte Schreib-/Leseregister. Das heißt, das Programm kann die<br />
Inhalte der Register sowohl auslesen als auch beschreiben.<br />
<br />
Register haben einen besonderen Stellenwert bei den AVR Controllern. Sie dienen dem Zugriff auf die Ports und die Schnittstellen des Controllers. Wir unterscheiden zwischen 8-Bit und 16-Bit Registern. Vorerst behandeln wir die 8-Bit Register.<br />
<br />
Einzelne Register sind bei allen AVRs vorhanden, andere wiederum nur bei bestimmten Typen. So sind beispielsweise die Register, welche für den Zugriff auf den UART notwendig sind, selbstverständlich nur bei denjenigen Modellen vorhanden, welche über einen integrierten Hardware UART bzw. USART verfügen.<br />
<br />
Die Namen der Register sind in den Headerdateien zu den entsprechenden AVR-Typen definiert. Dazu muss man den Namen der controllerspezifischen Headerdatei nicht kennen. Es reicht aus, die allgemeine Headerdatei ''avr/io.h'' einzubinden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
</syntaxhighlight><br />
<br />
Ist im Makefile der MCU-Typ z.&nbsp;B. mit dem Inhalt atmega8 definiert (und wird somit per -mmcu=atmega8 an den Compiler übergeben), wird beim Einlesen der io.h-Datei implizit ("automatisch") auch die iom8.h-Datei mit den Register-Definitionen für den ATmega8 eingelesen.<br />
<br />
<!-- Wohl besser als Anhang - spaeter... --><br />
Intern wird diese "Automatik" wie folgt realisiert: Der Controllertyp wird dem Compiler als Parameter übergeben (vgl. ''avr-gcc -c -mmcu=atmega16 [...]'' im Einführungsbeispiel). Wird ein Makefile nach der WinAVR/mfile-Vorlage verwendet, setzt man die Variable ''MCU'', der Inhalt dieser Variable wird dann an passender Stelle für die Compilerparameter verwendet. Der Compiler definiert intern eine dem mmcu-Parameter zugeordnete "Variable" (genauer: ein Makro) mit dem Namen des Controllers, vorangestelltem ''__AVR_'' und angehängten Unterstrichen (z.&nbsp;B. wird bei ''-mmcu=atmega16'' das Makro ''__AVR_ATmega16__'' definiert). Beim Einbinden der Header-Datei ''avr/io.h'' wird geprüft, ob das jeweilige Makro definiert ist und die zum Controller passende Definitionsdatei eingelesen. Zur Veranschaulichung einige Ausschnitte aus einem Makefile:<br />
<br />
<pre><br />
[...]<br />
# MCU Type ("name") setzen:<br />
MCU = atmega16<br />
[...]<br />
<br />
[...]<br />
## Verwendung des Inhalts von MCU (hier atmega16) fuer die <br />
## Compiler- und Assembler-Parameter<br />
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)<br />
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)<br />
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)<br />
[...]<br />
<br />
[...]<br />
## Aufruf des Compilers:<br />
## mit den Parametern ($(ALL_CFLAGS) ist -mmcu=$(MCU)[...] = -mmcu=atmega16[...]<br />
$(OBJDIR)/%.o : %.c<br />
@echo<br />
@echo $(MSG_COMPILING) $<<br />
$(CC) -c $(ALL_CFLAGS) $< -o $@ <br />
[...]<br />
</pre><br />
<br />
Da --mmcu=atmega16 übergeben wurde, wird __AVR_ATmega16__ definiert und kann in avr/io.h zur Fallunterscheidung genutzt werden:<br />
<br />
<syntaxhighlight lang="c"><br />
// avr/io.h <br />
// (bei WinAVR-Standardinstallation in C:\WinAVR\avr\include\avr)<br />
[...]<br />
#if defined (__AVR_AT94K__)<br />
# include <avr/ioat94k.h><br />
// [...]<br />
#elif defined (__AVR_ATmega16__)<br />
// da __AVR_ATmega16__ definiert ist, wird avr/iom16.h eingebunden:<br />
# include <avr/iom16.h><br />
// [...]<br />
#else<br />
# if !defined(__COMPILING_AVR_LIBC__)<br />
# warning "device type not defined"<br />
# endif<br />
#endif<br />
</syntaxhighlight><br />
<br />
Die Beispiele in den folgenden Abschnitten demonstrieren den Zugriff auf Register anhand der Register für I/O-Ports (PORTx, DDRx, PINx), die Vorgehensweise ist jedoch für alle Register (z.&nbsp;B. die des UART, ADC, SPI) analog.<br />
<br />
== Schreiben in Register ==<br />
<br />
Zum Schreiben kann man Register einfach wie eine Variable setzen.<ref>In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Schreibzugriff über die Funktion outp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt, outp() ist nicht mehr erforderlich.</ref><br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
int main()<br />
{<br />
/* Setzt das Richtungsregister des Ports A auf 0xff <br />
(alle Pins als Ausgang, vgl. Abschnitt Zugriff auf Ports): */<br />
DDRA = 0xff; <br />
<br />
/* Setzt PortA auf 0x03, Bit 0 und 1 "high", restliche "low": */<br />
PORTA = 0x03; <br />
<br />
// Setzen der Bits 0,1,2,3 und 4<br />
// Binär 00011111 = Hexadezimal 1F<br />
DDRB = 0x1F; /* direkte Zuweisung - unübersichtlich */<br />
<br />
/* Ausführliche Schreibweise: identische Funktionalität, mehr Tipparbeit<br />
aber übersichtlicher und selbsterklärend: */<br />
DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4);<br />
<br />
while (1);<br />
}<br />
</syntaxhighlight><br />
<br />
Die ausführliche Schreibweise sollte bevorzugt verwendet werden, da dadurch die Zuweisungen selbsterklärend sind und somit der Code leichter nachvollzogen werden kann. Atmel verwendet sie auch bei Beispielen in Datenblätten und in den allermeisten Quellcodes zu Application-Notes. Mehr zu der Schreibweise mit "|" und "<<" findet man unter [[Bitmanipulation]].<br />
<br />
Der gcc C-Compiler unterstützt ab Version 4.3.0 Konstanten im Binärformat, z.&nbsp;B. DDRB&nbsp;=&nbsp;0b00011111. Diese Schreibweise ist jedoch nur in GNU-C verfügbar und nicht in ISO-C definiert. Man sollte sie daher nicht verwenden, wenn Code mit anderen ausgetauscht oder mit anderen Compilern bzw. älteren Versionen des gcc genutzt werden soll.<br />
<br />
== Verändern von Registerinhalten ==<br />
<br />
Einzelne Bits setzt und löscht man "Standard-C-konform" mittels logischer (Bit-) Operationen. <br />
<br />
<syntaxhighlight lang="c"><br />
x |= (1 << Bitnummer); // Hiermit wird ein Bit in x gesetzt<br />
x &= ~(1 << Bitnummer); // Hiermit wird ein Bit in x geloescht<br />
</syntaxhighlight><br />
<br />
Es wird jeweils nur der Zustand des angegebenen Bits geändert, der vorherige Zustand der anderen Bits bleibt erhalten. <br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
#define MEINBIT 2<br />
...<br />
PORTA |= (1 << MEINBIT); /* setzt Bit 2 an PortA auf 1 */<br />
PORTA &= ~(1 << MEINBIT); /* loescht Bit 2 an PortA */<br />
</syntaxhighlight><br />
<br />
Mit dieser Methode lassen sich auch mehrere Bits eines Registers gleichzeitig setzen und löschen.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
DDRA &= ~( (1<<PA0) | (1<<PA3) ); /* PA0 und PA3 als Eingaenge */<br />
PORTA |= ( (1<<PA0) | (1<<PA3) ); /* Interne Pull-Up fuer beide einschalten */<br />
</syntaxhighlight><br />
<br />
Bei bestimmten AVR Registern mit Bits, die durch Beschreiben mit einer logischen 1 gelöscht werden, muss eine absolute Zuweisung benutzt werden. Ein ODER löscht in diesen Registern ALLE gesetzten Bits!<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
TIFR2 = (1<<OCF2A); // Nur Bit OCF2A löschen<br />
</syntaxhighlight><br />
<br />
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind nicht mehr erforderlich.<br />
<br />
Siehe auch:<br />
* [[Bitmanipulation]]<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers<br />
<br />
== Lesen aus Registern ==<br />
<br />
Zum Lesen kann man auf Register einfach wie auf eine Variable zugreifen. In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Lesezugriff über die Funktion inp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt und inp() ist nicht mehr erforderlich.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdint.h><br />
<br />
uint8_t foo;<br />
<br />
//...<br />
<br />
int main(void)<br />
{<br />
/* kopiert den Status der Eingabepins an PortB <br />
in die Variable foo: */<br />
foo = PINB; <br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Die Abfrage der Zustände von Bits erfolgt durch Einlesen des gesamten Registerinhalts und ausblenden der Bits deren Zustand nicht von Interesse ist. Einige Beispiele zum Prüfen ob Bits gesetzt oder gelöscht sind:<br />
<br />
<syntaxhighlight lang="c"><br />
#define MEINBIT0 0 <br />
#define MEINBIT2 2<br />
<br />
uint8_t i;<br />
<br />
extern test1();<br />
<br />
// Funkion test1 aufrufen, wenn Bit 0 in Register PINA gesetzt (1) ist<br />
i = PINA; // Inhalt in Arbeitsvariable<br />
i = i & 0x01; // alle Bits bis auf Bit 0 ausblenden (bitweise und)<br />
// falls das Bit gesetzt war, hat i den Inhalt 1<br />
if ( i != 0 ) { // Ergebnis ungleich 0 (wahr)? <br />
test1(); // dann muss Bit 0 in i gesetzt sein -> Funktion aufrufen<br />
}<br />
// verkürzt:<br />
if ( ( PINA & 0x01 ) != 0 ) {<br />
test1();<br />
}<br />
// nochmals verkürzt:<br />
if ( PINA & 0x01 ) {<br />
test1();<br />
}<br />
// mit definierter Bitnummer:<br />
if ( PINA & ( 1 << MEINBIT0 ) ) {<br />
test1();<br />
}<br />
<br />
// Funktion aufrufen, wenn Bit 0 und/oder Bit 2 gesetzt ist. (Bit 0 und 2 also Wert 5) <br />
// (Bedenke: Bit 0 hat Wert 1, Bit 1 hat Wert 2 und Bit 2 hat Wert 4)<br />
if ( PINA & 0x05 ) {<br />
test1(); // Vergleich <> 0 (wahr), also mindestens eines der Bits gesetzt<br />
}<br />
// mit definierten Bitnummern:<br />
if ( PINA & ( ( 1 << MEINBIT0 ) | ( 1 << MEINBIT2 ) ) ) {<br />
test1();<br />
}<br />
<br />
// Funktion aufrufen, wenn Bit 0 und Bit 2 gesetzt sind<br />
if ( ( PINA & 0x05 ) == 0x05 ) { // nur wahr, wenn beide Bits gesetzt<br />
test1();<br />
}<br />
<br />
// Funktion test2() aufrufen, wenn Bit 0 gelöscht (0) ist<br />
i = PINA; // einlesen in temporäre Variable<br />
i = i & 0x01; // maskieren von Bit 0<br />
if ( i == 0 ) { // Vergleich ist wahr, wenn Bit 0 nicht gesetzt ist<br />
test2();<br />
}<br />
// analog mit not-Operator<br />
if ( !i ) {<br />
test2();<br />
}<br />
// nochmals verkürzt:<br />
if ( !( PINA & 0x01 ) ) {<br />
test2();<br />
}<br />
</syntaxhighlight><br />
<br />
== Warten auf einen bestimmten Zustand ==<br />
<br />
Es gibt in der Bibliothek avr-libc Funktionen, die warten, bis ein bestimmter Zustand eines Bits erreicht ist. Es ist allerdings normalerweise eine eher unschöne Programmiertechnik, da in diesen Funktionen "blockierend" gewartet wird. Der Programmablauf bleibt also an dieser Stelle stehen, bis das maskierte Ereignis erfolgt ist. Setzt man den [[Watchdog]] ein, muss man darauf achten, dass dieser auch noch getriggert wird (Zurücksetzen des Watchdogtimers). <br />
<br />
Die Funktion '''loop_until_bit_is_set''' wartet in einer Schleife, bis das definierte Bit gesetzt ist. Wenn das Bit beim Aufruf der Funktion bereits gesetzt ist, wird die Funktion sofort wieder verlassen. Das niederwertigste Bit hat die Bitnummer 0. <br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
<br />
/* Warten bis Bit Nr. 2 (das dritte Bit) in Register PINA gesetzt (1) ist */<br />
<br />
#define WARTEPIN PINA<br />
#define WARTEBIT PA2<br />
<br />
// mit der avr-libc Funktion:<br />
loop_until_bit_is_set(WARTEPIN, WARTEBIT);<br />
<br />
// dito in "C-Standard":<br />
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN<br />
// _nicht_ ungleich 0 (also 0) ist.<br />
while ( !(WARTEPIN & (1 << WARTEBIT)) ) {}<br />
...<br />
</syntaxhighlight><br />
<br />
<br />
Die Funktion '''loop_until_bit_is_clear''' wartet in einer Schleife, bis das definierte Bit gelöscht ist. Wenn das Bit beim Aufruf der Funktion bereits gelöscht ist, wird die Funktion sofort wieder verlassen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
<br />
/* Warten bis Bit Nr. 4 (das fuenfte Bit) in Register PINB geloescht (0) ist */<br />
#define WARTEPIN PINB<br />
#define WARTEBIT PB4<br />
<br />
// avr-libc-Funktion:<br />
loop_until_bit_is_clear(WARTEPIN, WARTEBIT);<br />
<br />
// dito in "C-Standard":<br />
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN<br />
// gesetzt (1) ist <br />
while ( WARTEPIN & (1<<WARTEBIT) ) {}<br />
...<br />
</syntaxhighlight><br />
<br />
Universeller und auch auf andere Plattformen besser übertragbar ist die Verwendung von C-Standardoperationen.<br />
<br />
Siehe auch: <br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers<br />
* [[Bitmanipulation]]<br />
<br />
== 16-Bit Register (ADC, ICR1, OCR1x, TCNT1, UBRR) ==<br />
<br />
Einige der Portregister in den AVR-Controllern sind 16 Bit breit. Im Datenblatt sind diese Register üblicherweise mit dem Suffix "L" (Low-Byte) und "H" (High-Byte) versehen. Die avr-libc definiert zusätzlich die meisten dieser Variablen die Bezeichnung ohne "L" oder "H". Auf diese Register kann dann direkt zugegriffen werden. Dies ist zum Beispiel der Fall für Register wie ADC oder TCNT1.<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
uint16_t foo;<br />
<br />
/* setzt die Wort-Variable foo auf den Wert der letzten AD-Wandlung */<br />
foo = ADC; <br />
</syntaxhighlight><br />
<br />
Bei anderen Registern, wie zum Beispiel Baudraten-Register, liegen High- und Low-Teil nicht direkt nebeneinander im SFR-Bereich, so dass ein 16-Bit Zugriff nicht möglich ist und der Zugriff zusammengebastelt werden muss:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
#ifndef F_CPU<br />
#define F_CPU 3686400<br />
#endif<br />
#define UART_BAUD_RATE 9600<br />
<br />
...<br />
uint16_t baud = F_CPU / (UART_BAUD_RATE * 16L) -1;<br />
<br />
UBRRH = (uint8_t) (baud >> 8);<br />
UBRRL = (uint8_t) baud;<br />
...<br />
</syntaxhighlight><br />
<br />
Bei einigen AVR-Typen wie ATmega8 oder ATmega16 teilen sich UBRRH und UCSRC die gleiche Speicher-Adresse. Damit der AVR trotzdem zwischen den beiden Registern unterscheiden kann, bestimmt das Bit7 (URSEL), welches Register tatsächlich beschrieben werden soll. ''1000 0011'' (0x83) adressiert demnach UCSRC und übergibt den Wert ''3''. Und ''0000 0011'' (0x3) adressiert UBRRH und übergibt ebenfalls den Wert ''3''. <br />
<br />
Speziell bei den 16-Bit-Timern und auch beim ADC ist es bei allen Zugriffen auf Datenregister erforderlich, dass diese Daten synchronisiert sind. Wenn z.&nbsp;B. bei einem 16-Bit-Timer das High-Byte des Zählregisters gelesen wurde und vor dem Lesezugriff auf das Low-Byte ein Überlauf des Low-Bytes stattfindet, erhält man einen völlig unsinnigen Wert. Auch die Compare-Register müssen synchron geschrieben werden, da es ansonsten zu unerwünschten Compare-Ereignissen kommen kann. <br />
<br />
Beim ADC besteht das Problem darin, dass zwischen den Zugriffen auf die beiden Teilregister eine Wandlung beendet werden kann und der ADC ein neues Ergebnis in ADCL und ADCH schreiben will, wodurch High- und Low-Byte nicht zusammenpassen.<br />
<br />
Um diese Datenmüllproduktion zu verhindern, gibt es in beiden Fällen eine Synchronisation, die jeweils durch den Zugriff auf das Low-Byte ausgelöst wird:<br />
* Bei den Timer-Registern (das gilt für alle TCNT-, OCR- und ICR-Register bei den 16-Bit-Timern) wird bei einem ''Lesezugriff'' auf das Low-Byte automatisch das High-Byte in ein temporäres Register, das ansonsten nach außen nicht sichtbar ist, geschoben. Greift man nun ''anschließend'' auf das High-Byte zu, dann wird eben dieses temporäre Register gelesen.<br />
* Bei einem ''Schreibzugriff'' auf eines der genannten Register wird das High-Byte in besagtem temporären Register zwischengespeichert und erst beim Schreiben des Low-Bytes werden ''beide'' gleichzeitig in das eigentliche Register übernommen.<br />
<br />
Das bedeutet für die Reihenfolge:<br />
* Lesezugriff: Erst Low-Byte, dann High-Byte<br />
* Schreibzugriff: Erst High-Byte, dann Low-Byte<br />
<br />
Des weiteren ist zu beachten, dass es für all diese 16-Bit-Register nur ein einziges temporäres Register gibt, so dass das Auftreten eines Interrupts, in dessen Handler ein solches Register manipuliert wird, bei einem durch ihn unterbrochenen Zugriff i.d.R. zu Datenmüll führt. 16-Bit-Zugriffe sind generell nicht atomar! Wenn mit Interrupts gearbeitet wird, kann es erforderlich sein, vor einem solchen Zugriff auf ein 16-Bit-Register die Interrupt-Bearbeitung zu deaktivieren.<br />
<br />
Beim ADC-Datenregister ADCH/ADCL ist die Synchronisierung anders gelöst. Hier wird beim Lesezugriff (ADCH/ADCL sind logischerweise read-only) auf das Low-Byte ADCL beide Teilregister für Zugriffe seitens des ADC so lange gesperrt, bis das High-Byte ADCH ausgelesen wurde. Dadurch kann der ADC nach einem Zugriff auf ADCL keinen neuen Wert in ADCH/ADCL ablegen, bis ADCH gelesen wurde. Ergebnisse von Wandlungen, die zwischen einem Zugriff auf ADCL und ADCH beendet werden, gehen verloren!<br />
<br />
Nach einem Zugriff auf ADCL muss grundsätzlich ADCH gelesen werden!<br />
<br />
In beiden Fällen – also sowohl bei den Timern als auch beim ADC – werden vom C-Compiler 16-Bit Pseudo-Register zur Verfügung gestellt (z.&nbsp;B. TCNT1H/TCNT1L → TCNT1, ADCH/ADCL → ADC bzw. ADCW), bei deren Verwendung der Compiler automatisch die richtige Zugriffsreihenfolge regelt. In C-Programmen sollten grundsätzlich diese 16-Bit-Register verwendet werden! Sollte trotzdem ein Zugriff auf ein Teilregister erforderlich sein, sind obige Angaben zu berücksichtigen.<br />
<br />
Es ist darauf zu achten, dass auch ein Zugriff auf die 16-Bit-Register vom Compiler in zwei 8-Bit-Zugriffe aufgeteilt wird und dementsprechend genauso nicht-atomar ist wie die Einzelzugriffe. Auch hier gilt, dass u.U. die Interrupt-Bearbeitung gesperrt werden muss, um Datenmüll zu vermeiden.<br />
<br />
Beim ADC gibt es für den Fall, dass eine Auflösung von 8 Bit ausreicht, die Möglichkeit, das Ergebnis "linksbündig" in ADCH/ADCL auszurichten, so dass die relevanten 8 MSB in ADCH stehen. In diesem Fall muss bzw. sollte nur ADCH ausgelesen werden.<br />
<br />
ADC und ADCW sind unterschiedliche Bezeichner für das selbe Registerpaar. Üblicherweise kann man in C-Programmen ADC verwenden, was analog zu den anderen 16-Bit-Registern benannt ist. ADCW (ADC Word) existiert nur deshalb, weil die Headerdateien auch für Assembler vorgesehen sind und es bereits einen Assembler-Befehl namens ''adc'' gibt. <br />
<br />
Im Umgang mit 16-Bit Registern siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Related Pages/Frequently Asked Questions/Nr. 8<br />
* Datenblatt Abschnitt ''Accessing 16-bit Registers''<br />
<br />
== IO-Register als Parameter und Variablen ==<br />
<br />
Um Register als Parameter für eigene Funktionen übergeben zu können, muss man sie als einen volatile uint8_t Pointer übergeben. Zum Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
uint8_t key_pressed (volatile uint8_t *inputreg, uint8_t inputbit)<br />
{<br />
static uint8_t last_state = 0;<br />
<br />
if (last_state == (*inputreg & (1<<inputbit)))<br />
return 0; /* keine Änderung */<br />
<br />
/* Wenn doch, warten bis etwaiges Prellen vorbei ist: */<br />
_delay_ms(20);<br />
<br />
/* Zustand für nächsten Aufruf merken: */<br />
last_state = *inputreg & (1<<inputbit);<br />
<br />
/* und den entprellten Tastendruck zurückgeben: */<br />
return *inputreg & (1<<inputbit);<br />
}<br />
<br />
/* Beispiel für einen Funktionsaufruf: */<br />
<br />
void foo (void)<br />
{<br />
uint8_t i = key_pressed (&PINB, PB1);<br />
}<br />
</syntaxhighlight><br />
<br />
Ein Aufruf der Funktion mit call by value würde Folgendes bewirken: Beim Funktionseintritt wird nur eine Kopie des momentanen Portzustandes angefertigt, die sich unabhängig vom tatsächlichen Zustand das Ports nicht mehr ändert, womit die Funktion wirkungslos wäre. Die Übergabe eines Zeigers wäre die Lösung, wenn der Compiler nicht optimieren würde. Denn dadurch wird im Programm nicht von der Hardware gelesen, sondern wieder nur von einem Abbild im Speicher. Das Ergebnis wäre das gleiche wie oben. Mit dem Schlüsselwort volatile sagt man nun dem Compiler, dass die entsprechende Variable entweder durch andere Softwareroutinen (Interrupts) oder durch die Hardware verändert werden kann.<br />
<br />
Siehe auch: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass avr-libc FAQ: "How do I pass an IO port as a parameter to a function?"]<br />
<br />
= Zugriff auf IO-Ports =<br />
<br />
Jeder AVR implementiert eine unterschiedliche Menge an GPIO-Registern<br />
(GPIO - General Purpose Input/Output). Diese Register dienen dazu:<br />
* einzustellen welche der Anschlüsse ("Beinchen") des Controllers als Ein- oder Ausgänge dienen<br />
* bei Ausgängen deren Zustand festzulegen<br />
* bei Eingängen deren Zustand zu erfassen<br />
<br />
Mittels GPIO werden digitale Zustände gesetzt und erfasst, d.h. die Spannung an einem Ausgang wird ein- oder ausgeschaltet und an einem Eingang wird erfasst, ob die anliegende Spannung über oder unter einem bestimmten Schwellwert liegt. Im Datenblatt Abschnitt Electrical Characteristics/DC Characteristics finden sich die Spannungswerte (V_OL, V_OH für Ausgänge, V_IL, V_IH für Eingänge).<br />
<br />
Die Verarbeitung von analogen Eingangswerten und die Ausgabe von Analogwerten wird in Kapitel [[AVR-GCC-Tutorial#Analoge_Ein-_und_Ausgabe|Analoge Ein- und Ausgabe]] behandelt.<br />
<br />
Die physischen Ein- und Ausgänge werden bei AVR-Controllern zu logischen Ports gruppiert.<br />
<br />
Alle Ports werden über Register gesteuert. Dazu sind jedem Port 3 Register zugeordnet:<br />
<br />
{| class="wikitable"<br />
|- <br />
! width="10%"| DDRx<br />
| Datenrichtungsregister für Port'''x'''. <br />
'''x''' entspricht '''A''', '''B''', ''' C''' usw. je nach gewünschtem Port. Bit im Register gesetzt (1) für Ausgang, Bit gelöscht (0) für Eingang.<br />
|- <br />
! PINx<br />
| Eingangsadresse für Port'''x'''. <br />
Zustand des Ports. Die Bits in PINx entsprechen dem Zustand der als Eingang definierten Portpins. Bit 1 wenn Pin "high", Bit 0 wenn Portpin low.<br />
|-<br />
! PORTx<br />
| Datenregister für Port'''x'''. <br />
Dieses Register wird verwendet, um die Ausgänge eines Ports anzusteuern. Bei Pins, die mittels DDRx auf Eingang geschaltet wurden, können über PORTx<br />
die internen Pull-Up Widerstände aktiviert oder deaktiviert werden (1 = aktiv).<br />
|}<br />
<br />
Die folgenden Beispiele gehen von einem AVR aus, der sowohl Port A als auch Port B besitzt. Sie müssen für andere AVRs (zum Beispiel ATmega8/48/88/168) entsprechend angepasst werden.<br />
<br />
== Datenrichtung bestimmen ==<br />
<br />
Zuerst muss die Datenrichtung der verwendeten Pins bestimmt werden. Um dies zu erreichen, wird das Datenrichtungsregister des entsprechenden Ports beschrieben.<br />
<br />
Für jeden Pin, der als Ausgang verwendet werden soll, muss dabei das<br />
entsprechende Bit auf dem Port gesetzt werden. Soll der Pin als Eingang<br />
verwendet werden, muss das entsprechende Bit gelöscht sein.<br />
<br />
Beispiel:<br />
Angenommen am Port B sollen die Pins 0 bis 4 als Ausgänge definiert werden, die noch verbleibenden Pins 5 bis 7 sollen als Eingänge fungieren. Dazu ist es daher notwendig, im für das Port B zuständigen Datenrichtungsregister DDRB folgende Bitkonfiguration einzutragen<br />
<br />
+---+---+---+---+---+---+---+---+<br />
| 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |<br />
+---+---+---+---+---+---+---+---+<br />
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |<br />
<br />
In C liest sich das dann so:<br />
<br />
<syntaxhighlight lang="c"><br />
// in io.h wird u.a. DDRB definiert:<br />
#include <avr/io.h><br />
<br />
int main()<br />
{<br />
// Setzen der Bits 0,1,2,3 und 4<br />
// Binaer 00011111 = Hexadezimal 1F<br />
// direkte Zuweisung - standardkonform */<br />
DDRB = 0x1F; /* <br />
<br />
// Uebersichtliche Alternative - Binaerschreibweise, aber kein ISO-C<br />
DDRB = 0b00011111;<br />
<br />
// Ausfuehrliche Schreibweise: identische Funktionalitaet, mehr Tipparbeit<br />
// aber uebersichtlicher und selbsterklaerend:<br />
DDRB |= (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4); <br />
</syntaxhighlight><br />
<br />
Die Pins 5 bis 7 werden (da 0) als Eingänge geschaltet. Weitere Beispiele:<br />
<br />
<syntaxhighlight lang="c"><br />
// Alle Pins des Ports B als Ausgang definieren:<br />
DDRB = 0xff; <br />
// Pin0 wieder auf Eingang und andere im urspruenglichen Zustand belassen:<br />
DDRB &= ~(1 << DDB0);<br />
// Pin 3 und 4 auf Eingang und andere im urspruenglichen Zustand belassen:<br />
DDRB &= ~((1 << DDB3) | (1 << DDB4));<br />
// Pin 0 und 3 wieder auf Ausgang und andere im ursprünglichen Zustand belassen:<br />
DDRB |= (1 << DDB0) | (1 << DDB3);<br />
// Alle Pins auf Eingang:<br />
DDRB = 0x00;<br />
</syntaxhighlight><br />
<br />
== Vordefinierte Bitnummern für I/O-Register ==<br />
<br />
Die Bitnummern (z.&nbsp;B. PCx, PINCx und DDCx für den Port C) sind in den io*.h-Dateien der avr-libc definiert und dienen lediglich der besseren Lesbarkeit. Man muss diese Definitionen nicht verwenden oder kann auch einfach "immer" PAx, PBx, PCx usw. nutzen, auch wenn der Zugriff auf Bits in DDRx- oder PINx-Registern erfolgt. Für den Compiler sind die Ausdrücke (1<<PC7), (1<<DDC7) und (1<<PINC7) identisch zu (1<<7) (genauer: der Präprozessor ersetzt die Ausdrücke (1<<PC7),... zu (1<<7)). Ein Ausschnitt der Definitionen für Port C eines ATmega32 aus der iom32.h-Datei zur Verdeutlichung (analog für die weiteren Ports):<br />
<br />
<syntaxhighlight lang="c"><br />
...<br />
/* PORTC */<br />
#define PC7 7<br />
#define PC6 6<br />
#define PC5 5<br />
#define PC4 4<br />
#define PC3 3<br />
#define PC2 2<br />
#define PC1 1<br />
#define PC0 0<br />
<br />
/* DDRC */<br />
#define DDC7 7<br />
#define DDC6 6<br />
#define DDC5 5<br />
#define DDC4 4<br />
#define DDC3 3<br />
#define DDC2 2<br />
#define DDC1 1<br />
#define DDC0 0<br />
<br />
/* PINC */<br />
#define PINC7 7<br />
#define PINC6 6<br />
#define PINC5 5<br />
#define PINC4 4<br />
#define PINC3 3<br />
#define PINC2 2<br />
#define PINC1 1<br />
#define PINC0 0<br />
</syntaxhighlight><br />
<br />
<br />
== Digitale Signale ==<br />
<br />
Am einfachsten ist es, digitale Signale mit dem Mikrocontroller zu erfassen bzw. auszugeben.<br />
<br />
== Ausgänge ==<br />
Will man als Ausgang definierte Pins (entsprechende DDRx-Bits = 1) auf Logisch 1 setzen, setzt man die entsprechenden Bits im Portregister.<br />
<br />
Mit dem Befehl<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB = 0x04; /* besser PORTB=(1<<PB2) */<br />
<br />
// Uebersichtliche Alternative - Binaerschreibweise<br />
PORTB = 0b00000100; /* direkte Zuweisung - uebersichtlich */<br />
<br />
</syntaxhighlight><br />
wird also der Ausgang an Pin PB2 gesetzt (Beachte, dass die Bits immer ''von 0 an'' gezählt werden, das niederwertigste Bit ist also Bitnummer 0 und nicht etwa Bitnummer 1).<br />
<br />
Man beachte, dass bei der Zuweisung mittels '''=''' immer alle Pins gleichzeitig angegeben werden. Man sollte also, wenn nur bestimmte Ausgänge geschaltet werden sollen, zuerst den aktuellen Wert des Ports einlesen und das Bit des gewünschten Ports in diesen Wert einfließen lassen. Will man also nur den dritten Pin (Bit Nr. 2) an Port B auf "high" setzen und den Status der anderen Ausgänge unverändert lassen, nutze man diese Form:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB = PORTB | 0x04; /* besser: PORTB = PORTB | ( 1<<PB2 ) */<br />
/* vereinfacht durch Nutzung des |= Operators : */<br />
PORTB |= (1<<PB2);<br />
<br />
/* auch mehrere "gleichzeitig": */<br />
PORTB |= (1<<PB4) | (1<<PB5); /* Pins PB4 und PB5 "high" */<br />
</syntaxhighlight><br />
<br />
"Ausschalten", also Ausgänge auf "low" setzen, erfolgt analog:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB &= ~(1<<PB2); /* loescht Bit 2 in PORTB und setzt damit Pin PB2 auf low */ <br />
PORTB &= ~( (1<<PB4) | (1<<PB5) ); /* Pin PB4 und Pin PB5 "low" */<br />
</syntaxhighlight><br />
Siehe auch [[Bitmanipulation]]<br />
<br />
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind in aktuellen Versionen der avr-libc nicht mehr enthalten und auch nicht mehr erforderlich.<br />
<br />
''Falls der Anfangszustand von Ausgängen kritisch ist, muss die Reihenfolge beachtet werden, mit der die Datenrichtung (DDRx) eingestellt und der Ausgabewert (PORTx) gesetzt wird:''<br />
<br />
Für Ausgangspins, die mit Anfangswert "high" initialisiert werden sollen:<br />
* zuerst die Bits im PORTx-Register setzen<br />
* anschließend die Datenrichtung auf Ausgang stellen<br />
<br />
Daraus ergibt sich die Abfolge für einen Pin, der bisher als Eingang mit abgeschaltetem Pull-Up konfiguriert war:<br />
* setze PORTx: interner Pull-Up aktiv<br />
* setze DDRx: Ausgang ("high")<br />
<br />
Bei der Reihenfolge erst DDRx und dann PORTx kann es zu einem kurzen "low-Puls" kommen, der auch externe Pull-Up-Widerstände "überstimmt". Die (ungünstige) Abfolge: Eingang -> setze DDRx: Ausgang (auf "low", da PORTx nach Reset 0) -> setze PORTx: Ausgang auf high. Vergleiche dazu auch das Datenblatt Abschnitt ''Configuring the Pin''.<br />
<br />
== Eingänge (Wie kommen Signale in den &micro;C) ==<br />
<br />
Die digitalen Eingangssignale können auf verschiedene Arten zu unserer Logik gelangen.<br />
<br />
=== Signalkopplung ===<br />
<br />
Am einfachsten ist es, wenn die Signale direkt aus einer anderen digitalen Schaltung übernommen werden können. Hat der Ausgang der entsprechenden Schaltung TTL-Pegel dann können wir sogar direkt den Ausgang der Schaltung mit einem Eingangspin von unserem Controller verbinden.<br />
<br />
Hat der Ausgang der anderen Schaltung keinen TTL-Pegel so müssen wir den Pegel über entsprechende Hardware (z.&nbsp;B. Optokoppler, [[Widerstand#Spannungsteiler|Spannungsteiler]], "Levelshifter" aka [[Pegelwandler]]) anpassen.<br />
<br />
Die Masse der beiden Schaltungen muss selbstverständlich miteinander verbunden werden. Der Software selber ist es natürlich letztendlich egal, wie das Signal eingespeist wird. Wir können ja ohnehin lediglich prüfen, ob an einem Pin unseres Controllers eine logische 1 (Spannung größer ca. 0,7*Vcc) oder eine logische 0 (Spannung kleiner ca. 0,2*Vcc) anliegt. Detaillierte Informationen darüber, ab welcher Spannung ein Eingang als 0 ("low") bzw. 1 ("high") erkannt wird, liefert die Tabelle DC Characteristics im Datenblatt des genutzten Controllers.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|+ '''Spannungstabelle''' <br /> <small>(ca. Grenzwerte)</small><br />
|<br />
! Low || High<br />
|-<br />
! bei 5 V<br />
| 1 V || 3,5 V<br />
|-<br />
! bei 3,3 V<br />
| 0,66 V || 2,31 V<br />
|-<br />
! bei 1,8 V<br />
| 0,36 V || 1,26 V<br />
|}<br />
<br />
<br />
Die Abfrage der Zustände der Portpins erfolgt direkt über den Registernamen.<br />
<br />
{{Warnung|Dabei ist wichtig, zur Abfrage der Eingänge ''nicht'' etwa Portregister '''PORTx''' zu verwenden, sondern Eingangsregister '''PINx'''. Ansonsten liest man nicht den Zustand der Eingänge, sondern den Status der internen Pull-Up-Widerstände. Die Abfrage der Pinzustände über PORTx statt PINx ist ein häufiger Fehler beim AVR-"Erstkontakt".}}<br />
<br />
Will man also die aktuellen Signalzustände von Port D abfragen und in eine Variable namens bPortD abspeichern, schreibt man folgende Befehlszeilen:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdint.h><br />
...<br />
uint8_t bPortD;<br />
...<br />
bPortD = PIND;<br />
...<br />
</syntaxhighlight><br />
<br />
Mit den C-Bitoperationen kann man den Status der Bits abfragen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */<br />
if ( PINC & (1<<PINC1) ) {<br />
/* Aktion */<br />
}<br />
<br />
/* Fuehre Aktion aus, wenn Bit Nr. 2 (das "dritte" Bit) in PINB geloescht (0) ist */<br />
if ( !(PINB & (1<<PINB2)) ) {<br />
/* Aktion */<br />
}<br />
...<br />
</syntaxhighlight><br />
Siehe auch [[Bitmanipulation#Bits_prüfen]]<br />
<br />
=== Interne Pull-Up Widerstände ===<br />
<br />
Portpins für Ein- und Ausgänge (GPIO) eines AVR verfügen über zuschaltbare interne Pull-Up Widerstände (nominal mehrere 10kOhm, z.&nbsp;B. ATmega16 20-50kOhm). Diese können in vielen Fällen statt externer Widerstände genutzt werden.<br />
<br />
Die internen Pull-Up Widerstände von Vcc zu den einzelnen Portpins werden über das Register ''' PORTx''' aktiviert bzw. deaktiviert, wenn ein Pin als ''' Eingang''' geschaltet ist.<br />
<br />
Wird der Wert des entsprechenden Portpins auf 1 gesetzt, so ist der Pull-Up Widerstand aktiviert. Bei einem Wert von 0 ist der Pull-Up Widerstand nicht aktiv. Man sollte jeweils entweder den internen oder einen externen Pull-Up Widerstand verwenden, aber nicht beide zusammen.<br />
<br />
Im Beispiel werden alle Pins des Ports D als Eingänge geschaltet und alle Pull-Up Widerstände aktiviert. Weiterhin wird Pin PC7 als Eingang geschaltet und dessen interner Pull-Up Widerstand aktiviert, ohne die Einstellungen für die anderen Portpins (PC0-PC6) zu verändern.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
DDRD = 0x00; /* alle Pins von Port D als Eingang */<br />
PORTD = 0xff; /* interne Pull-Ups an allen Port-Pins aktivieren */<br />
...<br />
DDRC &= ~(1<<PC7); /* Pin PC7 als Eingang */<br />
PORTC |= (1<<PC7); /* internen Pull-Up an PC7 aktivieren */<br />
</syntaxhighlight><br />
<br />
=== Taster und Schalter ===<br />
<br />
Der Anschluss mechanischer Kontakte an den Mikrocontroller, ist zwischen zwei unterschiedliche Methoden zu unterscheiden: ''Active Low'' und ''Active High''.<br />
<br />
<gallery widths="300" heights="300" caption="Anschluss mechanischer Kontakte an einen µC"><br />
Image:Active Low.gif|'''Active Low:''' Bei dieser Methode wird der Kontakt zwischen den Eingangspin des Controllers und Masse geschaltet. Damit bei offenem Schalter der Controller kein undefiniertes Signal bekommt, wird zwischen die Versorgungsspannung und den Eingangspin ein sogenannter '''Pull-Up''' Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffnetem Schalter auf logisch 1 zu ziehen.<br />
Image:Active High.gif|'''Active High:''' Hier wird der Kontakt zwischen die Versorgungsspannung und den Eingangspin geschaltet. Damit bei offener Schalterstellung kein undefiniertes Signal am Controller ansteht, wird zwischen den Eingangspin und die Masse ein '''Pull-Down''' Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffneter Schalterstellung auf logisch 0 zu halten. <br />
</gallery><br />
<br />
Der Widerstandswert von Pull-Up- und Pull-Down-Widerständen ist an sich nicht kritisch. Wird er allerdings zu hoch gewählt, ist die Wirkung eventuell nicht gegeben. Als üblicher Wert haben sich 10 kOhm eingebürgert. Die AVRs verfügen an den meisten Pins über zuschaltbare interne Pull-Up Widerstände (vgl. Abschnitt [[AVR-GCC-Tutorial#Interne Pull-Up Widerstände|Interne Pull-Up Widerstände]]), welche insbesondere wie hier bei Tastern und ähnlichen Bauteilen (z.&nbsp;B. Drehgebern) statt externer Bauteile verwendet werden können. Interne Pull-Down-Widerstand sind nicht verfügbar und müssen daher in Form zusätzlicher Bauteile in die Schaltung eingefügt werden.<br />
<br />
==== Taster entprellen ====<br />
<br />
Siehe: ''[[Entprellung#Warteschleifen-Verfahren|Entprellung: Warteschleifen-Verfahren]]<br />
<br />
= Warteschleifen (delay.h) =<br />
<br />
Der Programmablauf kann verschiedene Arten von Wartefunktionen erfordern:<br />
<br />
* Warten im Sinn von Zeitvertrödeln<br />
* Warten auf einen bestimmten Zustand an den I/O-Pins<br />
* Warten auf einen bestimmten Zeitpunkt (siehe Timer)<br />
* Warten auf einen bestimmten Zählerstand (siehe Counter)<br />
<br />
Der einfachste Fall, das Zeitvertrödeln, kann in vielen Fällen und mit großer Genauigkeit anhand der avr-libc Bibliotheksfunktionen _delay_ms() und _delay_us() erledigt werden. Die Bibliotheksfunktionen sind einfachen Zählschleifen (Warteschleifen) vorzuziehen, da leere Zählschleifen ohne besondere Vorkehrungen sonst bei eingeschalteter Optimierung vom avr-gcc-Compiler wegoptimiert werden. Weiterhin sind die Bibliotheksfunktionen bereits darauf vorbereitet, die in F_CPU definierte Taktfrequenz zu verwenden. Außerdem sind die Funktionen der Bibliothek wirklich getestet.<br />
<br />
Einfach!? Schon, aber während gewartet wird, macht der µC nichts anderes mehr (abgesehen von möglicherweise auftretenden Interrupts, falls welche aktiviert sind). Die Wartefunktion blockiert den Programmablauf. Möchte man einerseits warten, um z.&nbsp;B. eine LED blinken zu lassen und gleichzeitig andere Aktionen ausführen z.&nbsp;B. weitere LED bedienen, sollten die Timer/Counter des AVR verwendet werden, siehe Artikel [[Multitasking]].<br />
<br />
Die Bibliotheksfunktionen funktionieren allerdings nur dann korrekt, wenn sie mit zur Übersetzungszeit (beim Compilieren) bekannten konstanten Werten aufgerufen werden. Der Quellcode muss mit eingeschalteter Optimierung übersetzt werden, sonst wird sehr viel Maschinencode erzeugt, und die Wartezeiten stimmen nicht mehr mit dem Parameter überein.<br />
<br />
Eine weitere Einschränkung liegt darin, daß sie möglicherweise länger warten, als erwartet, nämlich in dem Fall, daß Interrupts auftreten und die _delay...()-Funktion unterbrechen. Genau genommen warten diese nämlich nicht eine bestimmte Zeit, sondern verbrauchen eine bestimmte Anzahl von Prozessortakten. Die wiederum ist so bemessen, daß ohne Unterbrechung durch Interrupts die gewünschte Wartezeit erreicht wird.<br />
Wird das Warten aber durch eine oder mehrere ISR unterbrochen, die zusammen 1% Prozessorzeit verbrauchen, dann dauert das Warten etwa 1% länger. Bei 50% Last durch die ISR dauert das Warten doppelt solange wie gewünscht, bei 90% zehnmal solange...<br />
<br />
Abhängig von der Version der Bibliothek verhalten sich die Bibliotheksfunktionen etwas unterschiedlich.<br />
<br />
== avr-libc Versionen bis 1.6 ==<br />
<br />
Die Wartezeit der Funktion _delay_ms() ist auf 262,14ms/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 13,1ms warten. Die Wartezeit der Funktion _delay_us() ist auf 768us/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 38,4µs warten. Längere Wartezeiten müssen dann über einen mehrfachen Aufruf in einer Schleife gelöst werden.<br />
<br />
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#ifndef F_CPU<br />
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert <br />
(z.&nbsp;B. durch Übergabe als Parameter zum Compiler innerhalb <br />
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die<br />
"nachträgliche" Definition hinweist */<br />
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"<br />
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */<br />
#endif<br />
#include <util/delay.h> /* in älteren avr-libc Versionen <avr/delay.h> */ <br />
<br />
/*<br />
lange, variable Verzögerungszeit, Einheit in Millisekunden<br />
<br />
Die maximale Zeit pro Funktionsaufruf ist begrenzt auf <br />
262.14 ms / F_CPU in MHz (im Beispiel: <br />
262.1 / 3.6864 = max. 71 ms) <br />
<br />
Daher wird die kleine Warteschleife mehrfach aufgerufen,<br />
um auf eine längere Wartezeit zu kommen. Die zusätzliche <br />
Prüfung der Schleifenbedingung lässt die Wartezeit geringfügig<br />
ungenau werden (macht hier vielleicht 2-3ms aus).<br />
*/<br />
<br />
void long_delay(uint16_t ms)<br />
{<br />
for(; ms>0; ms--) _delay_ms(1);<br />
}<br />
<br />
int main( void )<br />
{<br />
DDRB = ( 1 << PB0 ); // PB0 an PORTB als Ausgang setzen<br />
<br />
while( 1 ) // Endlosschleife<br />
{ <br />
PORTB ^= ( 1 << PB0 ); // Toggle PB0 z.&nbsp;B. angeschlossene LED<br />
long_delay(1000); // Eine Sekunde warten...<br />
}<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
== avr-libc Versionen ab 1.7 ==<br />
<br />
_delay_ms() kann mit einem Argument bis 6553,5 ms (= 6,5535 Sekunden) benutzt werden. Es ist nicht möglich, eine Variable als Argument zu übergeben. Wird die früher gültige Grenze von 262,14 ms/F_CPU (in MHz) überschritten, so arbeitet _delay_ms() einfach etwas ungenauer und zählt nur noch mit einer Auflösung von 1/10 ms. Eine Verzögerung von 1000,10 ms ließe sich nicht mehr von einer von 1000,19 ms unterscheiden. Ein Verlust, der sich im Allgemeinen verschmerzen lässt. Dem Programmierer wird keine Rückmeldung gegeben, dass die Funktion ggf. gröber arbeitet, d.h. wenn es darauf ankommt, bitte den Parameter wie bisher geschickt wählen.<br />
<br />
Die Funktion _delay_us() wurde ebenfalls erweitert. Wenn deren maximal als genau behandelbares Argument überschritten wird, benutzt diese intern _delay_ms(). Damit gelten in diesem Fall die _delay_ms() Einschränkungen.<br />
<br />
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus, avr-libc ab Version 1.6<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#ifndef F_CPU<br />
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert <br />
(z.B. durch Übergabe als Parameter zum Compiler innerhalb <br />
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die<br />
"nachträgliche" Definition hinweist */<br />
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"<br />
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */<br />
#endif<br />
#include <util/delay.h><br />
<br />
int main( void )<br />
{<br />
DDRB = ( 1 << PB0 ); // PB0 an PORTB als Ausgang setzen<br />
<br />
while( 1 ) { // Endlosschleife<br />
PORTB ^= ( 1 << PB0 ); // Toggle PB0 z.B. angeschlossene LED<br />
_delay_ms(1000); // Eine Sekunde +/-1/10000 Sekunde warten...<br />
// funktioniert nicht mit Bibliotheken vor 1.6<br />
<br />
}<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
Die _delay_ms() und die _delay_us aus '''avr-libc 1.7.0''' sind fehlerhaft. _delay_ms () läuft 4x schneller als erwartet. Abhilfe ist eine korrigierte Includedatei: [http://www.mikrocontroller.net/topic/196738#1943039]<br />
<br />
= Programmieren mit Interrupts =<br />
<br />
<div style="float:right; margin:2em;"><br />
[[Image:Interrupt Programme.gif]]<br />
</div><br />
Nachdem wir nun alles Wissenswerte für die serielle Programmerstellung<br />
gelernt haben nehmen wir jetzt ein völlig anderes Thema in Angriff, nämlich<br />
die Programmierung unter Zuhilfenahme der Interrupts des AVR.<br />
<br />
Tritt ein Interrupt auf, unterbricht (engl. interrupts) der Controller die Verarbeitung des Hauptprogramms und verzweigt zu einer Interruptroutine. Das Hauptprogramm wird also beim Eintreffen eines Interrupts unterbrochen, die Interruptroutine ausgeführt und danach erst wieder das Hauptprogramm an der Unterbrechungsstelle fortgesetzt (vgl. die Abbildung).<br />
<br />
Um Interrupts verarbeiten zu können, ist folgendes zu beachten:<br />
<br />
* Für jede aktivierte Interruptquelle ist eine Funktion zu programmieren, in der die beim Auftreten des jeweiligen Interrupts erforderlichen Verarbeitungsschritte enthalten sind. Für diese Funktion existieren verschiedene Bezeichnungen. Üblich sind die englischen Begriffe Interrupt-Handler oder Interrupt-Service-Routinen (ISR), man findet aber auch die Bezeichnungen Interruptverarbeitungs- oder -behandlungsroutine oder auch kurz Interruptroutine. Zum Beispiel wird üblicherweise in der ISR zur Verarbeitung des Empfangsinterrupts eines UARTs (UART-RX Interrupt) das empfangene Zeichen in einen Zwischenspeicher (FIFO-Buffer) kopiert, dessen Inhalt später von anderen Programmteilen geleert wird. Sofern der Zwischenspeicher ausreichend groß ist, geht also kein Zeichen verloren, auch wenn im Hauptprogramm zeitintensive Operationen durchgeführt werden.<br />
* Die benötigten Interrupts sind in den jeweiligen Funktionsbausteinen einzuschalten. Dies erfolgt über das jeweilige Aktivierungsbit (Interrupt Enable) in einem der Hardwareregister (z.B. RX(Complete)Interrupt Enable eines UARTs)<br />
* Sämtliche Interrupts werden über einen weiteren globalen Schalter aktiviert und deaktiviert. Zur Verarbeitung der Interrupts ist dieser Schalter zu aktivieren (sei(), siehe unten).<br />
<br />
Alle Punkte sind zu beachten. Fehlt z.B. die globale Aktivierung, werden Interruptroutinen auch dann nicht aufgerufen, wenn sie im Funktionsbaustein eingeschaltet sind und eine Behandlungsroutine verhanden ist.<br />
<br />
Siehe auch<br />
<br />
* [http://www.mikrocontroller.net/forum/read-1-235092.html#new Ausführlicher Thread im Forum]<br />
* Artikel [[Interrupt]]<br />
* Artikel [[Multitasking]]<br />
{{Clear}}<br />
<br />
== Anforderungen an Interrupt-Routinen ==<br />
<br />
Um unliebsamen Überraschungen vorzubeugen, sollten einige Grundregeln bei der Implementierung der Interruptroutinen beachtet werden. Interruptroutinen sollten möglichst kurz und schnell abarbeitbar sein, daraus folgt:<br />
<br />
* Keine umfangreichen Berechnungen innerhalb der Interruptroutine. (*)<br />
* Keine langen Programmschleifen.<br />
* Obwohl es möglich ist, während der Abarbeitung einer Interruptroutine andere oder sogar den gleichen Interrupt wieder zuzulassen, wird davon ohne genaue Kenntnis der internen Abläufe dringend abgeraten.<br />
<br />
Interruptroutinen (ISRs) sollten also möglichst kurz sein und keine Schleifen mit vielen Durchläufen enthalten. Längere Operationen können meist in einen "Interrupt-Teil" in einer ISR und einen "Arbeitsteil" im Hauptprogramm aufgetrennt werden. Z.B. Speichern des Zustands aller Eingänge im EEPROM in bestimmten Zeitabständen: ISR-Teil: Zeitvergleich (Timer,RTC) mit Logzeit/-intervall. Bei Übereinstimmung ein globales Flag setzen (volatile bei Flag-Deklaration nicht vergessen, s.u.). Dann im Hauptprogramm prüfen, ob das Flag gesetzt ist. Wenn ja: die Daten im EEPROM ablegen und Flag löschen.<br />
<br />
(*)<br />
Hinweis: <br />
Es gibt allerdings die seltene Situation, dass man gerade eingelesene<br />
ADC-Werte sofort verarbeiten muss. Besonders dann, wenn man mehrere Werte sehr<br />
schnell hintereinander bekommt. Dann bleibt einem nichts anderes übrig, als die<br />
Werte noch in der ISR zu verarbeiten. Kommt aber sehr selten vor und sollte<br />
durch geeignete Wahl des Systemtaktes bzw. Auswahl des Controllers vermieden werden!<br />
<br />
== Interrupt-Quellen ==<br />
<br />
Die folgenden Ereignisse können einen Interrupt auf einem AVR AT90S2313 auslösen, wobei die Reihenfolge der Auflistung auch die Priorität der Interrupts aufzeigt.<br />
<br />
* Reset<br />
* Externer Interrupt 0<br />
* Externer Interrupt 1<br />
* Timer/Counter 1 Capture Ereignis<br />
* Timer/Counter 1 Compare Match<br />
* Timer/Counter 1 Überlauf<br />
* Timer/Counter 0 Überlauf<br />
* UART Zeichen empfangen<br />
* UART Datenregister leer<br />
* UART Zeichen gesendet<br />
* Analoger Komparator<br />
<br />
Die Anzahl der möglichen Interruptquellen variiert zwischen den verschiedenen Microcontroller-Typen. Im Zweifel hilft ein Blick ins Datenblatt ("Interrupt Vectors").<br />
<br />
== Register ==<br />
<br />
Der AT90S2313 verfügt über 2 Register die mit den<br />
Interrupts zusammenhängen.<br />
<br />
{| class="wikitable"<br />
|- <br />
!width="10%"| GIMSK<br />
| '''G'''eneral '''I'''nterrupt '''M'''a'''sk''' Register.<br /><br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit <br />
| 7 || 6|| 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''INT1''' || '''INT0''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-'''<br />
|- <br />
! R/W<br />
| R/W || R/W || R || R || R || R || R || R<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''INT1''' (External '''Int'''errupt Request '''1''' Enable)<br />
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am '''INT1'''-Pin eine steigende oder fallende (je nach Konfiguration im '''MCUCR''') Flanke erkannt wird.<br />
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.<br />
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.<br />
<br />
'''INT0''' (External '''Int'''errupt Request '''0''' Enable)<br />
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am '''INT0'''-Pin eine steigende oder fallende (je nach Konfiguration im '''MCUCR''') Flanke erkannt wird.<br />
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.<br />
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.<br />
<br />
|- <br />
! GIFR<br />
| '''G'''eneral '''I'''nterrupt '''F'''lag '''R'''egister.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''INTF1''' || '''INTF0''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-'''<br />
|- <br />
! R/W<br />
| R/W || R/W || R || R || R || R || R || R<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''INTF1''' (External '''Int'''errupt Flag '''1''')<br />
:Dieses Bit wird gesetzt, wenn am '''INT1'''-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.<br />
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert '''1(!)''' eingeschrieben wird.<br />
<br />
'''INTF0''' (External '''Int'''errupt Flag '''0''')<br />
:Dieses Bit wird gesetzt, wenn am '''INT0'''-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.<br />
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert '''1(!)''' eingeschrieben wird.<br />
|- <br />
! MCUCR<br />
| '''MCU''' '''C'''ontrol '''R'''egister.<br />
<br />
Das MCU Control Register enthält Kontrollbits für allgemeine MCU-Funktionen.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''-'''|| '''-'''|| '''SE'''|| '''SM'''|| '''ISC11'''|| '''ISC10'''|| '''ISC01'''|| '''ISC00'''<br />
|- <br />
! R/W<br />
| R || R || R/W || R/W || R/W || R/W || R/W || R/W<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
<br />
|}<br />
<br />
'''SE''' ('''S'''leep '''E'''nable)<br />
:Dieses Bit muss gesetzt sein, um den Controller mit dem '''SLEEP'''-Befehl in den Schlafzustand versetzen zu können.<br />
:Um den Schlafmodus nicht irrtümlich einzuschalten, wird empfohlen, das Bit erst unmittelbar vor Ausführung des '''SLEEP'''-Befehls zu setzen.<br />
<br />
'''SM''' ('''S'''leep '''M'''ode)<br />
:Dieses Bit bestimmt über den Schlafmodus.<br />
:Ist das Bit gelöscht, so wird der '''Idle'''-Modus ausgeführt. Ist das Bit gesetzt, so wird der '''Power-Down'''-Modus ausgeführt. (für andere AVR Controller siehe Abschnitt "Sleep-Mode")<br />
<br />
'''ISC11''', '''ISC10''' ('''I'''nterrupt '''S'''ense '''C'''ontrol '''1''' Bits)<br />
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am '''INT1'''-Pin ausgewertet wird.<br />
<br />
:{| class="wikitable"<br />
|- <br />
!width="10%"| ISC11 ||width="10%"| ISC10 || Bedeutung<br />
|- <br />
| align="center" | 0<br />
| align="center" | 0<br />
| Low Level an '''INT1''' erzeugt einen Interrupt.<br />
<br />
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.<br />
|- <br />
| align="center" | 0<br />
| align="center" | 1<br />
| Reserviert<br />
|- <br />
| align="center" | 1<br />
| align="center" | 0<br />
| Die fallende Flanke an '''INT1''' erzeugt einen Interrupt.<br />
|- <br />
| align="center" | 1<br />
| align="center" | 1<br />
| Die steigende Flanke an '''INT1''' erzeugt einen Interrupt.<br />
|}<br />
<br />
'''ISC01''', '''ISC00''' ('''I'''nterrupt '''S'''ense '''C'''ontrol '''0''' Bits)<br />
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am '''INT0'''-Pin ausgewertet wird.<br />
<br />
:{| class="wikitable"<br />
|- <br />
!width="10%"| ISC01 ||width="10%"| ISC00 || Bedeutung<br />
|- <br />
| align="center" | 0<br />
| align="center" | 0<br />
| Low Level an '''INT0''' erzeugt einen Interrupt.<br />
<br />
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.<br />
|- <br />
| align="center" | 0<br />
| align="center" | 1<br />
| Reserviert<br />
|- <br />
| align="center" | 1<br />
| align="center" | 0<br />
| Die fallende Flanke an '''INT0''' erzeugt einen Interrupt.<br />
|- <br />
| align="center" | 1<br />
| align="center" | 1<br />
| Die steigende Flanke an '''INT0''' erzeugt einen Interrupt.<br />
|}<br />
<br />
|}<br />
<br />
== Allgemeines über die Interrupt-Abarbeitung ==<br />
<br />
Wenn ein Interrupt eintrifft, wird automatisch das '''Global Interrupt Enable''' Bit im Status Register '''SREG''' gelöscht und alle weiteren Interrupts unterbunden. Dieses wird automatisch wieder gesetzt, wenn die Interruptroutine beendet wird. Wenn in der Zwischenzeit weitere Interrupts eintreffen, werden die zugehörigen Interrupt-Bits gesetzt und die Interrupts bei Beendigung der laufenden Interrupt-Routine in der Reihenfolge ihrer Priorität ausgeführt. Dies kann<br />
eigentlich nur dann zu Problemen führen, wenn ein hoch priorisierter Interrupt ständig und in kurzer Folge auftritt. Dieser sperrt dann möglicherweise alle anderen Interrupts mit niedrigerer Priorität. Dies ist einer der Gründe, weshalb die Interrupt-Routinen sehr kurz gehalten werden sollen. Es ist möglich das GIE-Bit in der ISR zu setzen und so schon wieder weitere Interrupts zuzulassen - allerdings sollte man damit vorsichtig sein und genau wissen was man damit macht. Kritisch wird es vor allem wenn der gleiche Interrupt noch einmal kommt, bevor die ISR abgearbeitet ist. <br />
<br />
<!-- === Das Status-Register ===<br />
<br />
Es gilt auch zu beachten, dass das Status-Register während der Abarbeitung einer Interruptroutine nicht automatisch gesichert wird. Falls notwendig, muss dies vom Programmierer selber vorgesehen werden. --><br />
<br />
== Interrupts mit avr-gcc ==<br />
<br />
<!-- ''Anmerkung eines Nutzers: Ich habe mir das Thema hier angearbeitet und hatte am Anfang starke Probleme: Jeder Interrupt muss nochmals einzeln aktiviert werden. Es reicht nicht nur per ''sei()'' die Interrupts global zu aktiveren.'' - mthomas: Hoffentlich duch die modifizerte Einleitung etwas offensichtlicher erläutert. Ansonsten bitte per Eintrag auf die Diskussionseite nochmals melden) --> <br />
<!-- Selbstverständlich können alle interruptspezifischen Registerzugriffe wie gewohnt über I/O-Adressierung vorgenommen werden. Etwas einfacher geht es jedoch, wenn wir die vom Compiler zur Verfügung gestellten Mittel einsetzen.--><br />
Funktionen zur Interrupt-Verarbeitung werden in den Includedateien ''interrupt.h'' der avr-libc zur Verfügung gestellt (bei älterem Quellcode zusätzlich ''signal.h'').<br />
<br />
<syntaxhighlight lang="c"><br />
// fuer sei(), cli() und ISR():<br />
#include <avr/interrupt.h><br />
</syntaxhighlight><br />
<br />
Das Makro '''sei()''' schaltet die Interrupts ein. Eigentlich wird nichts anderes gemacht, als das '''Global Interrupt Enable''' Bit im Status Register gesetzt.<br />
<br />
<syntaxhighlight lang="c"><br />
sei();<br />
</syntaxhighlight><br />
<br />
Das Makro '''cli()''' schaltet die Interrupts aus, oder anders gesagt, das '''Global Interrupt Enable''' Bit im Status Register wird gelöscht.<br />
<br />
<syntaxhighlight lang="c"><br />
cli();<br />
</syntaxhighlight><br />
<br />
Oft steht man vor der Aufgabe, dass eine Codesequenz nicht unterbrochen werden darf. Es liegt dann nahe, zu Beginn dieser Sequenz ein cli() und am Ende ein sei() einzufügen. Dies ist jedoch ungünstig, wenn die Interrupts vor Aufruf der Sequenz deaktiviert waren und danach auch weiterhin deaktiviert bleiben sollen. Ein sei() würde ungeachtet des vorherigen Zustands die Interrupts aktivieren, was zu unerwünschten Seiteneffekten führen kann. Die aus dem folgenden Beispiel ersichtliche Vorgehensweise ist in solchen Fällen vorzuziehen:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
#include <inttypes.h><br />
<br />
//...<br />
<br />
void NichtUnterbrechenBitte(void)<br />
{<br />
uint8_t tmp_sreg; // temporaerer Speicher fuer das Statusregister<br />
<br />
tmp_sreg = SREG; // Statusregister (also auch das I-Flag darin) sichern<br />
cli(); // Interrupts global deaktivieren<br />
<br />
/* hier "unterbrechnungsfreier" Code */<br />
<br />
/* Beispiel Anfang<br />
JTAG-Interface eines ATmega16 per Software deaktivieren <br />
und damit die JTAG-Pins an PORTC für "general I/O" nutzbar machen<br />
ohne die JTAG-Fuse-Bit zu aendern. Dazu ist eine "timed sequence"<br />
einzuhalten (vgl Datenblatt ATmega16, Stand 10/04, S. 229): <br />
Das JTD-Bit muss zweimal innerhalb von 4 Taktzyklen geschrieben <br />
werden. Ein Interrupt zwischen den beiden Schreibzugriffen wuerde <br />
die erforderliche Sequenz "brechen", das JTAG-Interface bliebe<br />
weiterhin aktiv und die IO-Pins weiterhin für JTAG reserviert. */<br />
<br />
MCUCSR |= (1<<JTD);<br />
MCUCSR |= (1<<JTD); // 2 mal in Folge ,vgl. Datenblatt fuer mehr Information<br />
<br />
/* Beispiel Ende */<br />
<br />
SREG = tmp_sreg; // Status-Register wieder herstellen <br />
// somit auch das I-Flag auf gesicherten Zustand setzen<br />
}<br />
<br />
void NichtSoGut(void)<br />
{<br />
cli();<br />
<br />
/* hier "unterbrechnungsfreier" Code */<br />
<br />
sei();<br />
}<br />
<br />
<br />
int main(void)<br />
{<br />
//...<br />
<br />
cli(); <br />
// Interrupts global deaktiviert <br />
<br />
NichtUnterbrechenBitte();<br />
// auch nach Aufruf der Funktion deaktiviert<br />
<br />
sei();<br />
// Interrupts global aktiviert <br />
<br />
NichtUnterbrechenBitte();<br />
// weiterhin aktiviert<br />
//...<br />
<br />
/* Verdeutlichung der unguenstigen Vorgehensweise mit cli/sei: */<br />
cli(); <br />
// Interrupts jetzt global deaktiviert <br />
<br />
NichtSoGut();<br />
// nach Aufruf der Funktion sind Interrupts global aktiviert <br />
// dies ist mglw. ungewollt!<br />
//...<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<!-- mt: besser so nicht(?), lieber "datenblattkonform"<br />
<br />
<font face="Courier New">'''timer_enable_int (unsigned char ints);<br /><br />
'''</font>Schaltet Timerbezogene Interrupts ein bzw. aus.<br /><br />
Wenn als Argument '''ints''' der Wert 0 übergeben wird so werden alle<br />
Timerinterrupts ausgeschaltet, ansonsten muss in '''ints''' angegeben werden,<br />
welche Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu<br />
setzenden Bits definiert werden.<br /><br />
Beispiel: '''<font face="Courier New">timer_enable_int (1 << TOIE1));<br /><br />
</font>'''Achtung: Wenn ein Timerinterrupt eingeschaltet wird während ein<br />
anderer Timerinterrupt bereits läuft, dann müssen beide Bits angegeben werden<br />
sonst wird der andere Timerinterrupt versehentlich ausgeschaltet.<br />
<br />
<font face="Courier New">'''enable_external_int (unsigned char ints);<br /><br />
'''</font>Schaltet die externen Interrupts ein bzw. aus.<br /><br />
Wenn als Argument '''ints''' der Wert 0 übergeben wird so werden alle externen<br />
Interrrups ausgeschaltet, ansonsten muss in '''ints''' angegeben werden, welche<br />
Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu<br />
setzenden Bits definiert werden.<br /><br />
Beispiel: '''<font face="Courier New">enable_external_int ((1<<br />
</font>'''Schaltet die externen Interrupts 0 und 1 ein.<br />
<br />
Nachdem nun die Interrupts aktiviert sind, braucht es selbstverständlich noch den auszuführenden Code, der ablaufen soll, wenn ein Interrupt eintrifft.<br />
--><br />
Zu den aktivierten Interrupts ist eine Funktion zu programmieren, deren Code aufgerufen wird, wenn der betreffende Interrupt auftritt (Interrupt-Handler, Interrupt-Service-Routine). Dazu existiert die Definition (ein Makro) '''ISR'''.<br />
<br />
=== ISR ===<br />
<br />
(''ISR()'' ersetzt bei neueren Versionen der avr-libc ''SIGNAL()''. SIGNAL sollte nicht mehr genutzt werden, zur Portierung von SIGNAL nach ISR siehe den [[AVR-GCC-Tutorial#Anhang|Anhang]].)<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
//...<br />
ISR(Vectorname) /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */<br />
{<br />
/* Interrupt Code */<br />
}<br />
</syntaxhighlight><br />
<br />
Mit ''ISR'' wird eine Funktion für die Bearbeitung eines Interrupts eingeleitet. Als Argument muss dabei die Benennung des entsprechenden Interruptvektors angegeben werden. Diese sind in den jeweiligen Includedateien IOxxxx.h zu finden. Die Bezeichnung entspricht dem Namen aus dem Datenblatt, bei dem die Leerzeichen durch Unterstriche ersetzt sind und ein ''_vect'' angehängt ist.<br />
<br />
Als Beispiel ein Ausschnitt aus der Datei für den ATmega8 (bei WinAVR Standardinstallation in C:\WinAVR\avr\include\avr\iom8.h) in der neben den aktuellen Namen für ''ISR'' (*_vect) noch die Bezeichnungen für das inzwischen nicht mehr aktuelle ''SIGNAL'' (SIG_*) enthalten sind.<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
/* $Id: iom8.h,v 1.13 2005/10/30 22:11:23 joerg_wunsch Exp $ */<br />
<br />
/* avr/iom8.h - definitions for ATmega8 */<br />
//...<br />
<br />
/* Interrupt vectors */<br />
<br />
/* External Interrupt Request 0 */<br />
#define INT0_vect _VECTOR(1)<br />
#define SIG_INTERRUPT0 _VECTOR(1)<br />
<br />
/* External Interrupt Request 1 */<br />
#define INT1_vect _VECTOR(2)<br />
#define SIG_INTERRUPT1 _VECTOR(2)<br />
<br />
/* Timer/Counter2 Compare Match */<br />
#define TIMER2_COMP_vect _VECTOR(3)<br />
#define SIG_OUTPUT_COMPARE2 _VECTOR(3)<br />
<br />
/* Timer/Counter2 Overflow */<br />
#define TIMER2_OVF_vect _VECTOR(4)<br />
#define SIG_OVERFLOW2 _VECTOR(4)<br />
<br />
/* Timer/Counter1 Capture Event */<br />
#define TIMER1_CAPT_vect _VECTOR(5)<br />
#define SIG_INPUT_CAPTURE1 _VECTOR(5)<br />
<br />
/* Timer/Counter1 Compare Match A */<br />
#define TIMER1_COMPA_vect _VECTOR(6)<br />
#define SIG_OUTPUT_COMPARE1A _VECTOR(6)<br />
<br />
/* Timer/Counter1 Compare Match B */<br />
#define TIMER1_COMPB_vect _VECTOR(7)<br />
#define SIG_OUTPUT_COMPARE1B _VECTOR(7)<br />
<br />
//...<br />
</syntaxhighlight><br />
<br />
<!--Vor Nutzung von SIGNAL muss ebenfalls die Header-Datei signal.h eingebunden werden.--> <br />
Mögliche Funktionsrümpfe für Interruptfunktionen sind zum Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
/* veraltet: #include <avr/signal.h> */<br />
<br />
ISR(INT0_vect) /* veraltet: SIGNAL(SIG_INTERRUPT0) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
ISR(TIMER0_OVF_vect) /* veraltet: SIGNAL(SIG_OVERFLOW0) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
ISR(USART_RXC_vect) /* veraltet: SIGNAL(SIG_UART_RECV) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
// und so weiter und so fort...<br />
</syntaxhighlight><br />
<br />
Auf die korrekte Schreibweise der Vektorbezeichnung ist zu achten. Der gcc-Compiler prüft erst ab Version 4.x, ob ein Signal/Interrupt der angegebenen Bezeichnung tatsächlich in der Includedatei definiert ist und gibt andernfalls eine Warnung aus. Bei WinAVR (ab 2/2005) wurde die Überprüfung auch in den mitgelieferten Compiler der Version 3.x integriert. Aus dem gcc-Quellcode Version 3.x selbst erstellte Compiler enthalten die Prüfung nicht (vgl. [[AVR-GCC]]). <br />
<br />
Während der Ausführung der Funktion sind alle weiteren Interrupts automatisch gesperrt. Beim Verlassen der Funktion werden die Interrupts wieder zugelassen.<br />
<br />
Sollte während der Abarbeitung der Interruptroutine ein weiterer Interrupt (gleiche oder andere Interruptquelle) auftreten, so wird das entsprechende Bit im zugeordneten Interrupt Flag Register gesetzt und die entsprechende Interruptroutine automatisch nach dem Beenden der aktuellen Funktion aufgerufen.<br />
<br />
Ein Problem ergibt sich eigentlich nur dann, wenn während der Abarbeitung der aktuellen Interruptroutine mehrere gleichartige Interrupts auftreten. Die entsprechende Interruptroutine wird im Nachhinein zwar aufgerufen jedoch wissen wir nicht, ob nun der entsprechende Interrupt einmal, zweimal oder gar noch öfter aufgetreten ist. Deshalb soll hier noch einmal betont werden, dass Interruptroutinen so schnell wie nur irgend möglich wieder verlassen werden sollten.<br />
<br />
=== Unterbrechbare Interruptroutinen ===<br />
<br />
"Faustregel": im Zweifel '''ISR'''. Die nachfolgend beschriebene Methode nur dann verwenden, wenn man sich über die unterschiedliche Funktionsweise im Klaren ist.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
<br />
ISR(XXX,ISR_NOBLOCK) /* veraltet: INTERRUPT(SIG_OVERFLOW0) */<br />
{<br />
/* Interrupt-Code */<br />
}<br />
</syntaxhighlight><br />
<br />
Hierbei steht XXX für den oben beschriebenen Namen des Vektors (also z.&nbsp;B. ''TIMER0_OVF_vect''). Der Unterschied im Vergleich zu einer herkömmlichen ISR ist, dass hier beim Aufrufen der Funktion das '''Global Enable Interrupt''' Bit durch Einfügen einer SEI-Anweisung direkt wieder gesetzt und somit alle Interrupts zugelassen werden &ndash; auch XXX-Interrupts. <br />
<br />
Bei unsachgemässer Handhabung kann dies zu erheblichen Problemen durch Rekursion wie einem Stack-Overflow oder anderen unerwarteten Effekten führen und sollte wirklich nur dann eingesetzt werden, wenn man sich sicher ist, das Ganze auch im Griff zu haben.<br />
<br />
Insbesondere sollte möglichst am ISR-Anfang die auslösende IRQ-Quelle deaktiviert und erst am Ende der ISR wieder aktiviert werden. Robuster als die Verwendung einer NOBLOCK-ISR ist daher folgender ISR-Aufbau:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
<br />
ISR (XXX) <br />
{<br />
// Implementiere die ISR ohne zunaechst weitere IRQs zuzulassen<br />
<br />
<<Deaktiviere die XXX-IRQ>><br />
<br />
// Erlaube alle Interrupts (ausser XXX)<br />
sei();<br />
<br />
//... Code ...<br />
<br />
// IRQs global deaktivieren um die XXX-IRQ wieder gefahrlos <br />
// aktivieren zu koennen<br />
cli();<br />
<br />
<<Aktiviere die XXX-IRQ>><br />
}<br />
</syntaxhighlight><br />
Auf diese Weise kann sich die XXX-IRQ nicht selbst unterbrechen, was zu einer Art Endlosschleife führen würde.<br />
<br />
Siehe auch: Hinweise in [[AVR-GCC]]<br />
<br />
siehe dazu: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html<br />
<br />
== Datenaustausch mit Interrupt-Routinen ==<br />
<br />
Variablen, die sowohl in Interrupt-Routinen (ISR = Interrupt Service Routine(s)) als auch vom übrigen Programmcode geschrieben oder gelesen werden, müssen mit einem '''volatile''' deklariert werden. Damit wird dem Compiler mitgeteilt, dass der Inhalt der Variablen vor jedem Lesezugriff aus dem Speicher gelesen und nach jedem Schreibzugriff in den Speicher geschrieben wird. Ansonsten könnte der Compiler den Code so optimieren, dass der Wert der Variablen nur in Prozessorregistern zwischengespeichert wird, die nichts von der Änderung woanders mitbekommen.<br />
<br />
Zur Veranschaulichung ein Codefragment für eine Tastenentprellung mit Erkennung einer "lange gedrückten" Taste.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
#include <stdint.h><br />
//...<br />
<br />
// Schwellwerte<br />
// Entprellung: <br />
#define CNTDEBOUNCE 10<br />
// "lange gedrueckt:"<br />
#define CNTREPEAT 200<br />
<br />
// hier z.&nbsp;B. Taste an Pin2 PortA "active low" = 0 wenn gedrueckt<br />
#define KEY_PIN PINA<br />
#define KEY_PINNO PA2<br />
<br />
// beachte: volatile! <br />
volatile uint8_t gKeyCounter;<br />
<br />
// Timer-Compare Interrupt ISR, wird z.B. alle 10ms ausgefuehrt<br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
// hier wird gKeyCounter veraendert. Die übrigen<br />
// Programmteile müssen diese Aenderung "sehen":<br />
// volatile -> aktuellen Wert immer in den Speicher schreiben<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
if (gKeyCounter < CNTREPEAT) gKeyCounter++;<br />
}<br />
else {<br />
gKeyCounter = 0;<br />
}<br />
}<br />
<br />
//...<br />
<br />
int main(void)<br />
{<br />
//...<br />
/* hier: Initialisierung der Ports und des Timer-Interrupts */<br />
//... <br />
// hier wird auf gKeyCounter zugegriffen. Dazu muss der in der<br />
// ISR geschriebene Wert bekannt sein:<br />
// volatile -> aktuellen Wert immer aus dem Speicher lesen<br />
if ( gKeyCounter > CNTDEBOUNCE ) { // Taste mind. 10*10 ms "prellfrei"<br />
if (gKeyCounter == CNTREPEAT) {<br />
/* hier: Code fuer "Taste lange gedrueckt" */<br />
}<br />
else {<br />
/* hier: Code fuer "Taste kurz gedrueckt" */<br />
}<br />
}<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Wird innerhalb einer ISR mehrfach auf eine mit volatile deklarierte Variable zugegriffen, wirkt sich dies ungünstig auf die Verarbeitungsgeschwindigkeit aus, da bei jedem Zugriff mit dem Speicherinhalt abgeglichen wird. Da bei AVR-Controllern ''innerhalb'' einer ISR keine Unterbrechungen zu erwarten sind, bietet es sich an, einen Zwischenspeicher in Form einer lokalen Variable zu verwenden, deren Inhalt zu Beginn und am Ende mit dem der volatile Variable synchronisiert wird. Lokale Variable werden bei eingeschalteter Optimierung mit hoher Wahrscheinlichkeit in Prozessorregistern verwaltet und der Zugriff darauf ist daher nur mit wenigen internen Operationen verbunden. Die ISR aus dem vorherigen Beispiel lässt sich so optimieren:<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
uint8_t tmp_kc;<br />
<br />
tmp_kc = gKeyCounter; // Uebernahme in lokale Arbeitsvariable<br />
<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
if (tmp_kc < CNTREPEAT) {<br />
tmp_kc++;<br />
}<br />
}<br />
else {<br />
tmp_kc = 0;<br />
}<br />
<br />
gKeyCounter = tmp_kc; // Zurueckschreiben<br />
}<br />
//...<br />
</syntaxhighlight><br />
<br />
Zum Vergleich die Disassemblies (Ausschnitte der "lss-Dateien", compiliert für ATmega162) im Anschluss. Man erkennt den viermaligen Zugriff auf die Speicheraddresse von ''gKeyCounter'' (hier 0x032A) in der ISR ohne "Cache"-Variable und den zweimaligen Zugriff in der Variante mit Zwischenspeicher. Im Beispiel ist der Vorteil gering, bei komplexeren Routinen kann die Zwischenspeicherung in lokalen Variablen jedoch zu deutlicheren Verbesserungen führen.<br />
<br />
<pre><br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
86a: 1f 92 push r1<br />
86c: 0f 92 push r0<br />
86e: 0f b6 in r0, 0x3f ; 63<br />
870: 0f 92 push r0<br />
872: 11 24 eor r1, r1<br />
874: 8f 93 push r24<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
876: ca 99 sbic 0x19, 2 ; 25<br />
878: 0a c0 rjmp .+20 ; 0x88e <__vector_13+0x24><br />
if (gKeyCounter < CNTREPEAT) gKeyCounter++;<br />
87a: 80 91 2a 03 lds r24, 0x032A<br />
87e: 88 3c cpi r24, 0xC8 ; 200 <br />
880: 40 f4 brcc .+16 ; 0x892 <__vector_13+0x28><br />
882: 80 91 2a 03 lds r24, 0x032A<br />
886: 8f 5f subi r24, 0xFF ; 255<br />
888: 80 93 2a 03 sts 0x032A, r24<br />
88c: 02 c0 rjmp .+4 ; 0x892 <__vector_13+0x28><br />
}<br />
else {<br />
gKeyCounter = 0;<br />
88e: 10 92 2a 03 sts 0x032A, r1<br />
892: 8f 91 pop r24<br />
894: 0f 90 pop r0<br />
896: 0f be out 0x3f, r0 ; 63<br />
898: 0f 90 pop r0<br />
89a: 1f 90 pop r1<br />
89c: 18 95 reti<br />
</pre><br />
<br />
<pre><br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
86a: 1f 92 push r1<br />
86c: 0f 92 push r0<br />
86e: 0f b6 in r0, 0x3f ; 63<br />
870: 0f 92 push r0<br />
872: 11 24 eor r1, r1<br />
874: 8f 93 push r24<br />
uint8_t tmp_kc;<br />
<br />
tmp_kc = gKeyCounter;<br />
876: 80 91 2a 03 lds r24, 0x032A<br />
<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
87a: ca 9b sbis 0x19, 2 ; 25<br />
87c: 02 c0 rjmp .+4 ; 0x882 <__vector_13+0x18><br />
87e: 80 e0 ldi r24, 0x00 ; 0<br />
880: 03 c0 rjmp .+6 ; 0x888 <__vector_13+0x1e><br />
if (tmp_kc < CNTREPEAT) {<br />
882: 88 3c cpi r24, 0xC8 ; 200<br />
884: 08 f4 brcc .+2 ; 0x888 <__vector_13+0x1e><br />
tmp_kc++;<br />
886: 8f 5f subi r24, 0xFF ; 255<br />
}<br />
}<br />
else {<br />
tmp_kc = 0;<br />
}<br />
<br />
gKeyCounter = tmp_kc;<br />
888: 80 93 2a 03 sts 0x032A, r24<br />
88c: 8f 91 pop r24<br />
88e: 0f 90 pop r0<br />
890: 0f be out 0x3f, r0 ; 63<br />
892: 0f 90 pop r0<br />
894: 1f 90 pop r1<br />
896: 18 95 reti<br />
</pre><br />
<br />
=== volatile und Pointer ===<br />
<br />
Bei '''volatile''' in Verbindung mit Pointern ist zu beachten, ob der Pointer selbst oder die Variable, auf die der Pointer zeigt, '''volatile''' ist.<br />
<br />
<syntaxhighlight lang="c"><br />
volatile uint8_t *a; // das Ziel von a ist volatile<br />
<br />
uint8_t *volatile a; // a selbst ist volatile<br />
</syntaxhighlight><br />
<br />
Falls der Pointer volatile ist (zweiter Fall im Beispiel), ist zu beachten, dass der Wert des Pointers, also eine Speicheradresse, intern in mehr als einem Byte verwaltet wird. Lese- und Schreibzugriffe im Hauptprogramm (außerhalb von Interrupt-Routinen) sind daher so zu implementieren, dass alle Teilbytes der Adresse konsistent bleiben, vgl. dazu den folgenden Abschnitt.<br />
<br />
=== Variablen größer 1 Byte ===<br />
<br />
Bei Variablen größer ein Byte, auf die in Interrupt-Routinen und im Hauptprogramm zugegriffen wird, muss darauf geachtet werden, dass die Zugriffe auf die einzelnen Bytes außerhalb der ISR nicht durch einen Interrupt unterbrochen werden. (Allgemeinplatz: AVRs sind 8-bit Controller). Zur Veranschaulichung ein Codefragment:<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
volatile uint16_t gMyCounter16bit;<br />
//...<br />
ISR(...)<br />
{<br />
//...<br />
gMyCounter16Bit++;<br />
//...<br />
}<br />
<br />
int main(void)<br />
{<br />
uint16_t tmpCnt;<br />
//...<br />
// nicht gut: Mglw. hier ein Fehler, wenn ein Byte von MyCounter <br />
// schon in tmpCnt kopiert ist aber vor dem Kopieren des zweiten Bytes <br />
// ein Interrupt auftritt, der den Inhalt von MyCounter verändert.<br />
tmpCnt = gMyCounter16bit; <br />
<br />
<br />
// besser: Änderungen "außerhalb" verhindern -> alle "Teilbytes"<br />
// bleiben konsistent<br />
cli(); // Interrupts deaktivieren<br />
tmpCnt = gMyCounter16Bit;<br />
sei(); // wieder aktivieren<br />
<br />
// oder: vorheriger Status des globalen Interrupt-Flags bleibt erhalten<br />
uint8_t sreg_tmp;<br />
sreg_tmp = SREG; /* Sichern */<br />
cli()<br />
tmpCnt = gMyCounter16Bit;<br />
SREG = sreg_tmp; /* Wiederherstellen */<br />
<br />
// oder: mehrfach lesen, bis man konsistente Daten hat<br />
uint16_t count1 = gMyCounter16Bit;<br />
uint16_t count2 = gMyCounter16Bit;<br />
while (count1 != count2) {<br />
count1 = count2;<br />
count2 = gMyCounter16Bit;<br />
}<br />
tmpCnt = count1;<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Die avr-libc bietet ab Version 1.6.0(?) einige Hilfsfunktionen/Makros, mit der im Beispiel oben gezeigten Funktionalität, die zusätzlich auch sogenannte [http://en.wikipedia.org/wiki/Memory_barrier memory barriers] beinhalten. Diese stehen nach #include <util/atomic.h> zur Verfügung.<br />
<syntaxhighlight lang="c"><br />
//...<br />
#include <util/atomic.h><br />
//...<br />
<br />
// analog zu cli, Zugriff, sei:<br />
ATOMIC_BLOCK(ATOMIC_FORCEON) {<br />
tmpCnt = gMyCounter16Bit;<br />
}<br />
<br />
// oder:<br />
<br />
// analog zu Sicherung des SREG, cli, Zugriff und Zurückschreiben des SREG:<br />
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />
tmpCnt = gMyCounter16Bit;<br />
}<br />
<br />
//...<br />
</syntaxhighlight><br />
<br />
* siehe auch [http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html Dokumentation der avr-libc zu atomic.h]<br />
<br />
== Interrupt-Routinen und Registerzugriffe ==<br />
<br />
Falls Register sowohl im Hauptprogramm als auch in Interrupt-Routinen verändert werden, ist darauf zu achten, dass diese Zugriffe sich nicht überlappen. Nur wenige Anweisungen lassen sich in sogenannte "atomare" Zugriffe übersetzen, die nicht von Interrupt-Routinen unterbrochen werden können. <br />
<br />
Zur Veranschaulichung eine Anweisung, bei der ein Bit und im Anschluss drei Bits in einem Register gesetzt werden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
int main(void)<br />
{<br />
//...<br />
PORTA |= (1<<PA0);<br />
<br />
PORTA |= (1<<PA2)|(1<<PA3)|(1<<PA4);<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Der Compiler übersetzt diese Anweisungen für einen ATmega128 bei Optimierungsstufe "S" nach:<br />
<br />
<div class="code"><pre><br />
...<br />
PORTA |= (1<<PA0);<br />
d2: d8 9a sbi 0x1b, 0 ; 27 (a)<br />
<br />
PORTA |= (1<<PA2)|(1<<PA3)|(1<<PA4);<br />
d4: 8b b3 in r24, 0x1b ; 27 (b)<br />
d6: 8c 61 ori r24, 0x1C ; 28 (c)<br />
d8: 8b bb out 0x1b, r24 ; 27 (d)<br />
...<br />
</pre></div><br />
<br />
Das Setzen des einzelnen Bits wird bei eingeschalteter Optimierung für Register im unteren Speicherbereich in eine einzige Assembler-Anweisung (sbi) übersetzt und ist nicht anfällig für Unterbrechungen durch Interrupts. Die Anweisung zum Setzen von drei Bits wird jedoch in drei abhängige Assembler-Anweisungen übersetzt und bietet damit zwei "Angriffspunkte" für Unterbrechungen. Eine Interrupt-Routine könnte nach dem Laden des Ausgangszustands in den Zwischenspeicher (hier Register 24) den Wert des Registers ändern, z.&nbsp;B. ein Bit löschen. Damit würde der Zwischenspeicher nicht mehr mit dem tatsächlichen Zustand übereinstimmen aber dennoch nach der Bitoperation (hier ori) in das Register zurückgeschrieben. <br />
<br />
Beispiel: PORTA sei anfangs 0b00000000. Die erste Anweisung (a) setzt Bit 0 auf '''1''', PORTA ist danach 0b0000000'''1'''. Nun wird im ersten Teil der zweiten Anweisung der Portzustand in ein Register eingelesen (b). Unmittelbar darauf (vor (c)) "feuert" ein Interrupt, in dessen Interrupt-Routine Bit 0 von PORTA gelöscht wird. Nach Verlassen der Interrupt-Routine hat PORTA den Wert 0b00000000. In den beiden noch folgenden Anweisungen des Hauptprogramms wird nun der zwischengespeicherte "alte" Zustand 0b00000001 mit 0b00011100 logisch-'''ODER'''-verknüft (c) und das Ergebnis 0b00011101 in PortA geschrieben (d). Obwohl zwischenzeitlich Bit 0 gelöscht wurde, ist es nach (d) wieder gesetzt. <br />
<br />
Lösungsmöglichkeiten:<br />
* Register ohne besondere Vorkehrungen nicht in Interruptroutinen ''und'' im Hauptprogramm verändern.<br />
* Interrupts vor Veränderungen in Registern, die auch in ISRs verändert werden, deaktivieren ("cli").<br />
* Bits einzeln löschen oder setzen. sbi und cbi können nicht unterbrochen werden. Vorsicht: nur Register im unteren Speicherbereich sind mittels sbi/cbi ansprechbar. Der Compiler kann nur für diese sbi/cbi-Anweisungen generieren. Für Register außerhalb dieses Adressbereichs ("Memory-Mapped"-Register) werden auch zur Manipulation einzelner Bits abhängige Anweisungen erzeugt (lds,...,sts).<br />
<br />
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Frequently asked Questions/Fragen Nr. 1 und 8. (Stand: avr-libc Vers. 1.0.4)<br />
<br />
== Interruptflags löschen ==<br />
<br />
Beim Löschen von Interruptflags haben AVRs eine Besonderheit, die auch im Datenblatt beschrieben ist: Es wird zum Löschen eine 1 in das betreffende Bit geschrieben. <br />
<br />
Hinweis:<br /><br />
Bei Registern mit mehreren Interrupt-Flag-Bits (wie die Timer Interrupt Flag Register) '''nicht''' die übliche bitweise VerODERung nehmen, sondern eine direkte Zuweisung machen. Da sonst weitere Flags, als nur das gewünschte, ebenfalls gelöscht werden könnten.<br /><br />
([http://www.mikrocontroller.net/topic/171148#1640133 Erklärung]).<br />
<br />
== Was macht das Hauptprogramm? ==<br />
<br />
Im einfachsten (Ausnahme-)Fall gar nichts mehr. Es ist also durchaus denkbar, ein Programm zu schreiben, welches in der main-Funktion lediglich noch die Interrupts aktiviert und dann in einer Endlosschleife verharrt. Sämtliche Funktionen werden dann in den ISRs abgearbeitet. Diese Vorgehensweise ist jedoch bei den meisten Anwendungen schlecht: man verschenkt eine Verarbeitungsebene und hat außerdem möglicherweise Probleme durch Interruptroutinen, die zu viel Verarbeitungszeit benötigen.<br />
<br />
Normalerweise wird man in den Interruptroutinen nur die bei Auftreten des jeweiligen Interruptereignisses unbedingt notwendigen Operationen ausführen lassen. Alle weniger kritischen Aufgaben werden dann im Hauptprogramm abgearbeitet.<br />
<br />
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Interrupts and Signals<br />
<br />
= Sleep-Modes =<br />
<br />
AVR Controller verfügen über eine Reihe von sogenannten [[Sleep Mode |''Sleep-Modes'']] ("Schlaf-Modi"). Diese ermöglichen es, Teile des Controllers abzuschalten. Zum Einen kann damit besonders bei Batteriebetrieb Strom gespart werden, zum Anderen können Komponenten des Controllers deaktiviert werden, die die Genauigkeit des Analog-Digital-Wandlers bzw. des Analog-Comparators negativ beeinflussen. Der Controller wird durch Interrupts aus dem Schlaf geweckt. Welche Interrupts den jeweiligen Schlafmodus beenden, ist einer Tabelle im Datenblatt des jeweiligen Controllers zu entnehmen.<br />
Die Funktionen (eigentlich Makros) der avr-libc stehen nach Einbinden der header-Datei ''sleep.h'' zur Verfügung.<br />
<br />
;set_sleep_mode (uint8_t mode): Setzt den Schlafmodus, der bei Aufruf von sleep() aktiviert wird. In sleep.h sind einige Konstanten definiert (z.&nbsp;B. SLEEP_MODE_PWR_DOWN). Die definierten Modi werden jedoch nicht alle von sämtlichten AVR-Controllern unterstützt.<br />
;sleep_enable(): Aktiviert den gesetzten Schlafmodus, versetzt den Controller aber noch nicht in den Schlafmodus<br />
;sleep_cpu(): Versetzt den Controller in den Schlafmodus .sleep_cpu wird im Prinzip durch die Assembler-Anweisung ''sleep'' ersetzt.<br />
;sleep_disable(): Deaktiviert den gesetzten Schlafmodus<br />
;sleep_mode(): Versetzt den Controller in den mit set_sleep_mode gewählten Schlafmodus. Das Makro entspricht sleep_enable()+sleep_cpu()+sleep_disable(), beinhaltet also nicht die Aktivierung von Interrupts (besser nicht benutzen).<br />
<br />
Bei Anwendung von sleep_cpu() müssen Interrupts also bereits freigeben sein (sei()), da der Controller sonst nicht mehr "aufwachen" kann. sleep_mode() ist nicht geeignet für die Verwendung in ISR Interrupt-Service-Routinen, da bei deren Abarbeitung Interrupts global deaktiviert sind und somit auch die möglichen "Aufwachinterrupts". Abhilfe: stattdessen sleep_enable(), sei(), sleep_cpu(), sleep_disable() und evtl. cli() verwenden (vgl. Dokumentation der avr-libc).<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/sleep.h><br />
<br />
int main(void)<br />
{<br />
...<br />
<br />
while (1) {<br />
...<br />
set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br />
sleep_mode();<br />
<br />
// Code hier wird erst nach Auftreten eines entsprechenden<br />
// "Aufwach-Interrupts" verarbeitet<br />
...<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
In älteren Versionenen der avr-libc wurden nicht alle AVR-Controller durch die sleep-Funktionen richtig angesteuert. Mit avr-libc 1.2.0 wurde die Anzahl der unterstützten Typen jedoch deutlich erweitert. Bei nicht-unterstützten Typen erreicht man die gewünschte Funktionalität durch direkte "[[Bitmanipulation]]" der entsprechenden Register (vgl. Datenblatt) und Aufruf des Sleep-Befehls via Inline-Assembler oder sleep_cpu():<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
// Sleep-Mode "Power-Save" beim ATmega169 "manuell" aktivieren<br />
SMCR = (3<<SM0) | (1<<SE);<br />
asm volatile ("sleep"::); // alternativ sleep_cpu() aus sleep.h<br />
...<br />
</syntaxhighlight><br />
<br />
== Sleep-Modi ==<br />
Die vielen Prozessoren aus der AVR-Familie unterstützen unterschiedliche Sleep-Modi, gefächert nach Vorhandensein von Funktionsblöcken im Controller. Konkrete und verläßliche Auskunft über die tatsächlichen Gegebenheiten finden sich wie immer in den jeweiligen Datenblättern. Die Modi unterscheiden sich darin, welche Funktionsbereiche zum Energiesparen abgeschaltet werden. Davon hängt auch ab, mit welchen Mitteln der Prozessor aus der jeweiligen Schlaftiefe wieder aufgeweckt werden kann.<br />
<br />
;Idle Mode (SLEEP_MODE_IDLE): Die CPU kann durch SPI, USART, Analog Comperator, ADC, TWI, Timer, Watchdog und irgendeinen anderen Interrupt wieder aufgeweckt werden.<br />
<br />
;ADC Noise Reduction Mode (SLEEP_MODE_ADC): In diesem Modus liegt das Hauptaugenmerk darauf, die CPU soweit stillzulegen, dass der ADC möglichst keine Störungen aus dem inneren der CPU auffangen kann, die das Meßergebnis negativ beeinflussen können. Das Aufwachen aus diesem Modus kann ausgelöst werden durch den ADC, externe Interrupts, TWI, Timer und Watchdog.<br />
<br />
;Power-Down Mode (SLEEP_MODE_PWR_DOWN): In diesem Modus wird ein externer Oszillator (Quarz, Quarzoszillator), wenn vorhanden. gestoppt. Geweckt werden kann die CPU durch einen externen Level-Interrupt, TWI, Watchdog, Brown-Out-Reset.<br />
<br />
;Power-Save-Mode (SLEEP_MODE_PWR_SAVE): Power-Save ist identisch zu Power-Down mit einer Ausnahme: Ist der Timer 2 auf die Verwendung eines externen Taktes konfiguriert, so läuft dieser Timer auch im Power-Save weiter und kann die CPU mit einem Interrupt aufwecken.<br />
<br />
;Standby-Mode (SLEEP_MODE_STANDBY, SLEEP_MODE_EXT_STANDBY): Voraussetzung für den Standby-Modus ist die Verwendung eines Quarzes oder eines Quarzoszillators, also einer externen Taktquelle. Ansonsten ist dieser Modus identisch zum Power-Down Modus. Vorteil dieses Modus' ist eine kürzere Aufwachzeit.<br />
<br />
;Abschalten des Brownout Detect (BOD) während der Sleep-Phase (nur P-Typen): Zur Stromersparnis bieten die P-Typen die Möglichkeit den BOD während der Sleep-Phase abzuschalten. Bei einem Atmega88PA beispielsweise, kann dadurch der Stromverbrauch im SLEEP_MODE_PWR_SAVE mit Timer2 im Asynchronmodus mit Uhrenquarz und periodischer Selbstaufweckung um ca. 50% gesenkt werden.<br />
Das Einschalten dieser Funktion geschieht in einer Timed Sequence.<br />
<br />
<syntaxhighlight lang="c"><br />
unsigned char temp0 = MCUCR;<br />
unsigned char temp1 = MCUCR;<br />
temp0 |= (1 << BODS) | (1 << BODSE);<br />
temp1 |= (1 << BODS);<br />
MCUCR = temp0;<br />
MCUCR = temp1;<br />
sleep_cpu();<br />
</syntaxhighlight><br />
<br />
Hierbei ist unbedingt zu beachten, dass das BODS-Bit 3 Takte nach dem Setzen wieder gelöscht wird. Daher muss der Aufruf des Sleep unmittelbar nach dem Setzen erfolgen und das BODS-Bit muss jedes Mal vor einem Sleep Aufruf erneut gesetzt werden.<br />
<br />
<br />
Siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Power Management and Sleep-Modes<br />
* [http://www.mikrocontroller.net/topic/96369#832712 Forenbeitrag] zur "Nichtverwendung" von sleep_mode in ISRs.<br />
<br />
= Zeiger =<br />
Zeiger (engl. ''Pointer'') sind Variablen, die die Adresse von Daten oder Funktionen enthalten und belegen 16 Bits. Die Größe hängt mit dem adressierbaren Speicherbereich zusammen und der GCC reserviert dann den entsprechenden Platz.<br />
Ggf. ist es also günstiger, Indizes auf Arrays (Listen) zu verwenden, so dass der GCC für die Zeigerarithmetik den erforderlichen RAM nur temporär benötigt.<br />
<br />
Siehe auch: [[Zeiger]]<br />
<br />
= Speicherzugriffe =<br />
<br />
Atmel AVR-Controller verfügen typisch über drei Speicher:<br />
<br />
* [[RAM]]: Im RAM (genauer statisches RAM/SRAM) wird vom gcc-Compiler Platz für Variablen reserviert. Auch der Stack befindet sich im RAM. Dieser Speicher ist "flüchtig", d.h. der Inhalt der Variablen geht beim Ausschalten oder einem Zusammenbruch der Spannungsversorgung verloren.<br />
<br />
* Programmspeicher: Ausgeführt als FLASH-Speicher, seitenweise wiederbeschreibbar. Darin ist das Anwendungsprogramm abgelegt.<br />
<br />
* [[EEPROM]]: Nichtflüchtiger Speicher, d.h. der einmal geschriebene Inhalt bleibt auch ohne Stromversorgung erhalten. Byte-weise schreib/lesbar. Im EEPROM werden typischerweise gerätespezifische Werte wie z.&nbsp;B. Kalibrierungswerte von Sensoren abgelegt.<br />
<br />
Einige AVRs besitzen keinen RAM-Speicher, lediglich die Register können als "Arbeitsvariablen"<br />
genutzt werden. Da die Anwendung des avr-gcc auf solch "kleinen" Controllern ohnehin selten sinnvoll ist und auch nur bei einigen RAM-losen Typen nach [http://lightner.net/avr/ATtinyAvrGcc.html "Bastelarbeiten"] möglich ist, werden diese Controller hier nicht weiter berücksichtigt. Auch EEPROM-Speicher ist nicht auf allen Typen verfügbar. Generell sollten die nachfolgenden Erläuterungen auf alle ATmega-Controller und die größeren AT90-Typen übertragbar sein. Für die Typen ATtiny2313, ATtiny26 und viele weitere der "ATtiny-Reihe" gelten die Ausführungen ebenfalls.<br />
<br />
Siehe auch:<br />
* [[Binäre Daten zum Programm hinzufügen]]<br />
== RAM ==<br />
<br />
Die Verwaltung des RAM-Speichers erfolgt durch den Compiler, im Regelfall ist beim Zugriff auf Variablen im RAM nichts Besonderes zu beachten. Die Erläuterungen in jedem brauchbaren C-Buch gelten auch für den vom avr-gcc-Compiler erzeugten Code.<br />
<br />
Um Speicher dynamisch (während der Laufzeit) zu reservieren, kann '''malloc()''' verwendet werden. malloc(size) "alloziert" (~reserviert) einen gewissen Speicherblock mit '''size''' Bytes. Ist kein Platz für den neuen Block, wird NULL (0) zurückgegeben.<br />
<br />
Wird der angelegte Block zu klein (groß), kann die Größe mit realloc() verändert werden. Den allozierten Speicherbereich kann man mit free() wieder freigeben. Wenn das Freigeben eines Blocks vergessen wird spricht man von einem "Speicherleck" (memory leak).<br />
<br />
malloc() legt Speicherblöcke im '''Heap''' an, belegt man zuviel Platz, dann wächst der Heap zu weit nach oben und überschreibt den Stack, und der Controller kommt in Teufels Küche. Das kann leider nicht nur passieren wenn man insgesamt zu viel Speicher anfordert, sondern auch wenn man Blöcke unterschiedlicher Größe in ungünstiger Reihenfolge alloziert/freigibt (siehe Artikel [[Heap-Fragmentierung]]). Aus diesem Grund sollte man malloc() auf Mikrocontrollern sehr sparsam (am besten gar nicht) verwenden.<br />
<br />
Beispiel zur Verwendung von malloc():<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
<br />
void foo(void) {<br />
// neuen speicherbereich anlegen,<br />
// platz für 10 uint16<br />
uint16_t* pBuffer = malloc(10 * sizeof(uint16_t));<br />
<br />
// darauf zugreifen, als wärs ein gewohnter Buffer<br />
pBuffer[2] = 5;<br />
<br />
// Speicher (unbedingt!) wieder freigeben<br />
free(pBuffer);<br />
}<br />
</syntaxhighlight><br />
<br />
Wenn (wie in obigem Beispiel) dynamischer Speicher nur für die Dauer einer Funktion benötigt und am Ende wieder freigegeben wird, bietet es sich an, statt malloc() '''alloca()''' zu verwenden. Der Unterschied zu malloc() ist, dass der Speicher auf dem Stack reserviert wird, und beim Verlassen der Funktion automatisch wieder freigegeben wird. Es kann somit kein Speicherleck und keine Fragmentierung entstehen.<br />
<br />
siehe auch:<br />
* http://www.nongnu.org/avr-libc/user-manual/malloc.html<br />
<br />
== Flash mit PROGMEM und pgm_read ==<br />
<br />
→ [http://nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html avr-libc: Doku zu avr/pgmspace.h]<br />
<br />
Ein Zugriff auf Konstanten im Programmspeicher ist mittels avr-gcc erst ab Version 4.7 "transparent" möglich. Um Daten aus dem Flash zu lesen, muss die AVR-Instruktion LPM (''Load from Program Memory'') erzeugt werden, bei Controllern mit mehr als 64kiB Flash auch ELPM.<br />
<br />
Dazu gibt es das AVR-spezifische GCC-Attribut <tt>progmem</tt>, mit dem eine Variablendeklaration im ''static storage''<ref>Variablen der Speicherklasse ''static storage'' haben eine unbegrenzte Lebensdauer. Beispiel für solche Variablen sind globale Variablen, aber auch static-Variablen innerhalb einer Funktion gehören dazu. Beispiele für Variablen, die nicht ''static storage'' sind: auto-Variablen ("normale" lokale Variablen), register-Variablen, durch malloc geschaffene Objekte, etc.</ref> markiert werden kann:<br />
<syntaxhighlight lang="c"><br />
const int value __attribute__((progmem)) = 1;<br />
</syntaxhighlight><br />
<br />
Effekt ist, dass die so markierte Variable nicht im RAM sondern im Flash angelegt wird. Wird durch "normalen" C-Code auf solch eine Variable zugegriffen, wird jedoch aus der gleichen Adresse aus dem RAM gelesen und nicht aus dem Flash! Das ist ein Fehler, den der Compiler aber nicht anzeigt!<br />
<br />
<syntaxhighlight lang="c"><br />
int test = value; // Fehler! PROGMEM Konstanten müssen mit den pgm_read-Funktionen gelesen werden!<br />
</syntaxhighlight><br />
<br />
Zum Lesen aus dem Flash stellt die avr-libc daher zahlreiche Makros zur Verfügung. Zudem wird das Makro <tt>PROGMEM</tt> definiert, das etwas Tipparbeit spart:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
const int value PROGMEM = 1;<br />
</syntaxhighlight><br />
<br />
<tt>progmem</tt> funktioniert im Wesentlichen wie ein Section-Attribut, das die Daten in der Section <tt>.progmem.data</tt> ablegt. Im Gegensatz zum Section-Attribut werden jedoch noch weitere Prüfungen unternommen, ab avr-gcc 4.6 etwa muss die entsprechende Variable <tt>const</tt> sein.<br />
<br />
=== Integer und float ===<br />
<br />
Zum Lesen von Skalaren stellt die avr-libc folgende Makros zu Verfügung, die jeweils ein Argument erhalten: Die 16-Bit Adresse des zu lesenden Wertes<ref>Damit ist der mögliche Speicherbereich für Flash-Konstanten auf 64kiB begrenzt. Einige pgmspace-Funktionen ermöglichen den Lesezugriff auf den gesamten Flash-Speicher, intern via Assembler-Anweisung ELPM. Die Initialisierungswerte des Speicherinhalts jenseits der 64kiB-Marke müssen dann jedoch auf anderem Weg angelegt werden, d.h. nicht per PROGMEM. Evtl. eigene Section und Linker-Optionen. Alt und nicht ganz korrekt: Die avr-libc pgmspace-Funktionen unterstützen nur die unteren 64kiB Flash bei Controllern mit mehr als 64kiB.</ref><br />
<br />
:{| {{Tabelle}}<br />
|+ Übersicht der <tt>pgm_read</tt> Funktionen aus<br/>dem Header <tt>avr/pgmspace.h</tt> der avr-libc<br />
|-<br />
! Gelesener Wert || <tt>pgm_read_xxx</tt> || Anzahl Bytes<br />
|-<br />
| <tt>uint8_t</tt> || <tt>pgm_read_byte</tt> || 1<br />
|-<br />
| <tt>uint16_t</tt> || <tt>pgm_read_word</tt> || 2<br />
|-<br />
| <tt>uint32_t</tt> || <tt>pgm_read_dword</tt> || 4<br />
|-<br />
| <tt>float</tt> || <tt>pgm_read_float</tt><ref>ab avr-libc 1.7.0</ref> || 4<br />
|}<br />
<br />
Soll ein Zeiger gelesen werden, so verwendet man <tt>pgm_read_word</tt> und castet das Ergebnis zum gewünschten Zeiger-Typ.<br />
<br />
;Beispiele:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
/* Byte */<br />
const uint8_t aByte PROGMEM = 123;<br />
<br />
/* int-Array */<br />
const int anArray[] PROGMEM = { 18, 3 ,70 };<br />
<br />
void foo (void)<br />
{<br />
/* Zeiger */<br />
static const uint8_t* const aPointer PROGMEM = &aByte;<br />
<br />
uint8_t a = pgm_read_byte (&aByte);<br />
int a2 = (int) pgm_read_word (&anArray[2]);<br />
const uint8_t* p = (const uint8_t*) pgm_read_word (&aPointer);<br />
}<br />
</syntaxhighlight><br />
<br />
=== Blöcke ===<br />
<br />
In den Flash-Funktionen der avr-libc sind keine der pgm_read_xxxx Nomenklatur folgenden Funktionen, die Speicherblöcke auslesen oder vergleichen. Die enstprechende Funktionen sind Varianten von <tt>memcpy</tt>, <tt>memcmp</tt> und heißt <tt>memcpy_P</tt>, <tt>memcmp_P</tt>, usw. Für weitere Funktionen und deren Prototypen siehe die Dokumentation der avr-libc.<br />
<br />
=== Strings ===<br />
<br />
Strings sind in C nichts anderes als eine Abfolge von Zeichen und einem <tt>'\0'</tt> als Stringende. Der prinzipielle Weg ist daher identisch zum Lesen von Bytes, wobei auf die [[FAQ#Wie funktioniert String-Verarbeitung in C?|Besonderheiten von Strings]] wie 0-Terminierung geachtet werden muss.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
size_t my_string_length (const char* addr)<br />
{<br />
size_t length = 0;<br />
<br />
while (pgm_read_byte (addr++))<br />
{<br />
len++;<br />
}<br />
return length;<br />
}<br />
</syntaxhighlight><br />
<br />
Zur Unterstützung des Programmierers steht das Repertoire der str-Funktionen auch in jeweils eine Variante zur Verfügung, die mit dem Flash-Speicher arbeiten kann. Die Funktionsnamen tragen den Suffix <tt>_P</tt>. Darüber hinaus gibt es das Makro <tt>PSTR</tt>, das ein String-Literal im Flash-Speicher ablegt und die Adresse des Strings liefert:<br />
<br />
Die nachfolgende Funktion liefert 0 zurück, wenn string_im_ram gleich "Hallo Welt" ist. Mit strcmp (String Compare) können wir zwei Strings vergleichen. Der Rückgabewert kann hierbei folgende Werte haben:<br><br />
0 die Strings sind gleich<br />
>0 das erste ungleiche Zeichen in string_im_ram ist größer als in "Hallo Welt"<br />
<0 das erste ungleiche Zeichen in string_im_ram ist kleiner als in "Hallo Welt"<br />
<br><br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
int foo (const char* string_im_ram)<br />
{<br />
return strcmp_P (string_im_ram, PSTR ("Hallo Welt"));<br />
}<br />
</syntaxhighlight><br />
<br />
Zu beachten ist, dass <tt>PSTR</tt> nur innerhalb von Funktionen verwendet werden kann.<br />
<br />
; Array aus Strings:<br />
<br />
Arrays aus Strings im Flash-Speicher werden in zwei Schritten angelegt:<br />
<br />
# Zuerst die einzelnen Elemente des Arrays und<br />
# im Anschluss ein Array, in dem die Startaddressen der Strings abgelegt werden.<br />
<br />
Zum Auslesen wird zuerst die Adresse des gewünschten Elements aus dem Array im Flash-Speicher gelesen, die im Anschluss dazu genutzt wird, um auf das Element (den String) selbst zuzugreifen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
static const char str1[] PROGMEM = "Hund";<br />
static const char str2[] PROGMEM = "Katze";<br />
static const char str3[] PROGMEM = "Maus";<br />
<br />
const char * const array[] PROGMEM = <br />
{<br />
str1, str2, str3<br />
};<br />
<br />
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]<br />
void read_string (char* buf, size_t i)<br />
{<br />
// Lese die Adresse des i-ten Strings aus array[]<br />
const char *parray = (const char*) pgm_read_word (&array[i]);<br />
<br />
// Kopiere den Inhalt der Zeichenkette vom Flash ins RAM<br />
strcpy_P (buf, parray);<br />
}<br />
</syntaxhighlight><br />
<br />
Eine weitere Möglichkeit ist, die Strings in einem 2-dimensionalen char-Array abzulegen anstatt deren Adresse in einem 1-dimensionalen Adress-Array zu speichern.<br />
<br />
Vorteil ist, dass der Code einfacher wird. Nachteil ist, dass bei unterschiedlich langen Strings Speicherplatz verschwendet wird, weil sich die Array-Dimension and der Länge des längsten Strings orientieret. Bei in etwa gleich langen Strings kann es aber sogar Speicherplatz sparen, denn es die Adressen der einzelnen Strings müssen nicht abgespeichert werden.<ref>In unserem Hund-Katze-Maus Beispiel belegt die erste Variante 22 Bytes Daten und 18 Bytes Code, die zweite Variante mit 2-dimensionalem Array belegt 18 Bytes Daten und 20 Bytes Code. Gemessen wurde mit avr-gcc 4.8 -Os für ATmega8.</ref><br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
// Die "6" ist 1 plus die Länge des längsten Strings ("Katze")<br />
const char array[][6] PROGMEM = <br />
{<br />
"Hund", "Katze", "Maus"<br />
};<br />
<br />
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]<br />
void read_string (char* buf, size_t i)<br />
{<br />
// Kopiere den Inhalt der i-ten Zeichenkette vom Flash ins RAM<br />
strcpy_P (buf, array[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Siehe dazu auch die avr-libc FAQ: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array How do I put an array of strings completely in ROM?]<br />
<br />
=== Warum so kompliziert? ===<br />
<br />
Zu dem Thema, warum die Verabeitung von Werten aus dem Flash-Speicher so kompliziert ist, sei hier nur kurz erläutert: Die Harvard-Architektur des AVR weist getrennte Adressräume für Programm (Flash) und Datenspeicher (RAM) auf. Der C-Standard sieht keine unterschiedlichen Adressräume vor.<br />
<br />
Hat man zum Beispiel eine Funktion string_an_uart (const char* s) und übergibt an diese Funktion die Adresse einer Zeichenkette, dann weiß die Funktion nicht, ob die Adresse in den Flash-Speicher oder das RAM zeigt. Weder aus dem Pointer-Wert, also dem Zahlenwert, noch aus dem "const" kann auf den Ort der Ablage geschlossen werden.<br />
<br />
Einige AVR-Compiler bilden die Harvard-Architektur ab, indem sie in einen Pointer nicht nur die Adresse speichern, sondern auch den Ablageort wie ''Flash'' oder ''RAM''. In einem Aufruf einer Funktion wird dann bei Pointer-Parametern neben der Adresse auch der Speicherbereich, auf den der Pointer zeigt, übergeben.<br />
<br />
Dies hat jedoch auch Nachteile, denn bei jedem Zugriff über einen Zeiger muss zur ''Laufzeit'' entschieden werden, wie der Zugriff auszuführen ist und entsprechend länglicher und langsamer wird der erzeugte Code.<br />
<br />
Siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitte Modules/Program Space String Utilities und Abschnitt Modules/Bootloader Support Utilities<br />
<br />
=== Variablenzugriff >64kB ===<br />
<br />
Die Zeiger beim avr-gcc sind nur 16 Bit breit, können somit also nur 64kiB Datenspeicher adressieren. Als Funktionspointer können sie beim AVR bis zu 128 kiB Programmspeicher adressieren, weil Funktionsadressen immer 16-Bit Worte adressieren und nicht Bytes. Um Flashzugriff jenseits von 64KiB zu bewerkstelligen gibt es mehrere Möglichkeiten:<br />
<br />
* Address-Spaces wie <tt>__flash1</tt> oder <tt>__memx</tt>, siehe Abschnitt "[[#Jenseits von flash|Jenseits von __flash]]".<br />
* Die Funktionen bzw. Makros <tt>pgm_read_xxx_far</tt> der AVR-Libc, wie im folgenden beschrieben.<br />
<br />
Unverständlicherweise gibt es in der AVR-Libc keine Funktion, um 32-Bit Pointer zu erhalten. Hier schafft ein eigenes GNU-C99 Makro Abhilfe:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/pgmspace.h><br />
<br />
//====================================================================<br />
// Macro to access strings defined in PROGMEM above 64kB<br />
//--------------------------------------------------------------------<br />
#define FAR(var) \<br />
({ uint_farptr_t tmp; \<br />
__asm__ ( \<br />
"ldi %A0, lo8(%1)" "\n\t" \<br />
"ldi %B0, hi8(%1)" "\n\t" \<br />
"ldi %C0, hh8(%1)" \<br />
: "=d" (tmp) \<br />
: "i" (&(var))); \<br />
tmp; \<br />
})<br />
//-------------------------------------------------------------------<br />
<br />
//===================================================================<br />
// Define a section above 64kiB (FAR_SECTION)<br />
// and add the required linker argument below<br />
// -Wl,--section-start=.far_section=0x10000<br />
//--------------------------------------------------------------------<br />
#define FAR_SECTION __attribute__((__section__(".far_section")))<br />
//--------------------------------------------------------------------<br />
<br />
//====================================================================<br />
// Just a Sample<br />
//--------------------------------------------------------------------<br />
<br />
const char MyString[] FAR_SECTION = "Hier liegt mein FAR-Teststring!";<br />
const char MyBmp64[] FAR_SECTION = {0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x00};<br />
<br />
int main(void)<br />
{<br />
char MyChar;<br />
DDRC = 0xFF;<br />
do<br />
{<br />
MyChar = pgm_read_byte_far(FAR(MyBmp64));<br />
PORTC = MyChar;<br />
}<br />
while(MyChar);<br />
}<br />
</syntaxhighlight><br />
<br />
D.h. man muss<br />
* Das Makro <tt>FAR</tt> im Quellcode einfügen<br />
* Die Definition der neuen Section <tt>FAR_SECTION</tt> einfügen<br />
* Die Variablen mit dieser Section kennzeichnen<br />
* Dem Linker mittels Kommandozeilenoption die Startadrese dieser Section mitteilen<br />
<br />
Der Zugriff auf diese Variablen kann nur mittels direkter Pointerarithmetik erfolgen, eine Indizierung von Arrays mit variablem Index ist nicht möglich.<br />
<br />
<syntaxhighlight lang="c"><br />
int n=3;<br />
MyChar = pgm_read_byte_far(FAR(MyBmp64)+n);<br />
</syntaxhighlight><br />
<br />
== Flash mit __flash und Embedded-C ==<br />
<br />
Ab Version 4.7 unterstützt avr-gcc ''Adress-Spaces'' gemäß dem Embedded-C Dokument ISO/IEC TR18037. Der geläufigste Adress-Space ist <tt>__flash</tt>, der im Gegensatz zu <tt>progmem</tt> kein GCC-Attribut ist, sondern ein Qualifier und damit syntaktisch ähnlich verwendet wird wie <tt>const</tt> oder <tt>volatile</tt>.<br />
<br />
GCC kennt keine eigene Option zum Aktivieren von Embedded-C, es wird als GNU-C Erweiterung behandelt. Daher müssen C-Module, die Address-Spaces verwenden, mit <tt>-std=gnu99</tt> o.ä. compiliert werden.<br />
<br />
<syntaxhighlight lang="c"><br />
static const __flash int value = 10;<br />
<br />
int get_value (void)<br />
{<br />
return value;<br />
}<br />
</syntaxhighlight><br />
<br />
# Im Gegensatz zu <tt>progmem</tt> sind keine speziellen Bibliotheksfunktionen oder -makros für den Zugriff mehr notwendig: Der Code zum Lesen der Variable ist "normales" C.<br />
# Die Variable wird im richtigen Speicherbereich (Flash) angelegt.<br />
# <tt>__flash</tt> ist nur zusammen mit read-only Objekten oder Zeigern, d.h. nur zusammen mit <tt>const</tt>, erlaubt.<br />
# Zugriffe wie im obigen Beispiel können (weg)optimiert werden. Das Beispiel entspricht einem "<tt>return 10</tt>". Es besteht keine Notwendigkeit, für <tt>value</tt> überhaupt Flash-Speicher zu reservieren.<br />
<br />
Auch Zeiger-Indirektionen sind problemlos möglich. Zu beachten ist, dass <tt>__flash</tt> auf der richtigen Seite des "<tt>*</tt>" in der Zeigerdeklaration bzw. -definition steht:<br />
* '''Rechts vom <tt>*</tt>:''' Der Zeiger selbst liegt im Flash<br />
* '''Links vom <tt>*</tt>:''' Der Zeiger enthält eine Flash-Adresse<br />
<br />
<syntaxhighlight lang="c"><br />
// val ist eine Variable im Flash<br />
const __flash int val = 42;<br />
<br />
// pval liegt auch im Flash und enthält die Adresse von val<br />
const __flash int* const __flash pval = &val;<br />
<br />
char get_val (void)<br />
{<br />
// liest den Wert von val über die in pval abgelegte Adresse<br />
return *pval;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Blöcke ===<br />
<br />
Um Speicherbereiche vom Flash in den RAM zu kopieren, gibt es zwei Möglichkeiten: Zum einen können wie bei <tt>progmem</tt> beschreiben die Funktionen der avr-libc wie <tt>memcpy_P</tt>, <tt>memcmp_P</tt>, <tt>movmem_P</tt>, etc. verwendet werden:<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
// Eine Datenstruktur<br />
typedef struct<br />
{<br />
int id;<br />
char buf[10];<br />
} data_t;<br />
<br />
extern void uart_send (const void*, size_t);<br />
<br />
void send_data (const __flash data_t *pdata)<br />
{<br />
// buf wird auf dem Stack angelegt<br />
data_t buf;<br />
<br />
// Kopiere Daten vom Flash nach buf ins RAM<br />
memcpy_P (&buf, pdata, sizeof (data_t));<br />
<br />
// Sende die Daten in buf<br />
uart_send (&buf, sizeof (data_t));<br />
}<br />
</syntaxhighlight><br />
<br />
Zum anderen kann eine Struktur auch über direktes Kopieren ins RAM geladen werden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
<br />
// Eine Datenstruktur<br />
typedef struct<br />
{<br />
int id;<br />
char buf[10];<br />
} data_t;<br />
<br />
extern void uart_send (const void*, size_t);<br />
<br />
void send_data (const __flash data_t *pdata)<br />
{<br />
// Kopiere Daten ins RAM. buf wird auf dem Stack angelegt<br />
const data_t buf = *pdata;<br />
<br />
// Verwendet die Daten in buf<br />
uart_send (&buf, sizeof (data_t));<br />
}<br />
</syntaxhighlight><br />
<br />
=== Strings ===<br />
<br />
Natürlich können auch Strings im Flash abgelegt werden und auch mit Funktionen wie <tt>strcpy_P</tt> aus der avr-libc verarbeitet werden. Zudem ist es möglich, Flash-Zeiger mit der Adresse eines String-Literals zu initialisieren:<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
#define FSTR(X) ((const __flash char[]) { X } )<br />
<br />
const __flash char * const __flash array[] = <br />
{<br />
FSTR ("Hund"), FSTR ("Katze"), FSTR ("Maus")<br />
};<br />
<br />
size_t get_len (uint8_t tier)<br />
{<br />
return strlen_P (array[tier]);<br />
}<br />
</syntaxhighlight><br />
<br />
Leider sieht der Embedded-C Draft nicht vor, String-Literale direkt in einem anderen Adress-Space als ''generic'' anzulegen, so dass hier der Umweg über <tt>FSTR</tt> genommen werden muss. Dieses Konstrukt ist nur ausserhalb von Funktionen möglich und kann daher nicht als Ersatz für <tt>PSTR</tt> aus der avr-libc dienen.<br />
<br />
Soll <tt>array</tt> ein 2-dimensonales Array sein anstatt ein 1-dimensionales Array von Zeigern, dann geht das ohne große Verrenkungen:<br />
<br />
<syntaxhighlight lang="c"><br />
// Die 6 ergibt sich aus 1 plus der Länge des längsten Strings "Katze"<br />
const __flash char array[][6] = <br />
{<br />
"Hund", "Katze", "Maus"<br />
};<br />
</syntaxhighlight><br />
<br />
Weiters besteht die Möglichkeit, <tt>array</tt> analog anzulegen, wie man es mit <tt>PROGMEM</tt> machen würde: Jeder String wird explizit angelegt und seine Adresse bei der Initialisierung von <tt>array</tt> verwendet. Dies entspricht dem ersten Beispiel eines 1-dimensionalen Zeigerarrays:<br />
<br />
<syntaxhighlight lang="c"><br />
static const __flash char strHund[] = "Hund";<br />
static const __flash char strKatze[] = "Katze";<br />
static const __flash char strMaus[] = "Maus";<br />
<br />
const __flash char * const __flash array[] = <br />
{<br />
strHund, strKatze, strMaus<br />
};<br />
</syntaxhighlight><br />
<br />
=== Casts ===<br />
<br />
Embedded C fordert, dass zwei Adress-Spaces entweder disjunkt sind – d.h. sie enthalten keine gemeinsamen Adressen – oder aber ein Space komplett im anderen enthalten ist, also eine Teilmengen-Beziehung besteht. Die Adress-Spaces von avr-gcc sind so implementiert, dass jeder Space Teilmenge jedes anderes ist. Zwar haben Spaces wie RAM und Flash physikalisch keinen Speicherbereich gemein, allerdings ermöglicht diese Implementierung das Casten von Zeigern zu unterschiedlichen Adress-Spaces<ref>Im Gegensatz zu einem Attribute wie <tt>progmem</tt> ist ein (Adress Space) Qualifier Teil des Zeiger-Typs.</ref>: <br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdbool.h><br />
<br />
char read_char (const char *address, bool data_in_flash)<br />
{<br />
if (data_in_flash)<br />
return *(const __flash char*) address;<br />
else<br />
return *address;<br />
}<br />
</syntaxhighlight><br />
<br />
Der Cast selbst erzeugt keinen zusätzlichen Code, da eine RAM-Adresse und eine Flash-Adresse die gleiche Binärdarstellung haben. Allerdings wird über den nach <tt>__flash</tt> gecasteten Zeiger anders zugegriffen, nämlich per LPM.<br />
<br />
=== Jenseits von __flash ===<br />
<br />
Ausser <tt>__flash</tt> gibt es auch folgende Address-Spaces:<br />
<br />
==== <tt>__flash</tt>''N'' ====<br />
<br />
<tt>__flash</tt>''N'' mit ''N'' = 1..5 sind fünf weitere Spaces, die analog zu <tt>__flash</tt> funktionieren und deren Zeiger ebenfalls 16 Bit breit sind. avr-gcc erwartet, dass die zugehörigen Daten, welche in die Section <tt>.progmem</tt>''N''<tt>.data</tt> abgelegt werden, so lokatiert sind, dass das high-Byte der Adresse (Bits 16..23) gerade ''N'' ist.<br />
<br />
Weil Daten- und Code-Layout höchst projektspezifisch sind, werden diese Sections im Standard Linker-Skript nicht beschrieben. Um funktionsfähigen Code zu erhalten, muss daher ein eigenes Linker-Skript zur Verfügung gestellt werden, das diese Sections beschreibt, oder es kann eine Erweiterung des Standard Skripts bereitgestellt werden falls dies möglich ist.<br />
<br />
;Beispiel: Eine Applikation, die <tt>__flash2</tt> verwendet. Die zugehörende Section <tt>.progmem2.data</tt> wird hinter <tt>.text</tt> angeordnet aber vor den Initializern für <tt>.data</tt>. Dazu wird beim Linken das ld-Skript Fragment per <tt>-Tflash12.ld</tt> angegeben, welches dann an der gewünschten Stelle in das default Skript eingefügt wird:<br />
:{| <!-- Tabelle bitte für korrekte Einrückung belassen --><br />
|-<br />
|<pre><br />
SECTIONS<br />
{<br />
.flash2 :<br />
{<br />
. = MAX (ABSOLUTE(0x20000), .);<br />
PROVIDE (__flash2_start = .);<br />
. = ALIGN(2);<br />
*(.flash2.text*)<br />
*(.progmem2.data*)<br />
PROVIDE (__flash2_end = .);<br />
<br />
ASSERT (__flash2_start == __flash2_end || __flash2_start >= ABSOLUTE(0x20000),<br />
"__flash2 data in .progmem2.data below 0x20000");<br />
ASSERT (__flash2_start == __flash2_end || __flash2_end <= ABSOLUTE(0x30000),<br />
"__flash2 data in .progmem2.data exceeds 0x30000");<br />
}<br />
}<br />
INSERT AFTER .text<br />
</pre><br />
|}<br />
<br />
==== <tt>__memx</tt> ====<br />
<br />
Dieser Address-Space implementiert 3-Byte Zeiger und unterstützt Lesen über 64KiB-Segmentgrenzen hinweg. Das MSB (Bit 23) gibt dabei an, ob der <tt>__memx</tt>-Zeiger eine Flash-Adresse enthält (Bit23 = 0) oder eine RAM-Adresse (Bit23 = 1), was folgenden Code erlaubt:<br />
<br />
<syntaxhighlight lang="c"><br />
const __memx int a_flash = 42;<br />
const int a_ram = 100;<br />
<br />
int get_a (const __memx int* pa)<br />
{<br />
return *pa;<br />
}<br />
<br />
int main (void)<br />
{<br />
return get_a (&a_flash) + get_a (&a_ram);<br />
}</syntaxhighlight><br />
<br />
Dies bedeutet, dass erst zur ''Laufzeit'' entschieden werden kann, ob <tt>get_a</tt> die Daten aus dem RAM oder aus dem Flash lesen soll, was <tt>__memx</tt> im Vergleich zu den anderen Address-Spaces langsamer macht. Ausserdem ist zu beachten, dass <tt>__memx</tt>-Zeiger zwar 24-Bit Zeiger sind, die zugrundeliegende Adress-Arithmetik jedoch gemäß dem C-Standard erfolgt, also als 16-Bit Arithmetik. Bestehende Funktion der avr-libc wie z.B. printf_P funktionieren damit ebensowenig wie printf! Wenn man <tt>__memx</tt> verwenden will, braucht man dafür eigene Funktionen.<br />
<br />
=== __flash, progmem und Portierbarkeit ===<br />
<br />
Da ab er aktuellen Compilerversion 4.7 sowohl <tt>__flash</tt> als auch <tt>PROGMEM</tt> und die <tt>pgm_read</tt>-Funktionen zur Verfügung stehen, ergibt sich die Frage, welche Variante "besser" ist und wie zwischen ihnen hin- und her zu portieren ist.<br />
<br />
Zunächst sei erwähnt, dass <tt>__flash</tt> kein Ersatz für <tt>PROGMEM</tt> ist, sondern lediglich eine Alternative dazu. Das "alte" progmem wird weiterhin mir gleicher Semantik unterstützt, so dass alter Code ohne Änderungen mit den neueren Compilerversionen übersetzbar bleibt.<br />
<br />
Von der Codegüte her dürften sich keine großen Unterschiede ergeben. Es ist nicht zu erwarten, dass die eine oder die andere Variante wesentlich besseren oder schlechteren Code erzeugt — von einer Ausnahme abgesehen: Der Wert beim Zugriff ist zur Compilezeit bekannt und kann daher eliminiert werden.<br />
<syntaxhighlight lang="c"><br />
static const __flash char x[] = { 'A', 'V', 'R' };<br />
<br />
char foo (void)<br />
{<br />
return x[2];<br />
}<br />
</syntaxhighlight><br />
Dies wird übersetzt wie "<tt>return 'R';</tt>", und das Array <tt>x[]</tt> kann komplett wegoptimiert werden und entfallen.<br />
<br />
==== progmem → __flash ====<br />
<br />
Portierung in diese Richtung bedeutet, alten Code anzupassen. Zwingend ist die Portierung nicht, da <tt>progmem</tt> weiterhin unterstützt wird.<br />
Allerdings ist eine Quelle mit <tt>__flash</tt> besser lesbar, denn der Code wird von den <tt>pgm_read</tt>-Funktionen befreit, die vor allem bei Mehrfach-Indirektion den Code ziemlich verunstalten und unleserlich machen können.<br />
Weiterer Vorteil von <tt>_flash</tt> ist, daß eine striktere Typprüfung erfolgen kann.<br />
<br />
Eine Portierung wird man in zwei Schritten vornehmen:<br />
<br />
;1. Definitionen von Flash-Variablen werden angepasst:<br />
<br />
Vorher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
static const char hund[] PROGMEM = "Hund";<br />
static const char katze[] PROGMEM = "Katze";<br />
static const char maus[] PROGMEM = "Maus";<br />
<br />
const char * const tier[] PROGMEM = <br />
{<br />
hund, katze, maus<br />
};<br />
</syntaxhighlight><br />
|}<br />
<br />
Nachher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
static const __flash char hund[] = "Hund";<br />
static const __flash char katze[] = "Katze";<br />
static const __flash char maus[] = "Maus";<br />
<br />
const __flash char * const __flash tier[] = <br />
{<br />
hund, katze, maus<br />
};<br />
</syntaxhighlight><br />
|}<br />
<br />
Der Header <tt>avr/pgmspace.h</tt> wird nicht mehr benötigt. Im Gegensatz zu <tt>progmem</tt> müssen Qualifier immer links von der definierten Variablen stehen; bei Attributen wie <tt>progmem</tt> ist das mehr oder weniger egal.<br />
<br />
Nachdem diese Anpassung erfolgreich abgeschlossen ist, folgt Schritt<br />
<br />
; 2. Der Code wird von <tt>pgm_read</tt>-Aufrufen bereinigt:<br />
<br />
Vorher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
extern const char *tier[];<br />
<br />
char first_letter (uint8_t i)<br />
{<br />
const char* ptier = (const char*) pgm_read_word (&tier[i]);<br />
return (char) pgm_read_byte (&ptier[0]);<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
Nachher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <stdint.h><br />
<br />
extern const __flash char * const __flash tier[];<br />
<br />
char first_letter (uint8_t i)<br />
{<br />
return tier[i][0];<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
== Dateien direkt im Flash einbinden ==<br />
<br />
Wenn man größere Dateien direkt im Programm einbinden will, ohne sie vorher in C Quelltext umzuwandeln, muss man das mit dem Linker machen. Wie das geht steht hier.<br />
<br />
* [http://www.atmel.com/webdoc/avrlibcreferencemanual/FAQ_1faq_binarydata.html Atmel, avr gcc Dokumentation]<br />
* [http://nongnu.org/avr-libc/user-manual/FAQ.html#faq_binarydata Nongnu avr gcc Dokumentation]<br />
<br />
Wie man das dann praktisch umsetzt, sieht man in diesem Beitrag.<br />
<br />
* [https://www.mikrocontroller.net/topic/361429?goto=4056910#4056910 Forumsbeitrag]: Binärdateien mittels Linker einbinden<br />
* [https://www.mikrocontroller.net/topic/361429?goto=4056910#4056947 Forumsbeitrag]: Ein kleines Tool zum Umwandeln von Binärdateien in C-Quelltext.<br />
<br />
== Flash in der Anwendung schreiben ==<br />
<br />
Bei AVRs mit "self-programming"-Option – auch bekannt als [[Bootloader]]-Support – können Teile des Flash-Speichers vom Anwendungsprogramm beschrieben werden. Dies ist nur möglich, wenn die Schreibfunktion in einem besonderen Speicherbereich, der Boot-Section des Programmspeichers/Flash, abgelegt ist.<br />
<br />
Bei einigen kleinen AVRs gibt es keine gesonderte Boot-Section, bei diesen kann der Flashspeicher von jeder Stelle des Programms geschrieben werden. Für Details sei hier auf das jeweilige Controller-Datenblatt und die Erläuterungen zum Modul boot.h der avr-libc verwiesen. Es existieren auch Application-Notes dazu bei atmel.com, die auf avr-gcc-Code übertragbar sind.<br />
<br />
Siehe auch: <br />
* Forumsbeitrag [http://www.mikrocontroller.net/topic/163632#1561622 Daten in Programmspeicher speichern]<br />
<br />
== EEPROM ==<br />
<br />
Möchte man Werte aus einem Programm heraus so speichern, dass sie auch nach dem Abschalten der Versorgungsspannung noch erhalten bleiben und nach dem Wiederherstellen der Versorgungsspannung bei erneutem Programmstart wieder zur Verfügung stehen, dann benutzt man das EEPROM.<br />
<br />
Schreib- und Lesezugriffe auf den EEPROM-Speicher erfolgen über die im Modul eeprom.h der avr-libc definierten Funktionen. Mit diesen Funktionen können einzelne Bytes, Datenworte (16 Bit), Fließkommawerte (32 Bit, single-precision, float) und Datenblöcke geschrieben und gelesen werden.<br />
<br />
Diese Funktionen kümmern sich auch um diverse Details, die bei der Benutzung des EEPROMs normalerweise notwendig sind:<br />
* EEPROM-Operationen sind im Vergleich relativ langsam. Man muss daher darauf achten, dass eine vorhergehende Operation abgeschlossen ist, ehe die nächste Operation mit dem EEPROM gestartet wird. Die in der avr-libc implementierten Funktionen aus eeprom.h berücksichtigten dies. Soll beim Aufruf einer EEPROM-Funktion sichergestellt werden, dass diese nicht intern in einer Warteschleife auf den Abschluss der vorherigen Operation wartet, kann vorher per eeprom_is_ready testen, ob der Zugriff auf den EEPROM-Speicher sofort möglich ist.<br />
* Es ist darauf zu achten, dass die EEPROM-Funktionen nicht durch einen Interrupt unterbrochen werden. Einige Phasen des Zugriffs sind zeitkritisch und müssen in einer definierten bzw. begrenzten Anzahl von Takten durchgeführt werden. Durch einen unterbrechenden Interrupt würde diese Restriktion nicht mehr eingehalten. Auch dieses Detail wird von den avr-libc Funktionen berücksichtigt, so dass man sich als C-Programmierer nicht darum kümmern muss. Innerhalb der Funktionen werden Interrupts vor der "EEPROM-Sequenz" global deaktiviert und im Anschluss, falls vorher auch schon eingeschaltet, wieder aktiviert.<br />
<br />
Man beachte, dass der EEPROM-Speicher nur eine begrenzte Anzahl von Schreibzugriffen zulässt. Beschreibt man eine EEPROM-Zelle öfter als die im Datenblatt zugesicherte Anzahl (typisch 100.000), wird die Funktion der Zelle nicht mehr garantiert. Dies gilt für jede einzelne Zelle. <br />
<br />
Bei geschickter Programmierung (z.&nbsp;B. Ring-Puffer), bei der die zu beschreibenden Zellen regelmäßig gewechselt werden, kann man eine deutlich höhere Anzahl an Schreibzugriffen, bezogen auf den gesamten EEPROM-Speicher, erreichen. Auf jeden Fall sollte man aber eine Abschätzung über die zu erwartende Lebensdauer des EEPROM durchführen. Wird ein Wert im EEPROM im Durchschnitt nur einmal pro Woche verändert, wird die garantierte Anzahl der Schreibzyklen innerhalb der voraussichtlichen Verwendungszeit des Controllers sicherlich nicht erreicht werden. Welcher Controller ist schon 100000 / 52 = 1923 Jahre im Einsatz? In diesem Fall lohnt es sich daher nicht, erweiterte Programmfunktionen zu implementieren, mit denen die Anzahl der Schreibzugriffe minimiert wird.<br />
<br />
Eine weitere Möglichkeit, Schreibzyklen einzusparen, besteht in der Vorabprüfung, ob der zu speichernde Wert im EEPROM bereits enthalten ist und nur veränderte Werte zu schreiben. In aktuelleren Versionen der avr-libc sind bereits Funktionen enthalten, die solche Prüfungen enthalten (eeprom_update_*).<br />
<br />
Eine dritte Möglichkeit speichert alle Daten zunächst im RAM, wo sie beliebig oft beschrieben werden können. Nur beim Ausschalten oder beim Ausfall der Stromversorgung werden die Daten in den EEPROM geschrieben. Wie man das richtig macht sieht man im Artikel [[Speicher#EEPROM Schreibzugriffe minimieren | Speicher]].<br />
<br />
Lesezugriffe können beliebig oft durchgeführt werden. Sie unterliegen keinen Einschränkungen in Bezug auf deren Anzahl. <br />
<br />
=== EEMEM ===<br />
Um eine Variable im EEPROM anzulegen, stellt die avr-libc das Makro EEMEM zur Verfügung:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdint.h><br />
#include <avr/eeprom.h><br />
<br />
/* Byte */<br />
uint8_t eeFooByte EEMEM = 123;<br />
<br />
/* Wort */<br />
uint16_t eeFooWord EEMEM = 12345;<br />
<br />
/* float */<br />
float eeFooFloat EEMEM;<br />
<br />
/* Byte-Array */<br />
uint8_t eeFooByteArray1[] EEMEM = { 18, 3, 70 };<br />
uint8_t eeFooByteArray2[] EEMEM = { 30, 7, 79 };<br />
<br />
/* 16-bit unsigned short feld */<br />
uint16_t eeFooWordArray1[4] EEMEM;<br />
</syntaxhighlight><br />
<br />
Die grundsätzliche Vorgehensweise ist identisch zur Verwendung von PROGMEM. Auch hier erzeugt man sich spezielle attributierte Variablen (EEMEM erledigt das), die vom Compiler/Linker nicht wie normale Variablen behandelt werden. Compiler/Linker kümmern sich zwar darum, dass diesen Variablen eine Adresse zugewiesen wird, diese Adresse ist dann aber die Adresse der 'Variablen' im EEPROM. Um die dort gespeicherten Werte zu lesen bzw. zu schreiben, übergibt man diese Adresse an spezielle Funktionen, die die entsprechenden Werte aus dem EEPROM holen bzw. das EEPROM neu beschreiben.<br />
<br />
Die mittels EEMEM erzeugten 'Variablen' sind also mehr als Platzhalter zu verstehen, denn als echte Variablen. Es geht nur darum, im C-Programm symbolische Namen zur Verfügung zu haben, anstatt mit echten EEPROM-Adressen hantieren zu müssen, etwas, das grundsätzlich aber auch genauso gut möglich ist. Nur muss man sich in diesem Fall dann selbst darum kümmern, dass mehrere 'Variablen' ohne Überschneidung im EEPROM angeordnet werden.<br />
<br />
=== Bytes lesen/schreiben ===<br />
<br />
Die avr-libc Funktion zum Lesen eines Bytes heißt eeprom_read_byte. Parameter ist die Adresse des Bytes im EEPROM. Geschrieben wird über die Funktion eeprom_write_byte mit den Parametern Adresse und Inhalt. Anwendungsbeispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#define EEPROM_DEF 0xFF<br />
<br />
void eeprom_example (void)<br />
{<br />
uint8_t myByte;<br />
<br />
// myByte lesen (Wert = 123)<br />
myByte = eeprom_read_byte (&eeFooByte);<br />
<br />
// der Wert 99 wird im EEPROM an die Adresse der<br />
// Variablen eeFooByte geschrieben<br />
myByte = 99;<br />
eeprom_write_byte(&eeFooByte, myByte); // schreiben<br />
<br />
myByte = eeprom_read_byte (&eeFooByteArray1[1]); <br />
// myByte hat nun den Wert 3<br />
<br />
// Beispiel fuer eeprom_update_byte: die EEPROM-Zelle wird nur<br />
// dann beschrieben, wenn deren Inhalt sich vom Parameterwert<br />
// unterscheidet. In diesem Beispiel erfolgt also kein Schreib-<br />
// zugriff, da die Werte gleich sind.<br />
eeprom_update_byte(&eeFooByte, myByte);<br />
<br />
<br />
// Beispiel zur "Sicherung" gegen leeres EEPROM nach "Chip Erase"<br />
// (z. B. wenn die .eep-Datei nach Programmierung einer neuen Version<br />
// des Programms nicht in den EEPROM uebertragen wurde und EESAVE<br />
// deaktiviert ist (unprogrammed/1)<br />
// <br />
// Vorsicht: wenn EESAVE "programmed" ist, hilft diese Sicherung nicht<br />
// weiter, da die Speicheraddressen in einem neuen/erweiterten Programm<br />
// moeglicherweise verschoben wurden. An der Stelle &eeFooByte steht<br />
// dann u.U. der Wert einer anderen Variable aus einer "alten" Version.<br />
<br />
uint8_t fooByteDefault = 222;<br />
if ((myByte = eeprom_read_byte (&eeFooByte)) == EEPROM_DEF)<br />
{<br />
myByte = fooByteDefault;<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
=== Wort lesen/schreiben ===<br />
<br />
Schreiben und Lesen von Datenworten erfolgt analog zur Vorgehensweise bei Bytes:<br />
<br />
<syntaxhighlight lang="c"><br />
// lesen<br />
uint16_t myWord = eeprom_read_word (&eeFooWord);<br />
<br />
// schreiben<br />
eeprom_write_word (&eeFooWord, 2222);<br />
</syntaxhighlight><br />
<br />
=== Block lesen/schreiben ===<br />
<br />
Lesen und Schreiben von Datenblöcken erfolgt über die Funktionen <code>eeprom_read_block()</code> bzw. <code>eeprom_write_block()</code>. Die Funktionen erwarten drei Parameter: die Adresse der Quell- bzw. Zieldaten im RAM, die EEPROM-Adresse und die Länge des Datenblocks in Bytes als <code>size_t</code>.<br />
<syntaxhighlight lang="c"><br />
uint8_t myByteBuffer[3];<br />
uint16_t myWordBuffer[4];<br />
<br />
void eeprom_block_example (void)<br />
{<br />
/* Datenblock aus EEPROM lesen */<br />
<br />
/* liest 3 Bytes ab der von eeFooByteArray1 definierten EEPROM-Adresse<br />
in das RAM-Array myByteBuffer */<br />
eeprom_read_block (myByteBuffer, eeFooByteArray1, 3);<br />
<br />
/* dito mit etwas Absicherung betr. der Länge */<br />
eeprom_read_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));<br />
<br />
/* und nun mit 16-Bit Array */<br />
eeprom_read_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));<br />
<br />
/* Datenblock in EEPROM schreiben */<br />
eeprom_write_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));<br />
eeprom_write_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));<br />
}<br />
</syntaxhighlight><br />
<br />
=== Fließkommawerte lesen/schreiben ===<br />
<br />
In der avr-libc stehen auch EEPROM-Funktionen für Variablen des Typs float (Fließkommazahlen mit "einfacher" Genauigkeit) zur Verfügung.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/eeprom.h><br />
<br />
float eeFloat EEMEM = 12.34f;<br />
<br />
float void eeprom_float_example(float value)<br />
{<br />
/* float in EEPROM schreiben */<br />
eeprom_write_float(&eeFloat, value);<br />
<br />
/* float aus EEPROM lesen */<br />
return eeprom_read_float(&eeFloat);<br />
}</syntaxhighlight><br />
<br />
=== EEPROM-Speicherabbild in .eep-Datei ===<br />
<br />
Mit den zum Compiler gehörenden Werkzeugen kann der aus den Variablendeklarationen abgeleitete EEPROM-Inhalt in eine Datei geschrieben werden. Die übliche Dateiendung ist .eep, Daten im Intel Hex-Format. Damit können Standardwerte für den EEPROM-Inhalt im Quellcode definiert werden. <br />
<br />
Makefiles nach WinAVR/MFile-Vorlage enthalten bereits die notwendigen Einstellungen, siehe dazu die Erläuterungen im [[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]].<br />
<br />
Der Inhalt der eep-Datei muss ebenfalls zum Mikrocontroller übertragen werden, wenn die Initialisierungswerte aus der Deklaration vom Programm erwartet werden. Ansonsten enthält der EEPROM-Speicher nach der Übertragung des Programmers mittels ISP abhängig von der Einstellung der EESAVE-Fuse<ref>vgl. Datenblatt Abschnitt Fuse Bits</ref> nicht die korrekten Werte:<br />
; EESAVE = 0 (programmed): Die Daten im EEPROM bleiben erhalten. Werden sie nicht neu geschrieben, so enthält das EEPROM evtl. Daten, die nicht mehr zum Programm passen.<br />
; EESAVE = 1 (unprogrammed): Beim Programmieren werden die Daten im EEPROM gelöscht, also auf 0xff gesetzt.<br />
<br />
Als Sicherung kann man im Programm nochmals die Standardwerte vorhalten, beim Lesen auf 0xFF prüfen und gegebenenfalls einen Standardwert nutzen. Das geht natürlich nur, wenn 0xFF selbst nicht als Datenwert vorkommen kann.<br />
<syntaxhighlight lang="c"><br />
#define DUTY_CYCLE_DEFAULT 0x80<br />
<br />
uint8_t eeDutyCycle EEMEM; // Platzhalter für EEPROM<br />
uint8_t DutyCycle; // die echte Variable<br />
<br />
<br />
int main(void)<br />
{<br />
DutyCycle = eeprom_read_byte( &eeDutyCycle );<br />
if( DutyCycle == 0xFF ) // das allererste mal. Im EEPROM steht noch kein gültiger Wert<br />
{<br />
DutyCycle = DUTY_CYCLE_DEFAULT;<br />
eeprom_writeByte( &eeDutyCycle, DutyCycle );<br />
}<br />
<br />
...<br />
</syntaxhighlight><br />
<br />
=== Direkter Zugriff auf EEPROM-Adressen ===<br />
<br />
Will man direkt auf bestimmte EEPROM Adressen zugreifen, dann sind folgende IAR-kompatiblen Makros <tt>_EEGET</tt> und <tt>_EEPUT</tt> hilfreich, um sich die Typecasts zu ersparen.<br />
<br />
;Hinweis: Die nachfolgend gezeigten Makros und Zugriffe auf absolute Adressen sind in Normalfall nicht nötig und nur auf sehr wenige, spezielle Fälle beschränkt! Im Normalfall sollte man auf absolute Adressen möglichst nicht zugreifen und den Compiler seine Arbeit machen lassen, der verwaltet die Variablen und deren Adressen meist besser als der Programmierer. Der Zugriff auf Variablen im EEPROM sollte immer über ihren Namen erfolgen.<br />
<br />
Verwendung:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/eeprom.h><br />
<br />
_EEPUT (0x20, 128); // Byte-Wert 128 an Adresse 0x20 schreiben<br />
...<br />
uint8_t val = _EEGET (0x20); // EEPROM-Wert von Adresse 0x20 lesen<br />
</syntaxhighlight><br />
<br />
=== Was steckt dahinter? - EEPROM-Register ===<br />
Auch wenn es normalerweise keinen Grund gibt, in C selbst an den Steuerregistern herumzuschrauben - die eeprom Funktionen erledigen das alles zuverlässig - der Vollständigkeit halber der registermässige technische Unterbau.<br />
Um das EEPROM anzusteuern, sind drei Register von Bedeutung:<br />
;EEAR: Hier werden die Adressen eingetragen zum Schreiben oder Lesen. Dieses Register unterteilt sich nochmal in EEARH und EEARL, da in einem 8-Bit-Register keine 512 Adressen adressiert werden können.<br />
;EEDR: Hier werden die Daten eingetragen, die geschrieben werden sollen, bzw. es enthält die gelesenen Daten.<br />
;EECR: Ist das Kontrollregister für das EEPROM<br />
<br />
Das EECR steuert den Zugriff auf das EEPROM und ist wie folgt aufgebaut:<br />
<br />
:{| class="wikitable" style="text-align:center"<br />
|+ '''Aufbau des EECR-Registers'''<br />
|-<br />
!Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|-<br />
! Name<br />
| - || - || - ||- || EERIE || EEMWE || EEWE || EERE<br />
|-<br />
! Read/Write<br />
| R || R || R || R || R/W || R/W || R/W || R/W<br />
|-<br />
!Init Value<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''Bedeutung der Bits'''<br />
<br />
;Bit 4-7: nicht belegt<br />
<br />
;Bit 3 (EERIE): ''EEPROM Ready Interrupt Enable'': Wenn das Bit gesetzt ist und globale Interrupts erlaubt sind in Register SREG (Bit 7), wird ein Interrupt ausgelöst nach Beendigung des Schreibzyklus (EEPROM Ready Interrupt). Ist einer der beiden Bits 0, wird kein Interrupt ausgelöst.<br />
<br />
;Bit 2 EEMWE): ''EEPROM Master Write Enable'': Dieses Bit bestimmt, dass, wenn EEWE = 1 gesetzt wird (innerhalb von 4 Taktzyklen), das EEPROM beschrieben wird mit den Daten in EEDR bei Adresse EEAR. Wenn EEMWE = 0 ist und EEWE = 1 gesetzt wird, hat das keine Auswirkungen. Der Schreibvorgang wird dann nicht ausgelöst. Nach 4 Taktzyklen wird das Bit EEMWE automatisch wieder auf 0 gesetzt. Dieses Bit löst den Schreibvorgang nicht aus, es dient sozusagen als Sicherungsbit für EEWE.<br />
<br />
;Bit 1 (EEWE): ''EEPROM Write Enable'': Dieses Bit löst den Schreibvorgang aus, wenn es auf 1 gesetzt wird, sofern vorher EEMWE gesetzt wurde und seitdem nicht mehr als 4 Taktzyklen vergangen sind. Wenn der Schreibvorgang abgeschlossen ist, wird dieses Bit automatisch wieder auf 0 gesetzt und, sofern EERIE gesetzt ist, ein Interrupt ausgelöst. Ein Schreibvorgang sieht typischerweise wie folgt aus:<br />
:# EEPROM-Bereitschaft abwarten (EEWE=0) <br />
:# Adresse übergeben an EEAR<br />
:# Daten übergeben an EEDR<br />
:# Schreibvorgang auslösen in EECR mit Bit EEMWE=1 und EEWE=1<br />
:# (Optional) Warten, bis Schreibvorgang abgeschlossen ist<br />
<br />
;Bit 0 EERE: ''EEPROM Read Enable'': Wird dieses Bit auf 1 gesetzt wird das EEPROM an der Adresse in EEAR ausgelesen und die Daten in EEDR gespeichert. Das EEPROM kann nicht ausgelesen werden, wenn bereits eine Schreiboperation gestartet wurde. Es ist daher zu empfehlen, die Bereitschaft vorher zu prüfen. Das EEPROM ist lesebereit, wenn das Bit EEWE=0 ist. Ist der Lesevorgang abgeschlossen, wird das Bit wieder auf 0 gesetzt, und das EEPROM ist für neue Lese- und Schreibbefehle wieder bereit. Ein typischer Lesevorgang kann wie folgt aufgebaut sein:<br />
:# Bereitschaft zum Lesen prüfen (EEWE=0)<br />
:# Adresse übergeben an EEAR<br />
:# Lesezyklus auslösen mit EERE = 1<br />
:# Warten, bis Lesevorgang abgeschlossen EERE = 0<br />
:# Daten abholen aus EEDR<br />
<br />
= Die Nutzung von sprintf und printf =<br />
<br />
Um komfortabel, d.h. formatiert, Ausgaben auf ein Display oder die serielle Schnittstelle zu tätigen, bieten sich '''sprintf''' oder '''printf''' an. Alle *printf-Varianten sind jedoch ziemlich speicherintensiv und der Einsatz in einem Mikrocontroller mit knappem Speicher muss sorgsam abgewogen werden.<br />
<br />
Bei '''sprintf''' wird die Ausgabe zunächst in einem Puffer vorbereitet und anschließend mit einfachen Funktionen zeichenweise ausgegeben. Es liegt in der Verantwortung des Programmierers, genügend Platz im Puffer für die erwarteten Zeichen bereitzuhalten.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdio.h><br />
#include <stdint.h><br />
<br />
// ...<br />
// nicht dargestellt: Implementierung von uart_puts (vgl. Abschnitt UART)<br />
// ...<br />
<br />
uint16_t counter;<br />
<br />
// Ausgabe eines unsigned Integerwertes<br />
void uart_puti( uint16_t value )<br />
{<br />
uint8_t puffer[20];<br />
<br />
sprintf( puffer, "Zählerstand: %u", value );<br />
uart_puts( puffer );<br />
}<br />
<br />
int main()<br />
{<br />
counter = 5;<br />
<br />
uart_puti( counter );<br />
uart_puti( 42 );<br />
}<br />
</syntaxhighlight><br />
<br />
Eine weitere elegante Möglichkeit besteht darin, den STREAM stdout (Standardausgabe) auf eine eigene Ausgabefunktion umzuleiten. Dazu wird dem Ausgabemechanismus der C-Bibliothek eine neue Ausgabefunktion bekannt gemacht, deren Aufgabe es ist, ein einzelnes Zeichen auszugeben. Wohin die Ausgabe dann tatsächlich stattfindet, ist Sache der Ausgabefunktion. Im Beispiel unten wird auf UART ausgegeben. Alle anderen, höheren Funktionen wie z.&nbsp;B. '''printf''', greifen letztendlich auf diese primitive Ausgabefunktion zurück. <br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdio.h><br />
<br />
void uart_init(void);<br />
<br />
// a. Deklaration der primitiven Ausgabefunktion<br />
int uart_putchar(char c, FILE *stream);<br />
<br />
// b. Umleiten der Standardausgabe stdout (Teil 1)<br />
static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );<br />
<br />
// c. Definition der Ausgabefunktion<br />
int uart_putchar( char c, FILE *stream )<br />
{<br />
if( c == '\n' )<br />
uart_putchar( '\r', stream );<br />
<br />
loop_until_bit_is_set( UCSRA, UDRE );<br />
UDR = c;<br />
return 0;<br />
}<br />
<br />
void uart_init(void)<br />
{<br />
/* hier µC spezifischen Code zur Initialisierung */<br />
/* des UART einfügen... s.o. im AVR-GCC-Tutorial */<br />
<br />
// Beispiel: <br />
//<br />
// myAVR Board 1.5 mit externem Quarz Q1 3,6864 MHz<br />
// 9600 Baud 8N1<br />
<br />
#ifndef F_CPU<br />
#define F_CPU 3686400<br />
#endif<br />
#define UART_BAUD_RATE 9600<br />
<br />
// Hilfsmakro zur UBRR-Berechnung ("Formel" laut Datenblatt)<br />
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)<br />
<br />
UCSRB |= (1<<TXEN) | (1<<RXEN); // UART TX und RX einschalten<br />
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 <br />
<br />
UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );<br />
UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );<br />
}<br />
<br />
int main(void)<br />
{<br />
int16_t antwort = 42;<br />
uart_init();<br />
<br />
// b. Umleiten der Standardausgabe stdout (Teil 2)<br />
stdout = &mystdout;<br />
<br />
// Anwendung<br />
printf( "Die Antwort ist %d.\n", antwort );<br />
return 0;<br />
}<br />
<br />
// Quelle: avr-libc-user-manual-1.4.3.pdf, S.74<br />
// + Ergänzungen<br />
</syntaxhighlight><br />
<br />
<br />
Sollen Fließkommazahlen ausgegeben werden, muss im Makefile eine andere (größere) Version der [[FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio|printflib]] eingebunden werden.<br />
<br />
= Anmerkungen =<br />
<references/><br />
<br />
= TODO =<br />
* Aktualisierung Register- und Bitbeschreibungen an aktuelle AVR<br />
* "naked"-Funktionen [http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html][http://arduino.stackexchange.com/questions/8758/arduino-interruption-on-pin-change]<br />
<br />
[[Kategorie:avr-gcc Tutorial| ]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial&diff=100752
AVR-GCC-Tutorial
2019-07-31T17:54:40Z
<p>Gjlayde: /* Zugriff auf IO-Ports */ Typo</p>
<hr />
<div>Dieses Tutorial soll den Einstieg in die Programmierung von Atmel [[AVR]]-Mikrocontrollern in der Programmiersprache [[C]] mit dem freien C-Compiler [[avr-gcc]] aus der [http://gcc.gnu.org/ GNU Compiler Collection] (GCC) erleichtern.<br />
<br />
Vorausgesetzt werden Grundkenntnisse der Programmiersprache C. Diese Kenntnisse kann man sich online erarbeiten, z. B. mit dem [http://www.schellong.de/c.htm C Tutorial von Helmut Schellong] ([[C|Liste von C-Tutorials]]). Nicht erforderlich sind Vorkenntnisse in der Programmierung von Mikrocontrollern.<br />
<br />
= Vorwort =<br />
<br />
In diesem Text wird häufig auf die Standardbibliothek avr-libc verwiesen, für die es eine [http://www.nongnu.org/avr-libc/user-manual/index.html Online-Dokumentation] gibt, in der sich auch viele nützliche Informationen zum Compiler und zur Programmierung von AVR-Controllern finden. Beim Paket [[WinAVR]] gehört die avr-libc Dokumentation zum Lieferumfang und wird mitinstalliert.<br />
<br />
Der Compiler und die Standardbibliothek avr-libc werden ständig weiterentwickelt. Einige Unterschiede, die sich im Verlauf der Entwicklung ergeben haben, werden hier und im Artikel [[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen]] zwar angesprochen, Anfängern und Umsteigern sei jedoch empfohlen, eine aktuelle Versionen zu nutzen.<br />
<br />
Das ursprüngliche Tutorial stammt von Christian Schifferle, viele neue Abschnitte und aktuelle Anpassungen von Martin Thomas.<br />
<br />
Dieses Tutorial ist in [[Media:AVR-GCC-Tutorial.pdf|PDF-Form]] erhältlich (zur Zeit nur eine sehr veraltete Version).<br />
<br />
== Weiterführende Kapitel ==<br />
<br />
Um dieses riesige Tutorial etwas überschaubarer zu gestalten, wurden einige Kapitel ausgelagert, die nicht unmittelbar mit den Grundlagen von avr-gcc in Verbindung stehen. All diese Seiten gehören zur [[:Kategorie:avr-gcc Tutorial]].<br />
<br />
;UART: → Hauptartikel: ''[[AVR-GCC-Tutorial/Der UART|Der UART]]''<br />
<br />
;ADC: → Hauptartikel: ''[[AVR-GCC-Tutorial/Analoge Ein- und Ausgabe|Analoge Ein- und Ausgabe (ADC)]]''<br />
<br />
;Timer: → Hauptartikel: ''[[AVR-GCC-Tutorial/Die Timer und Zähler des AVR|Die Timer und Zähler des AVR]]''<br />
<br />
;LCD: → Hauptartikel: ''[[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Ansteuerung]]''<br />
<br />
;Watchdog: → Hauptartikel: ''[[AVR-GCC-Tutorial/Der Watchdog|Der Watchdog]]''<br />
<br />
;Assembler: → Hauptartikel: ''[[AVR-GCC-Tutorial/Assembler und Inline-Assembler|Assembler und Inline-Assembler]]''<br />
<br />
;alte Quellen anpassen: → Hauptartikel: ''[[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen anpassen]]''<br />
<br />
;Makefiles: → Hauptartikel: ''[[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]]'' sowie als Alternative für sehr kleine Projekte → Hauptartikel: ''[[C ohne Makefile]]''<br />
<br />
= Benötigte Werkzeuge =<br />
<br />
Um eigene Programme für AVRs mittels einer AVR-Toolchain zu erstellen wird folgende Hard- und Software benötigt:<br />
<br />
* Eine AVR-Toolchain bestehend aus avr-gcc, den avr-Binutils (Assembler, Linker, etc) und einer Standard-C Bibliothek. Üblich ist die AVR-LibC, die auch quasi in allen avr-gcc Distributionen enthalten ist.<br />
<br />
Hardware wird keine benötigt – bis auf einen PC natürlich, auf dem der Compiler ablaufen kann. Selbst ohne AVR-Hardware kann man also bereits C-Programme für AVRs schreiben, compiliern und sich das Look-and-Feel von avr-gcc sowie von IDEs wie [[Atmel Studio]], Eclipse oder leichtgewichtigeren Entwicklungsumbgebungen anschauen. Selbst das Debuggen und Simulieren ist mithilfe entsprechender Tools wie Debugger und Simulator in gewissen Grenzen möglich.<br />
<br />
Um Programme für AVRs mittels einer AVR-Toolchain zu testen, wird folgende Hard- und Software benötigt:<br />
<br />
* Platine oder Versuchsaufbau für die Aufnahme eines AVR-Controllers, der vom avr-gcc Compiler unterstützt wird.<ref>Für eine Liste der unterstützten COntroller siehe die Dokumentation des Compilers oder [http://www.nongnu.org/avr-libc/user-manual/index.html#supported_devices AVR-Libc: Supported Devices].</ref> Dieses Testboard kann durchaus auch selbst gelötet oder auf einem Steckbrett aufgebaut werden. Einige Registerbeschreibungen dieses Tutorials beziehen sich auf den inzwischen veralteten AT90S2313. Der weitaus größte Teil des Textes ist aber für alle Controller der AVR-Familie gültig. <br />
<br />
:Brauchbare Testplattformen sind auch das [[STK500]] und der [[AVR Butterfly]] von Atmel. Weitere Infos findet man in den Artikeln [[AVR#Starterkits|AVR Starterkits]] und [[AVR-Tutorial: Equipment]].<br />
<br />
* Programmiersoftware und -[[AVR In System Programmer |hardware]] z. B. PonyProg (siehe auch: [[Pony-Prog Tutorial]]) oder [[AVRDUDE]] mit [[STK200]]-Dongle oder die von Atmel verfügbare Hard- und Software ([[STK500]], Atmel AVRISP, [[AVR-Studio]]).<br />
<br />
* Nicht unbedingt erforderlich, aber zur Simulation und zum Debuggen unter MS-Windows recht nützlich: [[AVR-Studio]].<br />
<br />
* Wer unter Windows und Linux gleichermassen entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] ansehen. Beide sind unter Windows und Linux einfach zu installieren, siehe auch [[AVR Eclipse]]. Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks]<ref>Aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar.</ref>. Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins "AVR-Projekte" angelegt werden. Für Linux gibt es auch noch das [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=25220 KontrollerLab].<br />
<br />
= Was tun, wenn's nicht klappt? =<br />
<br />
* Herausfinden, ob es tatsächlich ein avr(-gcc) spezifisches Problem ist oder nur die eigenen C-Kenntnisse einer Auffrischung bedürfen. Allgemeine C-Fragen kann man eventuell "beim freundlichen Programmierer zwei Büro-, Zimmer- oder Haustüren weiter" loswerden. Ansonsten: [[C]]-Buch (gibt's auch "gratis" online) lesen.<br />
<br />
* Die [[AVR Checkliste]] durcharbeiten.<br />
<br />
* Die '''[http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc]''' lesen, vor allem (aber nicht nur) den Abschnitt Related Pages/'''Frequently Asked Questions''' = Oft gestellte Fragen (und Antworten dazu). Z.Zt leider nur in englischer Sprache verfügbar.<br />
<br />
* Den Artikel [[AVR-GCC]] in diesem Wiki lesen.<br />
<br />
* Das [http://www.mikrocontroller.net/forum/gcc GCC-Forum auf www.mikrocontroller.net] nach vergleichbaren Problemen absuchen.<br />
<br />
* Das avr-gcc-Forum bei [http://www.avrfreaks.net AVRfreaks] nach vergleichbaren Problemen absuchen.<br />
<br />
* Das [http://lists.gnu.org/archive/html/avr-gcc-list/ Archiv der avr-gcc Mailing-Liste] nach vergleichbaren Problemen absuchen.<br />
<br />
* Nach Beispielcode suchen. Vor allem im ''Projects''-Bereich von [http://www.avrfreaks.net AVRfreaks] (anmelden).<br />
<br />
* Google oder yahoo befragen schadet nie.<br />
<br />
* Bei Problemen mit der Ansteuerung interner AVR-Funktionen mit C-Code: das Datenblatt des Controllers lesen (ganz und am Besten zweimal). Datenblätter sind auf den [http://www.atmel.com Atmel Webseiten] als pdf-Dateien verfügbar. Das komplette Datenblatt (complete) und nicht die Kurzfassung (summary) verwenden.<br />
<br />
* Die Beispielprogramme im [[AVR-Tutorial]] sind zwar in AVR-Assembler verfasst, Erläuterungen und Vorgehensweisen sind aber auch auf C-Programme übertragbar.<br />
<br />
* Einen Beitrag in eines der Foren oder eine Mail an die Mailing-Liste schreiben. Dabei möglichst viel Information geben: Controller, Compilerversion, genutzte Bibliotheken, Ausschnitte aus dem Quellcode oder besser ein [http://www.mikrocontroller.net/topic/72767#598986 Testprojekt] mit allen notwendigen Dateien, um das Problem nachzuvollziehen, sowie genaue Fehlermeldungen bzw. Beschreibung des Fehlverhaltens. Bei Ansteuerung externer Geräte die Beschaltung beschreiben oder skizzieren (z. B. mit [http://www.tech-chat.de/ Andys ASCII Circuit]). Siehe dazu auch: '''[http://www.tty1.net/smart-questions_de.html "Wie man Fragen richtig stellt"]'''.<br />
<br />
= Erzeugen von Maschinencode =<br />
<br />
Aus dem C-Quellcode erzeugt der avr-gcc Compiler (zusammen mit Hilfsprogrammen wie z.&nbsp;B. Präprozessor, Assembler und Linker) Maschinencode für den AVR-Controller. Üblicherweise liegt dieser Code dann im Intel Hex-Format vor ("Hex-Datei"). Die Programmiersoftware (z.&nbsp;B. [[AVRDUDE]], PonyProg oder AVRStudio/STK500-plugin) liest diese Datei ein und überträgt die enthaltene Information (den Maschinencode) in den Speicher des Controllers. Im Prinzip sind also "nur" der avr-gcc-Compiler (und wenige Hilfsprogramme) mit den "richtigen" Optionen aufzurufen, um aus C-Code eine "Hex-Datei" zu erzeugen. Grundsätzlich stehen dazu drei verschiedene Ansätze zur Verfügung:<br />
<br />
* Die Verwendung einer integrierten Entwicklungsumgebung (IDE = '''I'''ntegrated '''D'''evelopment '''E'''nvironment), bei der alle Einstellungen z.&nbsp;B. in Dialogboxen durchgeführt werden können. Unter Anderem kann AVRStudio ab Version 4.12 (kostenlos auf [http://www.atmel.com/ atmel.com]) zusammen mit WinAVR als integrierte Entwicklungsumgebung für den Compiler avr-gcc genutzt werden (dazu müssen AVRStudio und WinAVR auf dem Rechner installiert sein). Weitere IDEs (ohne Anspruch auf Vollständigkeit): [http://www.eclipse.org/ Eclipse for C/C++ Developers] (d.h. inkl. CDT) und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] (für diverse Plattformen, u.a. Linux und MS Windows, IDE und Plugin kostenlos), [http://sourceforge.net/projects/kontrollerlab KontrollerLab] (Linux/KDE, kostenlos). [http://www.atmanecl.com/EnglishSite/SoftwareEnglish.htm AtmanAvr] (MS Windows, relativ günstig), KamAVR (MS-Windows, kostenlos, wird augenscheinlich nicht mehr weiterentwickelt), [http://www.amctools.com/vmlab.htm VMLab] (MS Windows, ab Version 3.12 ebenfalls kostenlos). Integrierte Entwicklungsumgebungen unterscheiden sich stark in Ihrer Bedienung und stehen auch nicht für alle Plattformen zur Verfügung, auf denen der Compiler ausführbar ist (z.&nbsp;B. AVRStudio nur für MS-Windows). Zur Anwendung des avr-gcc Compilers mit IDEs sei hier auf deren Dokumentation verwiesen. <br />
<br />
* Die Nutzung des Programms make mit passenden Makefiles. In den folgenden Abschnitten wird die Generierung von Maschinencode für einen AVR ("hex-Datei") aus C-Quellcode ("c-Dateien") anhand von "make" und den "Makefiles" näher erläutert. Viele der darin beschriebenen Optionen findet man auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio (AVRStudio generiert ein makefile in einem Unterverzeichnis des Projektverzeichnisses). <br />
<br />
* Das Generieren des Programms ohne IDE und ohne Makefile. In diesem Fall muss die Quellcodedatei durch eine vorgefertigte Kommandofolge an den Compiler übergeben werden. Der Artikel [[C ohne Makefile]] zeigt, wie das funktioniert. Diese Vorgehensweise empfiehlt sich jedoch nur für kleine Programme, die nicht auf verschiedene Quellcodedateien verteilt sind.<br />
<br />
Beim Wechsel vom makefile-Ansatz nach WinAVR-Vorlage zu AVRStudio ist darauf zu achten, dass AVRStudio (Stand: AVRStudio Version 4.13) bei einem neuen Projekt die Optimierungsoption (vgl. Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|AVR-GCC-Tutorial/Exkurs: Makefiles]], typisch: -Os) nicht einstellt und die mathematische Bibliothek der avr-libc (libm.a, Linker-Option -lm) nicht einbindet. (Hinweis: Bei Version 4.16 wird beides bereits gesetzt). Beides ist Standard bei Verwendung von makefiles nach WinAVR-Vorlage und sollte daher auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio "manuell" eingestellt werden, um auch mit AVRStudio kompakten Code zu erzeugen.<br />
<br />
= Einführungsbeispiel =<br />
<br />
Zum Einstieg ein kleines Beispiel, an dem die Nutzung des Compilers und der Hilfsprogramme (der sogenannten ''Toolchain'') demonstriert wird. Detaillierte Erläuterungen folgen in den weiteren Abschnitten dieses Tutorials.<br />
<br />
Das Programm soll auf einem AVR Mikrocontroller einige Ausgänge ein- und andere ausschalten. Das Beispiel ist für einen ATmega16 programmiert ([http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf Datenblatt]), kann aber sinngemäß für andere Controller der AVR-Familie modifiziert werden. <br />
<br />
Ein kurzes Wort zur Hardware: Bei diesem Programm werden alle Pins von PORTB auf Ausgang gesetzt, und einige davon werden auf HIGH andere auf LOW gesetzt. Das kann je nach angeschlossener Hardware an diesen Pins kritisch sein. Am ungefährlichsten ist es, wenn nichts an den Pins angeschlossen ist und man die Funktion des Programmes durch eine Spannungsmessung mit einem Multimeter kontrolliert. Die Spannung wird dabei zwischen GND-Pin und den einzelnen Pins von PORTB gemessen.<br />
<br />
Zunächst der Quellcode der Anwendung, der in einer Text-Datei mit dem Namen ''main.c'' abgespeichert wird.<br />
<br />
<syntaxhighlight lang="c"><br />
/* Alle Zeichen zwischen Schrägstrich-Stern <br />
und Stern-Schrägstrich sind Kommentare */<br />
<br />
// Zeilenkommentare sind ebenfalls möglich<br />
// alle auf die beiden Schrägstriche folgenden<br />
// Zeichen einer Zeile sind Kommentar<br />
<br />
#include <avr/io.h> // (1)<br />
<br />
int main (void) { // (2)<br />
<br />
DDRB = 0xFF; // (3)<br />
PORTB = 0x03; // (4)<br />
<br />
while(1) { // (5)<br />
/* "leere" Schleife*/ // (6)<br />
} // (7)<br />
<br />
/* wird nie erreicht */<br />
return 0; // (8)<br />
}<br />
</syntaxhighlight><br />
<br />
# In dieser Zeile wird eine sogenannte Header-Datei eingebunden. In <code>avr/io.h</code> sind die Registernamen definiert, die im späteren Verlauf genutzt werden. Auch unter Windows wird ein&nbsp;<code>/</code> zur Kennzeichnung von Unterverzeichnissen in Include-Dateinamen verwendet und kein&nbsp;<code>\</code>.<br />
# Hier beginnt das eigentliche Programm. Jedes C-Programm beginnt mit den Anweisungen in der Funktion <code>main</code>.<br />
# Die Anschlüsse eines AVR (Pins) werden zu Blöcken zusammengefasst, einen solchen Block bezeichnet man als Port. Beim ATmega16 hat jeder Port 8 Anschlüsse, bei kleineren AVRs können einem Port auch weniger als 8 Anschlüsse zugeordnet sein. Da per Definition (Datenblatt) alle gesetzten Bits in einem Datenrichtungsregister den entsprechenden Anschluss auf Ausgang schalten, werden mit DDRB=0xff alle Anschlüsse des Ports B als Ausgänge eingestellt.<br />
# Die den ersten beiden Bits des Ports zugeordneten Anschlüsse (PB0 und PB1) werden 1, alle anderen Anschlüsse des Ports B (PB2-PB7) zu 0. Aktivierte Ausgänge (logisch 1 oder "high") liegen auf Betriebsspannung (VCC, meist 5 Volt), nicht aktivierte Ausgänge führen 0 Volt (GND, Bezugspotential). Es ist sinnvoll, sich möglichst frühzeitig eine alternative Schreibweise beizubringen, die wegen der leichteren Überprüfbarkeit und Portierbarkeit oft im weiteren Tutorial und in Forenbeiträgen benutzt wird. Die Zuordnung sieht in diesem Fall so aus, Näheres dazu im Artikel [[Bitmanipulation]]:<syntaxhighlight lang="c">PORTB = (1<<PB1) | (1<<PB0);</syntaxhighlight><br />
# ist der Beginn der sogenannte ''Hauptschleife'' (main-loop). Dies ist eine Endlosschleife, welche kontinuierlich wiederkehrende Befehle enthält.<br />
# In diesem Beispiel ist die Hauptschleife leer. Der Controller durchläuft die Schleife immer wieder, ohne dass etwas passiert. Eine solche Schleife ist notwendig, da es auf dem Controller kein Betriebssystem gibt, das nach Beendigung des Programmes die Kontrolle übernehmen könnte. Ohne diese Schleife kehrt das Programm aus <code>main</code> zurück, alle Interrupts werden deaktiviert und eine Endlosschleife betreten.<br />
# Ende der Hauptschleife und Sprung zur passenden, öffnenden Klammer, also zu 5.<br />
# ist das Programmende. Die Zeile ist nur aus Gründen der C-Kompatibilität enthalten: <syntaxhighlight lang="c">int main(void)</syntaxhighlight> besagt, dass die Funktion einen int-Wert zurückgibt. Die Anweisung wird aber nicht erreicht, da das Programm die Hauptschleife nie verlässt.<br />
<br />
Um diesen Quellcode in ein lauffähiges Programm zu übersetzen, wird hier ein Makefile genutzt. Das verwendete Makefile findet sich auf der Seite [[Beispiel Makefile]] und basiert auf der Vorlage, die in WinAVR mitgeliefert wird und wurde bereits angepasst (Controllertyp ATmega16). Man kann das Makefile bearbeiten und an andere Controller anpassen oder sich mit dem Programm MFile menügesteuert ein Makefile "zusammenklicken". Das Makefile speichert man unter dem Namen <code>Makefile</code> (ohne Endung) im selben Verzeichnis, in dem auch die Datei <code>main.c</code> mit dem Programmcode abgelegt ist. Detailliertere Erklärungen zur Funktion von Makefiles finden sich im Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|Exkurs: Makefiles]].<br />
<br />
<pre><br />
D:\beispiel>dir<br />
<br />
Verzeichnis von D:\beispiel<br />
<br />
28.11.2006 22:53 <DIR> .<br />
28.11.2006 22:53 <DIR> ..<br />
28.11.2006 20:06 118 main.c<br />
28.11.2006 20:03 16.810 Makefile<br />
2 Datei(en) 16.928 Bytes<br />
</pre><br />
<br />
Nun gibt man ''make all'' ein. Falls das mit WinAVR installierte Programmers Notepad genutzt wird, gibt es dazu einen Menüpunkt im Tools Menü. Sind alle Einstellungen korrekt, entsteht eine Datei <code>main.hex</code>, in welcher der Code für den AVR enthalten ist. <br />
<pre><br />
D:\beispiel>make all<br />
<br />
-------- begin --------<br />
avr-gcc (GCC) 3.4.6<br />
Copyright (C) 2006 Free Software Foundation, Inc.<br />
This is free software; see the source for copying conditions. There is NO<br />
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.<br />
<br />
Compiling C: main.c<br />
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -f<br />
unsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef<br />
-Wa,-adhlns=obj/main.lst -std=gnu99 -Wundef -MD -MP -MF .dep/main.o.d main.c -<br />
o obj/main.o<br />
<br />
Linking: main.elf<br />
avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funs<br />
igned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -W<br />
a,-adhlns=obj/main.o -std=gnu99 -Wundef -MD -MP -MF .dep/main.elf.d obj/main.o<br />
--output main.elf -Wl,-Map=main.map,--cref -lm<br />
<br />
Creating load file for Flash: main.hex<br />
avr-objcopy -O ihex -R .eeprom main.elf main.hex<br />
</pre><br />
<br />
Der Inhalt der hex-Datei kann nun zum Controller übertragen werden. Dies kann z.&nbsp;B. über In-System-Programming ([[ISP]]) erfolgen, das im [[AVR-Tutorial: Equipment]] beschrieben ist. Makefiles nach der WinAVR/MFile-Vorlage sind für die Nutzung des Programms [[AVRDUDE]] vorbereitet. Wenn man den Typ und Anschluss des Programmiergerätes richtig eingestellt hat, kann mit ''make program'' die Übertragung mittels AVRDUDE gestartet werden. Jede andere Software, die hex-Dateien lesen und zu einem AVR übertragen kann<ref>z.&nbsp;B. [[Pony-Prog_Tutorial|Ponyprog]], yapp, AVRStudio</ref>, kann natürlich ebenfalls genutzt werden.<br />
<br />
Startet man nun den Controller (Reset-Taster oder Stromzufuhr aus/an), werden vom Programm die Anschlüsse PB0 und PB1 auf 1 gesetzt. Man kann mit einem Messgerät nun an diesem Anschluss die Betriebsspannung messen oder eine [[LED]] leuchten lassen (Anode an den Pin, Vorwiderstand nicht vergessen). An den Anschlüssen PB2-PB7 misst man 0 Volt. Eine mit der Anode mit einem dieser Anschlüsse verbundene LED leuchtet nicht.<br />
<br />
= Ganzzahlige Datentypen (Integer) =<br />
<br />
Bei der Programmierung von Mikrokontrollern ist die Definition einiger ganzzahliger Datentypen sinnvoll, an denen eindeutig die Bit-Länge abgelesen werden kann.<br />
<br />
Standardisierte Datentypen werden in der Header-Datei <code>stdint.h</code> definiert, die folgendermaßen eingebunden werden kann:<br />
<syntaxhighlight lang="c">#include <stdint.h></syntaxhighlight><br />
<br />
{| {{Tabelle}}<br />
|+ '''int-Typen aus <code>stdint.h</code> (C99)'''<br/>&nbsp;<br />
|- bgcolor="#d0d0ff"<br />
!colspan="5"| Vorzeichenbehaftete int-Typen<br />
|- bgcolor="#e8e8ff"<br />
! Typname || Bit-Breite ||colspan="2"| Wertebereich<br />
|align="center| '''C-Entsprechung''' (avr-gcc)<br />
|-<br />
|<code>int8_t</code> ||align="right"| 8 || −128 ⋯ 127 || −2<sup>7</sup> ⋯ 2<sup>7</sup>−1 || <code>signed char</code><br />
|-<br />
|<code>int16_t</code> ||align="right"| 16 || −32768 ⋯ 32767 || −2<sup>15</sup> ⋯ 2<sup>15</sup>−1 || <code>signed short</code>, <code>signed int</code><br />
|-<br />
|<code>int32_t</code> ||align="right"| 32 || −2147483648 ⋯ 2147483647 || −2<sup>31</sup> ⋯ 2<sup>31</sup>−1 || <code>signed long</code><br />
|-<br />
|<code>int64_t</code> ||align="right"| 64 || −9223372036854775808 ⋯ 9223372036854775807 || −2<sup>63</sup> ⋯ 2<sup>63</sup>−1 || <code>signed long long</code><br />
|- bgcolor="#d0d0ff"<br />
!colspan="5"| Vorzeichenlose int-Typen<br />
|- bgcolor="#e8e8ff"<br />
! Typname || Bit-Breite ||colspan="2"| Wertebereich<br />
|align="center| '''C-Entsprechung''' (avr-gcc)<br />
|-<br />
|<code>uint8_t</code> ||align="right"| 8 || 0 ⋯ 255 || 0 ⋯ 2<sup>8</sup>−1 || <code>unsigned char</code><br />
|-<br />
|<code>uint16_t</code> ||align="right"| 16 || 0 ⋯ 65535 || 0 ⋯ 2<sup>16</sup>−1 || <code>unsigned short</code>, <code>unsigned int</code><br />
|-<br />
|<code>uint32_t</code> ||align="right"| 32 || 0 ⋯ 4294967295 || 0 ⋯ 2<sup>32</sup>−1 || <code>unsigned long</code><br />
|-<br />
|<code>uint64_t</code> ||align="right"| 64 || 0 ⋯ 18446744073709551615 || 0 ⋯ 2<sup>64</sup>−1 || <code>unsigned long long</code><br />
|}<br />
<br />
Neben den Typen gibt es auch Makros für die Bereichsgrenzen wie <code>INT8_MIN</code> oder <code>UINT16_MAX</code>. Siehe dazu auch: [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdint.html Dokumentation der avr-libc: Standard Integer Types].<br />
<br />
= Grundsätzlicher Programmaufbau eines µC-Programms =<br />
<br />
Wir unterscheiden zwischen 2 verschiedenen Methoden, um ein<br />
Mikrocontroller-Programm zu schreiben, und zwar völlig unabhängig davon, in<br />
welcher Programmiersprache das Programm geschrieben wird.<br />
<br />
== Sequentieller Programmablauf ==<br />
<br />
[[Image:Sequentielle Programme.gif|left]]<br />
Bei dieser Programmiertechnik wird eine Endlosschleife programmiert, welche im<br />
Wesentlichen immer den gleichen Aufbau hat. Es wird hier nach dem sogenannten EVA-Prinzip gehandelt. EVA steht für "Eingabe, Verarbeitung, Ausgabe".<br />
{{Absatz}}<br />
<br />
== Interruptgesteuerter Programmablauf ==<br />
<br />
[[Image:Interrupt Programme.gif|left]]<br />
Bei dieser Methode werden beim Programmstart zuerst die gewünschten Interruptquellen aktiviert und dann in eine Endlosschleife gegangen, in welcher Dinge erledigt werden können, welche nicht zeitkritisch sind. Wenn ein Interrupt ausgelöst wird, so wird automatisch die zugeordnete Interruptfunktion ausgeführt.<br />
{{Absatz}}<br />
<br />
= Zugriff auf Register =<br />
<br />
Die AVR-Controller verfügen über eine Vielzahl von Registern. Die meisten<br />
davon sind sogenannte Schreib-/Leseregister. Das heißt, das Programm kann die<br />
Inhalte der Register sowohl auslesen als auch beschreiben.<br />
<br />
Register haben einen besonderen Stellenwert bei den AVR Controllern. Sie dienen dem Zugriff auf die Ports und die Schnittstellen des Controllers. Wir unterscheiden zwischen 8-Bit und 16-Bit Registern. Vorerst behandeln wir die 8-Bit Register.<br />
<br />
Einzelne Register sind bei allen AVRs vorhanden, andere wiederum nur bei bestimmten Typen. So sind beispielsweise die Register, welche für den Zugriff auf den UART notwendig sind, selbstverständlich nur bei denjenigen Modellen vorhanden, welche über einen integrierten Hardware UART bzw. USART verfügen.<br />
<br />
Die Namen der Register sind in den Headerdateien zu den entsprechenden AVR-Typen definiert. Dazu muss man den Namen der controllerspezifischen Headerdatei nicht kennen. Es reicht aus, die allgemeine Headerdatei ''avr/io.h'' einzubinden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
</syntaxhighlight><br />
<br />
Ist im Makefile der MCU-Typ z.&nbsp;B. mit dem Inhalt atmega8 definiert (und wird somit per -mmcu=atmega8 an den Compiler übergeben), wird beim Einlesen der io.h-Datei implizit ("automatisch") auch die iom8.h-Datei mit den Register-Definitionen für den ATmega8 eingelesen.<br />
<br />
<!-- Wohl besser als Anhang - spaeter... --><br />
Intern wird diese "Automatik" wie folgt realisiert: Der Controllertyp wird dem Compiler als Parameter übergeben (vgl. ''avr-gcc -c -mmcu=atmega16 [...]'' im Einführungsbeispiel). Wird ein Makefile nach der WinAVR/mfile-Vorlage verwendet, setzt man die Variable ''MCU'', der Inhalt dieser Variable wird dann an passender Stelle für die Compilerparameter verwendet. Der Compiler definiert intern eine dem mmcu-Parameter zugeordnete "Variable" (genauer: ein Makro) mit dem Namen des Controllers, vorangestelltem ''__AVR_'' und angehängten Unterstrichen (z.&nbsp;B. wird bei ''-mmcu=atmega16'' das Makro ''__AVR_ATmega16__'' definiert). Beim Einbinden der Header-Datei ''avr/io.h'' wird geprüft, ob das jeweilige Makro definiert ist und die zum Controller passende Definitionsdatei eingelesen. Zur Veranschaulichung einige Ausschnitte aus einem Makefile:<br />
<br />
<pre><br />
[...]<br />
# MCU Type ("name") setzen:<br />
MCU = atmega16<br />
[...]<br />
<br />
[...]<br />
## Verwendung des Inhalts von MCU (hier atmega16) fuer die <br />
## Compiler- und Assembler-Parameter<br />
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)<br />
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)<br />
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)<br />
[...]<br />
<br />
[...]<br />
## Aufruf des Compilers:<br />
## mit den Parametern ($(ALL_CFLAGS) ist -mmcu=$(MCU)[...] = -mmcu=atmega16[...]<br />
$(OBJDIR)/%.o : %.c<br />
@echo<br />
@echo $(MSG_COMPILING) $<<br />
$(CC) -c $(ALL_CFLAGS) $< -o $@ <br />
[...]<br />
</pre><br />
<br />
Da --mmcu=atmega16 übergeben wurde, wird __AVR_ATmega16__ definiert und kann in avr/io.h zur Fallunterscheidung genutzt werden:<br />
<br />
<syntaxhighlight lang="c"><br />
// avr/io.h <br />
// (bei WinAVR-Standardinstallation in C:\WinAVR\avr\include\avr)<br />
[...]<br />
#if defined (__AVR_AT94K__)<br />
# include <avr/ioat94k.h><br />
// [...]<br />
#elif defined (__AVR_ATmega16__)<br />
// da __AVR_ATmega16__ definiert ist, wird avr/iom16.h eingebunden:<br />
# include <avr/iom16.h><br />
// [...]<br />
#else<br />
# if !defined(__COMPILING_AVR_LIBC__)<br />
# warning "device type not defined"<br />
# endif<br />
#endif<br />
</syntaxhighlight><br />
<br />
Die Beispiele in den folgenden Abschnitten demonstrieren den Zugriff auf Register anhand der Register für I/O-Ports (PORTx, DDRx, PINx), die Vorgehensweise ist jedoch für alle Register (z.&nbsp;B. die des UART, ADC, SPI) analog.<br />
<br />
== Schreiben in Register ==<br />
<br />
Zum Schreiben kann man Register einfach wie eine Variable setzen.<ref>In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Schreibzugriff über die Funktion outp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt, outp() ist nicht mehr erforderlich.</ref><br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
int main()<br />
{<br />
/* Setzt das Richtungsregister des Ports A auf 0xff <br />
(alle Pins als Ausgang, vgl. Abschnitt Zugriff auf Ports): */<br />
DDRA = 0xff; <br />
<br />
/* Setzt PortA auf 0x03, Bit 0 und 1 "high", restliche "low": */<br />
PORTA = 0x03; <br />
<br />
// Setzen der Bits 0,1,2,3 und 4<br />
// Binär 00011111 = Hexadezimal 1F<br />
DDRB = 0x1F; /* direkte Zuweisung - unübersichtlich */<br />
<br />
/* Ausführliche Schreibweise: identische Funktionalität, mehr Tipparbeit<br />
aber übersichtlicher und selbsterklärend: */<br />
DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4);<br />
<br />
while (1);<br />
}<br />
</syntaxhighlight><br />
<br />
Die ausführliche Schreibweise sollte bevorzugt verwendet werden, da dadurch die Zuweisungen selbsterklärend sind und somit der Code leichter nachvollzogen werden kann. Atmel verwendet sie auch bei Beispielen in Datenblätten und in den allermeisten Quellcodes zu Application-Notes. Mehr zu der Schreibweise mit "|" und "<<" findet man unter [[Bitmanipulation]].<br />
<br />
Der gcc C-Compiler unterstützt ab Version 4.3.0 Konstanten im Binärformat, z.&nbsp;B. DDRB&nbsp;=&nbsp;0b00011111. Diese Schreibweise ist jedoch nur in GNU-C verfügbar und nicht in ISO-C definiert. Man sollte sie daher nicht verwenden, wenn Code mit anderen ausgetauscht oder mit anderen Compilern bzw. älteren Versionen des gcc genutzt werden soll.<br />
<br />
== Verändern von Registerinhalten ==<br />
<br />
Einzelne Bits setzt und löscht man "Standard-C-konform" mittels logischer (Bit-) Operationen. <br />
<br />
<syntaxhighlight lang="c"><br />
x |= (1 << Bitnummer); // Hiermit wird ein Bit in x gesetzt<br />
x &= ~(1 << Bitnummer); // Hiermit wird ein Bit in x geloescht<br />
</syntaxhighlight><br />
<br />
Es wird jeweils nur der Zustand des angegebenen Bits geändert, der vorherige Zustand der anderen Bits bleibt erhalten. <br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
#define MEINBIT 2<br />
...<br />
PORTA |= (1 << MEINBIT); /* setzt Bit 2 an PortA auf 1 */<br />
PORTA &= ~(1 << MEINBIT); /* loescht Bit 2 an PortA */<br />
</syntaxhighlight><br />
<br />
Mit dieser Methode lassen sich auch mehrere Bits eines Registers gleichzeitig setzen und löschen.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
DDRA &= ~( (1<<PA0) | (1<<PA3) ); /* PA0 und PA3 als Eingaenge */<br />
PORTA |= ( (1<<PA0) | (1<<PA3) ); /* Interne Pull-Up fuer beide einschalten */<br />
</syntaxhighlight><br />
<br />
Bei bestimmten AVR Registern mit Bits, die durch Beschreiben mit einer logischen 1 gelöscht werden, muss eine absolute Zuweisung benutzt werden. Ein ODER löscht in diesen Registern ALLE gesetzten Bits!<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
TIFR2 = (1<<OCF2A); // Nur Bit OCF2A löschen<br />
</syntaxhighlight><br />
<br />
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind nicht mehr erforderlich.<br />
<br />
Siehe auch:<br />
* [[Bitmanipulation]]<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers<br />
<br />
== Lesen aus Registern ==<br />
<br />
Zum Lesen kann man auf Register einfach wie auf eine Variable zugreifen. In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Lesezugriff über die Funktion inp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt und inp() ist nicht mehr erforderlich.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdint.h><br />
<br />
uint8_t foo;<br />
<br />
//...<br />
<br />
int main(void)<br />
{<br />
/* kopiert den Status der Eingabepins an PortB <br />
in die Variable foo: */<br />
foo = PINB; <br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Die Abfrage der Zustände von Bits erfolgt durch Einlesen des gesamten Registerinhalts und ausblenden der Bits deren Zustand nicht von Interesse ist. Einige Beispiele zum Prüfen ob Bits gesetzt oder gelöscht sind:<br />
<br />
<syntaxhighlight lang="c"><br />
#define MEINBIT0 0 <br />
#define MEINBIT2 2<br />
<br />
uint8_t i;<br />
<br />
extern test1();<br />
<br />
// Funkion test1 aufrufen, wenn Bit 0 in Register PINA gesetzt (1) ist<br />
i = PINA; // Inhalt in Arbeitsvariable<br />
i = i & 0x01; // alle Bits bis auf Bit 0 ausblenden (bitweise und)<br />
// falls das Bit gesetzt war, hat i den Inhalt 1<br />
if ( i != 0 ) { // Ergebnis ungleich 0 (wahr)? <br />
test1(); // dann muss Bit 0 in i gesetzt sein -> Funktion aufrufen<br />
}<br />
// verkürzt:<br />
if ( ( PINA & 0x01 ) != 0 ) {<br />
test1();<br />
}<br />
// nochmals verkürzt:<br />
if ( PINA & 0x01 ) {<br />
test1();<br />
}<br />
// mit definierter Bitnummer:<br />
if ( PINA & ( 1 << MEINBIT0 ) ) {<br />
test1();<br />
}<br />
<br />
// Funktion aufrufen, wenn Bit 0 und/oder Bit 2 gesetzt ist. (Bit 0 und 2 also Wert 5) <br />
// (Bedenke: Bit 0 hat Wert 1, Bit 1 hat Wert 2 und Bit 2 hat Wert 4)<br />
if ( PINA & 0x05 ) {<br />
test1(); // Vergleich <> 0 (wahr), also mindestens eines der Bits gesetzt<br />
}<br />
// mit definierten Bitnummern:<br />
if ( PINA & ( ( 1 << MEINBIT0 ) | ( 1 << MEINBIT2 ) ) ) {<br />
test1();<br />
}<br />
<br />
// Funktion aufrufen, wenn Bit 0 und Bit 2 gesetzt sind<br />
if ( ( PINA & 0x05 ) == 0x05 ) { // nur wahr, wenn beide Bits gesetzt<br />
test1();<br />
}<br />
<br />
// Funktion test2() aufrufen, wenn Bit 0 gelöscht (0) ist<br />
i = PINA; // einlesen in temporäre Variable<br />
i = i & 0x01; // maskieren von Bit 0<br />
if ( i == 0 ) { // Vergleich ist wahr, wenn Bit 0 nicht gesetzt ist<br />
test2();<br />
}<br />
// analog mit not-Operator<br />
if ( !i ) {<br />
test2();<br />
}<br />
// nochmals verkürzt:<br />
if ( !( PINA & 0x01 ) ) {<br />
test2();<br />
}<br />
</syntaxhighlight><br />
<br />
== Warten auf einen bestimmten Zustand ==<br />
<br />
Es gibt in der Bibliothek avr-libc Funktionen, die warten, bis ein bestimmter Zustand eines Bits erreicht ist. Es ist allerdings normalerweise eine eher unschöne Programmiertechnik, da in diesen Funktionen "blockierend" gewartet wird. Der Programmablauf bleibt also an dieser Stelle stehen, bis das maskierte Ereignis erfolgt ist. Setzt man den [[Watchdog]] ein, muss man darauf achten, dass dieser auch noch getriggert wird (Zurücksetzen des Watchdogtimers). <br />
<br />
Die Funktion '''loop_until_bit_is_set''' wartet in einer Schleife, bis das definierte Bit gesetzt ist. Wenn das Bit beim Aufruf der Funktion bereits gesetzt ist, wird die Funktion sofort wieder verlassen. Das niederwertigste Bit hat die Bitnummer 0. <br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
<br />
/* Warten bis Bit Nr. 2 (das dritte Bit) in Register PINA gesetzt (1) ist */<br />
<br />
#define WARTEPIN PINA<br />
#define WARTEBIT PA2<br />
<br />
// mit der avr-libc Funktion:<br />
loop_until_bit_is_set(WARTEPIN, WARTEBIT);<br />
<br />
// dito in "C-Standard":<br />
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN<br />
// _nicht_ ungleich 0 (also 0) ist.<br />
while ( !(WARTEPIN & (1 << WARTEBIT)) ) {}<br />
...<br />
</syntaxhighlight><br />
<br />
<br />
Die Funktion '''loop_until_bit_is_clear''' wartet in einer Schleife, bis das definierte Bit gelöscht ist. Wenn das Bit beim Aufruf der Funktion bereits gelöscht ist, wird die Funktion sofort wieder verlassen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
<br />
/* Warten bis Bit Nr. 4 (das fuenfte Bit) in Register PINB geloescht (0) ist */<br />
#define WARTEPIN PINB<br />
#define WARTEBIT PB4<br />
<br />
// avr-libc-Funktion:<br />
loop_until_bit_is_clear(WARTEPIN, WARTEBIT);<br />
<br />
// dito in "C-Standard":<br />
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN<br />
// gesetzt (1) ist <br />
while ( WARTEPIN & (1<<WARTEBIT) ) {}<br />
...<br />
</syntaxhighlight><br />
<br />
Universeller und auch auf andere Plattformen besser übertragbar ist die Verwendung von C-Standardoperationen.<br />
<br />
Siehe auch: <br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers<br />
* [[Bitmanipulation]]<br />
<br />
== 16-Bit Register (ADC, ICR1, OCR1x, TCNT1, UBRR) ==<br />
<br />
Einige der Portregister in den AVR-Controllern sind 16 Bit breit. Im Datenblatt sind diese Register üblicherweise mit dem Suffix "L" (Low-Byte) und "H" (High-Byte) versehen. Die avr-libc definiert zusätzlich die meisten dieser Variablen die Bezeichnung ohne "L" oder "H". Auf diese Register kann dann direkt zugegriffen werden. Dies ist zum Beispiel der Fall für Register wie ADC oder TCNT1.<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
uint16_t foo;<br />
<br />
/* setzt die Wort-Variable foo auf den Wert der letzten AD-Wandlung */<br />
foo = ADC; <br />
</syntaxhighlight><br />
<br />
Bei anderen Registern, wie zum Beispiel Baudraten-Register, liegen High- und Low-Teil nicht direkt nebeneinander im SFR-Bereich, so dass ein 16-Bit Zugriff nicht möglich ist und der Zugriff zusammengebastelt werden muss:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
#ifndef F_CPU<br />
#define F_CPU 3686400<br />
#endif<br />
#define UART_BAUD_RATE 9600<br />
<br />
...<br />
uint16_t baud = F_CPU / (UART_BAUD_RATE * 16L) -1;<br />
<br />
UBRRH = (uint8_t) (baud >> 8);<br />
UBRRL = (uint8_t) baud;<br />
...<br />
</syntaxhighlight><br />
<br />
Bei einigen AVR-Typen wie ATmega8 oder ATmega16 teilen sich UBRRH und UCSRC die gleiche Speicher-Adresse. Damit der AVR trotzdem zwischen den beiden Registern unterscheiden kann, bestimmt das Bit7 (URSEL), welches Register tatsächlich beschrieben werden soll. ''1000 0011'' (0x83) adressiert demnach UCSRC und übergibt den Wert ''3''. Und ''0000 0011'' (0x3) adressiert UBRRH und übergibt ebenfalls den Wert ''3''. <br />
<br />
Speziell bei den 16-Bit-Timern und auch beim ADC ist es bei allen Zugriffen auf Datenregister erforderlich, dass diese Daten synchronisiert sind. Wenn z.&nbsp;B. bei einem 16-Bit-Timer das High-Byte des Zählregisters gelesen wurde und vor dem Lesezugriff auf das Low-Byte ein Überlauf des Low-Bytes stattfindet, erhält man einen völlig unsinnigen Wert. Auch die Compare-Register müssen synchron geschrieben werden, da es ansonsten zu unerwünschten Compare-Ereignissen kommen kann. <br />
<br />
Beim ADC besteht das Problem darin, dass zwischen den Zugriffen auf die beiden Teilregister eine Wandlung beendet werden kann und der ADC ein neues Ergebnis in ADCL und ADCH schreiben will, wodurch High- und Low-Byte nicht zusammenpassen.<br />
<br />
Um diese Datenmüllproduktion zu verhindern, gibt es in beiden Fällen eine Synchronisation, die jeweils durch den Zugriff auf das Low-Byte ausgelöst wird:<br />
* Bei den Timer-Registern (das gilt für alle TCNT-, OCR- und ICR-Register bei den 16-Bit-Timern) wird bei einem ''Lesezugriff'' auf das Low-Byte automatisch das High-Byte in ein temporäres Register, das ansonsten nach außen nicht sichtbar ist, geschoben. Greift man nun ''anschließend'' auf das High-Byte zu, dann wird eben dieses temporäre Register gelesen.<br />
* Bei einem ''Schreibzugriff'' auf eines der genannten Register wird das High-Byte in besagtem temporären Register zwischengespeichert und erst beim Schreiben des Low-Bytes werden ''beide'' gleichzeitig in das eigentliche Register übernommen.<br />
<br />
Das bedeutet für die Reihenfolge:<br />
* Lesezugriff: Erst Low-Byte, dann High-Byte<br />
* Schreibzugriff: Erst High-Byte, dann Low-Byte<br />
<br />
Des weiteren ist zu beachten, dass es für all diese 16-Bit-Register nur ein einziges temporäres Register gibt, so dass das Auftreten eines Interrupts, in dessen Handler ein solches Register manipuliert wird, bei einem durch ihn unterbrochenen Zugriff i.d.R. zu Datenmüll führt. 16-Bit-Zugriffe sind generell nicht atomar! Wenn mit Interrupts gearbeitet wird, kann es erforderlich sein, vor einem solchen Zugriff auf ein 16-Bit-Register die Interrupt-Bearbeitung zu deaktivieren.<br />
<br />
Beim ADC-Datenregister ADCH/ADCL ist die Synchronisierung anders gelöst. Hier wird beim Lesezugriff (ADCH/ADCL sind logischerweise read-only) auf das Low-Byte ADCL beide Teilregister für Zugriffe seitens des ADC so lange gesperrt, bis das High-Byte ADCH ausgelesen wurde. Dadurch kann der ADC nach einem Zugriff auf ADCL keinen neuen Wert in ADCH/ADCL ablegen, bis ADCH gelesen wurde. Ergebnisse von Wandlungen, die zwischen einem Zugriff auf ADCL und ADCH beendet werden, gehen verloren!<br />
<br />
Nach einem Zugriff auf ADCL muss grundsätzlich ADCH gelesen werden!<br />
<br />
In beiden Fällen – also sowohl bei den Timern als auch beim ADC – werden vom C-Compiler 16-Bit Pseudo-Register zur Verfügung gestellt (z.&nbsp;B. TCNT1H/TCNT1L → TCNT1, ADCH/ADCL → ADC bzw. ADCW), bei deren Verwendung der Compiler automatisch die richtige Zugriffsreihenfolge regelt. In C-Programmen sollten grundsätzlich diese 16-Bit-Register verwendet werden! Sollte trotzdem ein Zugriff auf ein Teilregister erforderlich sein, sind obige Angaben zu berücksichtigen.<br />
<br />
Es ist darauf zu achten, dass auch ein Zugriff auf die 16-Bit-Register vom Compiler in zwei 8-Bit-Zugriffe aufgeteilt wird und dementsprechend genauso nicht-atomar ist wie die Einzelzugriffe. Auch hier gilt, dass u.U. die Interrupt-Bearbeitung gesperrt werden muss, um Datenmüll zu vermeiden.<br />
<br />
Beim ADC gibt es für den Fall, dass eine Auflösung von 8 Bit ausreicht, die Möglichkeit, das Ergebnis "linksbündig" in ADCH/ADCL auszurichten, so dass die relevanten 8 MSB in ADCH stehen. In diesem Fall muss bzw. sollte nur ADCH ausgelesen werden.<br />
<br />
ADC und ADCW sind unterschiedliche Bezeichner für das selbe Registerpaar. Üblicherweise kann man in C-Programmen ADC verwenden, was analog zu den anderen 16-Bit-Registern benannt ist. ADCW (ADC Word) existiert nur deshalb, weil die Headerdateien auch für Assembler vorgesehen sind und es bereits einen Assembler-Befehl namens ''adc'' gibt. <br />
<br />
Im Umgang mit 16-Bit Registern siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Related Pages/Frequently Asked Questions/Nr. 8<br />
* Datenblatt Abschnitt ''Accessing 16-bit Registers''<br />
<br />
== IO-Register als Parameter und Variablen ==<br />
<br />
Um Register als Parameter für eigene Funktionen übergeben zu können, muss man sie als einen volatile uint8_t Pointer übergeben. Zum Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
uint8_t key_pressed (volatile uint8_t *inputreg, uint8_t inputbit)<br />
{<br />
static uint8_t last_state = 0;<br />
<br />
if (last_state == (*inputreg & (1<<inputbit)))<br />
return 0; /* keine Änderung */<br />
<br />
/* Wenn doch, warten bis etwaiges Prellen vorbei ist: */<br />
_delay_ms(20);<br />
<br />
/* Zustand für nächsten Aufruf merken: */<br />
last_state = *inputreg & (1<<inputbit);<br />
<br />
/* und den entprellten Tastendruck zurückgeben: */<br />
return *inputreg & (1<<inputbit);<br />
}<br />
<br />
/* Beispiel für einen Funktionsaufruf: */<br />
<br />
void foo (void)<br />
{<br />
uint8_t i = key_pressed (&PINB, PB1);<br />
}<br />
</syntaxhighlight><br />
<br />
Ein Aufruf der Funktion mit call by value würde Folgendes bewirken: Beim Funktionseintritt wird nur eine Kopie des momentanen Portzustandes angefertigt, die sich unabhängig vom tatsächlichen Zustand das Ports nicht mehr ändert, womit die Funktion wirkungslos wäre. Die Übergabe eines Zeigers wäre die Lösung, wenn der Compiler nicht optimieren würde. Denn dadurch wird im Programm nicht von der Hardware gelesen, sondern wieder nur von einem Abbild im Speicher. Das Ergebnis wäre das gleiche wie oben. Mit dem Schlüsselwort volatile sagt man nun dem Compiler, dass die entsprechende Variable entweder durch andere Softwareroutinen (Interrupts) oder durch die Hardware verändert werden kann.<br />
<br />
Siehe auch: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass avr-libc FAQ: "How do I pass an IO port as a parameter to a function?"]<br />
<br />
= Zugriff auf IO-Ports =<br />
<br />
Jeder AVR implementiert eine unterschiedliche Menge an GPIO-Registern<br />
(GPIO - General Purpose Input/Output). Diese Register dienen dazu:<br />
* einzustellen welche der Anschlüsse ("Beinchen") des Controllers als Ein- oder Ausgänge dienen<br />
* bei Ausgängen deren Zustand festzulegen<br />
* bei Eingängen deren Zustand zu erfassen<br />
<br />
Mittels GPIO werden digitale Zustände gesetzt und erfasst, d.h. die Spannung an einem Ausgang wird ein- oder ausgeschaltet und an einem Eingang wird erfasst, ob die anliegende Spannung über oder unter einem bestimmten Schwellwert liegt. Im Datenblatt Abschnitt Electrical Characteristics/DC Characteristics finden sich die Spannungswerte (V_OL, V_OH für Ausgänge, V_IL, V_IH für Eingänge).<br />
<br />
Die Verarbeitung von analogen Eingangswerten und die Ausgabe von Analogwerten wird in Kapitel [[AVR-GCC-Tutorial#Analoge_Ein-_und_Ausgabe|Analoge Ein- und Ausgabe]] behandelt.<br />
<br />
Die physischen Ein- und Ausgänge werden bei AVR-Controllern zu logischen Ports gruppiert.<br />
<br />
Alle Ports werden über Register gesteuert. Dazu sind jedem Port 3 Register zugeordnet:<br />
<br />
{| class="wikitable"<br />
|- <br />
! width="10%"| DDRx<br />
| Datenrichtungsregister für Port'''x'''. <br />
'''x''' entspricht '''A''', '''B''', ''' C''' usw. je nach gewünschtem Port. Bit im Register gesetzt (1) für Ausgang, Bit gelöscht (0) für Eingang.<br />
|- <br />
! PINx<br />
| Eingangsadresse für Port'''x'''. <br />
Zustand des Ports. Die Bits in PINx entsprechen dem Zustand der als Eingang definierten Portpins. Bit 1 wenn Pin "high", Bit 0 wenn Portpin low.<br />
|-<br />
! PORTx<br />
| Datenregister für Port'''x'''. <br />
Dieses Register wird verwendet, um die Ausgänge eines Ports anzusteuern. Bei Pins, die mittels DDRx auf Eingang geschaltet wurden, können über PORTx<br />
die internen Pull-Up Widerstände aktiviert oder deaktiviert werden (1 = aktiv).<br />
|}<br />
<br />
Die folgenden Beispiele gehen von einem AVR aus, der sowohl Port A als auch Port B besitzt. Sie müssen für andere AVRs (zum Beispiel ATmega8/48/88/168) entsprechend angepasst werden.<br />
<br />
== Datenrichtung bestimmen ==<br />
<br />
Zuerst muss die Datenrichtung der verwendeten Pins bestimmt werden. Um dies zu erreichen, wird das Datenrichtungsregister des entsprechenden Ports beschrieben.<br />
<br />
Für jeden Pin, der als Ausgang verwendet werden soll, muss dabei das<br />
entsprechende Bit auf dem Port gesetzt werden. Soll der Pin als Eingang<br />
verwendet werden, muss das entsprechende Bit gelöscht sein.<br />
<br />
Beispiel:<br />
Angenommen am Port B sollen die Pins 0 bis 4 als Ausgänge definiert werden, die noch verbleibenden Pins 5 bis 7 sollen als Eingänge fungieren. Dazu ist es daher notwendig, im für das Port B zuständigen Datenrichtungsregister DDRB folgende Bitkonfiguration einzutragen<br />
<br />
+---+---+---+---+---+---+---+---+<br />
| 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |<br />
+---+---+---+---+---+---+---+---+<br />
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |<br />
<br />
In C liest sich das dann so:<br />
<br />
<syntaxhighlight lang="c"><br />
// in io.h wird u.a. DDRB definiert:<br />
#include <avr/io.h><br />
<br />
int main()<br />
{<br />
// Setzen der Bits 0,1,2,3 und 4<br />
// Binaer 00011111 = Hexadezimal 1F<br />
// direkte Zuweisung - standardkonform */<br />
DDRB = 0x1F; /* <br />
<br />
// Uebersichtliche Alternative - Binaerschreibweise, aber kein ISO-C<br />
DDRB = 0b00011111;<br />
<br />
// Ausfuehrliche Schreibweise: identische Funktionalitaet, mehr Tipparbeit<br />
// aber uebersichtlicher und selbsterklaerend:<br />
DDRB |= (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4); <br />
</syntaxhighlight><br />
<br />
Die Pins 5 bis 7 werden (da 0) als Eingänge geschaltet. Weitere Beispiele:<br />
<br />
<syntaxhighlight lang="c"><br />
// Alle Pins des Ports B als Ausgang definieren:<br />
DDRB = 0xff; <br />
// Pin0 wieder auf Eingang und andere im urspruenglichen Zustand belassen:<br />
DDRB &= ~(1 << DDB0);<br />
// Pin 3 und 4 auf Eingang und andere im urspruenglichen Zustand belassen:<br />
DDRB &= ~((1 << DDB3) | (1 << DDB4));<br />
// Pin 0 und 3 wieder auf Ausgang und andere im ursprünglichen Zustand belassen:<br />
DDRB |= (1 << DDB0) | (1 << DDB3);<br />
// Alle Pins auf Eingang:<br />
DDRB = 0x00;<br />
</syntaxhighlight><br />
<br />
== Vordefinierte Bitnummern für I/O-Register ==<br />
<br />
Die Bitnummern (z.&nbsp;B. PCx, PINCx und DDCx für den Port C) sind in den io*.h-Dateien der avr-libc definiert und dienen lediglich der besseren Lesbarkeit. Man muss diese Definitionen nicht verwenden oder kann auch einfach "immer" PAx, PBx, PCx usw. nutzen, auch wenn der Zugriff auf Bits in DDRx- oder PINx-Registern erfolgt. Für den Compiler sind die Ausdrücke (1<<PC7), (1<<DDC7) und (1<<PINC7) identisch zu (1<<7) (genauer: der Präprozessor ersetzt die Ausdrücke (1<<PC7),... zu (1<<7)). Ein Ausschnitt der Definitionen für Port C eines ATmega32 aus der iom32.h-Datei zur Verdeutlichung (analog für die weiteren Ports):<br />
<br />
<syntaxhighlight lang="c"><br />
...<br />
/* PORTC */<br />
#define PC7 7<br />
#define PC6 6<br />
#define PC5 5<br />
#define PC4 4<br />
#define PC3 3<br />
#define PC2 2<br />
#define PC1 1<br />
#define PC0 0<br />
<br />
/* DDRC */<br />
#define DDC7 7<br />
#define DDC6 6<br />
#define DDC5 5<br />
#define DDC4 4<br />
#define DDC3 3<br />
#define DDC2 2<br />
#define DDC1 1<br />
#define DDC0 0<br />
<br />
/* PINC */<br />
#define PINC7 7<br />
#define PINC6 6<br />
#define PINC5 5<br />
#define PINC4 4<br />
#define PINC3 3<br />
#define PINC2 2<br />
#define PINC1 1<br />
#define PINC0 0<br />
</syntaxhighlight><br />
<br />
<br />
== Digitale Signale ==<br />
<br />
Am einfachsten ist es, digitale Signale mit dem Mikrocontroller zu erfassen bzw. auszugeben.<br />
<br />
== Ausgänge ==<br />
Will man als Ausgang definierte Pins (entsprechende DDRx-Bits = 1) auf Logisch 1 setzen, setzt man die entsprechenden Bits im Portregister.<br />
<br />
Mit dem Befehl<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB = 0x04; /* besser PORTB=(1<<PB2) */<br />
<br />
// Uebersichtliche Alternative - Binaerschreibweise<br />
PORTB = 0b00000100; /* direkte Zuweisung - uebersichtlich */<br />
<br />
</syntaxhighlight><br />
wird also der Ausgang an Pin PB2 gesetzt (Beachte, dass die Bits immer ''von 0 an'' gezählt werden, das niederwertigste Bit ist also Bitnummer 0 und nicht etwa Bitnummer 1).<br />
<br />
Man beachte, dass bei der Zuweisung mittels '''=''' immer alle Pins gleichzeitig angegeben werden. Man sollte also, wenn nur bestimmte Ausgänge geschaltet werden sollen, zuerst den aktuellen Wert des Ports einlesen und das Bit des gewünschten Ports in diesen Wert einfließen lassen. Will man also nur den dritten Pin (Bit Nr. 2) an Port B auf "high" setzen und den Status der anderen Ausgänge unverändert lassen, nutze man diese Form:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB = PORTB | 0x04; /* besser: PORTB = PORTB | ( 1<<PB2 ) */<br />
/* vereinfacht durch Nutzung des |= Operators : */<br />
PORTB |= (1<<PB2);<br />
<br />
/* auch mehrere "gleichzeitig": */<br />
PORTB |= (1<<PB4) | (1<<PB5); /* Pins PB4 und PB5 "high" */<br />
</syntaxhighlight><br />
<br />
"Ausschalten", also Ausgänge auf "low" setzen, erfolgt analog:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB &= ~(1<<PB2); /* loescht Bit 2 in PORTB und setzt damit Pin PB2 auf low */ <br />
PORTB &= ~( (1<<PB4) | (1<<PB5) ); /* Pin PB4 und Pin PB5 "low" */<br />
</syntaxhighlight><br />
Siehe auch [[Bitmanipulation]]<br />
<br />
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind in aktuellen Versionen der avr-libc nicht mehr enthalten und auch nicht mehr erforderlich.<br />
<br />
''Falls der Anfangszustand von Ausgängen kritisch ist, muss die Reihenfolge beachtet werden, mit der die Datenrichtung (DDRx) eingestellt und der Ausgabewert (PORTx) gesetzt wird:''<br />
<br />
Für Ausgangspins, die mit Anfangswert "high" initialisiert werden sollen:<br />
* zuerst die Bits im PORTx-Register setzen<br />
* anschließend die Datenrichtung auf Ausgang stellen<br />
<br />
Daraus ergibt sich die Abfolge für einen Pin, der bisher als Eingang mit abgeschaltetem Pull-Up konfiguriert war:<br />
* setze PORTx: interner Pull-Up aktiv<br />
* setze DDRx: Ausgang ("high")<br />
<br />
Bei der Reihenfolge erst DDRx und dann PORTx kann es zu einem kurzen "low-Puls" kommen, der auch externe Pull-Up-Widerstände "überstimmt". Die (ungünstige) Abfolge: Eingang -> setze DDRx: Ausgang (auf "low", da PORTx nach Reset 0) -> setze PORTx: Ausgang auf high. Vergleiche dazu auch das Datenblatt Abschnitt ''Configuring the Pin''.<br />
<br />
== Eingänge (Wie kommen Signale in den &micro;C) ==<br />
<br />
Die digitalen Eingangssignale können auf verschiedene Arten zu unserer Logik gelangen.<br />
<br />
=== Signalkopplung ===<br />
<br />
Am einfachsten ist es, wenn die Signale direkt aus einer anderen digitalen Schaltung übernommen werden können. Hat der Ausgang der entsprechenden Schaltung TTL-Pegel dann können wir sogar direkt den Ausgang der Schaltung mit einem Eingangspin von unserem Controller verbinden.<br />
<br />
Hat der Ausgang der anderen Schaltung keinen TTL-Pegel so müssen wir den Pegel über entsprechende Hardware (z.&nbsp;B. Optokoppler, [[Widerstand#Spannungsteiler|Spannungsteiler]], "Levelshifter" aka [[Pegelwandler]]) anpassen.<br />
<br />
Die Masse der beiden Schaltungen muss selbstverständlich miteinander verbunden werden. Der Software selber ist es natürlich letztendlich egal, wie das Signal eingespeist wird. Wir können ja ohnehin lediglich prüfen, ob an einem Pin unseres Controllers eine logische 1 (Spannung größer ca. 0,7*Vcc) oder eine logische 0 (Spannung kleiner ca. 0,2*Vcc) anliegt. Detaillierte Informationen darüber, ab welcher Spannung ein Eingang als 0 ("low") bzw. 1 ("high") erkannt wird, liefert die Tabelle DC Characteristics im Datenblatt des genutzten Controllers.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|+ '''Spannungstabelle''' <br /> <small>(ca. Grenzwerte)</small><br />
|<br />
! Low || High<br />
|-<br />
! bei 5 V<br />
| 1 V || 3,5 V<br />
|-<br />
! bei 3,3 V<br />
| 0,66 V || 2,31 V<br />
|-<br />
! bei 1,8 V<br />
| 0,36 V || 1,26 V<br />
|}<br />
<br />
<br />
Die Abfrage der Zustände der Portpins erfolgt direkt über den Registernamen.<br />
<br />
{{Warnung|Dabei ist wichtig, zur Abfrage der Eingänge ''nicht'' etwa Portregister '''PORTx''' zu verwenden, sondern Eingangsregister '''PINx'''. Ansonsten liest man nicht den Zustand der Eingänge, sondern den Status der internen Pull-Up-Widerstände. Die Abfrage der Pinzustände über PORTx statt PINx ist ein häufiger Fehler beim AVR-"Erstkontakt".}}<br />
<br />
Will man also die aktuellen Signalzustände von Port D abfragen und in eine Variable namens bPortD abspeichern, schreibt man folgende Befehlszeilen:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdint.h><br />
...<br />
uint8_t bPortD;<br />
...<br />
bPortD = PIND;<br />
...<br />
</syntaxhighlight><br />
<br />
Mit den C-Bitoperationen kann man den Status der Bits abfragen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */<br />
if ( PINC & (1<<PINC1) ) {<br />
/* Aktion */<br />
}<br />
<br />
/* Fuehre Aktion aus, wenn Bit Nr. 2 (das "dritte" Bit) in PINB geloescht (0) ist */<br />
if ( !(PINB & (1<<PINB2)) ) {<br />
/* Aktion */<br />
}<br />
...<br />
</syntaxhighlight><br />
Siehe auch [[Bitmanipulation#Bits_prüfen]]<br />
<br />
=== Interne Pull-Up Widerstände ===<br />
<br />
Portpins für Ein- und Ausgänge (GPIO) eines AVR verfügen über zuschaltbare interne Pull-Up Widerstände (nominal mehrere 10kOhm, z.&nbsp;B. ATmega16 20-50kOhm). Diese können in vielen Fällen statt externer Widerstände genutzt werden.<br />
<br />
Die internen Pull-Up Widerstände von Vcc zu den einzelnen Portpins werden über das Register ''' PORTx''' aktiviert bzw. deaktiviert, wenn ein Pin als ''' Eingang''' geschaltet ist.<br />
<br />
Wird der Wert des entsprechenden Portpins auf 1 gesetzt, so ist der Pull-Up Widerstand aktiviert. Bei einem Wert von 0 ist der Pull-Up Widerstand nicht aktiv. Man sollte jeweils entweder den internen oder einen externen Pull-Up Widerstand verwenden, aber nicht beide zusammen.<br />
<br />
Im Beispiel werden alle Pins des Ports D als Eingänge geschaltet und alle Pull-Up Widerstände aktiviert. Weiterhin wird Pin PC7 als Eingang geschaltet und dessen interner Pull-Up Widerstand aktiviert, ohne die Einstellungen für die anderen Portpins (PC0-PC6) zu verändern.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
DDRD = 0x00; /* alle Pins von Port D als Eingang */<br />
PORTD = 0xff; /* interne Pull-Ups an allen Port-Pins aktivieren */<br />
...<br />
DDRC &= ~(1<<PC7); /* Pin PC7 als Eingang */<br />
PORTC |= (1<<PC7); /* internen Pull-Up an PC7 aktivieren */<br />
</syntaxhighlight><br />
<br />
=== Taster und Schalter ===<br />
<br />
Der Anschluss mechanischer Kontakte an den Mikrocontroller, ist zwischen zwei unterschiedliche Methoden zu unterscheiden: ''Active Low'' und ''Active High''.<br />
<br />
<gallery widths="300" heights="300" caption="Anschluss mechanischer Kontakte an einen µC"><br />
Image:Active Low.gif|'''Active Low:''' Bei dieser Methode wird der Kontakt zwischen den Eingangspin des Controllers und Masse geschaltet. Damit bei offenem Schalter der Controller kein undefiniertes Signal bekommt, wird zwischen die Versorgungsspannung und den Eingangspin ein sogenannter '''Pull-Up''' Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffnetem Schalter auf logisch 1 zu ziehen.<br />
Image:Active High.gif|'''Active High:''' Hier wird der Kontakt zwischen die Versorgungsspannung und den Eingangspin geschaltet. Damit bei offener Schalterstellung kein undefiniertes Signal am Controller ansteht, wird zwischen den Eingangspin und die Masse ein '''Pull-Down''' Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffneter Schalterstellung auf logisch 0 zu halten. <br />
</gallery><br />
<br />
Der Widerstandswert von Pull-Up- und Pull-Down-Widerständen ist an sich nicht kritisch. Wird er allerdings zu hoch gewählt, ist die Wirkung eventuell nicht gegeben. Als üblicher Wert haben sich 10 kOhm eingebürgert. Die AVRs verfügen an den meisten Pins über zuschaltbare interne Pull-Up Widerstände (vgl. Abschnitt [[AVR-GCC-Tutorial#Interne Pull-Up Widerstände|Interne Pull-Up Widerstände]]), welche insbesondere wie hier bei Tastern und ähnlichen Bauteilen (z.&nbsp;B. Drehgebern) statt externer Bauteile verwendet werden können. Interne Pull-Down-Widerstand sind nicht verfügbar und müssen daher in Form zusätzlicher Bauteile in die Schaltung eingefügt werden.<br />
<br />
==== Taster entprellen ====<br />
<br />
Siehe: ''[[Entprellung#Warteschleifen-Verfahren|Entprellung: Warteschleifen-Verfahren]]<br />
<br />
= Warteschleifen (delay.h) =<br />
<br />
Der Programmablauf kann verschiedene Arten von Wartefunktionen erfordern:<br />
<br />
* Warten im Sinn von Zeitvertrödeln<br />
* Warten auf einen bestimmten Zustand an den I/O-Pins<br />
* Warten auf einen bestimmten Zeitpunkt (siehe Timer)<br />
* Warten auf einen bestimmten Zählerstand (siehe Counter)<br />
<br />
Der einfachste Fall, das Zeitvertrödeln, kann in vielen Fällen und mit großer Genauigkeit anhand der avr-libc Bibliotheksfunktionen _delay_ms() und _delay_us() erledigt werden. Die Bibliotheksfunktionen sind einfachen Zählschleifen (Warteschleifen) vorzuziehen, da leere Zählschleifen ohne besondere Vorkehrungen sonst bei eingeschalteter Optimierung vom avr-gcc-Compiler wegoptimiert werden. Weiterhin sind die Bibliotheksfunktionen bereits darauf vorbereitet, die in F_CPU definierte Taktfrequenz zu verwenden. Außerdem sind die Funktionen der Bibliothek wirklich getestet.<br />
<br />
Einfach!? Schon, aber während gewartet wird, macht der µC nichts anderes mehr (abgesehen von möglicherweise auftretenden Interrupts, falls welche aktiviert sind). Die Wartefunktion blockiert den Programmablauf. Möchte man einerseits warten, um z.&nbsp;B. eine LED blinken zu lassen und gleichzeitig andere Aktionen ausführen z.&nbsp;B. weitere LED bedienen, sollten die Timer/Counter des AVR verwendet werden, siehe Artikel [[Multitasking]].<br />
<br />
Die Bibliotheksfunktionen funktionieren allerdings nur dann korrekt, wenn sie mit zur Übersetzungszeit (beim Compilieren) bekannten konstanten Werten aufgerufen werden. Der Quellcode muss mit eingeschalteter Optimierung übersetzt werden, sonst wird sehr viel Maschinencode erzeugt, und die Wartezeiten stimmen nicht mehr mit dem Parameter überein.<br />
<br />
Eine weitere Einschränkung liegt darin, daß sie möglicherweise länger warten, als erwartet, nämlich in dem Fall, daß Interrupts auftreten und die _delay...()-Funktion unterbrechen. Genau genommen warten diese nämlich nicht eine bestimmte Zeit, sondern verbrauchen eine bestimmte Anzahl von Prozessortakten. Die wiederum ist so bemessen, daß ohne Unterbrechung durch Interrupts die gewünschte Wartezeit erreicht wird.<br />
Wird das Warten aber durch eine oder mehrere ISR unterbrochen, die zusammen 1% Prozessorzeit verbrauchen, dann dauert das Warten etwa 1% länger. Bei 50% Last durch die ISR dauert das Warten doppelt solange wie gewünscht, bei 90% zehnmal solange...<br />
<br />
Abhängig von der Version der Bibliothek verhalten sich die Bibliotheksfunktionen etwas unterschiedlich.<br />
<br />
== avr-libc Versionen bis 1.6 ==<br />
<br />
Die Wartezeit der Funktion _delay_ms() ist auf 262,14ms/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 13,1ms warten. Die Wartezeit der Funktion _delay_us() ist auf 768us/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 38,4µs warten. Längere Wartezeiten müssen dann über einen mehrfachen Aufruf in einer Schleife gelöst werden.<br />
<br />
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#ifndef F_CPU<br />
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert <br />
(z.&nbsp;B. durch Übergabe als Parameter zum Compiler innerhalb <br />
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die<br />
"nachträgliche" Definition hinweist */<br />
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"<br />
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */<br />
#endif<br />
#include <util/delay.h> /* in älteren avr-libc Versionen <avr/delay.h> */ <br />
<br />
/*<br />
lange, variable Verzögerungszeit, Einheit in Millisekunden<br />
<br />
Die maximale Zeit pro Funktionsaufruf ist begrenzt auf <br />
262.14 ms / F_CPU in MHz (im Beispiel: <br />
262.1 / 3.6864 = max. 71 ms) <br />
<br />
Daher wird die kleine Warteschleife mehrfach aufgerufen,<br />
um auf eine längere Wartezeit zu kommen. Die zusätzliche <br />
Prüfung der Schleifenbedingung lässt die Wartezeit geringfügig<br />
ungenau werden (macht hier vielleicht 2-3ms aus).<br />
*/<br />
<br />
void long_delay(uint16_t ms)<br />
{<br />
for(; ms>0; ms--) _delay_ms(1);<br />
}<br />
<br />
int main( void )<br />
{<br />
DDRB = ( 1 << PB0 ); // PB0 an PORTB als Ausgang setzen<br />
<br />
while( 1 ) // Endlosschleife<br />
{ <br />
PORTB ^= ( 1 << PB0 ); // Toggle PB0 z.&nbsp;B. angeschlossene LED<br />
long_delay(1000); // Eine Sekunde warten...<br />
}<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
== avr-libc Versionen ab 1.7 ==<br />
<br />
_delay_ms() kann mit einem Argument bis 6553,5 ms (= 6,5535 Sekunden) benutzt werden. Es ist nicht möglich, eine Variable als Argument zu übergeben. Wird die früher gültige Grenze von 262,14 ms/F_CPU (in MHz) überschritten, so arbeitet _delay_ms() einfach etwas ungenauer und zählt nur noch mit einer Auflösung von 1/10 ms. Eine Verzögerung von 1000,10 ms ließe sich nicht mehr von einer von 1000,19 ms unterscheiden. Ein Verlust, der sich im Allgemeinen verschmerzen lässt. Dem Programmierer wird keine Rückmeldung gegeben, dass die Funktion ggf. gröber arbeitet, d.h. wenn es darauf ankommt, bitte den Parameter wie bisher geschickt wählen.<br />
<br />
Die Funktion _delay_us() wurde ebenfalls erweitert. Wenn deren maximal als genau behandelbares Argument überschritten wird, benutzt diese intern _delay_ms(). Damit gelten in diesem Fall die _delay_ms() Einschränkungen.<br />
<br />
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus, avr-libc ab Version 1.6<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#ifndef F_CPU<br />
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert <br />
(z.B. durch Übergabe als Parameter zum Compiler innerhalb <br />
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die<br />
"nachträgliche" Definition hinweist */<br />
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"<br />
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */<br />
#endif<br />
#include <util/delay.h><br />
<br />
int main( void )<br />
{<br />
DDRB = ( 1 << PB0 ); // PB0 an PORTB als Ausgang setzen<br />
<br />
while( 1 ) { // Endlosschleife<br />
PORTB ^= ( 1 << PB0 ); // Toggle PB0 z.B. angeschlossene LED<br />
_delay_ms(1000); // Eine Sekunde +/-1/10000 Sekunde warten...<br />
// funktioniert nicht mit Bibliotheken vor 1.6<br />
<br />
}<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
Die _delay_ms() und die _delay_us aus '''avr-libc 1.7.0''' sind fehlerhaft. _delay_ms () läuft 4x schneller als erwartet. Abhilfe ist eine korrigierte Includedatei: [http://www.mikrocontroller.net/topic/196738#1943039]<br />
<br />
= Programmieren mit Interrupts =<br />
<br />
<div style="float:right; margin:2em;"><br />
[[Image:Interrupt Programme.gif]]<br />
</div><br />
Nachdem wir nun alles Wissenswerte für die serielle Programmerstellung<br />
gelernt haben nehmen wir jetzt ein völlig anderes Thema in Angriff, nämlich<br />
die Programmierung unter Zuhilfenahme der Interrupts des AVR.<br />
<br />
Tritt ein Interrupt auf, unterbricht (engl. interrupts) der Controller die Verarbeitung des Hauptprogramms und verzweigt zu einer Interruptroutine. Das Hauptprogramm wird also beim Eintreffen eines Interrupts unterbrochen, die Interruptroutine ausgeführt und danach erst wieder das Hauptprogramm an der Unterbrechungsstelle fortgesetzt (vgl. die Abbildung).<br />
<br />
Um Interrupts verarbeiten zu können, ist folgendes zu beachten:<br />
<br />
* Für jede aktivierte Interruptquelle ist eine Funktion zu programmieren, in der die beim Auftreten des jeweiligen Interrupts erforderlichen Verarbeitungsschritte enthalten sind. Für diese Funktion existieren verschiedene Bezeichnungen. Üblich sind die englischen Begriffe Interrupt-Handler oder Interrupt-Service-Routinen (ISR), man findet aber auch die Bezeichnungen Interruptverarbeitungs- oder -behandlungsroutine oder auch kurz Interruptroutine. Zum Beispiel wird üblicherweise in der ISR zur Verarbeitung des Empfangsinterrupts eines UARTs (UART-RX Interrupt) das empfangene Zeichen in einen Zwischenspeicher (FIFO-Buffer) kopiert, dessen Inhalt später von anderen Programmteilen geleert wird. Sofern der Zwischenspeicher ausreichend groß ist, geht also kein Zeichen verloren, auch wenn im Hauptprogramm zeitintensive Operationen durchgeführt werden.<br />
* Die benötigten Interrupts sind in den jeweiligen Funktionsbausteinen einzuschalten. Dies erfolgt über das jeweilige Aktivierungsbit (Interrupt Enable) in einem der Hardwareregister (z.B. RX(Complete)Interrupt Enable eines UARTs)<br />
* Sämtliche Interrupts werden über einen weiteren globalen Schalter aktiviert und deaktiviert. Zur Verarbeitung der Interrupts ist dieser Schalter zu aktivieren (sei(), siehe unten).<br />
<br />
Alle Punkte sind zu beachten. Fehlt z.B. die globale Aktivierung, werden Interruptroutinen auch dann nicht aufgerufen, wenn sie im Funktionsbaustein eingeschaltet sind und eine Behandlungsroutine verhanden ist.<br />
<br />
Siehe auch<br />
<br />
* [http://www.mikrocontroller.net/forum/read-1-235092.html#new Ausführlicher Thread im Forum]<br />
* Artikel [[Interrupt]]<br />
* Artikel [[Multitasking]]<br />
{{Clear}}<br />
<br />
== Anforderungen an Interrupt-Routinen ==<br />
<br />
Um unliebsamen Überraschungen vorzubeugen, sollten einige Grundregeln bei der Implementierung der Interruptroutinen beachtet werden. Interruptroutinen sollten möglichst kurz und schnell abarbeitbar sein, daraus folgt:<br />
<br />
* Keine umfangreichen Berechnungen innerhalb der Interruptroutine. (*)<br />
* Keine langen Programmschleifen.<br />
* Obwohl es möglich ist, während der Abarbeitung einer Interruptroutine andere oder sogar den gleichen Interrupt wieder zuzulassen, wird davon ohne genaue Kenntnis der internen Abläufe dringend abgeraten.<br />
<br />
Interruptroutinen (ISRs) sollten also möglichst kurz sein und keine Schleifen mit vielen Durchläufen enthalten. Längere Operationen können meist in einen "Interrupt-Teil" in einer ISR und einen "Arbeitsteil" im Hauptprogramm aufgetrennt werden. Z.B. Speichern des Zustands aller Eingänge im EEPROM in bestimmten Zeitabständen: ISR-Teil: Zeitvergleich (Timer,RTC) mit Logzeit/-intervall. Bei Übereinstimmung ein globales Flag setzen (volatile bei Flag-Deklaration nicht vergessen, s.u.). Dann im Hauptprogramm prüfen, ob das Flag gesetzt ist. Wenn ja: die Daten im EEPROM ablegen und Flag löschen.<br />
<br />
(*)<br />
Hinweis: <br />
Es gibt allerdings die seltene Situation, dass man gerade eingelesene<br />
ADC-Werte sofort verarbeiten muss. Besonders dann, wenn man mehrere Werte sehr<br />
schnell hintereinander bekommt. Dann bleibt einem nichts anderes übrig, als die<br />
Werte noch in der ISR zu verarbeiten. Kommt aber sehr selten vor und sollte<br />
durch geeignete Wahl des Systemtaktes bzw. Auswahl des Controllers vermieden werden!<br />
<br />
== Interrupt-Quellen ==<br />
<br />
Die folgenden Ereignisse können einen Interrupt auf einem AVR AT90S2313 auslösen, wobei die Reihenfolge der Auflistung auch die Priorität der Interrupts aufzeigt.<br />
<br />
* Reset<br />
* Externer Interrupt 0<br />
* Externer Interrupt 1<br />
* Timer/Counter 1 Capture Ereignis<br />
* Timer/Counter 1 Compare Match<br />
* Timer/Counter 1 Überlauf<br />
* Timer/Counter 0 Überlauf<br />
* UART Zeichen empfangen<br />
* UART Datenregister leer<br />
* UART Zeichen gesendet<br />
* Analoger Komparator<br />
<br />
Die Anzahl der möglichen Interruptquellen variiert zwischen den verschiedenen Microcontroller-Typen. Im Zweifel hilft ein Blick ins Datenblatt ("Interrupt Vectors").<br />
<br />
== Register ==<br />
<br />
Der AT90S2313 verfügt über 2 Register die mit den<br />
Interrupts zusammenhängen.<br />
<br />
{| class="wikitable"<br />
|- <br />
| '''GIMSK'''<br />
| '''G'''eneral '''I'''nterrupt '''M'''a'''sk''' Register.<br /><br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit <br />
| 7 || 6|| 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''INT1''' || '''INT0''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-'''<br />
|- <br />
! R/W<br />
| R/W || R/W || R || R || R || R || R || R<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''INT1''' (External '''Int'''errupt Request '''1''' Enable)<br />
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am '''INT1'''-Pin eine steigende oder fallende (je nach Konfiguration im '''MCUCR''') Flanke erkannt wird.<br />
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.<br />
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.<br />
<br />
'''INT0''' (External '''Int'''errupt Request '''0''' Enable)<br />
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am '''INT0'''-Pin eine steigende oder fallende (je nach Konfiguration im '''MCUCR''') Flanke erkannt wird.<br />
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.<br />
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.<br />
<br />
|- <br />
| '''GIFR'''<br />
| '''G'''eneral '''I'''nterrupt '''F'''lag '''R'''egister.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''INTF1''' || '''INTF0''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-'''<br />
|- <br />
! R/W<br />
| R/W || R/W || R || R || R || R || R || R<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''INTF1''' (External '''Int'''errupt Flag '''1''')<br />
:Dieses Bit wird gesetzt, wenn am '''INT1'''-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.<br />
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert '''1(!)''' eingeschrieben wird.<br />
<br />
'''INTF0''' (External '''Int'''errupt Flag '''0''')<br />
:Dieses Bit wird gesetzt, wenn am '''INT0'''-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.<br />
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert '''1(!)''' eingeschrieben wird.<br />
|- <br />
| '''MCUCR'''<br />
| '''MCU''' '''C'''ontrol '''R'''egister.<br />
<br />
Das MCU Control Register enthält Kontrollbits für allgemeine MCU-Funktionen.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''-'''|| '''-'''|| '''SE'''|| '''SM'''|| '''ISC11'''|| '''ISC10'''|| '''ISC01'''|| '''ISC00'''<br />
|- <br />
! R/W<br />
| R || R || R/W || R/W || R/W || R/W || R/W || R/W<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
<br />
|}<br />
<br />
'''SE''' ('''S'''leep '''E'''nable)<br />
:Dieses Bit muss gesetzt sein, um den Controller mit dem '''SLEEP'''-Befehl in den Schlafzustand versetzen zu können.<br />
:Um den Schlafmodus nicht irrtümlich einzuschalten, wird empfohlen, das Bit erst unmittelbar vor Ausführung des '''SLEEP'''-Befehls zu setzen.<br />
<br />
'''SM''' ('''S'''leep '''M'''ode)<br />
:Dieses Bit bestimmt über den Schlafmodus.<br />
:Ist das Bit gelöscht, so wird der '''Idle'''-Modus ausgeführt. Ist das Bit gesetzt, so wird der '''Power-Down'''-Modus ausgeführt. (für andere AVR Controller siehe Abschnitt "Sleep-Mode")<br />
<br />
'''ISC11''', '''ISC10''' ('''I'''nterrupt '''S'''ense '''C'''ontrol '''1''' Bits)<br />
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am '''INT1'''-Pin ausgewertet wird.<br />
<br />
:{| class="wikitable"<br />
|- <br />
! ISC11 || ISC10 || Bedeutung<br />
|- <br />
| align="center" | 0<br />
| align="center" | 0<br />
| Low Level an '''INT1''' erzeugt einen Interrupt.<br />
<br />
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.<br />
|- <br />
| align="center" | 0<br />
| align="center" | 1<br />
| Reserviert<br />
|- <br />
| align="center" | 1<br />
| align="center" | 0<br />
| Die fallende Flanke an '''INT1''' erzeugt einen Interrupt.<br />
|- <br />
| align="center" | 1<br />
| align="center" | 1<br />
| Die steigende Flanke an '''INT1''' erzeugt einen Interrupt.<br />
|}<br />
<br />
'''ISC01''', '''ISC00''' ('''I'''nterrupt '''S'''ense '''C'''ontrol '''0''' Bits)<br />
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am '''INT0'''-Pin ausgewertet wird.<br />
<br />
:{| class="wikitable"<br />
|- <br />
! ISC01 || ISC00 || Bedeutung<br />
|- <br />
| align="center" | 0<br />
| align="center" | 0<br />
| Low Level an '''INT0''' erzeugt einen Interrupt.<br />
<br />
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.<br />
|- <br />
| align="center" | 0<br />
| align="center" | 1<br />
| Reserviert<br />
|- <br />
| align="center" | 1<br />
| align="center" | 0<br />
| Die fallende Flanke an '''INT0''' erzeugt einen Interrupt.<br />
|- <br />
| align="center" | 1<br />
| align="center" | 1<br />
| Die steigende Flanke an '''INT0''' erzeugt einen Interrupt.<br />
|}<br />
<br />
|}<br />
<br />
== Allgemeines über die Interrupt-Abarbeitung ==<br />
<br />
Wenn ein Interrupt eintrifft, wird automatisch das '''Global Interrupt Enable''' Bit im Status Register '''SREG''' gelöscht und alle weiteren Interrupts unterbunden. Dieses wird automatisch wieder gesetzt, wenn die Interruptroutine beendet wird. Wenn in der Zwischenzeit weitere Interrupts eintreffen, werden die zugehörigen Interrupt-Bits gesetzt und die Interrupts bei Beendigung der laufenden Interrupt-Routine in der Reihenfolge ihrer Priorität ausgeführt. Dies kann<br />
eigentlich nur dann zu Problemen führen, wenn ein hoch priorisierter Interrupt ständig und in kurzer Folge auftritt. Dieser sperrt dann möglicherweise alle anderen Interrupts mit niedrigerer Priorität. Dies ist einer der Gründe, weshalb die Interrupt-Routinen sehr kurz gehalten werden sollen. Es ist möglich das GIE-Bit in der ISR zu setzen und so schon wieder weitere Interrupts zuzulassen - allerdings sollte man damit vorsichtig sein und genau wissen was man damit macht. Kritisch wird es vor allem wenn der gleiche Interrupt noch einmal kommt, bevor die ISR abgearbeitet ist. <br />
<br />
<!-- === Das Status-Register ===<br />
<br />
Es gilt auch zu beachten, dass das Status-Register während der Abarbeitung einer Interruptroutine nicht automatisch gesichert wird. Falls notwendig, muss dies vom Programmierer selber vorgesehen werden. --><br />
<br />
== Interrupts mit avr-gcc ==<br />
<br />
<!-- ''Anmerkung eines Nutzers: Ich habe mir das Thema hier angearbeitet und hatte am Anfang starke Probleme: Jeder Interrupt muss nochmals einzeln aktiviert werden. Es reicht nicht nur per ''sei()'' die Interrupts global zu aktiveren.'' - mthomas: Hoffentlich duch die modifizerte Einleitung etwas offensichtlicher erläutert. Ansonsten bitte per Eintrag auf die Diskussionseite nochmals melden) --> <br />
<!-- Selbstverständlich können alle interruptspezifischen Registerzugriffe wie gewohnt über I/O-Adressierung vorgenommen werden. Etwas einfacher geht es jedoch, wenn wir die vom Compiler zur Verfügung gestellten Mittel einsetzen.--><br />
Funktionen zur Interrupt-Verarbeitung werden in den Includedateien ''interrupt.h'' der avr-libc zur Verfügung gestellt (bei älterem Quellcode zusätzlich ''signal.h'').<br />
<br />
<syntaxhighlight lang="c"><br />
// fuer sei(), cli() und ISR():<br />
#include <avr/interrupt.h><br />
</syntaxhighlight><br />
<br />
Das Makro '''sei()''' schaltet die Interrupts ein. Eigentlich wird nichts anderes gemacht, als das '''Global Interrupt Enable''' Bit im Status Register gesetzt.<br />
<br />
<syntaxhighlight lang="c"><br />
sei();<br />
</syntaxhighlight><br />
<br />
Das Makro '''cli()''' schaltet die Interrupts aus, oder anders gesagt, das '''Global Interrupt Enable''' Bit im Status Register wird gelöscht.<br />
<br />
<syntaxhighlight lang="c"><br />
cli();<br />
</syntaxhighlight><br />
<br />
Oft steht man vor der Aufgabe, dass eine Codesequenz nicht unterbrochen werden darf. Es liegt dann nahe, zu Beginn dieser Sequenz ein cli() und am Ende ein sei() einzufügen. Dies ist jedoch ungünstig, wenn die Interrupts vor Aufruf der Sequenz deaktiviert waren und danach auch weiterhin deaktiviert bleiben sollen. Ein sei() würde ungeachtet des vorherigen Zustands die Interrupts aktivieren, was zu unerwünschten Seiteneffekten führen kann. Die aus dem folgenden Beispiel ersichtliche Vorgehensweise ist in solchen Fällen vorzuziehen:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
#include <inttypes.h><br />
<br />
//...<br />
<br />
void NichtUnterbrechenBitte(void)<br />
{<br />
uint8_t tmp_sreg; // temporaerer Speicher fuer das Statusregister<br />
<br />
tmp_sreg = SREG; // Statusregister (also auch das I-Flag darin) sichern<br />
cli(); // Interrupts global deaktivieren<br />
<br />
/* hier "unterbrechnungsfreier" Code */<br />
<br />
/* Beispiel Anfang<br />
JTAG-Interface eines ATmega16 per Software deaktivieren <br />
und damit die JTAG-Pins an PORTC für "general I/O" nutzbar machen<br />
ohne die JTAG-Fuse-Bit zu aendern. Dazu ist eine "timed sequence"<br />
einzuhalten (vgl Datenblatt ATmega16, Stand 10/04, S. 229): <br />
Das JTD-Bit muss zweimal innerhalb von 4 Taktzyklen geschrieben <br />
werden. Ein Interrupt zwischen den beiden Schreibzugriffen wuerde <br />
die erforderliche Sequenz "brechen", das JTAG-Interface bliebe<br />
weiterhin aktiv und die IO-Pins weiterhin für JTAG reserviert. */<br />
<br />
MCUCSR |= (1<<JTD);<br />
MCUCSR |= (1<<JTD); // 2 mal in Folge ,vgl. Datenblatt fuer mehr Information<br />
<br />
/* Beispiel Ende */<br />
<br />
SREG = tmp_sreg; // Status-Register wieder herstellen <br />
// somit auch das I-Flag auf gesicherten Zustand setzen<br />
}<br />
<br />
void NichtSoGut(void)<br />
{<br />
cli();<br />
<br />
/* hier "unterbrechnungsfreier" Code */<br />
<br />
sei();<br />
}<br />
<br />
<br />
int main(void)<br />
{<br />
//...<br />
<br />
cli(); <br />
// Interrupts global deaktiviert <br />
<br />
NichtUnterbrechenBitte();<br />
// auch nach Aufruf der Funktion deaktiviert<br />
<br />
sei();<br />
// Interrupts global aktiviert <br />
<br />
NichtUnterbrechenBitte();<br />
// weiterhin aktiviert<br />
//...<br />
<br />
/* Verdeutlichung der unguenstigen Vorgehensweise mit cli/sei: */<br />
cli(); <br />
// Interrupts jetzt global deaktiviert <br />
<br />
NichtSoGut();<br />
// nach Aufruf der Funktion sind Interrupts global aktiviert <br />
// dies ist mglw. ungewollt!<br />
//...<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<!-- mt: besser so nicht(?), lieber "datenblattkonform"<br />
<br />
<font face="Courier New">'''timer_enable_int (unsigned char ints);<br /><br />
'''</font>Schaltet Timerbezogene Interrupts ein bzw. aus.<br /><br />
Wenn als Argument '''ints''' der Wert 0 übergeben wird so werden alle<br />
Timerinterrupts ausgeschaltet, ansonsten muss in '''ints''' angegeben werden,<br />
welche Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu<br />
setzenden Bits definiert werden.<br /><br />
Beispiel: '''<font face="Courier New">timer_enable_int (1 << TOIE1));<br /><br />
</font>'''Achtung: Wenn ein Timerinterrupt eingeschaltet wird während ein<br />
anderer Timerinterrupt bereits läuft, dann müssen beide Bits angegeben werden<br />
sonst wird der andere Timerinterrupt versehentlich ausgeschaltet.<br />
<br />
<font face="Courier New">'''enable_external_int (unsigned char ints);<br /><br />
'''</font>Schaltet die externen Interrupts ein bzw. aus.<br /><br />
Wenn als Argument '''ints''' der Wert 0 übergeben wird so werden alle externen<br />
Interrrups ausgeschaltet, ansonsten muss in '''ints''' angegeben werden, welche<br />
Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu<br />
setzenden Bits definiert werden.<br /><br />
Beispiel: '''<font face="Courier New">enable_external_int ((1<<br />
</font>'''Schaltet die externen Interrupts 0 und 1 ein.<br />
<br />
Nachdem nun die Interrupts aktiviert sind, braucht es selbstverständlich noch den auszuführenden Code, der ablaufen soll, wenn ein Interrupt eintrifft.<br />
--><br />
Zu den aktivierten Interrupts ist eine Funktion zu programmieren, deren Code aufgerufen wird, wenn der betreffende Interrupt auftritt (Interrupt-Handler, Interrupt-Service-Routine). Dazu existiert die Definition (ein Makro) '''ISR'''.<br />
<br />
=== ISR ===<br />
<br />
(''ISR()'' ersetzt bei neueren Versionen der avr-libc ''SIGNAL()''. SIGNAL sollte nicht mehr genutzt werden, zur Portierung von SIGNAL nach ISR siehe den [[AVR-GCC-Tutorial#Anhang|Anhang]].)<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
//...<br />
ISR(Vectorname) /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */<br />
{<br />
/* Interrupt Code */<br />
}<br />
</syntaxhighlight><br />
<br />
Mit ''ISR'' wird eine Funktion für die Bearbeitung eines Interrupts eingeleitet. Als Argument muss dabei die Benennung des entsprechenden Interruptvektors angegeben werden. Diese sind in den jeweiligen Includedateien IOxxxx.h zu finden. Die Bezeichnung entspricht dem Namen aus dem Datenblatt, bei dem die Leerzeichen durch Unterstriche ersetzt sind und ein ''_vect'' angehängt ist.<br />
<br />
Als Beispiel ein Ausschnitt aus der Datei für den ATmega8 (bei WinAVR Standardinstallation in C:\WinAVR\avr\include\avr\iom8.h) in der neben den aktuellen Namen für ''ISR'' (*_vect) noch die Bezeichnungen für das inzwischen nicht mehr aktuelle ''SIGNAL'' (SIG_*) enthalten sind.<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
/* $Id: iom8.h,v 1.13 2005/10/30 22:11:23 joerg_wunsch Exp $ */<br />
<br />
/* avr/iom8.h - definitions for ATmega8 */<br />
//...<br />
<br />
/* Interrupt vectors */<br />
<br />
/* External Interrupt Request 0 */<br />
#define INT0_vect _VECTOR(1)<br />
#define SIG_INTERRUPT0 _VECTOR(1)<br />
<br />
/* External Interrupt Request 1 */<br />
#define INT1_vect _VECTOR(2)<br />
#define SIG_INTERRUPT1 _VECTOR(2)<br />
<br />
/* Timer/Counter2 Compare Match */<br />
#define TIMER2_COMP_vect _VECTOR(3)<br />
#define SIG_OUTPUT_COMPARE2 _VECTOR(3)<br />
<br />
/* Timer/Counter2 Overflow */<br />
#define TIMER2_OVF_vect _VECTOR(4)<br />
#define SIG_OVERFLOW2 _VECTOR(4)<br />
<br />
/* Timer/Counter1 Capture Event */<br />
#define TIMER1_CAPT_vect _VECTOR(5)<br />
#define SIG_INPUT_CAPTURE1 _VECTOR(5)<br />
<br />
/* Timer/Counter1 Compare Match A */<br />
#define TIMER1_COMPA_vect _VECTOR(6)<br />
#define SIG_OUTPUT_COMPARE1A _VECTOR(6)<br />
<br />
/* Timer/Counter1 Compare Match B */<br />
#define TIMER1_COMPB_vect _VECTOR(7)<br />
#define SIG_OUTPUT_COMPARE1B _VECTOR(7)<br />
<br />
//...<br />
</syntaxhighlight><br />
<br />
<!--Vor Nutzung von SIGNAL muss ebenfalls die Header-Datei signal.h eingebunden werden.--> <br />
Mögliche Funktionsrümpfe für Interruptfunktionen sind zum Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
/* veraltet: #include <avr/signal.h> */<br />
<br />
ISR(INT0_vect) /* veraltet: SIGNAL(SIG_INTERRUPT0) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
ISR(TIMER0_OVF_vect) /* veraltet: SIGNAL(SIG_OVERFLOW0) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
ISR(USART_RXC_vect) /* veraltet: SIGNAL(SIG_UART_RECV) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
// und so weiter und so fort...<br />
</syntaxhighlight><br />
<br />
Auf die korrekte Schreibweise der Vektorbezeichnung ist zu achten. Der gcc-Compiler prüft erst ab Version 4.x, ob ein Signal/Interrupt der angegebenen Bezeichnung tatsächlich in der Includedatei definiert ist und gibt andernfalls eine Warnung aus. Bei WinAVR (ab 2/2005) wurde die Überprüfung auch in den mitgelieferten Compiler der Version 3.x integriert. Aus dem gcc-Quellcode Version 3.x selbst erstellte Compiler enthalten die Prüfung nicht (vgl. [[AVR-GCC]]). <br />
<br />
Während der Ausführung der Funktion sind alle weiteren Interrupts automatisch gesperrt. Beim Verlassen der Funktion werden die Interrupts wieder zugelassen.<br />
<br />
Sollte während der Abarbeitung der Interruptroutine ein weiterer Interrupt (gleiche oder andere Interruptquelle) auftreten, so wird das entsprechende Bit im zugeordneten Interrupt Flag Register gesetzt und die entsprechende Interruptroutine automatisch nach dem Beenden der aktuellen Funktion aufgerufen.<br />
<br />
Ein Problem ergibt sich eigentlich nur dann, wenn während der Abarbeitung der aktuellen Interruptroutine mehrere gleichartige Interrupts auftreten. Die entsprechende Interruptroutine wird im Nachhinein zwar aufgerufen jedoch wissen wir nicht, ob nun der entsprechende Interrupt einmal, zweimal oder gar noch öfter aufgetreten ist. Deshalb soll hier noch einmal betont werden, dass Interruptroutinen so schnell wie nur irgend möglich wieder verlassen werden sollten.<br />
<br />
=== Unterbrechbare Interruptroutinen ===<br />
<br />
"Faustregel": im Zweifel '''ISR'''. Die nachfolgend beschriebene Methode nur dann verwenden, wenn man sich über die unterschiedliche Funktionsweise im Klaren ist.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
<br />
ISR(XXX,ISR_NOBLOCK) /* veraltet: INTERRUPT(SIG_OVERFLOW0) */<br />
{<br />
/* Interrupt-Code */<br />
}<br />
</syntaxhighlight><br />
<br />
Hierbei steht XXX für den oben beschriebenen Namen des Vektors (also z.&nbsp;B. ''TIMER0_OVF_vect''). Der Unterschied im Vergleich zu einer herkömmlichen ISR ist, dass hier beim Aufrufen der Funktion das '''Global Enable Interrupt''' Bit durch Einfügen einer SEI-Anweisung direkt wieder gesetzt und somit alle Interrupts zugelassen werden &ndash; auch XXX-Interrupts. <br />
<br />
Bei unsachgemässer Handhabung kann dies zu erheblichen Problemen durch Rekursion wie einem Stack-Overflow oder anderen unerwarteten Effekten führen und sollte wirklich nur dann eingesetzt werden, wenn man sich sicher ist, das Ganze auch im Griff zu haben.<br />
<br />
Insbesondere sollte möglichst am ISR-Anfang die auslösende IRQ-Quelle deaktiviert und erst am Ende der ISR wieder aktiviert werden. Robuster als die Verwendung einer NOBLOCK-ISR ist daher folgender ISR-Aufbau:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
<br />
ISR (XXX) <br />
{<br />
// Implementiere die ISR ohne zunaechst weitere IRQs zuzulassen<br />
<br />
<<Deaktiviere die XXX-IRQ>><br />
<br />
// Erlaube alle Interrupts (ausser XXX)<br />
sei();<br />
<br />
//... Code ...<br />
<br />
// IRQs global deaktivieren um die XXX-IRQ wieder gefahrlos <br />
// aktivieren zu koennen<br />
cli();<br />
<br />
<<Aktiviere die XXX-IRQ>><br />
}<br />
</syntaxhighlight><br />
Auf diese Weise kann sich die XXX-IRQ nicht selbst unterbrechen, was zu einer Art Endlosschleife führen würde.<br />
<br />
Siehe auch: Hinweise in [[AVR-GCC]]<br />
<br />
siehe dazu: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html<br />
<br />
== Datenaustausch mit Interrupt-Routinen ==<br />
<br />
Variablen, die sowohl in Interrupt-Routinen (ISR = Interrupt Service Routine(s)) als auch vom übrigen Programmcode geschrieben oder gelesen werden, müssen mit einem '''volatile''' deklariert werden. Damit wird dem Compiler mitgeteilt, dass der Inhalt der Variablen vor jedem Lesezugriff aus dem Speicher gelesen und nach jedem Schreibzugriff in den Speicher geschrieben wird. Ansonsten könnte der Compiler den Code so optimieren, dass der Wert der Variablen nur in Prozessorregistern zwischengespeichert wird, die nichts von der Änderung woanders mitbekommen.<br />
<br />
Zur Veranschaulichung ein Codefragment für eine Tastenentprellung mit Erkennung einer "lange gedrückten" Taste.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
#include <stdint.h><br />
//...<br />
<br />
// Schwellwerte<br />
// Entprellung: <br />
#define CNTDEBOUNCE 10<br />
// "lange gedrueckt:"<br />
#define CNTREPEAT 200<br />
<br />
// hier z.&nbsp;B. Taste an Pin2 PortA "active low" = 0 wenn gedrueckt<br />
#define KEY_PIN PINA<br />
#define KEY_PINNO PA2<br />
<br />
// beachte: volatile! <br />
volatile uint8_t gKeyCounter;<br />
<br />
// Timer-Compare Interrupt ISR, wird z.B. alle 10ms ausgefuehrt<br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
// hier wird gKeyCounter veraendert. Die übrigen<br />
// Programmteile müssen diese Aenderung "sehen":<br />
// volatile -> aktuellen Wert immer in den Speicher schreiben<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
if (gKeyCounter < CNTREPEAT) gKeyCounter++;<br />
}<br />
else {<br />
gKeyCounter = 0;<br />
}<br />
}<br />
<br />
//...<br />
<br />
int main(void)<br />
{<br />
//...<br />
/* hier: Initialisierung der Ports und des Timer-Interrupts */<br />
//... <br />
// hier wird auf gKeyCounter zugegriffen. Dazu muss der in der<br />
// ISR geschriebene Wert bekannt sein:<br />
// volatile -> aktuellen Wert immer aus dem Speicher lesen<br />
if ( gKeyCounter > CNTDEBOUNCE ) { // Taste mind. 10*10 ms "prellfrei"<br />
if (gKeyCounter == CNTREPEAT) {<br />
/* hier: Code fuer "Taste lange gedrueckt" */<br />
}<br />
else {<br />
/* hier: Code fuer "Taste kurz gedrueckt" */<br />
}<br />
}<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Wird innerhalb einer ISR mehrfach auf eine mit volatile deklarierte Variable zugegriffen, wirkt sich dies ungünstig auf die Verarbeitungsgeschwindigkeit aus, da bei jedem Zugriff mit dem Speicherinhalt abgeglichen wird. Da bei AVR-Controllern ''innerhalb'' einer ISR keine Unterbrechungen zu erwarten sind, bietet es sich an, einen Zwischenspeicher in Form einer lokalen Variable zu verwenden, deren Inhalt zu Beginn und am Ende mit dem der volatile Variable synchronisiert wird. Lokale Variable werden bei eingeschalteter Optimierung mit hoher Wahrscheinlichkeit in Prozessorregistern verwaltet und der Zugriff darauf ist daher nur mit wenigen internen Operationen verbunden. Die ISR aus dem vorherigen Beispiel lässt sich so optimieren:<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
uint8_t tmp_kc;<br />
<br />
tmp_kc = gKeyCounter; // Uebernahme in lokale Arbeitsvariable<br />
<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
if (tmp_kc < CNTREPEAT) {<br />
tmp_kc++;<br />
}<br />
}<br />
else {<br />
tmp_kc = 0;<br />
}<br />
<br />
gKeyCounter = tmp_kc; // Zurueckschreiben<br />
}<br />
//...<br />
</syntaxhighlight><br />
<br />
Zum Vergleich die Disassemblies (Ausschnitte der "lss-Dateien", compiliert für ATmega162) im Anschluss. Man erkennt den viermaligen Zugriff auf die Speicheraddresse von ''gKeyCounter'' (hier 0x032A) in der ISR ohne "Cache"-Variable und den zweimaligen Zugriff in der Variante mit Zwischenspeicher. Im Beispiel ist der Vorteil gering, bei komplexeren Routinen kann die Zwischenspeicherung in lokalen Variablen jedoch zu deutlicheren Verbesserungen führen.<br />
<br />
<pre><br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
86a: 1f 92 push r1<br />
86c: 0f 92 push r0<br />
86e: 0f b6 in r0, 0x3f ; 63<br />
870: 0f 92 push r0<br />
872: 11 24 eor r1, r1<br />
874: 8f 93 push r24<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
876: ca 99 sbic 0x19, 2 ; 25<br />
878: 0a c0 rjmp .+20 ; 0x88e <__vector_13+0x24><br />
if (gKeyCounter < CNTREPEAT) gKeyCounter++;<br />
87a: 80 91 2a 03 lds r24, 0x032A<br />
87e: 88 3c cpi r24, 0xC8 ; 200 <br />
880: 40 f4 brcc .+16 ; 0x892 <__vector_13+0x28><br />
882: 80 91 2a 03 lds r24, 0x032A<br />
886: 8f 5f subi r24, 0xFF ; 255<br />
888: 80 93 2a 03 sts 0x032A, r24<br />
88c: 02 c0 rjmp .+4 ; 0x892 <__vector_13+0x28><br />
}<br />
else {<br />
gKeyCounter = 0;<br />
88e: 10 92 2a 03 sts 0x032A, r1<br />
892: 8f 91 pop r24<br />
894: 0f 90 pop r0<br />
896: 0f be out 0x3f, r0 ; 63<br />
898: 0f 90 pop r0<br />
89a: 1f 90 pop r1<br />
89c: 18 95 reti<br />
</pre><br />
<br />
<pre><br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
86a: 1f 92 push r1<br />
86c: 0f 92 push r0<br />
86e: 0f b6 in r0, 0x3f ; 63<br />
870: 0f 92 push r0<br />
872: 11 24 eor r1, r1<br />
874: 8f 93 push r24<br />
uint8_t tmp_kc;<br />
<br />
tmp_kc = gKeyCounter;<br />
876: 80 91 2a 03 lds r24, 0x032A<br />
<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
87a: ca 9b sbis 0x19, 2 ; 25<br />
87c: 02 c0 rjmp .+4 ; 0x882 <__vector_13+0x18><br />
87e: 80 e0 ldi r24, 0x00 ; 0<br />
880: 03 c0 rjmp .+6 ; 0x888 <__vector_13+0x1e><br />
if (tmp_kc < CNTREPEAT) {<br />
882: 88 3c cpi r24, 0xC8 ; 200<br />
884: 08 f4 brcc .+2 ; 0x888 <__vector_13+0x1e><br />
tmp_kc++;<br />
886: 8f 5f subi r24, 0xFF ; 255<br />
}<br />
}<br />
else {<br />
tmp_kc = 0;<br />
}<br />
<br />
gKeyCounter = tmp_kc;<br />
888: 80 93 2a 03 sts 0x032A, r24<br />
88c: 8f 91 pop r24<br />
88e: 0f 90 pop r0<br />
890: 0f be out 0x3f, r0 ; 63<br />
892: 0f 90 pop r0<br />
894: 1f 90 pop r1<br />
896: 18 95 reti<br />
</pre><br />
<br />
=== volatile und Pointer ===<br />
<br />
Bei '''volatile''' in Verbindung mit Pointern ist zu beachten, ob der Pointer selbst oder die Variable, auf die der Pointer zeigt, '''volatile''' ist.<br />
<br />
<syntaxhighlight lang="c"><br />
volatile uint8_t *a; // das Ziel von a ist volatile<br />
<br />
uint8_t *volatile a; // a selbst ist volatile<br />
</syntaxhighlight><br />
<br />
Falls der Pointer volatile ist (zweiter Fall im Beispiel), ist zu beachten, dass der Wert des Pointers, also eine Speicheradresse, intern in mehr als einem Byte verwaltet wird. Lese- und Schreibzugriffe im Hauptprogramm (außerhalb von Interrupt-Routinen) sind daher so zu implementieren, dass alle Teilbytes der Adresse konsistent bleiben, vgl. dazu den folgenden Abschnitt.<br />
<br />
=== Variablen größer 1 Byte ===<br />
<br />
Bei Variablen größer ein Byte, auf die in Interrupt-Routinen und im Hauptprogramm zugegriffen wird, muss darauf geachtet werden, dass die Zugriffe auf die einzelnen Bytes außerhalb der ISR nicht durch einen Interrupt unterbrochen werden. (Allgemeinplatz: AVRs sind 8-bit Controller). Zur Veranschaulichung ein Codefragment:<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
volatile uint16_t gMyCounter16bit;<br />
//...<br />
ISR(...)<br />
{<br />
//...<br />
gMyCounter16Bit++;<br />
//...<br />
}<br />
<br />
int main(void)<br />
{<br />
uint16_t tmpCnt;<br />
//...<br />
// nicht gut: Mglw. hier ein Fehler, wenn ein Byte von MyCounter <br />
// schon in tmpCnt kopiert ist aber vor dem Kopieren des zweiten Bytes <br />
// ein Interrupt auftritt, der den Inhalt von MyCounter verändert.<br />
tmpCnt = gMyCounter16bit; <br />
<br />
<br />
// besser: Änderungen "außerhalb" verhindern -> alle "Teilbytes"<br />
// bleiben konsistent<br />
cli(); // Interrupts deaktivieren<br />
tmpCnt = gMyCounter16Bit;<br />
sei(); // wieder aktivieren<br />
<br />
// oder: vorheriger Status des globalen Interrupt-Flags bleibt erhalten<br />
uint8_t sreg_tmp;<br />
sreg_tmp = SREG; /* Sichern */<br />
cli()<br />
tmpCnt = gMyCounter16Bit;<br />
SREG = sreg_tmp; /* Wiederherstellen */<br />
<br />
// oder: mehrfach lesen, bis man konsistente Daten hat<br />
uint16_t count1 = gMyCounter16Bit;<br />
uint16_t count2 = gMyCounter16Bit;<br />
while (count1 != count2) {<br />
count1 = count2;<br />
count2 = gMyCounter16Bit;<br />
}<br />
tmpCnt = count1;<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Die avr-libc bietet ab Version 1.6.0(?) einige Hilfsfunktionen/Makros, mit der im Beispiel oben gezeigten Funktionalität, die zusätzlich auch sogenannte [http://en.wikipedia.org/wiki/Memory_barrier memory barriers] beinhalten. Diese stehen nach #include <util/atomic.h> zur Verfügung.<br />
<syntaxhighlight lang="c"><br />
//...<br />
#include <util/atomic.h><br />
//...<br />
<br />
// analog zu cli, Zugriff, sei:<br />
ATOMIC_BLOCK(ATOMIC_FORCEON) {<br />
tmpCnt = gMyCounter16Bit;<br />
}<br />
<br />
// oder:<br />
<br />
// analog zu Sicherung des SREG, cli, Zugriff und Zurückschreiben des SREG:<br />
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />
tmpCnt = gMyCounter16Bit;<br />
}<br />
<br />
//...<br />
</syntaxhighlight><br />
<br />
* siehe auch [http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html Dokumentation der avr-libc zu atomic.h]<br />
<br />
== Interrupt-Routinen und Registerzugriffe ==<br />
<br />
Falls Register sowohl im Hauptprogramm als auch in Interrupt-Routinen verändert werden, ist darauf zu achten, dass diese Zugriffe sich nicht überlappen. Nur wenige Anweisungen lassen sich in sogenannte "atomare" Zugriffe übersetzen, die nicht von Interrupt-Routinen unterbrochen werden können. <br />
<br />
Zur Veranschaulichung eine Anweisung, bei der ein Bit und im Anschluss drei Bits in einem Register gesetzt werden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
int main(void)<br />
{<br />
//...<br />
PORTA |= (1<<PA0);<br />
<br />
PORTA |= (1<<PA2)|(1<<PA3)|(1<<PA4);<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Der Compiler übersetzt diese Anweisungen für einen ATmega128 bei Optimierungsstufe "S" nach:<br />
<br />
<div class="code"><pre><br />
...<br />
PORTA |= (1<<PA0);<br />
d2: d8 9a sbi 0x1b, 0 ; 27 (a)<br />
<br />
PORTA |= (1<<PA2)|(1<<PA3)|(1<<PA4);<br />
d4: 8b b3 in r24, 0x1b ; 27 (b)<br />
d6: 8c 61 ori r24, 0x1C ; 28 (c)<br />
d8: 8b bb out 0x1b, r24 ; 27 (d)<br />
...<br />
</pre></div><br />
<br />
Das Setzen des einzelnen Bits wird bei eingeschalteter Optimierung für Register im unteren Speicherbereich in eine einzige Assembler-Anweisung (sbi) übersetzt und ist nicht anfällig für Unterbrechungen durch Interrupts. Die Anweisung zum Setzen von drei Bits wird jedoch in drei abhängige Assembler-Anweisungen übersetzt und bietet damit zwei "Angriffspunkte" für Unterbrechungen. Eine Interrupt-Routine könnte nach dem Laden des Ausgangszustands in den Zwischenspeicher (hier Register 24) den Wert des Registers ändern, z.&nbsp;B. ein Bit löschen. Damit würde der Zwischenspeicher nicht mehr mit dem tatsächlichen Zustand übereinstimmen aber dennoch nach der Bitoperation (hier ori) in das Register zurückgeschrieben. <br />
<br />
Beispiel: PORTA sei anfangs 0b00000000. Die erste Anweisung (a) setzt Bit 0 auf '''1''', PORTA ist danach 0b0000000'''1'''. Nun wird im ersten Teil der zweiten Anweisung der Portzustand in ein Register eingelesen (b). Unmittelbar darauf (vor (c)) "feuert" ein Interrupt, in dessen Interrupt-Routine Bit 0 von PORTA gelöscht wird. Nach Verlassen der Interrupt-Routine hat PORTA den Wert 0b00000000. In den beiden noch folgenden Anweisungen des Hauptprogramms wird nun der zwischengespeicherte "alte" Zustand 0b00000001 mit 0b00011100 logisch-'''ODER'''-verknüft (c) und das Ergebnis 0b00011101 in PortA geschrieben (d). Obwohl zwischenzeitlich Bit 0 gelöscht wurde, ist es nach (d) wieder gesetzt. <br />
<br />
Lösungsmöglichkeiten:<br />
* Register ohne besondere Vorkehrungen nicht in Interruptroutinen ''und'' im Hauptprogramm verändern.<br />
* Interrupts vor Veränderungen in Registern, die auch in ISRs verändert werden, deaktivieren ("cli").<br />
* Bits einzeln löschen oder setzen. sbi und cbi können nicht unterbrochen werden. Vorsicht: nur Register im unteren Speicherbereich sind mittels sbi/cbi ansprechbar. Der Compiler kann nur für diese sbi/cbi-Anweisungen generieren. Für Register außerhalb dieses Adressbereichs ("Memory-Mapped"-Register) werden auch zur Manipulation einzelner Bits abhängige Anweisungen erzeugt (lds,...,sts).<br />
<br />
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Frequently asked Questions/Fragen Nr. 1 und 8. (Stand: avr-libc Vers. 1.0.4)<br />
<br />
== Interruptflags löschen ==<br />
<br />
Beim Löschen von Interruptflags haben AVRs eine Besonderheit, die auch im Datenblatt beschrieben ist: Es wird zum Löschen eine 1 in das betreffende Bit geschrieben. <br />
<br />
Hinweis:<br /><br />
Bei Registern mit mehreren Interrupt-Flag-Bits (wie die Timer Interrupt Flag Register) '''nicht''' die übliche bitweise VerODERung nehmen, sondern eine direkte Zuweisung machen. Da sonst weitere Flags, als nur das gewünschte, ebenfalls gelöscht werden könnten.<br /><br />
([http://www.mikrocontroller.net/topic/171148#1640133 Erklärung]).<br />
<br />
== Was macht das Hauptprogramm? ==<br />
<br />
Im einfachsten (Ausnahme-)Fall gar nichts mehr. Es ist also durchaus denkbar, ein Programm zu schreiben, welches in der main-Funktion lediglich noch die Interrupts aktiviert und dann in einer Endlosschleife verharrt. Sämtliche Funktionen werden dann in den ISRs abgearbeitet. Diese Vorgehensweise ist jedoch bei den meisten Anwendungen schlecht: man verschenkt eine Verarbeitungsebene und hat außerdem möglicherweise Probleme durch Interruptroutinen, die zu viel Verarbeitungszeit benötigen.<br />
<br />
Normalerweise wird man in den Interruptroutinen nur die bei Auftreten des jeweiligen Interruptereignisses unbedingt notwendigen Operationen ausführen lassen. Alle weniger kritischen Aufgaben werden dann im Hauptprogramm abgearbeitet.<br />
<br />
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Interrupts and Signals<br />
<br />
= Sleep-Modes =<br />
<br />
AVR Controller verfügen über eine Reihe von sogenannten [[Sleep Mode |''Sleep-Modes'']] ("Schlaf-Modi"). Diese ermöglichen es, Teile des Controllers abzuschalten. Zum Einen kann damit besonders bei Batteriebetrieb Strom gespart werden, zum Anderen können Komponenten des Controllers deaktiviert werden, die die Genauigkeit des Analog-Digital-Wandlers bzw. des Analog-Comparators negativ beeinflussen. Der Controller wird durch Interrupts aus dem Schlaf geweckt. Welche Interrupts den jeweiligen Schlafmodus beenden, ist einer Tabelle im Datenblatt des jeweiligen Controllers zu entnehmen.<br />
Die Funktionen (eigentlich Makros) der avr-libc stehen nach Einbinden der header-Datei ''sleep.h'' zur Verfügung.<br />
<br />
;set_sleep_mode (uint8_t mode): Setzt den Schlafmodus, der bei Aufruf von sleep() aktiviert wird. In sleep.h sind einige Konstanten definiert (z.&nbsp;B. SLEEP_MODE_PWR_DOWN). Die definierten Modi werden jedoch nicht alle von sämtlichten AVR-Controllern unterstützt.<br />
;sleep_enable(): Aktiviert den gesetzten Schlafmodus, versetzt den Controller aber noch nicht in den Schlafmodus<br />
;sleep_cpu(): Versetzt den Controller in den Schlafmodus .sleep_cpu wird im Prinzip durch die Assembler-Anweisung ''sleep'' ersetzt.<br />
;sleep_disable(): Deaktiviert den gesetzten Schlafmodus<br />
;sleep_mode(): Versetzt den Controller in den mit set_sleep_mode gewählten Schlafmodus. Das Makro entspricht sleep_enable()+sleep_cpu()+sleep_disable(), beinhaltet also nicht die Aktivierung von Interrupts (besser nicht benutzen).<br />
<br />
Bei Anwendung von sleep_cpu() müssen Interrupts also bereits freigeben sein (sei()), da der Controller sonst nicht mehr "aufwachen" kann. sleep_mode() ist nicht geeignet für die Verwendung in ISR Interrupt-Service-Routinen, da bei deren Abarbeitung Interrupts global deaktiviert sind und somit auch die möglichen "Aufwachinterrupts". Abhilfe: stattdessen sleep_enable(), sei(), sleep_cpu(), sleep_disable() und evtl. cli() verwenden (vgl. Dokumentation der avr-libc).<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/sleep.h><br />
<br />
int main(void)<br />
{<br />
...<br />
<br />
while (1) {<br />
...<br />
set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br />
sleep_mode();<br />
<br />
// Code hier wird erst nach Auftreten eines entsprechenden<br />
// "Aufwach-Interrupts" verarbeitet<br />
...<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
In älteren Versionenen der avr-libc wurden nicht alle AVR-Controller durch die sleep-Funktionen richtig angesteuert. Mit avr-libc 1.2.0 wurde die Anzahl der unterstützten Typen jedoch deutlich erweitert. Bei nicht-unterstützten Typen erreicht man die gewünschte Funktionalität durch direkte "[[Bitmanipulation]]" der entsprechenden Register (vgl. Datenblatt) und Aufruf des Sleep-Befehls via Inline-Assembler oder sleep_cpu():<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
// Sleep-Mode "Power-Save" beim ATmega169 "manuell" aktivieren<br />
SMCR = (3<<SM0) | (1<<SE);<br />
asm volatile ("sleep"::); // alternativ sleep_cpu() aus sleep.h<br />
...<br />
</syntaxhighlight><br />
<br />
== Sleep-Modi ==<br />
Die vielen Prozessoren aus der AVR-Familie unterstützen unterschiedliche Sleep-Modi, gefächert nach Vorhandensein von Funktionsblöcken im Controller. Konkrete und verläßliche Auskunft über die tatsächlichen Gegebenheiten finden sich wie immer in den jeweiligen Datenblättern. Die Modi unterscheiden sich darin, welche Funktionsbereiche zum Energiesparen abgeschaltet werden. Davon hängt auch ab, mit welchen Mitteln der Prozessor aus der jeweiligen Schlaftiefe wieder aufgeweckt werden kann.<br />
<br />
;Idle Mode (SLEEP_MODE_IDLE): Die CPU kann durch SPI, USART, Analog Comperator, ADC, TWI, Timer, Watchdog und irgendeinen anderen Interrupt wieder aufgeweckt werden.<br />
<br />
;ADC Noise Reduction Mode (SLEEP_MODE_ADC): In diesem Modus liegt das Hauptaugenmerk darauf, die CPU soweit stillzulegen, dass der ADC möglichst keine Störungen aus dem inneren der CPU auffangen kann, die das Meßergebnis negativ beeinflussen können. Das Aufwachen aus diesem Modus kann ausgelöst werden durch den ADC, externe Interrupts, TWI, Timer und Watchdog.<br />
<br />
;Power-Down Mode (SLEEP_MODE_PWR_DOWN): In diesem Modus wird ein externer Oszillator (Quarz, Quarzoszillator), wenn vorhanden. gestoppt. Geweckt werden kann die CPU durch einen externen Level-Interrupt, TWI, Watchdog, Brown-Out-Reset.<br />
<br />
;Power-Save-Mode (SLEEP_MODE_PWR_SAVE): Power-Save ist identisch zu Power-Down mit einer Ausnahme: Ist der Timer 2 auf die Verwendung eines externen Taktes konfiguriert, so läuft dieser Timer auch im Power-Save weiter und kann die CPU mit einem Interrupt aufwecken.<br />
<br />
;Standby-Mode (SLEEP_MODE_STANDBY, SLEEP_MODE_EXT_STANDBY): Voraussetzung für den Standby-Modus ist die Verwendung eines Quarzes oder eines Quarzoszillators, also einer externen Taktquelle. Ansonsten ist dieser Modus identisch zum Power-Down Modus. Vorteil dieses Modus' ist eine kürzere Aufwachzeit.<br />
<br />
;Abschalten des Brownout Detect (BOD) während der Sleep-Phase (nur P-Typen): Zur Stromersparnis bieten die P-Typen die Möglichkeit den BOD während der Sleep-Phase abzuschalten. Bei einem Atmega88PA beispielsweise, kann dadurch der Stromverbrauch im SLEEP_MODE_PWR_SAVE mit Timer2 im Asynchronmodus mit Uhrenquarz und periodischer Selbstaufweckung um ca. 50% gesenkt werden.<br />
Das Einschalten dieser Funktion geschieht in einer Timed Sequence.<br />
<br />
<syntaxhighlight lang="c"><br />
unsigned char temp0 = MCUCR;<br />
unsigned char temp1 = MCUCR;<br />
temp0 |= (1 << BODS) | (1 << BODSE);<br />
temp1 |= (1 << BODS);<br />
MCUCR = temp0;<br />
MCUCR = temp1;<br />
sleep_cpu();<br />
</syntaxhighlight><br />
<br />
Hierbei ist unbedingt zu beachten, dass das BODS-Bit 3 Takte nach dem Setzen wieder gelöscht wird. Daher muss der Aufruf des Sleep unmittelbar nach dem Setzen erfolgen und das BODS-Bit muss jedes Mal vor einem Sleep Aufruf erneut gesetzt werden.<br />
<br />
<br />
Siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Power Management and Sleep-Modes<br />
* [http://www.mikrocontroller.net/topic/96369#832712 Forenbeitrag] zur "Nichtverwendung" von sleep_mode in ISRs.<br />
<br />
= Zeiger =<br />
Zeiger (engl. ''Pointer'') sind Variablen, die die Adresse von Daten oder Funktionen enthalten und belegen 16 Bits. Die Größe hängt mit dem adressierbaren Speicherbereich zusammen und der GCC reserviert dann den entsprechenden Platz.<br />
Ggf. ist es also günstiger, Indizes auf Arrays (Listen) zu verwenden, so dass der GCC für die Zeigerarithmetik den erforderlichen RAM nur temporär benötigt.<br />
<br />
Siehe auch: [[Zeiger]]<br />
<br />
= Speicherzugriffe =<br />
<br />
Atmel AVR-Controller verfügen typisch über drei Speicher:<br />
<br />
* [[RAM]]: Im RAM (genauer statisches RAM/SRAM) wird vom gcc-Compiler Platz für Variablen reserviert. Auch der Stack befindet sich im RAM. Dieser Speicher ist "flüchtig", d.h. der Inhalt der Variablen geht beim Ausschalten oder einem Zusammenbruch der Spannungsversorgung verloren.<br />
<br />
* Programmspeicher: Ausgeführt als FLASH-Speicher, seitenweise wiederbeschreibbar. Darin ist das Anwendungsprogramm abgelegt.<br />
<br />
* [[EEPROM]]: Nichtflüchtiger Speicher, d.h. der einmal geschriebene Inhalt bleibt auch ohne Stromversorgung erhalten. Byte-weise schreib/lesbar. Im EEPROM werden typischerweise gerätespezifische Werte wie z.&nbsp;B. Kalibrierungswerte von Sensoren abgelegt.<br />
<br />
Einige AVRs besitzen keinen RAM-Speicher, lediglich die Register können als "Arbeitsvariablen"<br />
genutzt werden. Da die Anwendung des avr-gcc auf solch "kleinen" Controllern ohnehin selten sinnvoll ist und auch nur bei einigen RAM-losen Typen nach [http://lightner.net/avr/ATtinyAvrGcc.html "Bastelarbeiten"] möglich ist, werden diese Controller hier nicht weiter berücksichtigt. Auch EEPROM-Speicher ist nicht auf allen Typen verfügbar. Generell sollten die nachfolgenden Erläuterungen auf alle ATmega-Controller und die größeren AT90-Typen übertragbar sein. Für die Typen ATtiny2313, ATtiny26 und viele weitere der "ATtiny-Reihe" gelten die Ausführungen ebenfalls.<br />
<br />
Siehe auch:<br />
* [[Binäre Daten zum Programm hinzufügen]]<br />
== RAM ==<br />
<br />
Die Verwaltung des RAM-Speichers erfolgt durch den Compiler, im Regelfall ist beim Zugriff auf Variablen im RAM nichts Besonderes zu beachten. Die Erläuterungen in jedem brauchbaren C-Buch gelten auch für den vom avr-gcc-Compiler erzeugten Code.<br />
<br />
Um Speicher dynamisch (während der Laufzeit) zu reservieren, kann '''malloc()''' verwendet werden. malloc(size) "alloziert" (~reserviert) einen gewissen Speicherblock mit '''size''' Bytes. Ist kein Platz für den neuen Block, wird NULL (0) zurückgegeben.<br />
<br />
Wird der angelegte Block zu klein (groß), kann die Größe mit realloc() verändert werden. Den allozierten Speicherbereich kann man mit free() wieder freigeben. Wenn das Freigeben eines Blocks vergessen wird spricht man von einem "Speicherleck" (memory leak).<br />
<br />
malloc() legt Speicherblöcke im '''Heap''' an, belegt man zuviel Platz, dann wächst der Heap zu weit nach oben und überschreibt den Stack, und der Controller kommt in Teufels Küche. Das kann leider nicht nur passieren wenn man insgesamt zu viel Speicher anfordert, sondern auch wenn man Blöcke unterschiedlicher Größe in ungünstiger Reihenfolge alloziert/freigibt (siehe Artikel [[Heap-Fragmentierung]]). Aus diesem Grund sollte man malloc() auf Mikrocontrollern sehr sparsam (am besten gar nicht) verwenden.<br />
<br />
Beispiel zur Verwendung von malloc():<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
<br />
void foo(void) {<br />
// neuen speicherbereich anlegen,<br />
// platz für 10 uint16<br />
uint16_t* pBuffer = malloc(10 * sizeof(uint16_t));<br />
<br />
// darauf zugreifen, als wärs ein gewohnter Buffer<br />
pBuffer[2] = 5;<br />
<br />
// Speicher (unbedingt!) wieder freigeben<br />
free(pBuffer);<br />
}<br />
</syntaxhighlight><br />
<br />
Wenn (wie in obigem Beispiel) dynamischer Speicher nur für die Dauer einer Funktion benötigt und am Ende wieder freigegeben wird, bietet es sich an, statt malloc() '''alloca()''' zu verwenden. Der Unterschied zu malloc() ist, dass der Speicher auf dem Stack reserviert wird, und beim Verlassen der Funktion automatisch wieder freigegeben wird. Es kann somit kein Speicherleck und keine Fragmentierung entstehen.<br />
<br />
siehe auch:<br />
* http://www.nongnu.org/avr-libc/user-manual/malloc.html<br />
<br />
== Flash mit PROGMEM und pgm_read ==<br />
<br />
→ [http://nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html avr-libc: Doku zu avr/pgmspace.h]<br />
<br />
Ein Zugriff auf Konstanten im Programmspeicher ist mittels avr-gcc erst ab Version 4.7 "transparent" möglich. Um Daten aus dem Flash zu lesen, muss die AVR-Instruktion LPM (''Load from Program Memory'') erzeugt werden, bei Controllern mit mehr als 64kiB Flash auch ELPM.<br />
<br />
Dazu gibt es das AVR-spezifische GCC-Attribut <tt>progmem</tt>, mit dem eine Variablendeklaration im ''static storage''<ref>Variablen der Speicherklasse ''static storage'' haben eine unbegrenzte Lebensdauer. Beispiel für solche Variablen sind globale Variablen, aber auch static-Variablen innerhalb einer Funktion gehören dazu. Beispiele für Variablen, die nicht ''static storage'' sind: auto-Variablen ("normale" lokale Variablen), register-Variablen, durch malloc geschaffene Objekte, etc.</ref> markiert werden kann:<br />
<syntaxhighlight lang="c"><br />
const int value __attribute__((progmem)) = 1;<br />
</syntaxhighlight><br />
<br />
Effekt ist, dass die so markierte Variable nicht im RAM sondern im Flash angelegt wird. Wird durch "normalen" C-Code auf solch eine Variable zugegriffen, wird jedoch aus der gleichen Adresse aus dem RAM gelesen und nicht aus dem Flash! Das ist ein Fehler, den der Compiler aber nicht anzeigt!<br />
<br />
<syntaxhighlight lang="c"><br />
int test = value; // Fehler! PROGMEM Konstanten müssen mit den pgm_read-Funktionen gelesen werden!<br />
</syntaxhighlight><br />
<br />
Zum Lesen aus dem Flash stellt die avr-libc daher zahlreiche Makros zur Verfügung. Zudem wird das Makro <tt>PROGMEM</tt> definiert, das etwas Tipparbeit spart:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
const int value PROGMEM = 1;<br />
</syntaxhighlight><br />
<br />
<tt>progmem</tt> funktioniert im Wesentlichen wie ein Section-Attribut, das die Daten in der Section <tt>.progmem.data</tt> ablegt. Im Gegensatz zum Section-Attribut werden jedoch noch weitere Prüfungen unternommen, ab avr-gcc 4.6 etwa muss die entsprechende Variable <tt>const</tt> sein.<br />
<br />
=== Integer und float ===<br />
<br />
Zum Lesen von Skalaren stellt die avr-libc folgende Makros zu Verfügung, die jeweils ein Argument erhalten: Die 16-Bit Adresse des zu lesenden Wertes<ref>Damit ist der mögliche Speicherbereich für Flash-Konstanten auf 64kiB begrenzt. Einige pgmspace-Funktionen ermöglichen den Lesezugriff auf den gesamten Flash-Speicher, intern via Assembler-Anweisung ELPM. Die Initialisierungswerte des Speicherinhalts jenseits der 64kiB-Marke müssen dann jedoch auf anderem Weg angelegt werden, d.h. nicht per PROGMEM. Evtl. eigene Section und Linker-Optionen. Alt und nicht ganz korrekt: Die avr-libc pgmspace-Funktionen unterstützen nur die unteren 64kiB Flash bei Controllern mit mehr als 64kiB.</ref><br />
<br />
:{| {{Tabelle}}<br />
|+ Übersicht der <tt>pgm_read</tt> Funktionen aus<br/>dem Header <tt>avr/pgmspace.h</tt> der avr-libc<br />
|-<br />
! Gelesener Wert || <tt>pgm_read_xxx</tt> || Anzahl Bytes<br />
|-<br />
| <tt>uint8_t</tt> || <tt>pgm_read_byte</tt> || 1<br />
|-<br />
| <tt>uint16_t</tt> || <tt>pgm_read_word</tt> || 2<br />
|-<br />
| <tt>uint32_t</tt> || <tt>pgm_read_dword</tt> || 4<br />
|-<br />
| <tt>float</tt> || <tt>pgm_read_float</tt><ref>ab avr-libc 1.7.0</ref> || 4<br />
|}<br />
<br />
Soll ein Zeiger gelesen werden, so verwendet man <tt>pgm_read_word</tt> und castet das Ergebnis zum gewünschten Zeiger-Typ.<br />
<br />
;Beispiele:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
/* Byte */<br />
const uint8_t aByte PROGMEM = 123;<br />
<br />
/* int-Array */<br />
const int anArray[] PROGMEM = { 18, 3 ,70 };<br />
<br />
void foo (void)<br />
{<br />
/* Zeiger */<br />
static const uint8_t* const aPointer PROGMEM = &aByte;<br />
<br />
uint8_t a = pgm_read_byte (&aByte);<br />
int a2 = (int) pgm_read_word (&anArray[2]);<br />
const uint8_t* p = (const uint8_t*) pgm_read_word (&aPointer);<br />
}<br />
</syntaxhighlight><br />
<br />
=== Blöcke ===<br />
<br />
In den Flash-Funktionen der avr-libc sind keine der pgm_read_xxxx Nomenklatur folgenden Funktionen, die Speicherblöcke auslesen oder vergleichen. Die enstprechende Funktionen sind Varianten von <tt>memcpy</tt>, <tt>memcmp</tt> und heißt <tt>memcpy_P</tt>, <tt>memcmp_P</tt>, usw. Für weitere Funktionen und deren Prototypen siehe die Dokumentation der avr-libc.<br />
<br />
=== Strings ===<br />
<br />
Strings sind in C nichts anderes als eine Abfolge von Zeichen und einem <tt>'\0'</tt> als Stringende. Der prinzipielle Weg ist daher identisch zum Lesen von Bytes, wobei auf die [[FAQ#Wie funktioniert String-Verarbeitung in C?|Besonderheiten von Strings]] wie 0-Terminierung geachtet werden muss.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
size_t my_string_length (const char* addr)<br />
{<br />
size_t length = 0;<br />
<br />
while (pgm_read_byte (addr++))<br />
{<br />
len++;<br />
}<br />
return length;<br />
}<br />
</syntaxhighlight><br />
<br />
Zur Unterstützung des Programmierers steht das Repertoire der str-Funktionen auch in jeweils eine Variante zur Verfügung, die mit dem Flash-Speicher arbeiten kann. Die Funktionsnamen tragen den Suffix <tt>_P</tt>. Darüber hinaus gibt es das Makro <tt>PSTR</tt>, das ein String-Literal im Flash-Speicher ablegt und die Adresse des Strings liefert:<br />
<br />
Die nachfolgende Funktion liefert 0 zurück, wenn string_im_ram gleich "Hallo Welt" ist. Mit strcmp (String Compare) können wir zwei Strings vergleichen. Der Rückgabewert kann hierbei folgende Werte haben:<br><br />
0 die Strings sind gleich<br />
>0 das erste ungleiche Zeichen in string_im_ram ist größer als in "Hallo Welt"<br />
<0 das erste ungleiche Zeichen in string_im_ram ist kleiner als in "Hallo Welt"<br />
<br><br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
int foo (const char* string_im_ram)<br />
{<br />
return strcmp_P (string_im_ram, PSTR ("Hallo Welt"));<br />
}<br />
</syntaxhighlight><br />
<br />
Zu beachten ist, dass <tt>PSTR</tt> nur innerhalb von Funktionen verwendet werden kann.<br />
<br />
; Array aus Strings:<br />
<br />
Arrays aus Strings im Flash-Speicher werden in zwei Schritten angelegt:<br />
<br />
# Zuerst die einzelnen Elemente des Arrays und<br />
# im Anschluss ein Array, in dem die Startaddressen der Strings abgelegt werden.<br />
<br />
Zum Auslesen wird zuerst die Adresse des gewünschten Elements aus dem Array im Flash-Speicher gelesen, die im Anschluss dazu genutzt wird, um auf das Element (den String) selbst zuzugreifen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
static const char str1[] PROGMEM = "Hund";<br />
static const char str2[] PROGMEM = "Katze";<br />
static const char str3[] PROGMEM = "Maus";<br />
<br />
const char * const array[] PROGMEM = <br />
{<br />
str1, str2, str3<br />
};<br />
<br />
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]<br />
void read_string (char* buf, size_t i)<br />
{<br />
// Lese die Adresse des i-ten Strings aus array[]<br />
const char *parray = (const char*) pgm_read_word (&array[i]);<br />
<br />
// Kopiere den Inhalt der Zeichenkette vom Flash ins RAM<br />
strcpy_P (buf, parray);<br />
}<br />
</syntaxhighlight><br />
<br />
Eine weitere Möglichkeit ist, die Strings in einem 2-dimensionalen char-Array abzulegen anstatt deren Adresse in einem 1-dimensionalen Adress-Array zu speichern.<br />
<br />
Vorteil ist, dass der Code einfacher wird. Nachteil ist, dass bei unterschiedlich langen Strings Speicherplatz verschwendet wird, weil sich die Array-Dimension and der Länge des längsten Strings orientieret. Bei in etwa gleich langen Strings kann es aber sogar Speicherplatz sparen, denn es die Adressen der einzelnen Strings müssen nicht abgespeichert werden.<ref>In unserem Hund-Katze-Maus Beispiel belegt die erste Variante 22 Bytes Daten und 18 Bytes Code, die zweite Variante mit 2-dimensionalem Array belegt 18 Bytes Daten und 20 Bytes Code. Gemessen wurde mit avr-gcc 4.8 -Os für ATmega8.</ref><br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
// Die "6" ist 1 plus die Länge des längsten Strings ("Katze")<br />
const char array[][6] PROGMEM = <br />
{<br />
"Hund", "Katze", "Maus"<br />
};<br />
<br />
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]<br />
void read_string (char* buf, size_t i)<br />
{<br />
// Kopiere den Inhalt der i-ten Zeichenkette vom Flash ins RAM<br />
strcpy_P (buf, array[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Siehe dazu auch die avr-libc FAQ: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array How do I put an array of strings completely in ROM?]<br />
<br />
=== Warum so kompliziert? ===<br />
<br />
Zu dem Thema, warum die Verabeitung von Werten aus dem Flash-Speicher so kompliziert ist, sei hier nur kurz erläutert: Die Harvard-Architektur des AVR weist getrennte Adressräume für Programm (Flash) und Datenspeicher (RAM) auf. Der C-Standard sieht keine unterschiedlichen Adressräume vor.<br />
<br />
Hat man zum Beispiel eine Funktion string_an_uart (const char* s) und übergibt an diese Funktion die Adresse einer Zeichenkette, dann weiß die Funktion nicht, ob die Adresse in den Flash-Speicher oder das RAM zeigt. Weder aus dem Pointer-Wert, also dem Zahlenwert, noch aus dem "const" kann auf den Ort der Ablage geschlossen werden.<br />
<br />
Einige AVR-Compiler bilden die Harvard-Architektur ab, indem sie in einen Pointer nicht nur die Adresse speichern, sondern auch den Ablageort wie ''Flash'' oder ''RAM''. In einem Aufruf einer Funktion wird dann bei Pointer-Parametern neben der Adresse auch der Speicherbereich, auf den der Pointer zeigt, übergeben.<br />
<br />
Dies hat jedoch auch Nachteile, denn bei jedem Zugriff über einen Zeiger muss zur ''Laufzeit'' entschieden werden, wie der Zugriff auszuführen ist und entsprechend länglicher und langsamer wird der erzeugte Code.<br />
<br />
Siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitte Modules/Program Space String Utilities und Abschnitt Modules/Bootloader Support Utilities<br />
<br />
=== Variablenzugriff >64kB ===<br />
<br />
Die Zeiger beim avr-gcc sind nur 16 Bit breit, können somit also nur 64kiB Datenspeicher adressieren. Als Funktionspointer können sie beim AVR bis zu 128 kiB Programmspeicher adressieren, weil Funktionsadressen immer 16-Bit Worte adressieren und nicht Bytes. Um Flashzugriff jenseits von 64KiB zu bewerkstelligen gibt es mehrere Möglichkeiten:<br />
<br />
* Address-Spaces wie <tt>__flash1</tt> oder <tt>__memx</tt>, siehe Abschnitt "[[#Jenseits von flash|Jenseits von __flash]]".<br />
* Die Funktionen bzw. Makros <tt>pgm_read_xxx_far</tt> der AVR-Libc, wie im folgenden beschrieben.<br />
<br />
Unverständlicherweise gibt es in der AVR-Libc keine Funktion, um 32-Bit Pointer zu erhalten. Hier schafft ein eigenes GNU-C99 Makro Abhilfe:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/pgmspace.h><br />
<br />
//====================================================================<br />
// Macro to access strings defined in PROGMEM above 64kB<br />
//--------------------------------------------------------------------<br />
#define FAR(var) \<br />
({ uint_farptr_t tmp; \<br />
__asm__ ( \<br />
"ldi %A0, lo8(%1)" "\n\t" \<br />
"ldi %B0, hi8(%1)" "\n\t" \<br />
"ldi %C0, hh8(%1)" \<br />
: "=d" (tmp) \<br />
: "i" (&(var))); \<br />
tmp; \<br />
})<br />
//-------------------------------------------------------------------<br />
<br />
//===================================================================<br />
// Define a section above 64kiB (FAR_SECTION)<br />
// and add the required linker argument below<br />
// -Wl,--section-start=.far_section=0x10000<br />
//--------------------------------------------------------------------<br />
#define FAR_SECTION __attribute__((__section__(".far_section")))<br />
//--------------------------------------------------------------------<br />
<br />
//====================================================================<br />
// Just a Sample<br />
//--------------------------------------------------------------------<br />
<br />
const char MyString[] FAR_SECTION = "Hier liegt mein FAR-Teststring!";<br />
const char MyBmp64[] FAR_SECTION = {0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x00};<br />
<br />
int main(void)<br />
{<br />
char MyChar;<br />
DDRC = 0xFF;<br />
do<br />
{<br />
MyChar = pgm_read_byte_far(FAR(MyBmp64));<br />
PORTC = MyChar;<br />
}<br />
while(MyChar);<br />
}<br />
</syntaxhighlight><br />
<br />
D.h. man muss<br />
* Das Makro <tt>FAR</tt> im Quellcode einfügen<br />
* Die Definition der neuen Section <tt>FAR_SECTION</tt> einfügen<br />
* Die Variablen mit dieser Section kennzeichnen<br />
* Dem Linker mittels Kommandozeilenoption die Startadrese dieser Section mitteilen<br />
<br />
Der Zugriff auf diese Variablen kann nur mittels direkter Pointerarithmetik erfolgen, eine Indizierung von Arrays mit variablem Index ist nicht möglich.<br />
<br />
<syntaxhighlight lang="c"><br />
int n=3;<br />
MyChar = pgm_read_byte_far(FAR(MyBmp64)+n);<br />
</syntaxhighlight><br />
<br />
== Flash mit __flash und Embedded-C ==<br />
<br />
Ab Version 4.7 unterstützt avr-gcc ''Adress-Spaces'' gemäß dem Embedded-C Dokument ISO/IEC TR18037. Der geläufigste Adress-Space ist <tt>__flash</tt>, der im Gegensatz zu <tt>progmem</tt> kein GCC-Attribut ist, sondern ein Qualifier und damit syntaktisch ähnlich verwendet wird wie <tt>const</tt> oder <tt>volatile</tt>.<br />
<br />
GCC kennt keine eigene Option zum Aktivieren von Embedded-C, es wird als GNU-C Erweiterung behandelt. Daher müssen C-Module, die Address-Spaces verwenden, mit <tt>-std=gnu99</tt> o.ä. compiliert werden.<br />
<br />
<syntaxhighlight lang="c"><br />
static const __flash int value = 10;<br />
<br />
int get_value (void)<br />
{<br />
return value;<br />
}<br />
</syntaxhighlight><br />
<br />
# Im Gegensatz zu <tt>progmem</tt> sind keine speziellen Bibliotheksfunktionen oder -makros für den Zugriff mehr notwendig: Der Code zum Lesen der Variable ist "normales" C.<br />
# Die Variable wird im richtigen Speicherbereich (Flash) angelegt.<br />
# <tt>__flash</tt> ist nur zusammen mit read-only Objekten oder Zeigern, d.h. nur zusammen mit <tt>const</tt>, erlaubt.<br />
# Zugriffe wie im obigen Beispiel können (weg)optimiert werden. Das Beispiel entspricht einem "<tt>return 10</tt>". Es besteht keine Notwendigkeit, für <tt>value</tt> überhaupt Flash-Speicher zu reservieren.<br />
<br />
Auch Zeiger-Indirektionen sind problemlos möglich. Zu beachten ist, dass <tt>__flash</tt> auf der richtigen Seite des "<tt>*</tt>" in der Zeigerdeklaration bzw. -definition steht:<br />
* '''Rechts vom <tt>*</tt>:''' Der Zeiger selbst liegt im Flash<br />
* '''Links vom <tt>*</tt>:''' Der Zeiger enthält eine Flash-Adresse<br />
<br />
<syntaxhighlight lang="c"><br />
// val ist eine Variable im Flash<br />
const __flash int val = 42;<br />
<br />
// pval liegt auch im Flash und enthält die Adresse von val<br />
const __flash int* const __flash pval = &val;<br />
<br />
char get_val (void)<br />
{<br />
// liest den Wert von val über die in pval abgelegte Adresse<br />
return *pval;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Blöcke ===<br />
<br />
Um Speicherbereiche vom Flash in den RAM zu kopieren, gibt es zwei Möglichkeiten: Zum einen können wie bei <tt>progmem</tt> beschreiben die Funktionen der avr-libc wie <tt>memcpy_P</tt>, <tt>memcmp_P</tt>, <tt>movmem_P</tt>, etc. verwendet werden:<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
// Eine Datenstruktur<br />
typedef struct<br />
{<br />
int id;<br />
char buf[10];<br />
} data_t;<br />
<br />
extern void uart_send (const void*, size_t);<br />
<br />
void send_data (const __flash data_t *pdata)<br />
{<br />
// buf wird auf dem Stack angelegt<br />
data_t buf;<br />
<br />
// Kopiere Daten vom Flash nach buf ins RAM<br />
memcpy_P (&buf, pdata, sizeof (data_t));<br />
<br />
// Sende die Daten in buf<br />
uart_send (&buf, sizeof (data_t));<br />
}<br />
</syntaxhighlight><br />
<br />
Zum anderen kann eine Struktur auch über direktes Kopieren ins RAM geladen werden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
<br />
// Eine Datenstruktur<br />
typedef struct<br />
{<br />
int id;<br />
char buf[10];<br />
} data_t;<br />
<br />
extern void uart_send (const void*, size_t);<br />
<br />
void send_data (const __flash data_t *pdata)<br />
{<br />
// Kopiere Daten ins RAM. buf wird auf dem Stack angelegt<br />
const data_t buf = *pdata;<br />
<br />
// Verwendet die Daten in buf<br />
uart_send (&buf, sizeof (data_t));<br />
}<br />
</syntaxhighlight><br />
<br />
=== Strings ===<br />
<br />
Natürlich können auch Strings im Flash abgelegt werden und auch mit Funktionen wie <tt>strcpy_P</tt> aus der avr-libc verarbeitet werden. Zudem ist es möglich, Flash-Zeiger mit der Adresse eines String-Literals zu initialisieren:<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
#define FSTR(X) ((const __flash char[]) { X } )<br />
<br />
const __flash char * const __flash array[] = <br />
{<br />
FSTR ("Hund"), FSTR ("Katze"), FSTR ("Maus")<br />
};<br />
<br />
size_t get_len (uint8_t tier)<br />
{<br />
return strlen_P (array[tier]);<br />
}<br />
</syntaxhighlight><br />
<br />
Leider sieht der Embedded-C Draft nicht vor, String-Literale direkt in einem anderen Adress-Space als ''generic'' anzulegen, so dass hier der Umweg über <tt>FSTR</tt> genommen werden muss. Dieses Konstrukt ist nur ausserhalb von Funktionen möglich und kann daher nicht als Ersatz für <tt>PSTR</tt> aus der avr-libc dienen.<br />
<br />
Soll <tt>array</tt> ein 2-dimensonales Array sein anstatt ein 1-dimensionales Array von Zeigern, dann geht das ohne große Verrenkungen:<br />
<br />
<syntaxhighlight lang="c"><br />
// Die 6 ergibt sich aus 1 plus der Länge des längsten Strings "Katze"<br />
const __flash char array[][6] = <br />
{<br />
"Hund", "Katze", "Maus"<br />
};<br />
</syntaxhighlight><br />
<br />
Weiters besteht die Möglichkeit, <tt>array</tt> analog anzulegen, wie man es mit <tt>PROGMEM</tt> machen würde: Jeder String wird explizit angelegt und seine Adresse bei der Initialisierung von <tt>array</tt> verwendet. Dies entspricht dem ersten Beispiel eines 1-dimensionalen Zeigerarrays:<br />
<br />
<syntaxhighlight lang="c"><br />
static const __flash char strHund[] = "Hund";<br />
static const __flash char strKatze[] = "Katze";<br />
static const __flash char strMaus[] = "Maus";<br />
<br />
const __flash char * const __flash array[] = <br />
{<br />
strHund, strKatze, strMaus<br />
};<br />
</syntaxhighlight><br />
<br />
=== Casts ===<br />
<br />
Embedded C fordert, dass zwei Adress-Spaces entweder disjunkt sind – d.h. sie enthalten keine gemeinsamen Adressen – oder aber ein Space komplett im anderen enthalten ist, also eine Teilmengen-Beziehung besteht. Die Adress-Spaces von avr-gcc sind so implementiert, dass jeder Space Teilmenge jedes anderes ist. Zwar haben Spaces wie RAM und Flash physikalisch keinen Speicherbereich gemein, allerdings ermöglicht diese Implementierung das Casten von Zeigern zu unterschiedlichen Adress-Spaces<ref>Im Gegensatz zu einem Attribute wie <tt>progmem</tt> ist ein (Adress Space) Qualifier Teil des Zeiger-Typs.</ref>: <br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdbool.h><br />
<br />
char read_char (const char *address, bool data_in_flash)<br />
{<br />
if (data_in_flash)<br />
return *(const __flash char*) address;<br />
else<br />
return *address;<br />
}<br />
</syntaxhighlight><br />
<br />
Der Cast selbst erzeugt keinen zusätzlichen Code, da eine RAM-Adresse und eine Flash-Adresse die gleiche Binärdarstellung haben. Allerdings wird über den nach <tt>__flash</tt> gecasteten Zeiger anders zugegriffen, nämlich per LPM.<br />
<br />
=== Jenseits von __flash ===<br />
<br />
Ausser <tt>__flash</tt> gibt es auch folgende Address-Spaces:<br />
<br />
==== <tt>__flash</tt>''N'' ====<br />
<br />
<tt>__flash</tt>''N'' mit ''N'' = 1..5 sind fünf weitere Spaces, die analog zu <tt>__flash</tt> funktionieren und deren Zeiger ebenfalls 16 Bit breit sind. avr-gcc erwartet, dass die zugehörigen Daten, welche in die Section <tt>.progmem</tt>''N''<tt>.data</tt> abgelegt werden, so lokatiert sind, dass das high-Byte der Adresse (Bits 16..23) gerade ''N'' ist.<br />
<br />
Weil Daten- und Code-Layout höchst projektspezifisch sind, werden diese Sections im Standard Linker-Skript nicht beschrieben. Um funktionsfähigen Code zu erhalten, muss daher ein eigenes Linker-Skript zur Verfügung gestellt werden, das diese Sections beschreibt, oder es kann eine Erweiterung des Standard Skripts bereitgestellt werden falls dies möglich ist.<br />
<br />
;Beispiel: Eine Applikation, die <tt>__flash2</tt> verwendet. Die zugehörende Section <tt>.progmem2.data</tt> wird hinter <tt>.text</tt> angeordnet aber vor den Initializern für <tt>.data</tt>. Dazu wird beim Linken das ld-Skript Fragment per <tt>-Tflash12.ld</tt> angegeben, welches dann an der gewünschten Stelle in das default Skript eingefügt wird:<br />
:{| <!-- Tabelle bitte für korrekte Einrückung belassen --><br />
|-<br />
|<pre><br />
SECTIONS<br />
{<br />
.flash2 :<br />
{<br />
. = MAX (ABSOLUTE(0x20000), .);<br />
PROVIDE (__flash2_start = .);<br />
. = ALIGN(2);<br />
*(.flash2.text*)<br />
*(.progmem2.data*)<br />
PROVIDE (__flash2_end = .);<br />
<br />
ASSERT (__flash2_start == __flash2_end || __flash2_start >= ABSOLUTE(0x20000),<br />
"__flash2 data in .progmem2.data below 0x20000");<br />
ASSERT (__flash2_start == __flash2_end || __flash2_end <= ABSOLUTE(0x30000),<br />
"__flash2 data in .progmem2.data exceeds 0x30000");<br />
}<br />
}<br />
INSERT AFTER .text<br />
</pre><br />
|}<br />
<br />
==== <tt>__memx</tt> ====<br />
<br />
Dieser Address-Space implementiert 3-Byte Zeiger und unterstützt Lesen über 64KiB-Segmentgrenzen hinweg. Das MSB (Bit 23) gibt dabei an, ob der <tt>__memx</tt>-Zeiger eine Flash-Adresse enthält (Bit23 = 0) oder eine RAM-Adresse (Bit23 = 1), was folgenden Code erlaubt:<br />
<br />
<syntaxhighlight lang="c"><br />
const __memx int a_flash = 42;<br />
const int a_ram = 100;<br />
<br />
int get_a (const __memx int* pa)<br />
{<br />
return *pa;<br />
}<br />
<br />
int main (void)<br />
{<br />
return get_a (&a_flash) + get_a (&a_ram);<br />
}</syntaxhighlight><br />
<br />
Dies bedeutet, dass erst zur ''Laufzeit'' entschieden werden kann, ob <tt>get_a</tt> die Daten aus dem RAM oder aus dem Flash lesen soll, was <tt>__memx</tt> im Vergleich zu den anderen Address-Spaces langsamer macht. Ausserdem ist zu beachten, dass <tt>__memx</tt>-Zeiger zwar 24-Bit Zeiger sind, die zugrundeliegende Adress-Arithmetik jedoch gemäß dem C-Standard erfolgt, also als 16-Bit Arithmetik. Bestehende Funktion der avr-libc wie z.B. printf_P funktionieren damit ebensowenig wie printf! Wenn man <tt>__memx</tt> verwenden will, braucht man dafür eigene Funktionen.<br />
<br />
=== __flash, progmem und Portierbarkeit ===<br />
<br />
Da ab er aktuellen Compilerversion 4.7 sowohl <tt>__flash</tt> als auch <tt>PROGMEM</tt> und die <tt>pgm_read</tt>-Funktionen zur Verfügung stehen, ergibt sich die Frage, welche Variante "besser" ist und wie zwischen ihnen hin- und her zu portieren ist.<br />
<br />
Zunächst sei erwähnt, dass <tt>__flash</tt> kein Ersatz für <tt>PROGMEM</tt> ist, sondern lediglich eine Alternative dazu. Das "alte" progmem wird weiterhin mir gleicher Semantik unterstützt, so dass alter Code ohne Änderungen mit den neueren Compilerversionen übersetzbar bleibt.<br />
<br />
Von der Codegüte her dürften sich keine großen Unterschiede ergeben. Es ist nicht zu erwarten, dass die eine oder die andere Variante wesentlich besseren oder schlechteren Code erzeugt — von einer Ausnahme abgesehen: Der Wert beim Zugriff ist zur Compilezeit bekannt und kann daher eliminiert werden.<br />
<syntaxhighlight lang="c"><br />
static const __flash char x[] = { 'A', 'V', 'R' };<br />
<br />
char foo (void)<br />
{<br />
return x[2];<br />
}<br />
</syntaxhighlight><br />
Dies wird übersetzt wie "<tt>return 'R';</tt>", und das Array <tt>x[]</tt> kann komplett wegoptimiert werden und entfallen.<br />
<br />
==== progmem → __flash ====<br />
<br />
Portierung in diese Richtung bedeutet, alten Code anzupassen. Zwingend ist die Portierung nicht, da <tt>progmem</tt> weiterhin unterstützt wird.<br />
Allerdings ist eine Quelle mit <tt>__flash</tt> besser lesbar, denn der Code wird von den <tt>pgm_read</tt>-Funktionen befreit, die vor allem bei Mehrfach-Indirektion den Code ziemlich verunstalten und unleserlich machen können.<br />
Weiterer Vorteil von <tt>_flash</tt> ist, daß eine striktere Typprüfung erfolgen kann.<br />
<br />
Eine Portierung wird man in zwei Schritten vornehmen:<br />
<br />
;1. Definitionen von Flash-Variablen werden angepasst:<br />
<br />
Vorher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
static const char hund[] PROGMEM = "Hund";<br />
static const char katze[] PROGMEM = "Katze";<br />
static const char maus[] PROGMEM = "Maus";<br />
<br />
const char * const tier[] PROGMEM = <br />
{<br />
hund, katze, maus<br />
};<br />
</syntaxhighlight><br />
|}<br />
<br />
Nachher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
static const __flash char hund[] = "Hund";<br />
static const __flash char katze[] = "Katze";<br />
static const __flash char maus[] = "Maus";<br />
<br />
const __flash char * const __flash tier[] = <br />
{<br />
hund, katze, maus<br />
};<br />
</syntaxhighlight><br />
|}<br />
<br />
Der Header <tt>avr/pgmspace.h</tt> wird nicht mehr benötigt. Im Gegensatz zu <tt>progmem</tt> müssen Qualifier immer links von der definierten Variablen stehen; bei Attributen wie <tt>progmem</tt> ist das mehr oder weniger egal.<br />
<br />
Nachdem diese Anpassung erfolgreich abgeschlossen ist, folgt Schritt<br />
<br />
; 2. Der Code wird von <tt>pgm_read</tt>-Aufrufen bereinigt:<br />
<br />
Vorher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
extern const char *tier[];<br />
<br />
char first_letter (uint8_t i)<br />
{<br />
const char* ptier = (const char*) pgm_read_word (&tier[i]);<br />
return (char) pgm_read_byte (&ptier[0]);<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
Nachher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <stdint.h><br />
<br />
extern const __flash char * const __flash tier[];<br />
<br />
char first_letter (uint8_t i)<br />
{<br />
return tier[i][0];<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
== Dateien direkt im Flash einbinden ==<br />
<br />
Wenn man größere Dateien direkt im Programm einbinden will, ohne sie vorher in C Quelltext umzuwandeln, muss man das mit dem Linker machen. Wie das geht steht hier.<br />
<br />
* [http://www.atmel.com/webdoc/avrlibcreferencemanual/FAQ_1faq_binarydata.html Atmel, avr gcc Dokumentation]<br />
* [http://nongnu.org/avr-libc/user-manual/FAQ.html#faq_binarydata Nongnu avr gcc Dokumentation]<br />
<br />
Wie man das dann praktisch umsetzt, sieht man in diesem Beitrag.<br />
<br />
* [https://www.mikrocontroller.net/topic/361429?goto=4056910#4056910 Forumsbeitrag]: Binärdateien mittels Linker einbinden<br />
* [https://www.mikrocontroller.net/topic/361429?goto=4056910#4056947 Forumsbeitrag]: Ein kleines Tool zum Umwandeln von Binärdateien in C-Quelltext.<br />
<br />
== Flash in der Anwendung schreiben ==<br />
<br />
Bei AVRs mit "self-programming"-Option – auch bekannt als [[Bootloader]]-Support – können Teile des Flash-Speichers vom Anwendungsprogramm beschrieben werden. Dies ist nur möglich, wenn die Schreibfunktion in einem besonderen Speicherbereich, der Boot-Section des Programmspeichers/Flash, abgelegt ist.<br />
<br />
Bei einigen kleinen AVRs gibt es keine gesonderte Boot-Section, bei diesen kann der Flashspeicher von jeder Stelle des Programms geschrieben werden. Für Details sei hier auf das jeweilige Controller-Datenblatt und die Erläuterungen zum Modul boot.h der avr-libc verwiesen. Es existieren auch Application-Notes dazu bei atmel.com, die auf avr-gcc-Code übertragbar sind.<br />
<br />
Siehe auch: <br />
* Forumsbeitrag [http://www.mikrocontroller.net/topic/163632#1561622 Daten in Programmspeicher speichern]<br />
<br />
== EEPROM ==<br />
<br />
Möchte man Werte aus einem Programm heraus so speichern, dass sie auch nach dem Abschalten der Versorgungsspannung noch erhalten bleiben und nach dem Wiederherstellen der Versorgungsspannung bei erneutem Programmstart wieder zur Verfügung stehen, dann benutzt man das EEPROM.<br />
<br />
Schreib- und Lesezugriffe auf den EEPROM-Speicher erfolgen über die im Modul eeprom.h der avr-libc definierten Funktionen. Mit diesen Funktionen können einzelne Bytes, Datenworte (16 Bit), Fließkommawerte (32 Bit, single-precision, float) und Datenblöcke geschrieben und gelesen werden.<br />
<br />
Diese Funktionen kümmern sich auch um diverse Details, die bei der Benutzung des EEPROMs normalerweise notwendig sind:<br />
* EEPROM-Operationen sind im Vergleich relativ langsam. Man muss daher darauf achten, dass eine vorhergehende Operation abgeschlossen ist, ehe die nächste Operation mit dem EEPROM gestartet wird. Die in der avr-libc implementierten Funktionen aus eeprom.h berücksichtigten dies. Soll beim Aufruf einer EEPROM-Funktion sichergestellt werden, dass diese nicht intern in einer Warteschleife auf den Abschluss der vorherigen Operation wartet, kann vorher per eeprom_is_ready testen, ob der Zugriff auf den EEPROM-Speicher sofort möglich ist.<br />
* Es ist darauf zu achten, dass die EEPROM-Funktionen nicht durch einen Interrupt unterbrochen werden. Einige Phasen des Zugriffs sind zeitkritisch und müssen in einer definierten bzw. begrenzten Anzahl von Takten durchgeführt werden. Durch einen unterbrechenden Interrupt würde diese Restriktion nicht mehr eingehalten. Auch dieses Detail wird von den avr-libc Funktionen berücksichtigt, so dass man sich als C-Programmierer nicht darum kümmern muss. Innerhalb der Funktionen werden Interrupts vor der "EEPROM-Sequenz" global deaktiviert und im Anschluss, falls vorher auch schon eingeschaltet, wieder aktiviert.<br />
<br />
Man beachte, dass der EEPROM-Speicher nur eine begrenzte Anzahl von Schreibzugriffen zulässt. Beschreibt man eine EEPROM-Zelle öfter als die im Datenblatt zugesicherte Anzahl (typisch 100.000), wird die Funktion der Zelle nicht mehr garantiert. Dies gilt für jede einzelne Zelle. <br />
<br />
Bei geschickter Programmierung (z.&nbsp;B. Ring-Puffer), bei der die zu beschreibenden Zellen regelmäßig gewechselt werden, kann man eine deutlich höhere Anzahl an Schreibzugriffen, bezogen auf den gesamten EEPROM-Speicher, erreichen. Auf jeden Fall sollte man aber eine Abschätzung über die zu erwartende Lebensdauer des EEPROM durchführen. Wird ein Wert im EEPROM im Durchschnitt nur einmal pro Woche verändert, wird die garantierte Anzahl der Schreibzyklen innerhalb der voraussichtlichen Verwendungszeit des Controllers sicherlich nicht erreicht werden. Welcher Controller ist schon 100000 / 52 = 1923 Jahre im Einsatz? In diesem Fall lohnt es sich daher nicht, erweiterte Programmfunktionen zu implementieren, mit denen die Anzahl der Schreibzugriffe minimiert wird.<br />
<br />
Eine weitere Möglichkeit, Schreibzyklen einzusparen, besteht in der Vorabprüfung, ob der zu speichernde Wert im EEPROM bereits enthalten ist und nur veränderte Werte zu schreiben. In aktuelleren Versionen der avr-libc sind bereits Funktionen enthalten, die solche Prüfungen enthalten (eeprom_update_*).<br />
<br />
Eine dritte Möglichkeit speichert alle Daten zunächst im RAM, wo sie beliebig oft beschrieben werden können. Nur beim Ausschalten oder beim Ausfall der Stromversorgung werden die Daten in den EEPROM geschrieben. Wie man das richtig macht sieht man im Artikel [[Speicher#EEPROM Schreibzugriffe minimieren | Speicher]].<br />
<br />
Lesezugriffe können beliebig oft durchgeführt werden. Sie unterliegen keinen Einschränkungen in Bezug auf deren Anzahl. <br />
<br />
=== EEMEM ===<br />
Um eine Variable im EEPROM anzulegen, stellt die avr-libc das Makro EEMEM zur Verfügung:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdint.h><br />
#include <avr/eeprom.h><br />
<br />
/* Byte */<br />
uint8_t eeFooByte EEMEM = 123;<br />
<br />
/* Wort */<br />
uint16_t eeFooWord EEMEM = 12345;<br />
<br />
/* float */<br />
float eeFooFloat EEMEM;<br />
<br />
/* Byte-Array */<br />
uint8_t eeFooByteArray1[] EEMEM = { 18, 3, 70 };<br />
uint8_t eeFooByteArray2[] EEMEM = { 30, 7, 79 };<br />
<br />
/* 16-bit unsigned short feld */<br />
uint16_t eeFooWordArray1[4] EEMEM;<br />
</syntaxhighlight><br />
<br />
Die grundsätzliche Vorgehensweise ist identisch zur Verwendung von PROGMEM. Auch hier erzeugt man sich spezielle attributierte Variablen (EEMEM erledigt das), die vom Compiler/Linker nicht wie normale Variablen behandelt werden. Compiler/Linker kümmern sich zwar darum, dass diesen Variablen eine Adresse zugewiesen wird, diese Adresse ist dann aber die Adresse der 'Variablen' im EEPROM. Um die dort gespeicherten Werte zu lesen bzw. zu schreiben, übergibt man diese Adresse an spezielle Funktionen, die die entsprechenden Werte aus dem EEPROM holen bzw. das EEPROM neu beschreiben.<br />
<br />
Die mittels EEMEM erzeugten 'Variablen' sind also mehr als Platzhalter zu verstehen, denn als echte Variablen. Es geht nur darum, im C-Programm symbolische Namen zur Verfügung zu haben, anstatt mit echten EEPROM-Adressen hantieren zu müssen, etwas, das grundsätzlich aber auch genauso gut möglich ist. Nur muss man sich in diesem Fall dann selbst darum kümmern, dass mehrere 'Variablen' ohne Überschneidung im EEPROM angeordnet werden.<br />
<br />
=== Bytes lesen/schreiben ===<br />
<br />
Die avr-libc Funktion zum Lesen eines Bytes heißt eeprom_read_byte. Parameter ist die Adresse des Bytes im EEPROM. Geschrieben wird über die Funktion eeprom_write_byte mit den Parametern Adresse und Inhalt. Anwendungsbeispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#define EEPROM_DEF 0xFF<br />
<br />
void eeprom_example (void)<br />
{<br />
uint8_t myByte;<br />
<br />
// myByte lesen (Wert = 123)<br />
myByte = eeprom_read_byte (&eeFooByte);<br />
<br />
// der Wert 99 wird im EEPROM an die Adresse der<br />
// Variablen eeFooByte geschrieben<br />
myByte = 99;<br />
eeprom_write_byte(&eeFooByte, myByte); // schreiben<br />
<br />
myByte = eeprom_read_byte (&eeFooByteArray1[1]); <br />
// myByte hat nun den Wert 3<br />
<br />
// Beispiel fuer eeprom_update_byte: die EEPROM-Zelle wird nur<br />
// dann beschrieben, wenn deren Inhalt sich vom Parameterwert<br />
// unterscheidet. In diesem Beispiel erfolgt also kein Schreib-<br />
// zugriff, da die Werte gleich sind.<br />
eeprom_update_byte(&eeFooByte, myByte);<br />
<br />
<br />
// Beispiel zur "Sicherung" gegen leeres EEPROM nach "Chip Erase"<br />
// (z. B. wenn die .eep-Datei nach Programmierung einer neuen Version<br />
// des Programms nicht in den EEPROM uebertragen wurde und EESAVE<br />
// deaktiviert ist (unprogrammed/1)<br />
// <br />
// Vorsicht: wenn EESAVE "programmed" ist, hilft diese Sicherung nicht<br />
// weiter, da die Speicheraddressen in einem neuen/erweiterten Programm<br />
// moeglicherweise verschoben wurden. An der Stelle &eeFooByte steht<br />
// dann u.U. der Wert einer anderen Variable aus einer "alten" Version.<br />
<br />
uint8_t fooByteDefault = 222;<br />
if ((myByte = eeprom_read_byte (&eeFooByte)) == EEPROM_DEF)<br />
{<br />
myByte = fooByteDefault;<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
=== Wort lesen/schreiben ===<br />
<br />
Schreiben und Lesen von Datenworten erfolgt analog zur Vorgehensweise bei Bytes:<br />
<br />
<syntaxhighlight lang="c"><br />
// lesen<br />
uint16_t myWord = eeprom_read_word (&eeFooWord);<br />
<br />
// schreiben<br />
eeprom_write_word (&eeFooWord, 2222);<br />
</syntaxhighlight><br />
<br />
=== Block lesen/schreiben ===<br />
<br />
Lesen und Schreiben von Datenblöcken erfolgt über die Funktionen <code>eeprom_read_block()</code> bzw. <code>eeprom_write_block()</code>. Die Funktionen erwarten drei Parameter: die Adresse der Quell- bzw. Zieldaten im RAM, die EEPROM-Adresse und die Länge des Datenblocks in Bytes als <code>size_t</code>.<br />
<syntaxhighlight lang="c"><br />
uint8_t myByteBuffer[3];<br />
uint16_t myWordBuffer[4];<br />
<br />
void eeprom_block_example (void)<br />
{<br />
/* Datenblock aus EEPROM lesen */<br />
<br />
/* liest 3 Bytes ab der von eeFooByteArray1 definierten EEPROM-Adresse<br />
in das RAM-Array myByteBuffer */<br />
eeprom_read_block (myByteBuffer, eeFooByteArray1, 3);<br />
<br />
/* dito mit etwas Absicherung betr. der Länge */<br />
eeprom_read_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));<br />
<br />
/* und nun mit 16-Bit Array */<br />
eeprom_read_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));<br />
<br />
/* Datenblock in EEPROM schreiben */<br />
eeprom_write_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));<br />
eeprom_write_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));<br />
}<br />
</syntaxhighlight><br />
<br />
=== Fließkommawerte lesen/schreiben ===<br />
<br />
In der avr-libc stehen auch EEPROM-Funktionen für Variablen des Typs float (Fließkommazahlen mit "einfacher" Genauigkeit) zur Verfügung.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/eeprom.h><br />
<br />
float eeFloat EEMEM = 12.34f;<br />
<br />
float void eeprom_float_example(float value)<br />
{<br />
/* float in EEPROM schreiben */<br />
eeprom_write_float(&eeFloat, value);<br />
<br />
/* float aus EEPROM lesen */<br />
return eeprom_read_float(&eeFloat);<br />
}</syntaxhighlight><br />
<br />
=== EEPROM-Speicherabbild in .eep-Datei ===<br />
<br />
Mit den zum Compiler gehörenden Werkzeugen kann der aus den Variablendeklarationen abgeleitete EEPROM-Inhalt in eine Datei geschrieben werden. Die übliche Dateiendung ist .eep, Daten im Intel Hex-Format. Damit können Standardwerte für den EEPROM-Inhalt im Quellcode definiert werden. <br />
<br />
Makefiles nach WinAVR/MFile-Vorlage enthalten bereits die notwendigen Einstellungen, siehe dazu die Erläuterungen im [[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]].<br />
<br />
Der Inhalt der eep-Datei muss ebenfalls zum Mikrocontroller übertragen werden, wenn die Initialisierungswerte aus der Deklaration vom Programm erwartet werden. Ansonsten enthält der EEPROM-Speicher nach der Übertragung des Programmers mittels ISP abhängig von der Einstellung der EESAVE-Fuse<ref>vgl. Datenblatt Abschnitt Fuse Bits</ref> nicht die korrekten Werte:<br />
; EESAVE = 0 (programmed): Die Daten im EEPROM bleiben erhalten. Werden sie nicht neu geschrieben, so enthält das EEPROM evtl. Daten, die nicht mehr zum Programm passen.<br />
; EESAVE = 1 (unprogrammed): Beim Programmieren werden die Daten im EEPROM gelöscht, also auf 0xff gesetzt.<br />
<br />
Als Sicherung kann man im Programm nochmals die Standardwerte vorhalten, beim Lesen auf 0xFF prüfen und gegebenenfalls einen Standardwert nutzen. Das geht natürlich nur, wenn 0xFF selbst nicht als Datenwert vorkommen kann.<br />
<syntaxhighlight lang="c"><br />
#define DUTY_CYCLE_DEFAULT 0x80<br />
<br />
uint8_t eeDutyCycle EEMEM; // Platzhalter für EEPROM<br />
uint8_t DutyCycle; // die echte Variable<br />
<br />
<br />
int main(void)<br />
{<br />
DutyCycle = eeprom_read_byte( &eeDutyCycle );<br />
if( DutyCycle == 0xFF ) // das allererste mal. Im EEPROM steht noch kein gültiger Wert<br />
{<br />
DutyCycle = DUTY_CYCLE_DEFAULT;<br />
eeprom_writeByte( &eeDutyCycle, DutyCycle );<br />
}<br />
<br />
...<br />
</syntaxhighlight><br />
<br />
=== Direkter Zugriff auf EEPROM-Adressen ===<br />
<br />
Will man direkt auf bestimmte EEPROM Adressen zugreifen, dann sind folgende IAR-kompatiblen Makros <tt>_EEGET</tt> und <tt>_EEPUT</tt> hilfreich, um sich die Typecasts zu ersparen.<br />
<br />
;Hinweis: Die nachfolgend gezeigten Makros und Zugriffe auf absolute Adressen sind in Normalfall nicht nötig und nur auf sehr wenige, spezielle Fälle beschränkt! Im Normalfall sollte man auf absolute Adressen möglichst nicht zugreifen und den Compiler seine Arbeit machen lassen, der verwaltet die Variablen und deren Adressen meist besser als der Programmierer. Der Zugriff auf Variablen im EEPROM sollte immer über ihren Namen erfolgen.<br />
<br />
Verwendung:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/eeprom.h><br />
<br />
_EEPUT (0x20, 128); // Byte-Wert 128 an Adresse 0x20 schreiben<br />
...<br />
uint8_t val = _EEGET (0x20); // EEPROM-Wert von Adresse 0x20 lesen<br />
</syntaxhighlight><br />
<br />
=== Was steckt dahinter? - EEPROM-Register ===<br />
Auch wenn es normalerweise keinen Grund gibt, in C selbst an den Steuerregistern herumzuschrauben - die eeprom Funktionen erledigen das alles zuverlässig - der Vollständigkeit halber der registermässige technische Unterbau.<br />
Um das EEPROM anzusteuern, sind drei Register von Bedeutung:<br />
;EEAR: Hier werden die Adressen eingetragen zum Schreiben oder Lesen. Dieses Register unterteilt sich nochmal in EEARH und EEARL, da in einem 8-Bit-Register keine 512 Adressen adressiert werden können.<br />
;EEDR: Hier werden die Daten eingetragen, die geschrieben werden sollen, bzw. es enthält die gelesenen Daten.<br />
;EECR: Ist das Kontrollregister für das EEPROM<br />
<br />
Das EECR steuert den Zugriff auf das EEPROM und ist wie folgt aufgebaut:<br />
<br />
:{| class="wikitable" style="text-align:center"<br />
|+ '''Aufbau des EECR-Registers'''<br />
|-<br />
!Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|-<br />
! Name<br />
| - || - || - ||- || EERIE || EEMWE || EEWE || EERE<br />
|-<br />
! Read/Write<br />
| R || R || R || R || R/W || R/W || R/W || R/W<br />
|-<br />
!Init Value<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''Bedeutung der Bits'''<br />
<br />
;Bit 4-7: nicht belegt<br />
<br />
;Bit 3 (EERIE): ''EEPROM Ready Interrupt Enable'': Wenn das Bit gesetzt ist und globale Interrupts erlaubt sind in Register SREG (Bit 7), wird ein Interrupt ausgelöst nach Beendigung des Schreibzyklus (EEPROM Ready Interrupt). Ist einer der beiden Bits 0, wird kein Interrupt ausgelöst.<br />
<br />
;Bit 2 EEMWE): ''EEPROM Master Write Enable'': Dieses Bit bestimmt, dass, wenn EEWE = 1 gesetzt wird (innerhalb von 4 Taktzyklen), das EEPROM beschrieben wird mit den Daten in EEDR bei Adresse EEAR. Wenn EEMWE = 0 ist und EEWE = 1 gesetzt wird, hat das keine Auswirkungen. Der Schreibvorgang wird dann nicht ausgelöst. Nach 4 Taktzyklen wird das Bit EEMWE automatisch wieder auf 0 gesetzt. Dieses Bit löst den Schreibvorgang nicht aus, es dient sozusagen als Sicherungsbit für EEWE.<br />
<br />
;Bit 1 (EEWE): ''EEPROM Write Enable'': Dieses Bit löst den Schreibvorgang aus, wenn es auf 1 gesetzt wird, sofern vorher EEMWE gesetzt wurde und seitdem nicht mehr als 4 Taktzyklen vergangen sind. Wenn der Schreibvorgang abgeschlossen ist, wird dieses Bit automatisch wieder auf 0 gesetzt und, sofern EERIE gesetzt ist, ein Interrupt ausgelöst. Ein Schreibvorgang sieht typischerweise wie folgt aus:<br />
:# EEPROM-Bereitschaft abwarten (EEWE=0) <br />
:# Adresse übergeben an EEAR<br />
:# Daten übergeben an EEDR<br />
:# Schreibvorgang auslösen in EECR mit Bit EEMWE=1 und EEWE=1<br />
:# (Optional) Warten, bis Schreibvorgang abgeschlossen ist<br />
<br />
;Bit 0 EERE: ''EEPROM Read Enable'': Wird dieses Bit auf 1 gesetzt wird das EEPROM an der Adresse in EEAR ausgelesen und die Daten in EEDR gespeichert. Das EEPROM kann nicht ausgelesen werden, wenn bereits eine Schreiboperation gestartet wurde. Es ist daher zu empfehlen, die Bereitschaft vorher zu prüfen. Das EEPROM ist lesebereit, wenn das Bit EEWE=0 ist. Ist der Lesevorgang abgeschlossen, wird das Bit wieder auf 0 gesetzt, und das EEPROM ist für neue Lese- und Schreibbefehle wieder bereit. Ein typischer Lesevorgang kann wie folgt aufgebaut sein:<br />
:# Bereitschaft zum Lesen prüfen (EEWE=0)<br />
:# Adresse übergeben an EEAR<br />
:# Lesezyklus auslösen mit EERE = 1<br />
:# Warten, bis Lesevorgang abgeschlossen EERE = 0<br />
:# Daten abholen aus EEDR<br />
<br />
= Die Nutzung von sprintf und printf =<br />
<br />
Um komfortabel, d.h. formatiert, Ausgaben auf ein Display oder die serielle Schnittstelle zu tätigen, bieten sich '''sprintf''' oder '''printf''' an. Alle *printf-Varianten sind jedoch ziemlich speicherintensiv und der Einsatz in einem Mikrocontroller mit knappem Speicher muss sorgsam abgewogen werden.<br />
<br />
Bei '''sprintf''' wird die Ausgabe zunächst in einem Puffer vorbereitet und anschließend mit einfachen Funktionen zeichenweise ausgegeben. Es liegt in der Verantwortung des Programmierers, genügend Platz im Puffer für die erwarteten Zeichen bereitzuhalten.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdio.h><br />
#include <stdint.h><br />
<br />
// ...<br />
// nicht dargestellt: Implementierung von uart_puts (vgl. Abschnitt UART)<br />
// ...<br />
<br />
uint16_t counter;<br />
<br />
// Ausgabe eines unsigned Integerwertes<br />
void uart_puti( uint16_t value )<br />
{<br />
uint8_t puffer[20];<br />
<br />
sprintf( puffer, "Zählerstand: %u", value );<br />
uart_puts( puffer );<br />
}<br />
<br />
int main()<br />
{<br />
counter = 5;<br />
<br />
uart_puti( counter );<br />
uart_puti( 42 );<br />
}<br />
</syntaxhighlight><br />
<br />
Eine weitere elegante Möglichkeit besteht darin, den STREAM stdout (Standardausgabe) auf eine eigene Ausgabefunktion umzuleiten. Dazu wird dem Ausgabemechanismus der C-Bibliothek eine neue Ausgabefunktion bekannt gemacht, deren Aufgabe es ist, ein einzelnes Zeichen auszugeben. Wohin die Ausgabe dann tatsächlich stattfindet, ist Sache der Ausgabefunktion. Im Beispiel unten wird auf UART ausgegeben. Alle anderen, höheren Funktionen wie z.&nbsp;B. '''printf''', greifen letztendlich auf diese primitive Ausgabefunktion zurück. <br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdio.h><br />
<br />
void uart_init(void);<br />
<br />
// a. Deklaration der primitiven Ausgabefunktion<br />
int uart_putchar(char c, FILE *stream);<br />
<br />
// b. Umleiten der Standardausgabe stdout (Teil 1)<br />
static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );<br />
<br />
// c. Definition der Ausgabefunktion<br />
int uart_putchar( char c, FILE *stream )<br />
{<br />
if( c == '\n' )<br />
uart_putchar( '\r', stream );<br />
<br />
loop_until_bit_is_set( UCSRA, UDRE );<br />
UDR = c;<br />
return 0;<br />
}<br />
<br />
void uart_init(void)<br />
{<br />
/* hier µC spezifischen Code zur Initialisierung */<br />
/* des UART einfügen... s.o. im AVR-GCC-Tutorial */<br />
<br />
// Beispiel: <br />
//<br />
// myAVR Board 1.5 mit externem Quarz Q1 3,6864 MHz<br />
// 9600 Baud 8N1<br />
<br />
#ifndef F_CPU<br />
#define F_CPU 3686400<br />
#endif<br />
#define UART_BAUD_RATE 9600<br />
<br />
// Hilfsmakro zur UBRR-Berechnung ("Formel" laut Datenblatt)<br />
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)<br />
<br />
UCSRB |= (1<<TXEN) | (1<<RXEN); // UART TX und RX einschalten<br />
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 <br />
<br />
UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );<br />
UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );<br />
}<br />
<br />
int main(void)<br />
{<br />
int16_t antwort = 42;<br />
uart_init();<br />
<br />
// b. Umleiten der Standardausgabe stdout (Teil 2)<br />
stdout = &mystdout;<br />
<br />
// Anwendung<br />
printf( "Die Antwort ist %d.\n", antwort );<br />
return 0;<br />
}<br />
<br />
// Quelle: avr-libc-user-manual-1.4.3.pdf, S.74<br />
// + Ergänzungen<br />
</syntaxhighlight><br />
<br />
<br />
Sollen Fließkommazahlen ausgegeben werden, muss im Makefile eine andere (größere) Version der [[FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio|printflib]] eingebunden werden.<br />
<br />
= Anmerkungen =<br />
<references/><br />
<br />
= TODO =<br />
* Aktualisierung Register- und Bitbeschreibungen an aktuelle AVR<br />
* "naked"-Funktionen [http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html][http://arduino.stackexchange.com/questions/8758/arduino-interruption-on-pin-change]<br />
<br />
[[Kategorie:avr-gcc Tutorial| ]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=AVR-GCC-Tutorial&diff=100751
AVR-GCC-Tutorial
2019-07-31T17:50:24Z
<p>Gjlayde: /* Zugriff auf IO-Ports */ Typo</p>
<hr />
<div>Dieses Tutorial soll den Einstieg in die Programmierung von Atmel [[AVR]]-Mikrocontrollern in der Programmiersprache [[C]] mit dem freien C-Compiler [[avr-gcc]] aus der [http://gcc.gnu.org/ GNU Compiler Collection] (GCC) erleichtern.<br />
<br />
Vorausgesetzt werden Grundkenntnisse der Programmiersprache C. Diese Kenntnisse kann man sich online erarbeiten, z. B. mit dem [http://www.schellong.de/c.htm C Tutorial von Helmut Schellong] ([[C|Liste von C-Tutorials]]). Nicht erforderlich sind Vorkenntnisse in der Programmierung von Mikrocontrollern.<br />
<br />
= Vorwort =<br />
<br />
In diesem Text wird häufig auf die Standardbibliothek avr-libc verwiesen, für die es eine [http://www.nongnu.org/avr-libc/user-manual/index.html Online-Dokumentation] gibt, in der sich auch viele nützliche Informationen zum Compiler und zur Programmierung von AVR-Controllern finden. Beim Paket [[WinAVR]] gehört die avr-libc Dokumentation zum Lieferumfang und wird mitinstalliert.<br />
<br />
Der Compiler und die Standardbibliothek avr-libc werden ständig weiterentwickelt. Einige Unterschiede, die sich im Verlauf der Entwicklung ergeben haben, werden hier und im Artikel [[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen]] zwar angesprochen, Anfängern und Umsteigern sei jedoch empfohlen, eine aktuelle Versionen zu nutzen.<br />
<br />
Das ursprüngliche Tutorial stammt von Christian Schifferle, viele neue Abschnitte und aktuelle Anpassungen von Martin Thomas.<br />
<br />
Dieses Tutorial ist in [[Media:AVR-GCC-Tutorial.pdf|PDF-Form]] erhältlich (zur Zeit nur eine sehr veraltete Version).<br />
<br />
== Weiterführende Kapitel ==<br />
<br />
Um dieses riesige Tutorial etwas überschaubarer zu gestalten, wurden einige Kapitel ausgelagert, die nicht unmittelbar mit den Grundlagen von avr-gcc in Verbindung stehen. All diese Seiten gehören zur [[:Kategorie:avr-gcc Tutorial]].<br />
<br />
;UART: → Hauptartikel: ''[[AVR-GCC-Tutorial/Der UART|Der UART]]''<br />
<br />
;ADC: → Hauptartikel: ''[[AVR-GCC-Tutorial/Analoge Ein- und Ausgabe|Analoge Ein- und Ausgabe (ADC)]]''<br />
<br />
;Timer: → Hauptartikel: ''[[AVR-GCC-Tutorial/Die Timer und Zähler des AVR|Die Timer und Zähler des AVR]]''<br />
<br />
;LCD: → Hauptartikel: ''[[AVR-GCC-Tutorial/LCD-Ansteuerung|LCD-Ansteuerung]]''<br />
<br />
;Watchdog: → Hauptartikel: ''[[AVR-GCC-Tutorial/Der Watchdog|Der Watchdog]]''<br />
<br />
;Assembler: → Hauptartikel: ''[[AVR-GCC-Tutorial/Assembler und Inline-Assembler|Assembler und Inline-Assembler]]''<br />
<br />
;alte Quellen anpassen: → Hauptartikel: ''[[AVR-GCC-Tutorial/Alte Quellen|Alte Quellen anpassen]]''<br />
<br />
;Makefiles: → Hauptartikel: ''[[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]]'' sowie als Alternative für sehr kleine Projekte → Hauptartikel: ''[[C ohne Makefile]]''<br />
<br />
= Benötigte Werkzeuge =<br />
<br />
Um eigene Programme für AVRs mittels einer AVR-Toolchain zu erstellen wird folgende Hard- und Software benötigt:<br />
<br />
* Eine AVR-Toolchain bestehend aus avr-gcc, den avr-Binutils (Assembler, Linker, etc) und einer Standard-C Bibliothek. Üblich ist die AVR-LibC, die auch quasi in allen avr-gcc Distributionen enthalten ist.<br />
<br />
Hardware wird keine benötigt – bis auf einen PC natürlich, auf dem der Compiler ablaufen kann. Selbst ohne AVR-Hardware kann man also bereits C-Programme für AVRs schreiben, compiliern und sich das Look-and-Feel von avr-gcc sowie von IDEs wie [[Atmel Studio]], Eclipse oder leichtgewichtigeren Entwicklungsumbgebungen anschauen. Selbst das Debuggen und Simulieren ist mithilfe entsprechender Tools wie Debugger und Simulator in gewissen Grenzen möglich.<br />
<br />
Um Programme für AVRs mittels einer AVR-Toolchain zu testen, wird folgende Hard- und Software benötigt:<br />
<br />
* Platine oder Versuchsaufbau für die Aufnahme eines AVR-Controllers, der vom avr-gcc Compiler unterstützt wird.<ref>Für eine Liste der unterstützten COntroller siehe die Dokumentation des Compilers oder [http://www.nongnu.org/avr-libc/user-manual/index.html#supported_devices AVR-Libc: Supported Devices].</ref> Dieses Testboard kann durchaus auch selbst gelötet oder auf einem Steckbrett aufgebaut werden. Einige Registerbeschreibungen dieses Tutorials beziehen sich auf den inzwischen veralteten AT90S2313. Der weitaus größte Teil des Textes ist aber für alle Controller der AVR-Familie gültig. <br />
<br />
:Brauchbare Testplattformen sind auch das [[STK500]] und der [[AVR Butterfly]] von Atmel. Weitere Infos findet man in den Artikeln [[AVR#Starterkits|AVR Starterkits]] und [[AVR-Tutorial: Equipment]].<br />
<br />
* Programmiersoftware und -[[AVR In System Programmer |hardware]] z. B. PonyProg (siehe auch: [[Pony-Prog Tutorial]]) oder [[AVRDUDE]] mit [[STK200]]-Dongle oder die von Atmel verfügbare Hard- und Software ([[STK500]], Atmel AVRISP, [[AVR-Studio]]).<br />
<br />
* Nicht unbedingt erforderlich, aber zur Simulation und zum Debuggen unter MS-Windows recht nützlich: [[AVR-Studio]].<br />
<br />
* Wer unter Windows und Linux gleichermassen entwickeln will, der sollte sich die [http://www.eclipse.org/ IDE Eclipse for C/C++ Developers] und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] ansehen. Beide sind unter Windows und Linux einfach zu installieren, siehe auch [[AVR Eclipse]]. Ebenfalls unter Linux und Windows verfügbar ist die Entwicklungsumgebung [http://www.codeblocks.org/ Code::Blocks]<ref>Aktuelle, stabile Versionen sind als Nightly Builds regelmäßig im [http://forums.codeblocks.org/ Forum] verfügbar.</ref>. Innerhalb dieser Entwicklungsumgebung können ohne die Installation zusätzlicher Plugins "AVR-Projekte" angelegt werden. Für Linux gibt es auch noch das [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=25220 KontrollerLab].<br />
<br />
= Was tun, wenn's nicht klappt? =<br />
<br />
* Herausfinden, ob es tatsächlich ein avr(-gcc) spezifisches Problem ist oder nur die eigenen C-Kenntnisse einer Auffrischung bedürfen. Allgemeine C-Fragen kann man eventuell "beim freundlichen Programmierer zwei Büro-, Zimmer- oder Haustüren weiter" loswerden. Ansonsten: [[C]]-Buch (gibt's auch "gratis" online) lesen.<br />
<br />
* Die [[AVR Checkliste]] durcharbeiten.<br />
<br />
* Die '''[http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc]''' lesen, vor allem (aber nicht nur) den Abschnitt Related Pages/'''Frequently Asked Questions''' = Oft gestellte Fragen (und Antworten dazu). Z.Zt leider nur in englischer Sprache verfügbar.<br />
<br />
* Den Artikel [[AVR-GCC]] in diesem Wiki lesen.<br />
<br />
* Das [http://www.mikrocontroller.net/forum/gcc GCC-Forum auf www.mikrocontroller.net] nach vergleichbaren Problemen absuchen.<br />
<br />
* Das avr-gcc-Forum bei [http://www.avrfreaks.net AVRfreaks] nach vergleichbaren Problemen absuchen.<br />
<br />
* Das [http://lists.gnu.org/archive/html/avr-gcc-list/ Archiv der avr-gcc Mailing-Liste] nach vergleichbaren Problemen absuchen.<br />
<br />
* Nach Beispielcode suchen. Vor allem im ''Projects''-Bereich von [http://www.avrfreaks.net AVRfreaks] (anmelden).<br />
<br />
* Google oder yahoo befragen schadet nie.<br />
<br />
* Bei Problemen mit der Ansteuerung interner AVR-Funktionen mit C-Code: das Datenblatt des Controllers lesen (ganz und am Besten zweimal). Datenblätter sind auf den [http://www.atmel.com Atmel Webseiten] als pdf-Dateien verfügbar. Das komplette Datenblatt (complete) und nicht die Kurzfassung (summary) verwenden.<br />
<br />
* Die Beispielprogramme im [[AVR-Tutorial]] sind zwar in AVR-Assembler verfasst, Erläuterungen und Vorgehensweisen sind aber auch auf C-Programme übertragbar.<br />
<br />
* Einen Beitrag in eines der Foren oder eine Mail an die Mailing-Liste schreiben. Dabei möglichst viel Information geben: Controller, Compilerversion, genutzte Bibliotheken, Ausschnitte aus dem Quellcode oder besser ein [http://www.mikrocontroller.net/topic/72767#598986 Testprojekt] mit allen notwendigen Dateien, um das Problem nachzuvollziehen, sowie genaue Fehlermeldungen bzw. Beschreibung des Fehlverhaltens. Bei Ansteuerung externer Geräte die Beschaltung beschreiben oder skizzieren (z. B. mit [http://www.tech-chat.de/ Andys ASCII Circuit]). Siehe dazu auch: '''[http://www.tty1.net/smart-questions_de.html "Wie man Fragen richtig stellt"]'''.<br />
<br />
= Erzeugen von Maschinencode =<br />
<br />
Aus dem C-Quellcode erzeugt der avr-gcc Compiler (zusammen mit Hilfsprogrammen wie z.&nbsp;B. Präprozessor, Assembler und Linker) Maschinencode für den AVR-Controller. Üblicherweise liegt dieser Code dann im Intel Hex-Format vor ("Hex-Datei"). Die Programmiersoftware (z.&nbsp;B. [[AVRDUDE]], PonyProg oder AVRStudio/STK500-plugin) liest diese Datei ein und überträgt die enthaltene Information (den Maschinencode) in den Speicher des Controllers. Im Prinzip sind also "nur" der avr-gcc-Compiler (und wenige Hilfsprogramme) mit den "richtigen" Optionen aufzurufen, um aus C-Code eine "Hex-Datei" zu erzeugen. Grundsätzlich stehen dazu drei verschiedene Ansätze zur Verfügung:<br />
<br />
* Die Verwendung einer integrierten Entwicklungsumgebung (IDE = '''I'''ntegrated '''D'''evelopment '''E'''nvironment), bei der alle Einstellungen z.&nbsp;B. in Dialogboxen durchgeführt werden können. Unter Anderem kann AVRStudio ab Version 4.12 (kostenlos auf [http://www.atmel.com/ atmel.com]) zusammen mit WinAVR als integrierte Entwicklungsumgebung für den Compiler avr-gcc genutzt werden (dazu müssen AVRStudio und WinAVR auf dem Rechner installiert sein). Weitere IDEs (ohne Anspruch auf Vollständigkeit): [http://www.eclipse.org/ Eclipse for C/C++ Developers] (d.h. inkl. CDT) und das [http://avr-eclipse.sourceforge.net/wiki/index.php/The_AVR_Eclipse_Plugin AVR-Eclipse Plugin] (für diverse Plattformen, u.a. Linux und MS Windows, IDE und Plugin kostenlos), [http://sourceforge.net/projects/kontrollerlab KontrollerLab] (Linux/KDE, kostenlos). [http://www.atmanecl.com/EnglishSite/SoftwareEnglish.htm AtmanAvr] (MS Windows, relativ günstig), KamAVR (MS-Windows, kostenlos, wird augenscheinlich nicht mehr weiterentwickelt), [http://www.amctools.com/vmlab.htm VMLab] (MS Windows, ab Version 3.12 ebenfalls kostenlos). Integrierte Entwicklungsumgebungen unterscheiden sich stark in Ihrer Bedienung und stehen auch nicht für alle Plattformen zur Verfügung, auf denen der Compiler ausführbar ist (z.&nbsp;B. AVRStudio nur für MS-Windows). Zur Anwendung des avr-gcc Compilers mit IDEs sei hier auf deren Dokumentation verwiesen. <br />
<br />
* Die Nutzung des Programms make mit passenden Makefiles. In den folgenden Abschnitten wird die Generierung von Maschinencode für einen AVR ("hex-Datei") aus C-Quellcode ("c-Dateien") anhand von "make" und den "Makefiles" näher erläutert. Viele der darin beschriebenen Optionen findet man auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio (AVRStudio generiert ein makefile in einem Unterverzeichnis des Projektverzeichnisses). <br />
<br />
* Das Generieren des Programms ohne IDE und ohne Makefile. In diesem Fall muss die Quellcodedatei durch eine vorgefertigte Kommandofolge an den Compiler übergeben werden. Der Artikel [[C ohne Makefile]] zeigt, wie das funktioniert. Diese Vorgehensweise empfiehlt sich jedoch nur für kleine Programme, die nicht auf verschiedene Quellcodedateien verteilt sind.<br />
<br />
Beim Wechsel vom makefile-Ansatz nach WinAVR-Vorlage zu AVRStudio ist darauf zu achten, dass AVRStudio (Stand: AVRStudio Version 4.13) bei einem neuen Projekt die Optimierungsoption (vgl. Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|AVR-GCC-Tutorial/Exkurs: Makefiles]], typisch: -Os) nicht einstellt und die mathematische Bibliothek der avr-libc (libm.a, Linker-Option -lm) nicht einbindet. (Hinweis: Bei Version 4.16 wird beides bereits gesetzt). Beides ist Standard bei Verwendung von makefiles nach WinAVR-Vorlage und sollte daher auch im Konfigurationsdialog des avr-gcc-Plugins von AVRStudio "manuell" eingestellt werden, um auch mit AVRStudio kompakten Code zu erzeugen.<br />
<br />
= Einführungsbeispiel =<br />
<br />
Zum Einstieg ein kleines Beispiel, an dem die Nutzung des Compilers und der Hilfsprogramme (der sogenannten ''Toolchain'') demonstriert wird. Detaillierte Erläuterungen folgen in den weiteren Abschnitten dieses Tutorials.<br />
<br />
Das Programm soll auf einem AVR Mikrocontroller einige Ausgänge ein- und andere ausschalten. Das Beispiel ist für einen ATmega16 programmiert ([http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf Datenblatt]), kann aber sinngemäß für andere Controller der AVR-Familie modifiziert werden. <br />
<br />
Ein kurzes Wort zur Hardware: Bei diesem Programm werden alle Pins von PORTB auf Ausgang gesetzt, und einige davon werden auf HIGH andere auf LOW gesetzt. Das kann je nach angeschlossener Hardware an diesen Pins kritisch sein. Am ungefährlichsten ist es, wenn nichts an den Pins angeschlossen ist und man die Funktion des Programmes durch eine Spannungsmessung mit einem Multimeter kontrolliert. Die Spannung wird dabei zwischen GND-Pin und den einzelnen Pins von PORTB gemessen.<br />
<br />
Zunächst der Quellcode der Anwendung, der in einer Text-Datei mit dem Namen ''main.c'' abgespeichert wird.<br />
<br />
<syntaxhighlight lang="c"><br />
/* Alle Zeichen zwischen Schrägstrich-Stern <br />
und Stern-Schrägstrich sind Kommentare */<br />
<br />
// Zeilenkommentare sind ebenfalls möglich<br />
// alle auf die beiden Schrägstriche folgenden<br />
// Zeichen einer Zeile sind Kommentar<br />
<br />
#include <avr/io.h> // (1)<br />
<br />
int main (void) { // (2)<br />
<br />
DDRB = 0xFF; // (3)<br />
PORTB = 0x03; // (4)<br />
<br />
while(1) { // (5)<br />
/* "leere" Schleife*/ // (6)<br />
} // (7)<br />
<br />
/* wird nie erreicht */<br />
return 0; // (8)<br />
}<br />
</syntaxhighlight><br />
<br />
# In dieser Zeile wird eine sogenannte Header-Datei eingebunden. In <code>avr/io.h</code> sind die Registernamen definiert, die im späteren Verlauf genutzt werden. Auch unter Windows wird ein&nbsp;<code>/</code> zur Kennzeichnung von Unterverzeichnissen in Include-Dateinamen verwendet und kein&nbsp;<code>\</code>.<br />
# Hier beginnt das eigentliche Programm. Jedes C-Programm beginnt mit den Anweisungen in der Funktion <code>main</code>.<br />
# Die Anschlüsse eines AVR (Pins) werden zu Blöcken zusammengefasst, einen solchen Block bezeichnet man als Port. Beim ATmega16 hat jeder Port 8 Anschlüsse, bei kleineren AVRs können einem Port auch weniger als 8 Anschlüsse zugeordnet sein. Da per Definition (Datenblatt) alle gesetzten Bits in einem Datenrichtungsregister den entsprechenden Anschluss auf Ausgang schalten, werden mit DDRB=0xff alle Anschlüsse des Ports B als Ausgänge eingestellt.<br />
# Die den ersten beiden Bits des Ports zugeordneten Anschlüsse (PB0 und PB1) werden 1, alle anderen Anschlüsse des Ports B (PB2-PB7) zu 0. Aktivierte Ausgänge (logisch 1 oder "high") liegen auf Betriebsspannung (VCC, meist 5 Volt), nicht aktivierte Ausgänge führen 0 Volt (GND, Bezugspotential). Es ist sinnvoll, sich möglichst frühzeitig eine alternative Schreibweise beizubringen, die wegen der leichteren Überprüfbarkeit und Portierbarkeit oft im weiteren Tutorial und in Forenbeiträgen benutzt wird. Die Zuordnung sieht in diesem Fall so aus, Näheres dazu im Artikel [[Bitmanipulation]]:<syntaxhighlight lang="c">PORTB = (1<<PB1) | (1<<PB0);</syntaxhighlight><br />
# ist der Beginn der sogenannte ''Hauptschleife'' (main-loop). Dies ist eine Endlosschleife, welche kontinuierlich wiederkehrende Befehle enthält.<br />
# In diesem Beispiel ist die Hauptschleife leer. Der Controller durchläuft die Schleife immer wieder, ohne dass etwas passiert. Eine solche Schleife ist notwendig, da es auf dem Controller kein Betriebssystem gibt, das nach Beendigung des Programmes die Kontrolle übernehmen könnte. Ohne diese Schleife kehrt das Programm aus <code>main</code> zurück, alle Interrupts werden deaktiviert und eine Endlosschleife betreten.<br />
# Ende der Hauptschleife und Sprung zur passenden, öffnenden Klammer, also zu 5.<br />
# ist das Programmende. Die Zeile ist nur aus Gründen der C-Kompatibilität enthalten: <syntaxhighlight lang="c">int main(void)</syntaxhighlight> besagt, dass die Funktion einen int-Wert zurückgibt. Die Anweisung wird aber nicht erreicht, da das Programm die Hauptschleife nie verlässt.<br />
<br />
Um diesen Quellcode in ein lauffähiges Programm zu übersetzen, wird hier ein Makefile genutzt. Das verwendete Makefile findet sich auf der Seite [[Beispiel Makefile]] und basiert auf der Vorlage, die in WinAVR mitgeliefert wird und wurde bereits angepasst (Controllertyp ATmega16). Man kann das Makefile bearbeiten und an andere Controller anpassen oder sich mit dem Programm MFile menügesteuert ein Makefile "zusammenklicken". Das Makefile speichert man unter dem Namen <code>Makefile</code> (ohne Endung) im selben Verzeichnis, in dem auch die Datei <code>main.c</code> mit dem Programmcode abgelegt ist. Detailliertere Erklärungen zur Funktion von Makefiles finden sich im Artikel [[AVR-GCC-Tutorial/Exkurs_Makefiles|Exkurs: Makefiles]].<br />
<br />
<pre><br />
D:\beispiel>dir<br />
<br />
Verzeichnis von D:\beispiel<br />
<br />
28.11.2006 22:53 <DIR> .<br />
28.11.2006 22:53 <DIR> ..<br />
28.11.2006 20:06 118 main.c<br />
28.11.2006 20:03 16.810 Makefile<br />
2 Datei(en) 16.928 Bytes<br />
</pre><br />
<br />
Nun gibt man ''make all'' ein. Falls das mit WinAVR installierte Programmers Notepad genutzt wird, gibt es dazu einen Menüpunkt im Tools Menü. Sind alle Einstellungen korrekt, entsteht eine Datei <code>main.hex</code>, in welcher der Code für den AVR enthalten ist. <br />
<pre><br />
D:\beispiel>make all<br />
<br />
-------- begin --------<br />
avr-gcc (GCC) 3.4.6<br />
Copyright (C) 2006 Free Software Foundation, Inc.<br />
This is free software; see the source for copying conditions. There is NO<br />
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.<br />
<br />
Compiling C: main.c<br />
avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -f<br />
unsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef<br />
-Wa,-adhlns=obj/main.lst -std=gnu99 -Wundef -MD -MP -MF .dep/main.o.d main.c -<br />
o obj/main.o<br />
<br />
Linking: main.elf<br />
avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=1000000UL -Os -funsigned-char -funs<br />
igned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -W<br />
a,-adhlns=obj/main.o -std=gnu99 -Wundef -MD -MP -MF .dep/main.elf.d obj/main.o<br />
--output main.elf -Wl,-Map=main.map,--cref -lm<br />
<br />
Creating load file for Flash: main.hex<br />
avr-objcopy -O ihex -R .eeprom main.elf main.hex<br />
</pre><br />
<br />
Der Inhalt der hex-Datei kann nun zum Controller übertragen werden. Dies kann z.&nbsp;B. über In-System-Programming ([[ISP]]) erfolgen, das im [[AVR-Tutorial: Equipment]] beschrieben ist. Makefiles nach der WinAVR/MFile-Vorlage sind für die Nutzung des Programms [[AVRDUDE]] vorbereitet. Wenn man den Typ und Anschluss des Programmiergerätes richtig eingestellt hat, kann mit ''make program'' die Übertragung mittels AVRDUDE gestartet werden. Jede andere Software, die hex-Dateien lesen und zu einem AVR übertragen kann<ref>z.&nbsp;B. [[Pony-Prog_Tutorial|Ponyprog]], yapp, AVRStudio</ref>, kann natürlich ebenfalls genutzt werden.<br />
<br />
Startet man nun den Controller (Reset-Taster oder Stromzufuhr aus/an), werden vom Programm die Anschlüsse PB0 und PB1 auf 1 gesetzt. Man kann mit einem Messgerät nun an diesem Anschluss die Betriebsspannung messen oder eine [[LED]] leuchten lassen (Anode an den Pin, Vorwiderstand nicht vergessen). An den Anschlüssen PB2-PB7 misst man 0 Volt. Eine mit der Anode mit einem dieser Anschlüsse verbundene LED leuchtet nicht.<br />
<br />
= Ganzzahlige Datentypen (Integer) =<br />
<br />
Bei der Programmierung von Mikrokontrollern ist die Definition einiger ganzzahliger Datentypen sinnvoll, an denen eindeutig die Bit-Länge abgelesen werden kann.<br />
<br />
Standardisierte Datentypen werden in der Header-Datei <code>stdint.h</code> definiert, die folgendermaßen eingebunden werden kann:<br />
<syntaxhighlight lang="c">#include <stdint.h></syntaxhighlight><br />
<br />
{| {{Tabelle}}<br />
|+ '''int-Typen aus <code>stdint.h</code> (C99)'''<br/>&nbsp;<br />
|- bgcolor="#d0d0ff"<br />
!colspan="5"| Vorzeichenbehaftete int-Typen<br />
|- bgcolor="#e8e8ff"<br />
! Typname || Bit-Breite ||colspan="2"| Wertebereich<br />
|align="center| '''C-Entsprechung''' (avr-gcc)<br />
|-<br />
|<code>int8_t</code> ||align="right"| 8 || −128 ⋯ 127 || −2<sup>7</sup> ⋯ 2<sup>7</sup>−1 || <code>signed char</code><br />
|-<br />
|<code>int16_t</code> ||align="right"| 16 || −32768 ⋯ 32767 || −2<sup>15</sup> ⋯ 2<sup>15</sup>−1 || <code>signed short</code>, <code>signed int</code><br />
|-<br />
|<code>int32_t</code> ||align="right"| 32 || −2147483648 ⋯ 2147483647 || −2<sup>31</sup> ⋯ 2<sup>31</sup>−1 || <code>signed long</code><br />
|-<br />
|<code>int64_t</code> ||align="right"| 64 || −9223372036854775808 ⋯ 9223372036854775807 || −2<sup>63</sup> ⋯ 2<sup>63</sup>−1 || <code>signed long long</code><br />
|- bgcolor="#d0d0ff"<br />
!colspan="5"| Vorzeichenlose int-Typen<br />
|- bgcolor="#e8e8ff"<br />
! Typname || Bit-Breite ||colspan="2"| Wertebereich<br />
|align="center| '''C-Entsprechung''' (avr-gcc)<br />
|-<br />
|<code>uint8_t</code> ||align="right"| 8 || 0 ⋯ 255 || 0 ⋯ 2<sup>8</sup>−1 || <code>unsigned char</code><br />
|-<br />
|<code>uint16_t</code> ||align="right"| 16 || 0 ⋯ 65535 || 0 ⋯ 2<sup>16</sup>−1 || <code>unsigned short</code>, <code>unsigned int</code><br />
|-<br />
|<code>uint32_t</code> ||align="right"| 32 || 0 ⋯ 4294967295 || 0 ⋯ 2<sup>32</sup>−1 || <code>unsigned long</code><br />
|-<br />
|<code>uint64_t</code> ||align="right"| 64 || 0 ⋯ 18446744073709551615 || 0 ⋯ 2<sup>64</sup>−1 || <code>unsigned long long</code><br />
|}<br />
<br />
Neben den Typen gibt es auch Makros für die Bereichsgrenzen wie <code>INT8_MIN</code> oder <code>UINT16_MAX</code>. Siehe dazu auch: [http://www.nongnu.org/avr-libc/user-manual/group__avr__stdint.html Dokumentation der avr-libc: Standard Integer Types].<br />
<br />
= Grundsätzlicher Programmaufbau eines µC-Programms =<br />
<br />
Wir unterscheiden zwischen 2 verschiedenen Methoden, um ein<br />
Mikrocontroller-Programm zu schreiben, und zwar völlig unabhängig davon, in<br />
welcher Programmiersprache das Programm geschrieben wird.<br />
<br />
== Sequentieller Programmablauf ==<br />
<br />
[[Image:Sequentielle Programme.gif|left]]<br />
Bei dieser Programmiertechnik wird eine Endlosschleife programmiert, welche im<br />
Wesentlichen immer den gleichen Aufbau hat. Es wird hier nach dem sogenannten EVA-Prinzip gehandelt. EVA steht für "Eingabe, Verarbeitung, Ausgabe".<br />
{{Absatz}}<br />
<br />
== Interruptgesteuerter Programmablauf ==<br />
<br />
[[Image:Interrupt Programme.gif|left]]<br />
Bei dieser Methode werden beim Programmstart zuerst die gewünschten Interruptquellen aktiviert und dann in eine Endlosschleife gegangen, in welcher Dinge erledigt werden können, welche nicht zeitkritisch sind. Wenn ein Interrupt ausgelöst wird, so wird automatisch die zugeordnete Interruptfunktion ausgeführt.<br />
{{Absatz}}<br />
<br />
= Zugriff auf Register =<br />
<br />
Die AVR-Controller verfügen über eine Vielzahl von Registern. Die meisten<br />
davon sind sogenannte Schreib-/Leseregister. Das heißt, das Programm kann die<br />
Inhalte der Register sowohl auslesen als auch beschreiben.<br />
<br />
Register haben einen besonderen Stellenwert bei den AVR Controllern. Sie dienen dem Zugriff auf die Ports und die Schnittstellen des Controllers. Wir unterscheiden zwischen 8-Bit und 16-Bit Registern. Vorerst behandeln wir die 8-Bit Register.<br />
<br />
Einzelne Register sind bei allen AVRs vorhanden, andere wiederum nur bei bestimmten Typen. So sind beispielsweise die Register, welche für den Zugriff auf den UART notwendig sind, selbstverständlich nur bei denjenigen Modellen vorhanden, welche über einen integrierten Hardware UART bzw. USART verfügen.<br />
<br />
Die Namen der Register sind in den Headerdateien zu den entsprechenden AVR-Typen definiert. Dazu muss man den Namen der controllerspezifischen Headerdatei nicht kennen. Es reicht aus, die allgemeine Headerdatei ''avr/io.h'' einzubinden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
</syntaxhighlight><br />
<br />
Ist im Makefile der MCU-Typ z.&nbsp;B. mit dem Inhalt atmega8 definiert (und wird somit per -mmcu=atmega8 an den Compiler übergeben), wird beim Einlesen der io.h-Datei implizit ("automatisch") auch die iom8.h-Datei mit den Register-Definitionen für den ATmega8 eingelesen.<br />
<br />
<!-- Wohl besser als Anhang - spaeter... --><br />
Intern wird diese "Automatik" wie folgt realisiert: Der Controllertyp wird dem Compiler als Parameter übergeben (vgl. ''avr-gcc -c -mmcu=atmega16 [...]'' im Einführungsbeispiel). Wird ein Makefile nach der WinAVR/mfile-Vorlage verwendet, setzt man die Variable ''MCU'', der Inhalt dieser Variable wird dann an passender Stelle für die Compilerparameter verwendet. Der Compiler definiert intern eine dem mmcu-Parameter zugeordnete "Variable" (genauer: ein Makro) mit dem Namen des Controllers, vorangestelltem ''__AVR_'' und angehängten Unterstrichen (z.&nbsp;B. wird bei ''-mmcu=atmega16'' das Makro ''__AVR_ATmega16__'' definiert). Beim Einbinden der Header-Datei ''avr/io.h'' wird geprüft, ob das jeweilige Makro definiert ist und die zum Controller passende Definitionsdatei eingelesen. Zur Veranschaulichung einige Ausschnitte aus einem Makefile:<br />
<br />
<pre><br />
[...]<br />
# MCU Type ("name") setzen:<br />
MCU = atmega16<br />
[...]<br />
<br />
[...]<br />
## Verwendung des Inhalts von MCU (hier atmega16) fuer die <br />
## Compiler- und Assembler-Parameter<br />
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)<br />
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)<br />
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)<br />
[...]<br />
<br />
[...]<br />
## Aufruf des Compilers:<br />
## mit den Parametern ($(ALL_CFLAGS) ist -mmcu=$(MCU)[...] = -mmcu=atmega16[...]<br />
$(OBJDIR)/%.o : %.c<br />
@echo<br />
@echo $(MSG_COMPILING) $<<br />
$(CC) -c $(ALL_CFLAGS) $< -o $@ <br />
[...]<br />
</pre><br />
<br />
Da --mmcu=atmega16 übergeben wurde, wird __AVR_ATmega16__ definiert und kann in avr/io.h zur Fallunterscheidung genutzt werden:<br />
<br />
<syntaxhighlight lang="c"><br />
// avr/io.h <br />
// (bei WinAVR-Standardinstallation in C:\WinAVR\avr\include\avr)<br />
[...]<br />
#if defined (__AVR_AT94K__)<br />
# include <avr/ioat94k.h><br />
// [...]<br />
#elif defined (__AVR_ATmega16__)<br />
// da __AVR_ATmega16__ definiert ist, wird avr/iom16.h eingebunden:<br />
# include <avr/iom16.h><br />
// [...]<br />
#else<br />
# if !defined(__COMPILING_AVR_LIBC__)<br />
# warning "device type not defined"<br />
# endif<br />
#endif<br />
</syntaxhighlight><br />
<br />
Die Beispiele in den folgenden Abschnitten demonstrieren den Zugriff auf Register anhand der Register für I/O-Ports (PORTx, DDRx, PINx), die Vorgehensweise ist jedoch für alle Register (z.&nbsp;B. die des UART, ADC, SPI) analog.<br />
<br />
== Schreiben in Register ==<br />
<br />
Zum Schreiben kann man Register einfach wie eine Variable setzen.<ref>In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Schreibzugriff über die Funktion outp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt, outp() ist nicht mehr erforderlich.</ref><br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
int main()<br />
{<br />
/* Setzt das Richtungsregister des Ports A auf 0xff <br />
(alle Pins als Ausgang, vgl. Abschnitt Zugriff auf Ports): */<br />
DDRA = 0xff; <br />
<br />
/* Setzt PortA auf 0x03, Bit 0 und 1 "high", restliche "low": */<br />
PORTA = 0x03; <br />
<br />
// Setzen der Bits 0,1,2,3 und 4<br />
// Binär 00011111 = Hexadezimal 1F<br />
DDRB = 0x1F; /* direkte Zuweisung - unübersichtlich */<br />
<br />
/* Ausführliche Schreibweise: identische Funktionalität, mehr Tipparbeit<br />
aber übersichtlicher und selbsterklärend: */<br />
DDRB = (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4);<br />
<br />
while (1);<br />
}<br />
</syntaxhighlight><br />
<br />
Die ausführliche Schreibweise sollte bevorzugt verwendet werden, da dadurch die Zuweisungen selbsterklärend sind und somit der Code leichter nachvollzogen werden kann. Atmel verwendet sie auch bei Beispielen in Datenblätten und in den allermeisten Quellcodes zu Application-Notes. Mehr zu der Schreibweise mit "|" und "<<" findet man unter [[Bitmanipulation]].<br />
<br />
Der gcc C-Compiler unterstützt ab Version 4.3.0 Konstanten im Binärformat, z.&nbsp;B. DDRB&nbsp;=&nbsp;0b00011111. Diese Schreibweise ist jedoch nur in GNU-C verfügbar und nicht in ISO-C definiert. Man sollte sie daher nicht verwenden, wenn Code mit anderen ausgetauscht oder mit anderen Compilern bzw. älteren Versionen des gcc genutzt werden soll.<br />
<br />
== Verändern von Registerinhalten ==<br />
<br />
Einzelne Bits setzt und löscht man "Standard-C-konform" mittels logischer (Bit-) Operationen. <br />
<br />
<syntaxhighlight lang="c"><br />
x |= (1 << Bitnummer); // Hiermit wird ein Bit in x gesetzt<br />
x &= ~(1 << Bitnummer); // Hiermit wird ein Bit in x geloescht<br />
</syntaxhighlight><br />
<br />
Es wird jeweils nur der Zustand des angegebenen Bits geändert, der vorherige Zustand der anderen Bits bleibt erhalten. <br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
#define MEINBIT 2<br />
...<br />
PORTA |= (1 << MEINBIT); /* setzt Bit 2 an PortA auf 1 */<br />
PORTA &= ~(1 << MEINBIT); /* loescht Bit 2 an PortA */<br />
</syntaxhighlight><br />
<br />
Mit dieser Methode lassen sich auch mehrere Bits eines Registers gleichzeitig setzen und löschen.<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
DDRA &= ~( (1<<PA0) | (1<<PA3) ); /* PA0 und PA3 als Eingaenge */<br />
PORTA |= ( (1<<PA0) | (1<<PA3) ); /* Interne Pull-Up fuer beide einschalten */<br />
</syntaxhighlight><br />
<br />
Bei bestimmten AVR Registern mit Bits, die durch Beschreiben mit einer logischen 1 gelöscht werden, muss eine absolute Zuweisung benutzt werden. Ein ODER löscht in diesen Registern ALLE gesetzten Bits!<br />
<br />
Beispiel:<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
TIFR2 = (1<<OCF2A); // Nur Bit OCF2A löschen<br />
</syntaxhighlight><br />
<br />
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind nicht mehr erforderlich.<br />
<br />
Siehe auch:<br />
* [[Bitmanipulation]]<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers<br />
<br />
== Lesen aus Registern ==<br />
<br />
Zum Lesen kann man auf Register einfach wie auf eine Variable zugreifen. In Quellcodes, die für ältere Versionen des avr-gcc/der avr-libc entwickelt wurden, erfolgt der Lesezugriff über die Funktion inp(). Aktuelle Versionen des Compilers unterstützen den Zugriff nun direkt und inp() ist nicht mehr erforderlich.<br />
<br />
Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdint.h><br />
<br />
uint8_t foo;<br />
<br />
//...<br />
<br />
int main(void)<br />
{<br />
/* kopiert den Status der Eingabepins an PortB <br />
in die Variable foo: */<br />
foo = PINB; <br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Die Abfrage der Zustände von Bits erfolgt durch Einlesen des gesamten Registerinhalts und ausblenden der Bits deren Zustand nicht von Interesse ist. Einige Beispiele zum Prüfen ob Bits gesetzt oder gelöscht sind:<br />
<br />
<syntaxhighlight lang="c"><br />
#define MEINBIT0 0 <br />
#define MEINBIT2 2<br />
<br />
uint8_t i;<br />
<br />
extern test1();<br />
<br />
// Funkion test1 aufrufen, wenn Bit 0 in Register PINA gesetzt (1) ist<br />
i = PINA; // Inhalt in Arbeitsvariable<br />
i = i & 0x01; // alle Bits bis auf Bit 0 ausblenden (bitweise und)<br />
// falls das Bit gesetzt war, hat i den Inhalt 1<br />
if ( i != 0 ) { // Ergebnis ungleich 0 (wahr)? <br />
test1(); // dann muss Bit 0 in i gesetzt sein -> Funktion aufrufen<br />
}<br />
// verkürzt:<br />
if ( ( PINA & 0x01 ) != 0 ) {<br />
test1();<br />
}<br />
// nochmals verkürzt:<br />
if ( PINA & 0x01 ) {<br />
test1();<br />
}<br />
// mit definierter Bitnummer:<br />
if ( PINA & ( 1 << MEINBIT0 ) ) {<br />
test1();<br />
}<br />
<br />
// Funktion aufrufen, wenn Bit 0 und/oder Bit 2 gesetzt ist. (Bit 0 und 2 also Wert 5) <br />
// (Bedenke: Bit 0 hat Wert 1, Bit 1 hat Wert 2 und Bit 2 hat Wert 4)<br />
if ( PINA & 0x05 ) {<br />
test1(); // Vergleich <> 0 (wahr), also mindestens eines der Bits gesetzt<br />
}<br />
// mit definierten Bitnummern:<br />
if ( PINA & ( ( 1 << MEINBIT0 ) | ( 1 << MEINBIT2 ) ) ) {<br />
test1();<br />
}<br />
<br />
// Funktion aufrufen, wenn Bit 0 und Bit 2 gesetzt sind<br />
if ( ( PINA & 0x05 ) == 0x05 ) { // nur wahr, wenn beide Bits gesetzt<br />
test1();<br />
}<br />
<br />
// Funktion test2() aufrufen, wenn Bit 0 gelöscht (0) ist<br />
i = PINA; // einlesen in temporäre Variable<br />
i = i & 0x01; // maskieren von Bit 0<br />
if ( i == 0 ) { // Vergleich ist wahr, wenn Bit 0 nicht gesetzt ist<br />
test2();<br />
}<br />
// analog mit not-Operator<br />
if ( !i ) {<br />
test2();<br />
}<br />
// nochmals verkürzt:<br />
if ( !( PINA & 0x01 ) ) {<br />
test2();<br />
}<br />
</syntaxhighlight><br />
<br />
== Warten auf einen bestimmten Zustand ==<br />
<br />
Es gibt in der Bibliothek avr-libc Funktionen, die warten, bis ein bestimmter Zustand eines Bits erreicht ist. Es ist allerdings normalerweise eine eher unschöne Programmiertechnik, da in diesen Funktionen "blockierend" gewartet wird. Der Programmablauf bleibt also an dieser Stelle stehen, bis das maskierte Ereignis erfolgt ist. Setzt man den [[Watchdog]] ein, muss man darauf achten, dass dieser auch noch getriggert wird (Zurücksetzen des Watchdogtimers). <br />
<br />
Die Funktion '''loop_until_bit_is_set''' wartet in einer Schleife, bis das definierte Bit gesetzt ist. Wenn das Bit beim Aufruf der Funktion bereits gesetzt ist, wird die Funktion sofort wieder verlassen. Das niederwertigste Bit hat die Bitnummer 0. <br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
<br />
/* Warten bis Bit Nr. 2 (das dritte Bit) in Register PINA gesetzt (1) ist */<br />
<br />
#define WARTEPIN PINA<br />
#define WARTEBIT PA2<br />
<br />
// mit der avr-libc Funktion:<br />
loop_until_bit_is_set(WARTEPIN, WARTEBIT);<br />
<br />
// dito in "C-Standard":<br />
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN<br />
// _nicht_ ungleich 0 (also 0) ist.<br />
while ( !(WARTEPIN & (1 << WARTEBIT)) ) {}<br />
...<br />
</syntaxhighlight><br />
<br />
<br />
Die Funktion '''loop_until_bit_is_clear''' wartet in einer Schleife, bis das definierte Bit gelöscht ist. Wenn das Bit beim Aufruf der Funktion bereits gelöscht ist, wird die Funktion sofort wieder verlassen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
<br />
/* Warten bis Bit Nr. 4 (das fuenfte Bit) in Register PINB geloescht (0) ist */<br />
#define WARTEPIN PINB<br />
#define WARTEBIT PB4<br />
<br />
// avr-libc-Funktion:<br />
loop_until_bit_is_clear(WARTEPIN, WARTEBIT);<br />
<br />
// dito in "C-Standard":<br />
// Durchlaufe die (leere) Schleife solange das WARTEBIT in Register WARTEPIN<br />
// gesetzt (1) ist <br />
while ( WARTEPIN & (1<<WARTEBIT) ) {}<br />
...<br />
</syntaxhighlight><br />
<br />
Universeller und auch auf andere Plattformen besser übertragbar ist die Verwendung von C-Standardoperationen.<br />
<br />
Siehe auch: <br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Special Function Registers<br />
* [[Bitmanipulation]]<br />
<br />
== 16-Bit Register (ADC, ICR1, OCR1x, TCNT1, UBRR) ==<br />
<br />
Einige der Portregister in den AVR-Controllern sind 16 Bit breit. Im Datenblatt sind diese Register üblicherweise mit dem Suffix "L" (Low-Byte) und "H" (High-Byte) versehen. Die avr-libc definiert zusätzlich die meisten dieser Variablen die Bezeichnung ohne "L" oder "H". Auf diese Register kann dann direkt zugegriffen werden. Dies ist zum Beispiel der Fall für Register wie ADC oder TCNT1.<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
uint16_t foo;<br />
<br />
/* setzt die Wort-Variable foo auf den Wert der letzten AD-Wandlung */<br />
foo = ADC; <br />
</syntaxhighlight><br />
<br />
Bei anderen Registern, wie zum Beispiel Baudraten-Register, liegen High- und Low-Teil nicht direkt nebeneinander im SFR-Bereich, so dass ein 16-Bit Zugriff nicht möglich ist und der Zugriff zusammengebastelt werden muss:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
#ifndef F_CPU<br />
#define F_CPU 3686400<br />
#endif<br />
#define UART_BAUD_RATE 9600<br />
<br />
...<br />
uint16_t baud = F_CPU / (UART_BAUD_RATE * 16L) -1;<br />
<br />
UBRRH = (uint8_t) (baud >> 8);<br />
UBRRL = (uint8_t) baud;<br />
...<br />
</syntaxhighlight><br />
<br />
Bei einigen AVR-Typen wie ATmega8 oder ATmega16 teilen sich UBRRH und UCSRC die gleiche Speicher-Adresse. Damit der AVR trotzdem zwischen den beiden Registern unterscheiden kann, bestimmt das Bit7 (URSEL), welches Register tatsächlich beschrieben werden soll. ''1000 0011'' (0x83) adressiert demnach UCSRC und übergibt den Wert ''3''. Und ''0000 0011'' (0x3) adressiert UBRRH und übergibt ebenfalls den Wert ''3''. <br />
<br />
Speziell bei den 16-Bit-Timern und auch beim ADC ist es bei allen Zugriffen auf Datenregister erforderlich, dass diese Daten synchronisiert sind. Wenn z.&nbsp;B. bei einem 16-Bit-Timer das High-Byte des Zählregisters gelesen wurde und vor dem Lesezugriff auf das Low-Byte ein Überlauf des Low-Bytes stattfindet, erhält man einen völlig unsinnigen Wert. Auch die Compare-Register müssen synchron geschrieben werden, da es ansonsten zu unerwünschten Compare-Ereignissen kommen kann. <br />
<br />
Beim ADC besteht das Problem darin, dass zwischen den Zugriffen auf die beiden Teilregister eine Wandlung beendet werden kann und der ADC ein neues Ergebnis in ADCL und ADCH schreiben will, wodurch High- und Low-Byte nicht zusammenpassen.<br />
<br />
Um diese Datenmüllproduktion zu verhindern, gibt es in beiden Fällen eine Synchronisation, die jeweils durch den Zugriff auf das Low-Byte ausgelöst wird:<br />
* Bei den Timer-Registern (das gilt für alle TCNT-, OCR- und ICR-Register bei den 16-Bit-Timern) wird bei einem ''Lesezugriff'' auf das Low-Byte automatisch das High-Byte in ein temporäres Register, das ansonsten nach außen nicht sichtbar ist, geschoben. Greift man nun ''anschließend'' auf das High-Byte zu, dann wird eben dieses temporäre Register gelesen.<br />
* Bei einem ''Schreibzugriff'' auf eines der genannten Register wird das High-Byte in besagtem temporären Register zwischengespeichert und erst beim Schreiben des Low-Bytes werden ''beide'' gleichzeitig in das eigentliche Register übernommen.<br />
<br />
Das bedeutet für die Reihenfolge:<br />
* Lesezugriff: Erst Low-Byte, dann High-Byte<br />
* Schreibzugriff: Erst High-Byte, dann Low-Byte<br />
<br />
Des weiteren ist zu beachten, dass es für all diese 16-Bit-Register nur ein einziges temporäres Register gibt, so dass das Auftreten eines Interrupts, in dessen Handler ein solches Register manipuliert wird, bei einem durch ihn unterbrochenen Zugriff i.d.R. zu Datenmüll führt. 16-Bit-Zugriffe sind generell nicht atomar! Wenn mit Interrupts gearbeitet wird, kann es erforderlich sein, vor einem solchen Zugriff auf ein 16-Bit-Register die Interrupt-Bearbeitung zu deaktivieren.<br />
<br />
Beim ADC-Datenregister ADCH/ADCL ist die Synchronisierung anders gelöst. Hier wird beim Lesezugriff (ADCH/ADCL sind logischerweise read-only) auf das Low-Byte ADCL beide Teilregister für Zugriffe seitens des ADC so lange gesperrt, bis das High-Byte ADCH ausgelesen wurde. Dadurch kann der ADC nach einem Zugriff auf ADCL keinen neuen Wert in ADCH/ADCL ablegen, bis ADCH gelesen wurde. Ergebnisse von Wandlungen, die zwischen einem Zugriff auf ADCL und ADCH beendet werden, gehen verloren!<br />
<br />
Nach einem Zugriff auf ADCL muss grundsätzlich ADCH gelesen werden!<br />
<br />
In beiden Fällen – also sowohl bei den Timern als auch beim ADC – werden vom C-Compiler 16-Bit Pseudo-Register zur Verfügung gestellt (z.&nbsp;B. TCNT1H/TCNT1L → TCNT1, ADCH/ADCL → ADC bzw. ADCW), bei deren Verwendung der Compiler automatisch die richtige Zugriffsreihenfolge regelt. In C-Programmen sollten grundsätzlich diese 16-Bit-Register verwendet werden! Sollte trotzdem ein Zugriff auf ein Teilregister erforderlich sein, sind obige Angaben zu berücksichtigen.<br />
<br />
Es ist darauf zu achten, dass auch ein Zugriff auf die 16-Bit-Register vom Compiler in zwei 8-Bit-Zugriffe aufgeteilt wird und dementsprechend genauso nicht-atomar ist wie die Einzelzugriffe. Auch hier gilt, dass u.U. die Interrupt-Bearbeitung gesperrt werden muss, um Datenmüll zu vermeiden.<br />
<br />
Beim ADC gibt es für den Fall, dass eine Auflösung von 8 Bit ausreicht, die Möglichkeit, das Ergebnis "linksbündig" in ADCH/ADCL auszurichten, so dass die relevanten 8 MSB in ADCH stehen. In diesem Fall muss bzw. sollte nur ADCH ausgelesen werden.<br />
<br />
ADC und ADCW sind unterschiedliche Bezeichner für das selbe Registerpaar. Üblicherweise kann man in C-Programmen ADC verwenden, was analog zu den anderen 16-Bit-Registern benannt ist. ADCW (ADC Word) existiert nur deshalb, weil die Headerdateien auch für Assembler vorgesehen sind und es bereits einen Assembler-Befehl namens ''adc'' gibt. <br />
<br />
Im Umgang mit 16-Bit Registern siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Related Pages/Frequently Asked Questions/Nr. 8<br />
* Datenblatt Abschnitt ''Accessing 16-bit Registers''<br />
<br />
== IO-Register als Parameter und Variablen ==<br />
<br />
Um Register als Parameter für eigene Funktionen übergeben zu können, muss man sie als einen volatile uint8_t Pointer übergeben. Zum Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <util/delay.h><br />
<br />
uint8_t key_pressed (volatile uint8_t *inputreg, uint8_t inputbit)<br />
{<br />
static uint8_t last_state = 0;<br />
<br />
if (last_state == (*inputreg & (1<<inputbit)))<br />
return 0; /* keine Änderung */<br />
<br />
/* Wenn doch, warten bis etwaiges Prellen vorbei ist: */<br />
_delay_ms(20);<br />
<br />
/* Zustand für nächsten Aufruf merken: */<br />
last_state = *inputreg & (1<<inputbit);<br />
<br />
/* und den entprellten Tastendruck zurückgeben: */<br />
return *inputreg & (1<<inputbit);<br />
}<br />
<br />
/* Beispiel für einen Funktionsaufruf: */<br />
<br />
void foo (void)<br />
{<br />
uint8_t i = key_pressed (&PINB, PB1);<br />
}<br />
</syntaxhighlight><br />
<br />
Ein Aufruf der Funktion mit call by value würde Folgendes bewirken: Beim Funktionseintritt wird nur eine Kopie des momentanen Portzustandes angefertigt, die sich unabhängig vom tatsächlichen Zustand das Ports nicht mehr ändert, womit die Funktion wirkungslos wäre. Die Übergabe eines Zeigers wäre die Lösung, wenn der Compiler nicht optimieren würde. Denn dadurch wird im Programm nicht von der Hardware gelesen, sondern wieder nur von einem Abbild im Speicher. Das Ergebnis wäre das gleiche wie oben. Mit dem Schlüsselwort volatile sagt man nun dem Compiler, dass die entsprechende Variable entweder durch andere Softwareroutinen (Interrupts) oder durch die Hardware verändert werden kann.<br />
<br />
Siehe auch: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass avr-libc FAQ: "How do I pass an IO port as a parameter to a function?"]<br />
<br />
= Zugriff auf IO-Ports =<br />
<br />
Jeder AVR implementiert eine unterschiedliche Menge an GPIO-Registern<br />
(GPIO - General Purpose Input/Output). Diese Register dienen dazu:<br />
* einzustellen welche der Anschlüsse ("Beinchen") des Controllers als Ein- oder Ausgänge dienen<br />
* bei Ausgängen deren Zustand festzulegen<br />
* bei Eingängen deren Zustand zu erfassen<br />
<br />
Mittels GPIO werden digitale Zustände gesetzt und erfasst, d.h. die Spannung an einem Ausgang wird ein- oder ausgeschaltet und an einem Eingang wird erfasst, ob die anliegende Spannung über oder unter einem bestimmten Schwellwert liegt. Im Datenblatt Abschnitt Electrical Characteristics/DC Characteristics finden sich die Spannungswerte (V_OL, V_OH für Ausgänge, V_IL, V_IH für Eingänge).<br />
<br />
Die Verarbeitung von analogen Eingangswerten und die Ausgabe von Analogwerten wird in Kapitel [[AVR-GCC-Tutorial#Analoge_Ein-_und_Ausgabe|Analoge Ein- und Ausgabe]] behandelt.<br />
<br />
Die physischen Ein- und Ausgänge werden bei AVR-Controllern zu logischen Ports gruppiert.<br />
<br />
Alle Ports werden über Register gesteuert. Dazu sind jedem Port 3 Register zugeordnet:<br />
<br />
{| class="wikitable"<br />
|- <br />
! width="10%"| DDRx<br />
| Datenrichtungsregister für Port'''x'''. <br />
'''x''' entspricht '''A''', '''B''', ''' C''' usw. ja nach gewünschtem Port. Bit im Register gesetzt (1) für Ausgang, Bit gelöscht (0) für Eingang.<br />
|- <br />
! PINx<br />
| Eingangsadresse für Port'''x'''. <br />
Zustand des Ports. Die Bits in PINx entsprechen dem Zustand der als Eingang definierten Portpins. Bit 1 wenn Pin "high", Bit 0 wenn Portpin low.<br />
|-<br />
! PORTx<br />
| Datenregister für Port'''x'''. <br />
Dieses Register wird verwendet, um die Ausgänge eines Ports anzusteuern. Bei Pins, die mittels DDRx auf Eingang geschaltet wurden, können über PORTx<br />
die internen Pull-Up Widerstände aktiviert oder deaktiviert werden (1 = aktiv).<br />
|}<br />
<br />
Die folgenden Beispiele gehen von einem AVR aus, der sowohl Port A als auch Port B besitzt. Sie müssen für andere AVRs (zum Beispiel ATmega8/48/88/168) entsprechend angepasst werden.<br />
<br />
== Datenrichtung bestimmen ==<br />
<br />
Zuerst muss die Datenrichtung der verwendeten Pins bestimmt werden. Um dies zu erreichen, wird das Datenrichtungsregister des entsprechenden Ports beschrieben.<br />
<br />
Für jeden Pin, der als Ausgang verwendet werden soll, muss dabei das<br />
entsprechende Bit auf dem Port gesetzt werden. Soll der Pin als Eingang<br />
verwendet werden, muss das entsprechende Bit gelöscht sein.<br />
<br />
Beispiel:<br />
Angenommen am Port B sollen die Pins 0 bis 4 als Ausgänge definiert werden, die noch verbleibenden Pins 5 bis 7 sollen als Eingänge fungieren. Dazu ist es daher notwendig, im für das Port B zuständigen Datenrichtungsregister DDRB folgende Bitkonfiguration einzutragen<br />
<br />
+---+---+---+---+---+---+---+---+<br />
| 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |<br />
+---+---+---+---+---+---+---+---+<br />
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |<br />
<br />
In C liest sich das dann so:<br />
<br />
<syntaxhighlight lang="c"><br />
// in io.h wird u.a. DDRB definiert:<br />
#include <avr/io.h><br />
<br />
int main()<br />
{<br />
// Setzen der Bits 0,1,2,3 und 4<br />
// Binaer 00011111 = Hexadezimal 1F<br />
// direkte Zuweisung - standardkonform */<br />
DDRB = 0x1F; /* <br />
<br />
// Uebersichtliche Alternative - Binaerschreibweise, aber kein ISO-C<br />
DDRB = 0b00011111;<br />
<br />
// Ausfuehrliche Schreibweise: identische Funktionalitaet, mehr Tipparbeit<br />
// aber uebersichtlicher und selbsterklaerend:<br />
DDRB |= (1 << DDB0) | (1 << DDB1) | (1 << DDB2) | (1 << DDB3) | (1 << DDB4); <br />
</syntaxhighlight><br />
<br />
Die Pins 5 bis 7 werden (da 0) als Eingänge geschaltet. Weitere Beispiele:<br />
<br />
<syntaxhighlight lang="c"><br />
// Alle Pins des Ports B als Ausgang definieren:<br />
DDRB = 0xff; <br />
// Pin0 wieder auf Eingang und andere im urspruenglichen Zustand belassen:<br />
DDRB &= ~(1 << DDB0);<br />
// Pin 3 und 4 auf Eingang und andere im urspruenglichen Zustand belassen:<br />
DDRB &= ~((1 << DDB3) | (1 << DDB4));<br />
// Pin 0 und 3 wieder auf Ausgang und andere im ursprünglichen Zustand belassen:<br />
DDRB |= (1 << DDB0) | (1 << DDB3);<br />
// Alle Pins auf Eingang:<br />
DDRB = 0x00;<br />
</syntaxhighlight><br />
<br />
== Vordefinierte Bitnummern für I/O-Register ==<br />
<br />
Die Bitnummern (z.&nbsp;B. PCx, PINCx und DDCx für den Port C) sind in den io*.h-Dateien der avr-libc definiert und dienen lediglich der besseren Lesbarkeit. Man muss diese Definitionen nicht verwenden oder kann auch einfach "immer" PAx, PBx, PCx usw. nutzen, auch wenn der Zugriff auf Bits in DDRx- oder PINx-Registern erfolgt. Für den Compiler sind die Ausdrücke (1<<PC7), (1<<DDC7) und (1<<PINC7) identisch zu (1<<7) (genauer: der Präprozessor ersetzt die Ausdrücke (1<<PC7),... zu (1<<7)). Ein Ausschnitt der Definitionen für Port C eines ATmega32 aus der iom32.h-Datei zur Verdeutlichung (analog für die weiteren Ports):<br />
<br />
<syntaxhighlight lang="c"><br />
...<br />
/* PORTC */<br />
#define PC7 7<br />
#define PC6 6<br />
#define PC5 5<br />
#define PC4 4<br />
#define PC3 3<br />
#define PC2 2<br />
#define PC1 1<br />
#define PC0 0<br />
<br />
/* DDRC */<br />
#define DDC7 7<br />
#define DDC6 6<br />
#define DDC5 5<br />
#define DDC4 4<br />
#define DDC3 3<br />
#define DDC2 2<br />
#define DDC1 1<br />
#define DDC0 0<br />
<br />
/* PINC */<br />
#define PINC7 7<br />
#define PINC6 6<br />
#define PINC5 5<br />
#define PINC4 4<br />
#define PINC3 3<br />
#define PINC2 2<br />
#define PINC1 1<br />
#define PINC0 0<br />
</syntaxhighlight><br />
<br />
<br />
== Digitale Signale ==<br />
<br />
Am einfachsten ist es, digitale Signale mit dem Mikrocontroller zu erfassen bzw. auszugeben.<br />
<br />
== Ausgänge ==<br />
Will man als Ausgang definierte Pins (entsprechende DDRx-Bits = 1) auf Logisch 1 setzen, setzt man die entsprechenden Bits im Portregister.<br />
<br />
Mit dem Befehl<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB = 0x04; /* besser PORTB=(1<<PB2) */<br />
<br />
// Uebersichtliche Alternative - Binaerschreibweise<br />
PORTB = 0b00000100; /* direkte Zuweisung - uebersichtlich */<br />
<br />
</syntaxhighlight><br />
wird also der Ausgang an Pin PB2 gesetzt (Beachte, dass die Bits immer ''von 0 an'' gezählt werden, das niederwertigste Bit ist also Bitnummer 0 und nicht etwa Bitnummer 1).<br />
<br />
Man beachte, dass bei der Zuweisung mittels '''=''' immer alle Pins gleichzeitig angegeben werden. Man sollte also, wenn nur bestimmte Ausgänge geschaltet werden sollen, zuerst den aktuellen Wert des Ports einlesen und das Bit des gewünschten Ports in diesen Wert einfließen lassen. Will man also nur den dritten Pin (Bit Nr. 2) an Port B auf "high" setzen und den Status der anderen Ausgänge unverändert lassen, nutze man diese Form:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB = PORTB | 0x04; /* besser: PORTB = PORTB | ( 1<<PB2 ) */<br />
/* vereinfacht durch Nutzung des |= Operators : */<br />
PORTB |= (1<<PB2);<br />
<br />
/* auch mehrere "gleichzeitig": */<br />
PORTB |= (1<<PB4) | (1<<PB5); /* Pins PB4 und PB5 "high" */<br />
</syntaxhighlight><br />
<br />
"Ausschalten", also Ausgänge auf "low" setzen, erfolgt analog:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
PORTB &= ~(1<<PB2); /* loescht Bit 2 in PORTB und setzt damit Pin PB2 auf low */ <br />
PORTB &= ~( (1<<PB4) | (1<<PB5) ); /* Pin PB4 und Pin PB5 "low" */<br />
</syntaxhighlight><br />
Siehe auch [[Bitmanipulation]]<br />
<br />
In Quellcodes, die für ältere Version den des avr-gcc/der avr-libc entwickelt wurden, werden einzelne Bits mittels der Funktionen sbi und cbi gesetzt bzw. gelöscht. Beide Funktionen sind in aktuellen Versionen der avr-libc nicht mehr enthalten und auch nicht mehr erforderlich.<br />
<br />
''Falls der Anfangszustand von Ausgängen kritisch ist, muss die Reihenfolge beachtet werden, mit der die Datenrichtung (DDRx) eingestellt und der Ausgabewert (PORTx) gesetzt wird:''<br />
<br />
Für Ausgangspins, die mit Anfangswert "high" initialisiert werden sollen:<br />
* zuerst die Bits im PORTx-Register setzen<br />
* anschließend die Datenrichtung auf Ausgang stellen<br />
<br />
Daraus ergibt sich die Abfolge für einen Pin, der bisher als Eingang mit abgeschaltetem Pull-Up konfiguriert war:<br />
* setze PORTx: interner Pull-Up aktiv<br />
* setze DDRx: Ausgang ("high")<br />
<br />
Bei der Reihenfolge erst DDRx und dann PORTx kann es zu einem kurzen "low-Puls" kommen, der auch externe Pull-Up-Widerstände "überstimmt". Die (ungünstige) Abfolge: Eingang -> setze DDRx: Ausgang (auf "low", da PORTx nach Reset 0) -> setze PORTx: Ausgang auf high. Vergleiche dazu auch das Datenblatt Abschnitt ''Configuring the Pin''.<br />
<br />
== Eingänge (Wie kommen Signale in den &micro;C) ==<br />
<br />
Die digitalen Eingangssignale können auf verschiedene Arten zu unserer Logik gelangen.<br />
<br />
=== Signalkopplung ===<br />
<br />
Am einfachsten ist es, wenn die Signale direkt aus einer anderen digitalen Schaltung übernommen werden können. Hat der Ausgang der entsprechenden Schaltung TTL-Pegel dann können wir sogar direkt den Ausgang der Schaltung mit einem Eingangspin von unserem Controller verbinden.<br />
<br />
Hat der Ausgang der anderen Schaltung keinen TTL-Pegel so müssen wir den Pegel über entsprechende Hardware (z.&nbsp;B. Optokoppler, [[Widerstand#Spannungsteiler|Spannungsteiler]], "Levelshifter" aka [[Pegelwandler]]) anpassen.<br />
<br />
Die Masse der beiden Schaltungen muss selbstverständlich miteinander verbunden werden. Der Software selber ist es natürlich letztendlich egal, wie das Signal eingespeist wird. Wir können ja ohnehin lediglich prüfen, ob an einem Pin unseres Controllers eine logische 1 (Spannung größer ca. 0,7*Vcc) oder eine logische 0 (Spannung kleiner ca. 0,2*Vcc) anliegt. Detaillierte Informationen darüber, ab welcher Spannung ein Eingang als 0 ("low") bzw. 1 ("high") erkannt wird, liefert die Tabelle DC Characteristics im Datenblatt des genutzten Controllers.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|+ '''Spannungstabelle''' <br /> <small>(ca. Grenzwerte)</small><br />
|<br />
! Low || High<br />
|-<br />
! bei 5 V<br />
| 1 V || 3,5 V<br />
|-<br />
! bei 3,3 V<br />
| 0,66 V || 2,31 V<br />
|-<br />
! bei 1,8 V<br />
| 0,36 V || 1,26 V<br />
|}<br />
<br />
<br />
Die Abfrage der Zustände der Portpins erfolgt direkt über den Registernamen.<br />
<br />
{{Warnung|Dabei ist wichtig, zur Abfrage der Eingänge ''nicht'' etwa Portregister '''PORTx''' zu verwenden, sondern Eingangsregister '''PINx'''. Ansonsten liest man nicht den Zustand der Eingänge, sondern den Status der internen Pull-Up-Widerstände. Die Abfrage der Pinzustände über PORTx statt PINx ist ein häufiger Fehler beim AVR-"Erstkontakt".}}<br />
<br />
Will man also die aktuellen Signalzustände von Port D abfragen und in eine Variable namens bPortD abspeichern, schreibt man folgende Befehlszeilen:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdint.h><br />
...<br />
uint8_t bPortD;<br />
...<br />
bPortD = PIND;<br />
...<br />
</syntaxhighlight><br />
<br />
Mit den C-Bitoperationen kann man den Status der Bits abfragen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
/* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */<br />
if ( PINC & (1<<PINC1) ) {<br />
/* Aktion */<br />
}<br />
<br />
/* Fuehre Aktion aus, wenn Bit Nr. 2 (das "dritte" Bit) in PINB geloescht (0) ist */<br />
if ( !(PINB & (1<<PINB2)) ) {<br />
/* Aktion */<br />
}<br />
...<br />
</syntaxhighlight><br />
Siehe auch [[Bitmanipulation#Bits_prüfen]]<br />
<br />
=== Interne Pull-Up Widerstände ===<br />
<br />
Portpins für Ein- und Ausgänge (GPIO) eines AVR verfügen über zuschaltbare interne Pull-Up Widerstände (nominal mehrere 10kOhm, z.&nbsp;B. ATmega16 20-50kOhm). Diese können in vielen Fällen statt externer Widerstände genutzt werden.<br />
<br />
Die internen Pull-Up Widerstände von Vcc zu den einzelnen Portpins werden über das Register ''' PORTx''' aktiviert bzw. deaktiviert, wenn ein Pin als ''' Eingang''' geschaltet ist.<br />
<br />
Wird der Wert des entsprechenden Portpins auf 1 gesetzt, so ist der Pull-Up Widerstand aktiviert. Bei einem Wert von 0 ist der Pull-Up Widerstand nicht aktiv. Man sollte jeweils entweder den internen oder einen externen Pull-Up Widerstand verwenden, aber nicht beide zusammen.<br />
<br />
Im Beispiel werden alle Pins des Ports D als Eingänge geschaltet und alle Pull-Up Widerstände aktiviert. Weiterhin wird Pin PC7 als Eingang geschaltet und dessen interner Pull-Up Widerstand aktiviert, ohne die Einstellungen für die anderen Portpins (PC0-PC6) zu verändern.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
DDRD = 0x00; /* alle Pins von Port D als Eingang */<br />
PORTD = 0xff; /* interne Pull-Ups an allen Port-Pins aktivieren */<br />
...<br />
DDRC &= ~(1<<PC7); /* Pin PC7 als Eingang */<br />
PORTC |= (1<<PC7); /* internen Pull-Up an PC7 aktivieren */<br />
</syntaxhighlight><br />
<br />
=== Taster und Schalter ===<br />
<br />
Der Anschluss mechanischer Kontakte an den Mikrocontroller, ist zwischen zwei unterschiedliche Methoden zu unterscheiden: ''Active Low'' und ''Active High''.<br />
<br />
<gallery widths="300" heights="300" caption="Anschluss mechanischer Kontakte an einen µC"><br />
Image:Active Low.gif|'''Active Low:''' Bei dieser Methode wird der Kontakt zwischen den Eingangspin des Controllers und Masse geschaltet. Damit bei offenem Schalter der Controller kein undefiniertes Signal bekommt, wird zwischen die Versorgungsspannung und den Eingangspin ein sogenannter '''Pull-Up''' Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffnetem Schalter auf logisch 1 zu ziehen.<br />
Image:Active High.gif|'''Active High:''' Hier wird der Kontakt zwischen die Versorgungsspannung und den Eingangspin geschaltet. Damit bei offener Schalterstellung kein undefiniertes Signal am Controller ansteht, wird zwischen den Eingangspin und die Masse ein '''Pull-Down''' Widerstand geschaltet. Dieser dient dazu, den Pegel bei geöffneter Schalterstellung auf logisch 0 zu halten. <br />
</gallery><br />
<br />
Der Widerstandswert von Pull-Up- und Pull-Down-Widerständen ist an sich nicht kritisch. Wird er allerdings zu hoch gewählt, ist die Wirkung eventuell nicht gegeben. Als üblicher Wert haben sich 10 kOhm eingebürgert. Die AVRs verfügen an den meisten Pins über zuschaltbare interne Pull-Up Widerstände (vgl. Abschnitt [[AVR-GCC-Tutorial#Interne Pull-Up Widerstände|Interne Pull-Up Widerstände]]), welche insbesondere wie hier bei Tastern und ähnlichen Bauteilen (z.&nbsp;B. Drehgebern) statt externer Bauteile verwendet werden können. Interne Pull-Down-Widerstand sind nicht verfügbar und müssen daher in Form zusätzlicher Bauteile in die Schaltung eingefügt werden.<br />
<br />
==== Taster entprellen ====<br />
<br />
Siehe: ''[[Entprellung#Warteschleifen-Verfahren|Entprellung: Warteschleifen-Verfahren]]<br />
<br />
= Warteschleifen (delay.h) =<br />
<br />
Der Programmablauf kann verschiedene Arten von Wartefunktionen erfordern:<br />
<br />
* Warten im Sinn von Zeitvertrödeln<br />
* Warten auf einen bestimmten Zustand an den I/O-Pins<br />
* Warten auf einen bestimmten Zeitpunkt (siehe Timer)<br />
* Warten auf einen bestimmten Zählerstand (siehe Counter)<br />
<br />
Der einfachste Fall, das Zeitvertrödeln, kann in vielen Fällen und mit großer Genauigkeit anhand der avr-libc Bibliotheksfunktionen _delay_ms() und _delay_us() erledigt werden. Die Bibliotheksfunktionen sind einfachen Zählschleifen (Warteschleifen) vorzuziehen, da leere Zählschleifen ohne besondere Vorkehrungen sonst bei eingeschalteter Optimierung vom avr-gcc-Compiler wegoptimiert werden. Weiterhin sind die Bibliotheksfunktionen bereits darauf vorbereitet, die in F_CPU definierte Taktfrequenz zu verwenden. Außerdem sind die Funktionen der Bibliothek wirklich getestet.<br />
<br />
Einfach!? Schon, aber während gewartet wird, macht der µC nichts anderes mehr (abgesehen von möglicherweise auftretenden Interrupts, falls welche aktiviert sind). Die Wartefunktion blockiert den Programmablauf. Möchte man einerseits warten, um z.&nbsp;B. eine LED blinken zu lassen und gleichzeitig andere Aktionen ausführen z.&nbsp;B. weitere LED bedienen, sollten die Timer/Counter des AVR verwendet werden, siehe Artikel [[Multitasking]].<br />
<br />
Die Bibliotheksfunktionen funktionieren allerdings nur dann korrekt, wenn sie mit zur Übersetzungszeit (beim Compilieren) bekannten konstanten Werten aufgerufen werden. Der Quellcode muss mit eingeschalteter Optimierung übersetzt werden, sonst wird sehr viel Maschinencode erzeugt, und die Wartezeiten stimmen nicht mehr mit dem Parameter überein.<br />
<br />
Eine weitere Einschränkung liegt darin, daß sie möglicherweise länger warten, als erwartet, nämlich in dem Fall, daß Interrupts auftreten und die _delay...()-Funktion unterbrechen. Genau genommen warten diese nämlich nicht eine bestimmte Zeit, sondern verbrauchen eine bestimmte Anzahl von Prozessortakten. Die wiederum ist so bemessen, daß ohne Unterbrechung durch Interrupts die gewünschte Wartezeit erreicht wird.<br />
Wird das Warten aber durch eine oder mehrere ISR unterbrochen, die zusammen 1% Prozessorzeit verbrauchen, dann dauert das Warten etwa 1% länger. Bei 50% Last durch die ISR dauert das Warten doppelt solange wie gewünscht, bei 90% zehnmal solange...<br />
<br />
Abhängig von der Version der Bibliothek verhalten sich die Bibliotheksfunktionen etwas unterschiedlich.<br />
<br />
== avr-libc Versionen bis 1.6 ==<br />
<br />
Die Wartezeit der Funktion _delay_ms() ist auf 262,14ms/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 13,1ms warten. Die Wartezeit der Funktion _delay_us() ist auf 768us/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 38,4µs warten. Längere Wartezeiten müssen dann über einen mehrfachen Aufruf in einer Schleife gelöst werden.<br />
<br />
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#ifndef F_CPU<br />
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert <br />
(z.&nbsp;B. durch Übergabe als Parameter zum Compiler innerhalb <br />
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die<br />
"nachträgliche" Definition hinweist */<br />
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"<br />
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */<br />
#endif<br />
#include <util/delay.h> /* in älteren avr-libc Versionen <avr/delay.h> */ <br />
<br />
/*<br />
lange, variable Verzögerungszeit, Einheit in Millisekunden<br />
<br />
Die maximale Zeit pro Funktionsaufruf ist begrenzt auf <br />
262.14 ms / F_CPU in MHz (im Beispiel: <br />
262.1 / 3.6864 = max. 71 ms) <br />
<br />
Daher wird die kleine Warteschleife mehrfach aufgerufen,<br />
um auf eine längere Wartezeit zu kommen. Die zusätzliche <br />
Prüfung der Schleifenbedingung lässt die Wartezeit geringfügig<br />
ungenau werden (macht hier vielleicht 2-3ms aus).<br />
*/<br />
<br />
void long_delay(uint16_t ms)<br />
{<br />
for(; ms>0; ms--) _delay_ms(1);<br />
}<br />
<br />
int main( void )<br />
{<br />
DDRB = ( 1 << PB0 ); // PB0 an PORTB als Ausgang setzen<br />
<br />
while( 1 ) // Endlosschleife<br />
{ <br />
PORTB ^= ( 1 << PB0 ); // Toggle PB0 z.&nbsp;B. angeschlossene LED<br />
long_delay(1000); // Eine Sekunde warten...<br />
}<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
== avr-libc Versionen ab 1.7 ==<br />
<br />
_delay_ms() kann mit einem Argument bis 6553,5 ms (= 6,5535 Sekunden) benutzt werden. Es ist nicht möglich, eine Variable als Argument zu übergeben. Wird die früher gültige Grenze von 262,14 ms/F_CPU (in MHz) überschritten, so arbeitet _delay_ms() einfach etwas ungenauer und zählt nur noch mit einer Auflösung von 1/10 ms. Eine Verzögerung von 1000,10 ms ließe sich nicht mehr von einer von 1000,19 ms unterscheiden. Ein Verlust, der sich im Allgemeinen verschmerzen lässt. Dem Programmierer wird keine Rückmeldung gegeben, dass die Funktion ggf. gröber arbeitet, d.h. wenn es darauf ankommt, bitte den Parameter wie bisher geschickt wählen.<br />
<br />
Die Funktion _delay_us() wurde ebenfalls erweitert. Wenn deren maximal als genau behandelbares Argument überschritten wird, benutzt diese intern _delay_ms(). Damit gelten in diesem Fall die _delay_ms() Einschränkungen.<br />
<br />
Beispiel: Blinken einer LED an PORTB Pin PB0 im ca. 1s Rhythmus, avr-libc ab Version 1.6<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#ifndef F_CPU<br />
/* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert <br />
(z.B. durch Übergabe als Parameter zum Compiler innerhalb <br />
des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die<br />
"nachträgliche" Definition hinweist */<br />
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"<br />
#define F_CPU 3686400UL /* Quarz mit 3.6864 Mhz */<br />
#endif<br />
#include <util/delay.h><br />
<br />
int main( void )<br />
{<br />
DDRB = ( 1 << PB0 ); // PB0 an PORTB als Ausgang setzen<br />
<br />
while( 1 ) { // Endlosschleife<br />
PORTB ^= ( 1 << PB0 ); // Toggle PB0 z.B. angeschlossene LED<br />
_delay_ms(1000); // Eine Sekunde +/-1/10000 Sekunde warten...<br />
// funktioniert nicht mit Bibliotheken vor 1.6<br />
<br />
}<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
Die _delay_ms() und die _delay_us aus '''avr-libc 1.7.0''' sind fehlerhaft. _delay_ms () läuft 4x schneller als erwartet. Abhilfe ist eine korrigierte Includedatei: [http://www.mikrocontroller.net/topic/196738#1943039]<br />
<br />
= Programmieren mit Interrupts =<br />
<br />
<div style="float:right; margin:2em;"><br />
[[Image:Interrupt Programme.gif]]<br />
</div><br />
Nachdem wir nun alles Wissenswerte für die serielle Programmerstellung<br />
gelernt haben nehmen wir jetzt ein völlig anderes Thema in Angriff, nämlich<br />
die Programmierung unter Zuhilfenahme der Interrupts des AVR.<br />
<br />
Tritt ein Interrupt auf, unterbricht (engl. interrupts) der Controller die Verarbeitung des Hauptprogramms und verzweigt zu einer Interruptroutine. Das Hauptprogramm wird also beim Eintreffen eines Interrupts unterbrochen, die Interruptroutine ausgeführt und danach erst wieder das Hauptprogramm an der Unterbrechungsstelle fortgesetzt (vgl. die Abbildung).<br />
<br />
Um Interrupts verarbeiten zu können, ist folgendes zu beachten:<br />
<br />
* Für jede aktivierte Interruptquelle ist eine Funktion zu programmieren, in der die beim Auftreten des jeweiligen Interrupts erforderlichen Verarbeitungsschritte enthalten sind. Für diese Funktion existieren verschiedene Bezeichnungen. Üblich sind die englischen Begriffe Interrupt-Handler oder Interrupt-Service-Routinen (ISR), man findet aber auch die Bezeichnungen Interruptverarbeitungs- oder -behandlungsroutine oder auch kurz Interruptroutine. Zum Beispiel wird üblicherweise in der ISR zur Verarbeitung des Empfangsinterrupts eines UARTs (UART-RX Interrupt) das empfangene Zeichen in einen Zwischenspeicher (FIFO-Buffer) kopiert, dessen Inhalt später von anderen Programmteilen geleert wird. Sofern der Zwischenspeicher ausreichend groß ist, geht also kein Zeichen verloren, auch wenn im Hauptprogramm zeitintensive Operationen durchgeführt werden.<br />
* Die benötigten Interrupts sind in den jeweiligen Funktionsbausteinen einzuschalten. Dies erfolgt über das jeweilige Aktivierungsbit (Interrupt Enable) in einem der Hardwareregister (z.B. RX(Complete)Interrupt Enable eines UARTs)<br />
* Sämtliche Interrupts werden über einen weiteren globalen Schalter aktiviert und deaktiviert. Zur Verarbeitung der Interrupts ist dieser Schalter zu aktivieren (sei(), siehe unten).<br />
<br />
Alle Punkte sind zu beachten. Fehlt z.B. die globale Aktivierung, werden Interruptroutinen auch dann nicht aufgerufen, wenn sie im Funktionsbaustein eingeschaltet sind und eine Behandlungsroutine verhanden ist.<br />
<br />
Siehe auch<br />
<br />
* [http://www.mikrocontroller.net/forum/read-1-235092.html#new Ausführlicher Thread im Forum]<br />
* Artikel [[Interrupt]]<br />
* Artikel [[Multitasking]]<br />
{{Clear}}<br />
<br />
== Anforderungen an Interrupt-Routinen ==<br />
<br />
Um unliebsamen Überraschungen vorzubeugen, sollten einige Grundregeln bei der Implementierung der Interruptroutinen beachtet werden. Interruptroutinen sollten möglichst kurz und schnell abarbeitbar sein, daraus folgt:<br />
<br />
* Keine umfangreichen Berechnungen innerhalb der Interruptroutine. (*)<br />
* Keine langen Programmschleifen.<br />
* Obwohl es möglich ist, während der Abarbeitung einer Interruptroutine andere oder sogar den gleichen Interrupt wieder zuzulassen, wird davon ohne genaue Kenntnis der internen Abläufe dringend abgeraten.<br />
<br />
Interruptroutinen (ISRs) sollten also möglichst kurz sein und keine Schleifen mit vielen Durchläufen enthalten. Längere Operationen können meist in einen "Interrupt-Teil" in einer ISR und einen "Arbeitsteil" im Hauptprogramm aufgetrennt werden. Z.B. Speichern des Zustands aller Eingänge im EEPROM in bestimmten Zeitabständen: ISR-Teil: Zeitvergleich (Timer,RTC) mit Logzeit/-intervall. Bei Übereinstimmung ein globales Flag setzen (volatile bei Flag-Deklaration nicht vergessen, s.u.). Dann im Hauptprogramm prüfen, ob das Flag gesetzt ist. Wenn ja: die Daten im EEPROM ablegen und Flag löschen.<br />
<br />
(*)<br />
Hinweis: <br />
Es gibt allerdings die seltene Situation, dass man gerade eingelesene<br />
ADC-Werte sofort verarbeiten muss. Besonders dann, wenn man mehrere Werte sehr<br />
schnell hintereinander bekommt. Dann bleibt einem nichts anderes übrig, als die<br />
Werte noch in der ISR zu verarbeiten. Kommt aber sehr selten vor und sollte<br />
durch geeignete Wahl des Systemtaktes bzw. Auswahl des Controllers vermieden werden!<br />
<br />
== Interrupt-Quellen ==<br />
<br />
Die folgenden Ereignisse können einen Interrupt auf einem AVR AT90S2313 auslösen, wobei die Reihenfolge der Auflistung auch die Priorität der Interrupts aufzeigt.<br />
<br />
* Reset<br />
* Externer Interrupt 0<br />
* Externer Interrupt 1<br />
* Timer/Counter 1 Capture Ereignis<br />
* Timer/Counter 1 Compare Match<br />
* Timer/Counter 1 Überlauf<br />
* Timer/Counter 0 Überlauf<br />
* UART Zeichen empfangen<br />
* UART Datenregister leer<br />
* UART Zeichen gesendet<br />
* Analoger Komparator<br />
<br />
Die Anzahl der möglichen Interruptquellen variiert zwischen den verschiedenen Microcontroller-Typen. Im Zweifel hilft ein Blick ins Datenblatt ("Interrupt Vectors").<br />
<br />
== Register ==<br />
<br />
Der AT90S2313 verfügt über 2 Register die mit den<br />
Interrupts zusammenhängen.<br />
<br />
{| class="wikitable"<br />
|- <br />
| '''GIMSK'''<br />
| '''G'''eneral '''I'''nterrupt '''M'''a'''sk''' Register.<br /><br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit <br />
| 7 || 6|| 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''INT1''' || '''INT0''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-'''<br />
|- <br />
! R/W<br />
| R/W || R/W || R || R || R || R || R || R<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''INT1''' (External '''Int'''errupt Request '''1''' Enable)<br />
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am '''INT1'''-Pin eine steigende oder fallende (je nach Konfiguration im '''MCUCR''') Flanke erkannt wird.<br />
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.<br />
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.<br />
<br />
'''INT0''' (External '''Int'''errupt Request '''0''' Enable)<br />
:Wenn dieses Bit gesetzt ist, wird ein Interrupt ausgelöst, wenn am '''INT0'''-Pin eine steigende oder fallende (je nach Konfiguration im '''MCUCR''') Flanke erkannt wird.<br />
:Das Global Enable Interrupt Flag muss selbstverständlich auch gesetzt sein.<br />
:Der Interrupt wird auch ausgelöst, wenn der Pin als Ausgang geschaltet ist. Auf diese Weise bietet sich die Möglichkeit, Software-Interrupts zu realisieren.<br />
<br />
|- <br />
| '''GIFR'''<br />
| '''G'''eneral '''I'''nterrupt '''F'''lag '''R'''egister.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''INTF1''' || '''INTF0''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-''' || '''-'''<br />
|- <br />
! R/W<br />
| R/W || R/W || R || R || R || R || R || R<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''INTF1''' (External '''Int'''errupt Flag '''1''')<br />
:Dieses Bit wird gesetzt, wenn am '''INT1'''-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.<br />
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert '''1(!)''' eingeschrieben wird.<br />
<br />
'''INTF0''' (External '''Int'''errupt Flag '''0''')<br />
:Dieses Bit wird gesetzt, wenn am '''INT0'''-Pin eine Interrupt-Bedingung, entsprechend der Konfiguration, als eingetreten erkannt wird. Wenn das Global Enable Interrupt Flag gesetzt ist, wird die Interruptroutine angesprungen.<br />
:Das Flag wird automatisch gelöscht, wenn die Interruptroutine beendet ist. Alternativ kann das Flag gelöscht werden, indem der Wert '''1(!)''' eingeschrieben wird.<br />
|- <br />
| '''MCUCR'''<br />
| '''MCU''' '''C'''ontrol '''R'''egister.<br />
<br />
Das MCU Control Register enthält Kontrollbits für allgemeine MCU-Funktionen.<br />
<br />
{| class="wikitable" style="text-align:center"<br />
|- <br />
! Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|- <br />
! Name<br />
| '''-'''|| '''-'''|| '''SE'''|| '''SM'''|| '''ISC11'''|| '''ISC10'''|| '''ISC01'''|| '''ISC00'''<br />
|- <br />
! R/W<br />
| R || R || R/W || R/W || R/W || R/W || R/W || R/W<br />
|- <br />
! Initialwert<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
<br />
|}<br />
<br />
'''SE''' ('''S'''leep '''E'''nable)<br />
:Dieses Bit muss gesetzt sein, um den Controller mit dem '''SLEEP'''-Befehl in den Schlafzustand versetzen zu können.<br />
:Um den Schlafmodus nicht irrtümlich einzuschalten, wird empfohlen, das Bit erst unmittelbar vor Ausführung des '''SLEEP'''-Befehls zu setzen.<br />
<br />
'''SM''' ('''S'''leep '''M'''ode)<br />
:Dieses Bit bestimmt über den Schlafmodus.<br />
:Ist das Bit gelöscht, so wird der '''Idle'''-Modus ausgeführt. Ist das Bit gesetzt, so wird der '''Power-Down'''-Modus ausgeführt. (für andere AVR Controller siehe Abschnitt "Sleep-Mode")<br />
<br />
'''ISC11''', '''ISC10''' ('''I'''nterrupt '''S'''ense '''C'''ontrol '''1''' Bits)<br />
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am '''INT1'''-Pin ausgewertet wird.<br />
<br />
:{| class="wikitable"<br />
|- <br />
! ISC11 || ISC10 || Bedeutung<br />
|- <br />
| align="center" | 0<br />
| align="center" | 0<br />
| Low Level an '''INT1''' erzeugt einen Interrupt.<br />
<br />
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.<br />
|- <br />
| align="center" | 0<br />
| align="center" | 1<br />
| Reserviert<br />
|- <br />
| align="center" | 1<br />
| align="center" | 0<br />
| Die fallende Flanke an '''INT1''' erzeugt einen Interrupt.<br />
|- <br />
| align="center" | 1<br />
| align="center" | 1<br />
| Die steigende Flanke an '''INT1''' erzeugt einen Interrupt.<br />
|}<br />
<br />
'''ISC01''', '''ISC00''' ('''I'''nterrupt '''S'''ense '''C'''ontrol '''0''' Bits)<br />
:Diese beiden Bits bestimmen, ob die steigende oder die fallende Flanke für die Interrupterkennung am '''INT0'''-Pin ausgewertet wird.<br />
<br />
:{| class="wikitable"<br />
|- <br />
! ISC01 || ISC00 || Bedeutung<br />
|- <br />
| align="center" | 0<br />
| align="center" | 0<br />
| Low Level an '''INT0''' erzeugt einen Interrupt.<br />
<br />
Der Interrupt wird getriggert, solange der Pin auf 0 bleibt.<br />
|- <br />
| align="center" | 0<br />
| align="center" | 1<br />
| Reserviert<br />
|- <br />
| align="center" | 1<br />
| align="center" | 0<br />
| Die fallende Flanke an '''INT0''' erzeugt einen Interrupt.<br />
|- <br />
| align="center" | 1<br />
| align="center" | 1<br />
| Die steigende Flanke an '''INT0''' erzeugt einen Interrupt.<br />
|}<br />
<br />
|}<br />
<br />
== Allgemeines über die Interrupt-Abarbeitung ==<br />
<br />
Wenn ein Interrupt eintrifft, wird automatisch das '''Global Interrupt Enable''' Bit im Status Register '''SREG''' gelöscht und alle weiteren Interrupts unterbunden. Dieses wird automatisch wieder gesetzt, wenn die Interruptroutine beendet wird. Wenn in der Zwischenzeit weitere Interrupts eintreffen, werden die zugehörigen Interrupt-Bits gesetzt und die Interrupts bei Beendigung der laufenden Interrupt-Routine in der Reihenfolge ihrer Priorität ausgeführt. Dies kann<br />
eigentlich nur dann zu Problemen führen, wenn ein hoch priorisierter Interrupt ständig und in kurzer Folge auftritt. Dieser sperrt dann möglicherweise alle anderen Interrupts mit niedrigerer Priorität. Dies ist einer der Gründe, weshalb die Interrupt-Routinen sehr kurz gehalten werden sollen. Es ist möglich das GIE-Bit in der ISR zu setzen und so schon wieder weitere Interrupts zuzulassen - allerdings sollte man damit vorsichtig sein und genau wissen was man damit macht. Kritisch wird es vor allem wenn der gleiche Interrupt noch einmal kommt, bevor die ISR abgearbeitet ist. <br />
<br />
<!-- === Das Status-Register ===<br />
<br />
Es gilt auch zu beachten, dass das Status-Register während der Abarbeitung einer Interruptroutine nicht automatisch gesichert wird. Falls notwendig, muss dies vom Programmierer selber vorgesehen werden. --><br />
<br />
== Interrupts mit avr-gcc ==<br />
<br />
<!-- ''Anmerkung eines Nutzers: Ich habe mir das Thema hier angearbeitet und hatte am Anfang starke Probleme: Jeder Interrupt muss nochmals einzeln aktiviert werden. Es reicht nicht nur per ''sei()'' die Interrupts global zu aktiveren.'' - mthomas: Hoffentlich duch die modifizerte Einleitung etwas offensichtlicher erläutert. Ansonsten bitte per Eintrag auf die Diskussionseite nochmals melden) --> <br />
<!-- Selbstverständlich können alle interruptspezifischen Registerzugriffe wie gewohnt über I/O-Adressierung vorgenommen werden. Etwas einfacher geht es jedoch, wenn wir die vom Compiler zur Verfügung gestellten Mittel einsetzen.--><br />
Funktionen zur Interrupt-Verarbeitung werden in den Includedateien ''interrupt.h'' der avr-libc zur Verfügung gestellt (bei älterem Quellcode zusätzlich ''signal.h'').<br />
<br />
<syntaxhighlight lang="c"><br />
// fuer sei(), cli() und ISR():<br />
#include <avr/interrupt.h><br />
</syntaxhighlight><br />
<br />
Das Makro '''sei()''' schaltet die Interrupts ein. Eigentlich wird nichts anderes gemacht, als das '''Global Interrupt Enable''' Bit im Status Register gesetzt.<br />
<br />
<syntaxhighlight lang="c"><br />
sei();<br />
</syntaxhighlight><br />
<br />
Das Makro '''cli()''' schaltet die Interrupts aus, oder anders gesagt, das '''Global Interrupt Enable''' Bit im Status Register wird gelöscht.<br />
<br />
<syntaxhighlight lang="c"><br />
cli();<br />
</syntaxhighlight><br />
<br />
Oft steht man vor der Aufgabe, dass eine Codesequenz nicht unterbrochen werden darf. Es liegt dann nahe, zu Beginn dieser Sequenz ein cli() und am Ende ein sei() einzufügen. Dies ist jedoch ungünstig, wenn die Interrupts vor Aufruf der Sequenz deaktiviert waren und danach auch weiterhin deaktiviert bleiben sollen. Ein sei() würde ungeachtet des vorherigen Zustands die Interrupts aktivieren, was zu unerwünschten Seiteneffekten führen kann. Die aus dem folgenden Beispiel ersichtliche Vorgehensweise ist in solchen Fällen vorzuziehen:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
#include <inttypes.h><br />
<br />
//...<br />
<br />
void NichtUnterbrechenBitte(void)<br />
{<br />
uint8_t tmp_sreg; // temporaerer Speicher fuer das Statusregister<br />
<br />
tmp_sreg = SREG; // Statusregister (also auch das I-Flag darin) sichern<br />
cli(); // Interrupts global deaktivieren<br />
<br />
/* hier "unterbrechnungsfreier" Code */<br />
<br />
/* Beispiel Anfang<br />
JTAG-Interface eines ATmega16 per Software deaktivieren <br />
und damit die JTAG-Pins an PORTC für "general I/O" nutzbar machen<br />
ohne die JTAG-Fuse-Bit zu aendern. Dazu ist eine "timed sequence"<br />
einzuhalten (vgl Datenblatt ATmega16, Stand 10/04, S. 229): <br />
Das JTD-Bit muss zweimal innerhalb von 4 Taktzyklen geschrieben <br />
werden. Ein Interrupt zwischen den beiden Schreibzugriffen wuerde <br />
die erforderliche Sequenz "brechen", das JTAG-Interface bliebe<br />
weiterhin aktiv und die IO-Pins weiterhin für JTAG reserviert. */<br />
<br />
MCUCSR |= (1<<JTD);<br />
MCUCSR |= (1<<JTD); // 2 mal in Folge ,vgl. Datenblatt fuer mehr Information<br />
<br />
/* Beispiel Ende */<br />
<br />
SREG = tmp_sreg; // Status-Register wieder herstellen <br />
// somit auch das I-Flag auf gesicherten Zustand setzen<br />
}<br />
<br />
void NichtSoGut(void)<br />
{<br />
cli();<br />
<br />
/* hier "unterbrechnungsfreier" Code */<br />
<br />
sei();<br />
}<br />
<br />
<br />
int main(void)<br />
{<br />
//...<br />
<br />
cli(); <br />
// Interrupts global deaktiviert <br />
<br />
NichtUnterbrechenBitte();<br />
// auch nach Aufruf der Funktion deaktiviert<br />
<br />
sei();<br />
// Interrupts global aktiviert <br />
<br />
NichtUnterbrechenBitte();<br />
// weiterhin aktiviert<br />
//...<br />
<br />
/* Verdeutlichung der unguenstigen Vorgehensweise mit cli/sei: */<br />
cli(); <br />
// Interrupts jetzt global deaktiviert <br />
<br />
NichtSoGut();<br />
// nach Aufruf der Funktion sind Interrupts global aktiviert <br />
// dies ist mglw. ungewollt!<br />
//...<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
<br />
<!-- mt: besser so nicht(?), lieber "datenblattkonform"<br />
<br />
<font face="Courier New">'''timer_enable_int (unsigned char ints);<br /><br />
'''</font>Schaltet Timerbezogene Interrupts ein bzw. aus.<br /><br />
Wenn als Argument '''ints''' der Wert 0 übergeben wird so werden alle<br />
Timerinterrupts ausgeschaltet, ansonsten muss in '''ints''' angegeben werden,<br />
welche Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu<br />
setzenden Bits definiert werden.<br /><br />
Beispiel: '''<font face="Courier New">timer_enable_int (1 << TOIE1));<br /><br />
</font>'''Achtung: Wenn ein Timerinterrupt eingeschaltet wird während ein<br />
anderer Timerinterrupt bereits läuft, dann müssen beide Bits angegeben werden<br />
sonst wird der andere Timerinterrupt versehentlich ausgeschaltet.<br />
<br />
<font face="Courier New">'''enable_external_int (unsigned char ints);<br /><br />
'''</font>Schaltet die externen Interrupts ein bzw. aus.<br /><br />
Wenn als Argument '''ints''' der Wert 0 übergeben wird so werden alle externen<br />
Interrrups ausgeschaltet, ansonsten muss in '''ints''' angegeben werden, welche<br />
Interrupts zu aktivieren sind. Dabei müssen einfach die entsprechend zu<br />
setzenden Bits definiert werden.<br /><br />
Beispiel: '''<font face="Courier New">enable_external_int ((1<<br />
</font>'''Schaltet die externen Interrupts 0 und 1 ein.<br />
<br />
Nachdem nun die Interrupts aktiviert sind, braucht es selbstverständlich noch den auszuführenden Code, der ablaufen soll, wenn ein Interrupt eintrifft.<br />
--><br />
Zu den aktivierten Interrupts ist eine Funktion zu programmieren, deren Code aufgerufen wird, wenn der betreffende Interrupt auftritt (Interrupt-Handler, Interrupt-Service-Routine). Dazu existiert die Definition (ein Makro) '''ISR'''.<br />
<br />
=== ISR ===<br />
<br />
(''ISR()'' ersetzt bei neueren Versionen der avr-libc ''SIGNAL()''. SIGNAL sollte nicht mehr genutzt werden, zur Portierung von SIGNAL nach ISR siehe den [[AVR-GCC-Tutorial#Anhang|Anhang]].)<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
//...<br />
ISR(Vectorname) /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */<br />
{<br />
/* Interrupt Code */<br />
}<br />
</syntaxhighlight><br />
<br />
Mit ''ISR'' wird eine Funktion für die Bearbeitung eines Interrupts eingeleitet. Als Argument muss dabei die Benennung des entsprechenden Interruptvektors angegeben werden. Diese sind in den jeweiligen Includedateien IOxxxx.h zu finden. Die Bezeichnung entspricht dem Namen aus dem Datenblatt, bei dem die Leerzeichen durch Unterstriche ersetzt sind und ein ''_vect'' angehängt ist.<br />
<br />
Als Beispiel ein Ausschnitt aus der Datei für den ATmega8 (bei WinAVR Standardinstallation in C:\WinAVR\avr\include\avr\iom8.h) in der neben den aktuellen Namen für ''ISR'' (*_vect) noch die Bezeichnungen für das inzwischen nicht mehr aktuelle ''SIGNAL'' (SIG_*) enthalten sind.<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
/* $Id: iom8.h,v 1.13 2005/10/30 22:11:23 joerg_wunsch Exp $ */<br />
<br />
/* avr/iom8.h - definitions for ATmega8 */<br />
//...<br />
<br />
/* Interrupt vectors */<br />
<br />
/* External Interrupt Request 0 */<br />
#define INT0_vect _VECTOR(1)<br />
#define SIG_INTERRUPT0 _VECTOR(1)<br />
<br />
/* External Interrupt Request 1 */<br />
#define INT1_vect _VECTOR(2)<br />
#define SIG_INTERRUPT1 _VECTOR(2)<br />
<br />
/* Timer/Counter2 Compare Match */<br />
#define TIMER2_COMP_vect _VECTOR(3)<br />
#define SIG_OUTPUT_COMPARE2 _VECTOR(3)<br />
<br />
/* Timer/Counter2 Overflow */<br />
#define TIMER2_OVF_vect _VECTOR(4)<br />
#define SIG_OVERFLOW2 _VECTOR(4)<br />
<br />
/* Timer/Counter1 Capture Event */<br />
#define TIMER1_CAPT_vect _VECTOR(5)<br />
#define SIG_INPUT_CAPTURE1 _VECTOR(5)<br />
<br />
/* Timer/Counter1 Compare Match A */<br />
#define TIMER1_COMPA_vect _VECTOR(6)<br />
#define SIG_OUTPUT_COMPARE1A _VECTOR(6)<br />
<br />
/* Timer/Counter1 Compare Match B */<br />
#define TIMER1_COMPB_vect _VECTOR(7)<br />
#define SIG_OUTPUT_COMPARE1B _VECTOR(7)<br />
<br />
//...<br />
</syntaxhighlight><br />
<br />
<!--Vor Nutzung von SIGNAL muss ebenfalls die Header-Datei signal.h eingebunden werden.--> <br />
Mögliche Funktionsrümpfe für Interruptfunktionen sind zum Beispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
/* veraltet: #include <avr/signal.h> */<br />
<br />
ISR(INT0_vect) /* veraltet: SIGNAL(SIG_INTERRUPT0) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
ISR(TIMER0_OVF_vect) /* veraltet: SIGNAL(SIG_OVERFLOW0) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
ISR(USART_RXC_vect) /* veraltet: SIGNAL(SIG_UART_RECV) */<br />
{<br />
/* Interrupt Code */<br />
}<br />
<br />
// und so weiter und so fort...<br />
</syntaxhighlight><br />
<br />
Auf die korrekte Schreibweise der Vektorbezeichnung ist zu achten. Der gcc-Compiler prüft erst ab Version 4.x, ob ein Signal/Interrupt der angegebenen Bezeichnung tatsächlich in der Includedatei definiert ist und gibt andernfalls eine Warnung aus. Bei WinAVR (ab 2/2005) wurde die Überprüfung auch in den mitgelieferten Compiler der Version 3.x integriert. Aus dem gcc-Quellcode Version 3.x selbst erstellte Compiler enthalten die Prüfung nicht (vgl. [[AVR-GCC]]). <br />
<br />
Während der Ausführung der Funktion sind alle weiteren Interrupts automatisch gesperrt. Beim Verlassen der Funktion werden die Interrupts wieder zugelassen.<br />
<br />
Sollte während der Abarbeitung der Interruptroutine ein weiterer Interrupt (gleiche oder andere Interruptquelle) auftreten, so wird das entsprechende Bit im zugeordneten Interrupt Flag Register gesetzt und die entsprechende Interruptroutine automatisch nach dem Beenden der aktuellen Funktion aufgerufen.<br />
<br />
Ein Problem ergibt sich eigentlich nur dann, wenn während der Abarbeitung der aktuellen Interruptroutine mehrere gleichartige Interrupts auftreten. Die entsprechende Interruptroutine wird im Nachhinein zwar aufgerufen jedoch wissen wir nicht, ob nun der entsprechende Interrupt einmal, zweimal oder gar noch öfter aufgetreten ist. Deshalb soll hier noch einmal betont werden, dass Interruptroutinen so schnell wie nur irgend möglich wieder verlassen werden sollten.<br />
<br />
=== Unterbrechbare Interruptroutinen ===<br />
<br />
"Faustregel": im Zweifel '''ISR'''. Die nachfolgend beschriebene Methode nur dann verwenden, wenn man sich über die unterschiedliche Funktionsweise im Klaren ist.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
<br />
ISR(XXX,ISR_NOBLOCK) /* veraltet: INTERRUPT(SIG_OVERFLOW0) */<br />
{<br />
/* Interrupt-Code */<br />
}<br />
</syntaxhighlight><br />
<br />
Hierbei steht XXX für den oben beschriebenen Namen des Vektors (also z.&nbsp;B. ''TIMER0_OVF_vect''). Der Unterschied im Vergleich zu einer herkömmlichen ISR ist, dass hier beim Aufrufen der Funktion das '''Global Enable Interrupt''' Bit durch Einfügen einer SEI-Anweisung direkt wieder gesetzt und somit alle Interrupts zugelassen werden &ndash; auch XXX-Interrupts. <br />
<br />
Bei unsachgemässer Handhabung kann dies zu erheblichen Problemen durch Rekursion wie einem Stack-Overflow oder anderen unerwarteten Effekten führen und sollte wirklich nur dann eingesetzt werden, wenn man sich sicher ist, das Ganze auch im Griff zu haben.<br />
<br />
Insbesondere sollte möglichst am ISR-Anfang die auslösende IRQ-Quelle deaktiviert und erst am Ende der ISR wieder aktiviert werden. Robuster als die Verwendung einer NOBLOCK-ISR ist daher folgender ISR-Aufbau:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/interrupt.h><br />
<br />
ISR (XXX) <br />
{<br />
// Implementiere die ISR ohne zunaechst weitere IRQs zuzulassen<br />
<br />
<<Deaktiviere die XXX-IRQ>><br />
<br />
// Erlaube alle Interrupts (ausser XXX)<br />
sei();<br />
<br />
//... Code ...<br />
<br />
// IRQs global deaktivieren um die XXX-IRQ wieder gefahrlos <br />
// aktivieren zu koennen<br />
cli();<br />
<br />
<<Aktiviere die XXX-IRQ>><br />
}<br />
</syntaxhighlight><br />
Auf diese Weise kann sich die XXX-IRQ nicht selbst unterbrechen, was zu einer Art Endlosschleife führen würde.<br />
<br />
Siehe auch: Hinweise in [[AVR-GCC]]<br />
<br />
siehe dazu: http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html<br />
<br />
== Datenaustausch mit Interrupt-Routinen ==<br />
<br />
Variablen, die sowohl in Interrupt-Routinen (ISR = Interrupt Service Routine(s)) als auch vom übrigen Programmcode geschrieben oder gelesen werden, müssen mit einem '''volatile''' deklariert werden. Damit wird dem Compiler mitgeteilt, dass der Inhalt der Variablen vor jedem Lesezugriff aus dem Speicher gelesen und nach jedem Schreibzugriff in den Speicher geschrieben wird. Ansonsten könnte der Compiler den Code so optimieren, dass der Wert der Variablen nur in Prozessorregistern zwischengespeichert wird, die nichts von der Änderung woanders mitbekommen.<br />
<br />
Zur Veranschaulichung ein Codefragment für eine Tastenentprellung mit Erkennung einer "lange gedrückten" Taste.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
#include <stdint.h><br />
//...<br />
<br />
// Schwellwerte<br />
// Entprellung: <br />
#define CNTDEBOUNCE 10<br />
// "lange gedrueckt:"<br />
#define CNTREPEAT 200<br />
<br />
// hier z.&nbsp;B. Taste an Pin2 PortA "active low" = 0 wenn gedrueckt<br />
#define KEY_PIN PINA<br />
#define KEY_PINNO PA2<br />
<br />
// beachte: volatile! <br />
volatile uint8_t gKeyCounter;<br />
<br />
// Timer-Compare Interrupt ISR, wird z.B. alle 10ms ausgefuehrt<br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
// hier wird gKeyCounter veraendert. Die übrigen<br />
// Programmteile müssen diese Aenderung "sehen":<br />
// volatile -> aktuellen Wert immer in den Speicher schreiben<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
if (gKeyCounter < CNTREPEAT) gKeyCounter++;<br />
}<br />
else {<br />
gKeyCounter = 0;<br />
}<br />
}<br />
<br />
//...<br />
<br />
int main(void)<br />
{<br />
//...<br />
/* hier: Initialisierung der Ports und des Timer-Interrupts */<br />
//... <br />
// hier wird auf gKeyCounter zugegriffen. Dazu muss der in der<br />
// ISR geschriebene Wert bekannt sein:<br />
// volatile -> aktuellen Wert immer aus dem Speicher lesen<br />
if ( gKeyCounter > CNTDEBOUNCE ) { // Taste mind. 10*10 ms "prellfrei"<br />
if (gKeyCounter == CNTREPEAT) {<br />
/* hier: Code fuer "Taste lange gedrueckt" */<br />
}<br />
else {<br />
/* hier: Code fuer "Taste kurz gedrueckt" */<br />
}<br />
}<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Wird innerhalb einer ISR mehrfach auf eine mit volatile deklarierte Variable zugegriffen, wirkt sich dies ungünstig auf die Verarbeitungsgeschwindigkeit aus, da bei jedem Zugriff mit dem Speicherinhalt abgeglichen wird. Da bei AVR-Controllern ''innerhalb'' einer ISR keine Unterbrechungen zu erwarten sind, bietet es sich an, einen Zwischenspeicher in Form einer lokalen Variable zu verwenden, deren Inhalt zu Beginn und am Ende mit dem der volatile Variable synchronisiert wird. Lokale Variable werden bei eingeschalteter Optimierung mit hoher Wahrscheinlichkeit in Prozessorregistern verwaltet und der Zugriff darauf ist daher nur mit wenigen internen Operationen verbunden. Die ISR aus dem vorherigen Beispiel lässt sich so optimieren:<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
uint8_t tmp_kc;<br />
<br />
tmp_kc = gKeyCounter; // Uebernahme in lokale Arbeitsvariable<br />
<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
if (tmp_kc < CNTREPEAT) {<br />
tmp_kc++;<br />
}<br />
}<br />
else {<br />
tmp_kc = 0;<br />
}<br />
<br />
gKeyCounter = tmp_kc; // Zurueckschreiben<br />
}<br />
//...<br />
</syntaxhighlight><br />
<br />
Zum Vergleich die Disassemblies (Ausschnitte der "lss-Dateien", compiliert für ATmega162) im Anschluss. Man erkennt den viermaligen Zugriff auf die Speicheraddresse von ''gKeyCounter'' (hier 0x032A) in der ISR ohne "Cache"-Variable und den zweimaligen Zugriff in der Variante mit Zwischenspeicher. Im Beispiel ist der Vorteil gering, bei komplexeren Routinen kann die Zwischenspeicherung in lokalen Variablen jedoch zu deutlicheren Verbesserungen führen.<br />
<br />
<pre><br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
86a: 1f 92 push r1<br />
86c: 0f 92 push r0<br />
86e: 0f b6 in r0, 0x3f ; 63<br />
870: 0f 92 push r0<br />
872: 11 24 eor r1, r1<br />
874: 8f 93 push r24<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
876: ca 99 sbic 0x19, 2 ; 25<br />
878: 0a c0 rjmp .+20 ; 0x88e <__vector_13+0x24><br />
if (gKeyCounter < CNTREPEAT) gKeyCounter++;<br />
87a: 80 91 2a 03 lds r24, 0x032A<br />
87e: 88 3c cpi r24, 0xC8 ; 200 <br />
880: 40 f4 brcc .+16 ; 0x892 <__vector_13+0x28><br />
882: 80 91 2a 03 lds r24, 0x032A<br />
886: 8f 5f subi r24, 0xFF ; 255<br />
888: 80 93 2a 03 sts 0x032A, r24<br />
88c: 02 c0 rjmp .+4 ; 0x892 <__vector_13+0x28><br />
}<br />
else {<br />
gKeyCounter = 0;<br />
88e: 10 92 2a 03 sts 0x032A, r1<br />
892: 8f 91 pop r24<br />
894: 0f 90 pop r0<br />
896: 0f be out 0x3f, r0 ; 63<br />
898: 0f 90 pop r0<br />
89a: 1f 90 pop r1<br />
89c: 18 95 reti<br />
</pre><br />
<br />
<pre><br />
ISR(TIMER1_COMPA_vect)<br />
{<br />
86a: 1f 92 push r1<br />
86c: 0f 92 push r0<br />
86e: 0f b6 in r0, 0x3f ; 63<br />
870: 0f 92 push r0<br />
872: 11 24 eor r1, r1<br />
874: 8f 93 push r24<br />
uint8_t tmp_kc;<br />
<br />
tmp_kc = gKeyCounter;<br />
876: 80 91 2a 03 lds r24, 0x032A<br />
<br />
if ( !(KEY_PIN & (1<<KEY_PINNO)) ) {<br />
87a: ca 9b sbis 0x19, 2 ; 25<br />
87c: 02 c0 rjmp .+4 ; 0x882 <__vector_13+0x18><br />
87e: 80 e0 ldi r24, 0x00 ; 0<br />
880: 03 c0 rjmp .+6 ; 0x888 <__vector_13+0x1e><br />
if (tmp_kc < CNTREPEAT) {<br />
882: 88 3c cpi r24, 0xC8 ; 200<br />
884: 08 f4 brcc .+2 ; 0x888 <__vector_13+0x1e><br />
tmp_kc++;<br />
886: 8f 5f subi r24, 0xFF ; 255<br />
}<br />
}<br />
else {<br />
tmp_kc = 0;<br />
}<br />
<br />
gKeyCounter = tmp_kc;<br />
888: 80 93 2a 03 sts 0x032A, r24<br />
88c: 8f 91 pop r24<br />
88e: 0f 90 pop r0<br />
890: 0f be out 0x3f, r0 ; 63<br />
892: 0f 90 pop r0<br />
894: 1f 90 pop r1<br />
896: 18 95 reti<br />
</pre><br />
<br />
=== volatile und Pointer ===<br />
<br />
Bei '''volatile''' in Verbindung mit Pointern ist zu beachten, ob der Pointer selbst oder die Variable, auf die der Pointer zeigt, '''volatile''' ist.<br />
<br />
<syntaxhighlight lang="c"><br />
volatile uint8_t *a; // das Ziel von a ist volatile<br />
<br />
uint8_t *volatile a; // a selbst ist volatile<br />
</syntaxhighlight><br />
<br />
Falls der Pointer volatile ist (zweiter Fall im Beispiel), ist zu beachten, dass der Wert des Pointers, also eine Speicheradresse, intern in mehr als einem Byte verwaltet wird. Lese- und Schreibzugriffe im Hauptprogramm (außerhalb von Interrupt-Routinen) sind daher so zu implementieren, dass alle Teilbytes der Adresse konsistent bleiben, vgl. dazu den folgenden Abschnitt.<br />
<br />
=== Variablen größer 1 Byte ===<br />
<br />
Bei Variablen größer ein Byte, auf die in Interrupt-Routinen und im Hauptprogramm zugegriffen wird, muss darauf geachtet werden, dass die Zugriffe auf die einzelnen Bytes außerhalb der ISR nicht durch einen Interrupt unterbrochen werden. (Allgemeinplatz: AVRs sind 8-bit Controller). Zur Veranschaulichung ein Codefragment:<br />
<br />
<syntaxhighlight lang="c"><br />
//...<br />
volatile uint16_t gMyCounter16bit;<br />
//...<br />
ISR(...)<br />
{<br />
//...<br />
gMyCounter16Bit++;<br />
//...<br />
}<br />
<br />
int main(void)<br />
{<br />
uint16_t tmpCnt;<br />
//...<br />
// nicht gut: Mglw. hier ein Fehler, wenn ein Byte von MyCounter <br />
// schon in tmpCnt kopiert ist aber vor dem Kopieren des zweiten Bytes <br />
// ein Interrupt auftritt, der den Inhalt von MyCounter verändert.<br />
tmpCnt = gMyCounter16bit; <br />
<br />
<br />
// besser: Änderungen "außerhalb" verhindern -> alle "Teilbytes"<br />
// bleiben konsistent<br />
cli(); // Interrupts deaktivieren<br />
tmpCnt = gMyCounter16Bit;<br />
sei(); // wieder aktivieren<br />
<br />
// oder: vorheriger Status des globalen Interrupt-Flags bleibt erhalten<br />
uint8_t sreg_tmp;<br />
sreg_tmp = SREG; /* Sichern */<br />
cli()<br />
tmpCnt = gMyCounter16Bit;<br />
SREG = sreg_tmp; /* Wiederherstellen */<br />
<br />
// oder: mehrfach lesen, bis man konsistente Daten hat<br />
uint16_t count1 = gMyCounter16Bit;<br />
uint16_t count2 = gMyCounter16Bit;<br />
while (count1 != count2) {<br />
count1 = count2;<br />
count2 = gMyCounter16Bit;<br />
}<br />
tmpCnt = count1;<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Die avr-libc bietet ab Version 1.6.0(?) einige Hilfsfunktionen/Makros, mit der im Beispiel oben gezeigten Funktionalität, die zusätzlich auch sogenannte [http://en.wikipedia.org/wiki/Memory_barrier memory barriers] beinhalten. Diese stehen nach #include <util/atomic.h> zur Verfügung.<br />
<syntaxhighlight lang="c"><br />
//...<br />
#include <util/atomic.h><br />
//...<br />
<br />
// analog zu cli, Zugriff, sei:<br />
ATOMIC_BLOCK(ATOMIC_FORCEON) {<br />
tmpCnt = gMyCounter16Bit;<br />
}<br />
<br />
// oder:<br />
<br />
// analog zu Sicherung des SREG, cli, Zugriff und Zurückschreiben des SREG:<br />
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />
tmpCnt = gMyCounter16Bit;<br />
}<br />
<br />
//...<br />
</syntaxhighlight><br />
<br />
* siehe auch [http://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html Dokumentation der avr-libc zu atomic.h]<br />
<br />
== Interrupt-Routinen und Registerzugriffe ==<br />
<br />
Falls Register sowohl im Hauptprogramm als auch in Interrupt-Routinen verändert werden, ist darauf zu achten, dass diese Zugriffe sich nicht überlappen. Nur wenige Anweisungen lassen sich in sogenannte "atomare" Zugriffe übersetzen, die nicht von Interrupt-Routinen unterbrochen werden können. <br />
<br />
Zur Veranschaulichung eine Anweisung, bei der ein Bit und im Anschluss drei Bits in einem Register gesetzt werden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
<br />
int main(void)<br />
{<br />
//...<br />
PORTA |= (1<<PA0);<br />
<br />
PORTA |= (1<<PA2)|(1<<PA3)|(1<<PA4);<br />
//...<br />
}<br />
</syntaxhighlight><br />
<br />
Der Compiler übersetzt diese Anweisungen für einen ATmega128 bei Optimierungsstufe "S" nach:<br />
<br />
<div class="code"><pre><br />
...<br />
PORTA |= (1<<PA0);<br />
d2: d8 9a sbi 0x1b, 0 ; 27 (a)<br />
<br />
PORTA |= (1<<PA2)|(1<<PA3)|(1<<PA4);<br />
d4: 8b b3 in r24, 0x1b ; 27 (b)<br />
d6: 8c 61 ori r24, 0x1C ; 28 (c)<br />
d8: 8b bb out 0x1b, r24 ; 27 (d)<br />
...<br />
</pre></div><br />
<br />
Das Setzen des einzelnen Bits wird bei eingeschalteter Optimierung für Register im unteren Speicherbereich in eine einzige Assembler-Anweisung (sbi) übersetzt und ist nicht anfällig für Unterbrechungen durch Interrupts. Die Anweisung zum Setzen von drei Bits wird jedoch in drei abhängige Assembler-Anweisungen übersetzt und bietet damit zwei "Angriffspunkte" für Unterbrechungen. Eine Interrupt-Routine könnte nach dem Laden des Ausgangszustands in den Zwischenspeicher (hier Register 24) den Wert des Registers ändern, z.&nbsp;B. ein Bit löschen. Damit würde der Zwischenspeicher nicht mehr mit dem tatsächlichen Zustand übereinstimmen aber dennoch nach der Bitoperation (hier ori) in das Register zurückgeschrieben. <br />
<br />
Beispiel: PORTA sei anfangs 0b00000000. Die erste Anweisung (a) setzt Bit 0 auf '''1''', PORTA ist danach 0b0000000'''1'''. Nun wird im ersten Teil der zweiten Anweisung der Portzustand in ein Register eingelesen (b). Unmittelbar darauf (vor (c)) "feuert" ein Interrupt, in dessen Interrupt-Routine Bit 0 von PORTA gelöscht wird. Nach Verlassen der Interrupt-Routine hat PORTA den Wert 0b00000000. In den beiden noch folgenden Anweisungen des Hauptprogramms wird nun der zwischengespeicherte "alte" Zustand 0b00000001 mit 0b00011100 logisch-'''ODER'''-verknüft (c) und das Ergebnis 0b00011101 in PortA geschrieben (d). Obwohl zwischenzeitlich Bit 0 gelöscht wurde, ist es nach (d) wieder gesetzt. <br />
<br />
Lösungsmöglichkeiten:<br />
* Register ohne besondere Vorkehrungen nicht in Interruptroutinen ''und'' im Hauptprogramm verändern.<br />
* Interrupts vor Veränderungen in Registern, die auch in ISRs verändert werden, deaktivieren ("cli").<br />
* Bits einzeln löschen oder setzen. sbi und cbi können nicht unterbrochen werden. Vorsicht: nur Register im unteren Speicherbereich sind mittels sbi/cbi ansprechbar. Der Compiler kann nur für diese sbi/cbi-Anweisungen generieren. Für Register außerhalb dieses Adressbereichs ("Memory-Mapped"-Register) werden auch zur Manipulation einzelner Bits abhängige Anweisungen erzeugt (lds,...,sts).<br />
<br />
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Frequently asked Questions/Fragen Nr. 1 und 8. (Stand: avr-libc Vers. 1.0.4)<br />
<br />
== Interruptflags löschen ==<br />
<br />
Beim Löschen von Interruptflags haben AVRs eine Besonderheit, die auch im Datenblatt beschrieben ist: Es wird zum Löschen eine 1 in das betreffende Bit geschrieben. <br />
<br />
Hinweis:<br /><br />
Bei Registern mit mehreren Interrupt-Flag-Bits (wie die Timer Interrupt Flag Register) '''nicht''' die übliche bitweise VerODERung nehmen, sondern eine direkte Zuweisung machen. Da sonst weitere Flags, als nur das gewünschte, ebenfalls gelöscht werden könnten.<br /><br />
([http://www.mikrocontroller.net/topic/171148#1640133 Erklärung]).<br />
<br />
== Was macht das Hauptprogramm? ==<br />
<br />
Im einfachsten (Ausnahme-)Fall gar nichts mehr. Es ist also durchaus denkbar, ein Programm zu schreiben, welches in der main-Funktion lediglich noch die Interrupts aktiviert und dann in einer Endlosschleife verharrt. Sämtliche Funktionen werden dann in den ISRs abgearbeitet. Diese Vorgehensweise ist jedoch bei den meisten Anwendungen schlecht: man verschenkt eine Verarbeitungsebene und hat außerdem möglicherweise Probleme durch Interruptroutinen, die zu viel Verarbeitungszeit benötigen.<br />
<br />
Normalerweise wird man in den Interruptroutinen nur die bei Auftreten des jeweiligen Interruptereignisses unbedingt notwendigen Operationen ausführen lassen. Alle weniger kritischen Aufgaben werden dann im Hauptprogramm abgearbeitet.<br />
<br />
* siehe auch: [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Interrupts and Signals<br />
<br />
= Sleep-Modes =<br />
<br />
AVR Controller verfügen über eine Reihe von sogenannten [[Sleep Mode |''Sleep-Modes'']] ("Schlaf-Modi"). Diese ermöglichen es, Teile des Controllers abzuschalten. Zum Einen kann damit besonders bei Batteriebetrieb Strom gespart werden, zum Anderen können Komponenten des Controllers deaktiviert werden, die die Genauigkeit des Analog-Digital-Wandlers bzw. des Analog-Comparators negativ beeinflussen. Der Controller wird durch Interrupts aus dem Schlaf geweckt. Welche Interrupts den jeweiligen Schlafmodus beenden, ist einer Tabelle im Datenblatt des jeweiligen Controllers zu entnehmen.<br />
Die Funktionen (eigentlich Makros) der avr-libc stehen nach Einbinden der header-Datei ''sleep.h'' zur Verfügung.<br />
<br />
;set_sleep_mode (uint8_t mode): Setzt den Schlafmodus, der bei Aufruf von sleep() aktiviert wird. In sleep.h sind einige Konstanten definiert (z.&nbsp;B. SLEEP_MODE_PWR_DOWN). Die definierten Modi werden jedoch nicht alle von sämtlichten AVR-Controllern unterstützt.<br />
;sleep_enable(): Aktiviert den gesetzten Schlafmodus, versetzt den Controller aber noch nicht in den Schlafmodus<br />
;sleep_cpu(): Versetzt den Controller in den Schlafmodus .sleep_cpu wird im Prinzip durch die Assembler-Anweisung ''sleep'' ersetzt.<br />
;sleep_disable(): Deaktiviert den gesetzten Schlafmodus<br />
;sleep_mode(): Versetzt den Controller in den mit set_sleep_mode gewählten Schlafmodus. Das Makro entspricht sleep_enable()+sleep_cpu()+sleep_disable(), beinhaltet also nicht die Aktivierung von Interrupts (besser nicht benutzen).<br />
<br />
Bei Anwendung von sleep_cpu() müssen Interrupts also bereits freigeben sein (sei()), da der Controller sonst nicht mehr "aufwachen" kann. sleep_mode() ist nicht geeignet für die Verwendung in ISR Interrupt-Service-Routinen, da bei deren Abarbeitung Interrupts global deaktiviert sind und somit auch die möglichen "Aufwachinterrupts". Abhilfe: stattdessen sleep_enable(), sei(), sleep_cpu(), sleep_disable() und evtl. cli() verwenden (vgl. Dokumentation der avr-libc).<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/sleep.h><br />
<br />
int main(void)<br />
{<br />
...<br />
<br />
while (1) {<br />
...<br />
set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br />
sleep_mode();<br />
<br />
// Code hier wird erst nach Auftreten eines entsprechenden<br />
// "Aufwach-Interrupts" verarbeitet<br />
...<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
In älteren Versionenen der avr-libc wurden nicht alle AVR-Controller durch die sleep-Funktionen richtig angesteuert. Mit avr-libc 1.2.0 wurde die Anzahl der unterstützten Typen jedoch deutlich erweitert. Bei nicht-unterstützten Typen erreicht man die gewünschte Funktionalität durch direkte "[[Bitmanipulation]]" der entsprechenden Register (vgl. Datenblatt) und Aufruf des Sleep-Befehls via Inline-Assembler oder sleep_cpu():<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
...<br />
// Sleep-Mode "Power-Save" beim ATmega169 "manuell" aktivieren<br />
SMCR = (3<<SM0) | (1<<SE);<br />
asm volatile ("sleep"::); // alternativ sleep_cpu() aus sleep.h<br />
...<br />
</syntaxhighlight><br />
<br />
== Sleep-Modi ==<br />
Die vielen Prozessoren aus der AVR-Familie unterstützen unterschiedliche Sleep-Modi, gefächert nach Vorhandensein von Funktionsblöcken im Controller. Konkrete und verläßliche Auskunft über die tatsächlichen Gegebenheiten finden sich wie immer in den jeweiligen Datenblättern. Die Modi unterscheiden sich darin, welche Funktionsbereiche zum Energiesparen abgeschaltet werden. Davon hängt auch ab, mit welchen Mitteln der Prozessor aus der jeweiligen Schlaftiefe wieder aufgeweckt werden kann.<br />
<br />
;Idle Mode (SLEEP_MODE_IDLE): Die CPU kann durch SPI, USART, Analog Comperator, ADC, TWI, Timer, Watchdog und irgendeinen anderen Interrupt wieder aufgeweckt werden.<br />
<br />
;ADC Noise Reduction Mode (SLEEP_MODE_ADC): In diesem Modus liegt das Hauptaugenmerk darauf, die CPU soweit stillzulegen, dass der ADC möglichst keine Störungen aus dem inneren der CPU auffangen kann, die das Meßergebnis negativ beeinflussen können. Das Aufwachen aus diesem Modus kann ausgelöst werden durch den ADC, externe Interrupts, TWI, Timer und Watchdog.<br />
<br />
;Power-Down Mode (SLEEP_MODE_PWR_DOWN): In diesem Modus wird ein externer Oszillator (Quarz, Quarzoszillator), wenn vorhanden. gestoppt. Geweckt werden kann die CPU durch einen externen Level-Interrupt, TWI, Watchdog, Brown-Out-Reset.<br />
<br />
;Power-Save-Mode (SLEEP_MODE_PWR_SAVE): Power-Save ist identisch zu Power-Down mit einer Ausnahme: Ist der Timer 2 auf die Verwendung eines externen Taktes konfiguriert, so läuft dieser Timer auch im Power-Save weiter und kann die CPU mit einem Interrupt aufwecken.<br />
<br />
;Standby-Mode (SLEEP_MODE_STANDBY, SLEEP_MODE_EXT_STANDBY): Voraussetzung für den Standby-Modus ist die Verwendung eines Quarzes oder eines Quarzoszillators, also einer externen Taktquelle. Ansonsten ist dieser Modus identisch zum Power-Down Modus. Vorteil dieses Modus' ist eine kürzere Aufwachzeit.<br />
<br />
;Abschalten des Brownout Detect (BOD) während der Sleep-Phase (nur P-Typen): Zur Stromersparnis bieten die P-Typen die Möglichkeit den BOD während der Sleep-Phase abzuschalten. Bei einem Atmega88PA beispielsweise, kann dadurch der Stromverbrauch im SLEEP_MODE_PWR_SAVE mit Timer2 im Asynchronmodus mit Uhrenquarz und periodischer Selbstaufweckung um ca. 50% gesenkt werden.<br />
Das Einschalten dieser Funktion geschieht in einer Timed Sequence.<br />
<br />
<syntaxhighlight lang="c"><br />
unsigned char temp0 = MCUCR;<br />
unsigned char temp1 = MCUCR;<br />
temp0 |= (1 << BODS) | (1 << BODSE);<br />
temp1 |= (1 << BODS);<br />
MCUCR = temp0;<br />
MCUCR = temp1;<br />
sleep_cpu();<br />
</syntaxhighlight><br />
<br />
Hierbei ist unbedingt zu beachten, dass das BODS-Bit 3 Takte nach dem Setzen wieder gelöscht wird. Daher muss der Aufruf des Sleep unmittelbar nach dem Setzen erfolgen und das BODS-Bit muss jedes Mal vor einem Sleep Aufruf erneut gesetzt werden.<br />
<br />
<br />
Siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitt Modules/Power Management and Sleep-Modes<br />
* [http://www.mikrocontroller.net/topic/96369#832712 Forenbeitrag] zur "Nichtverwendung" von sleep_mode in ISRs.<br />
<br />
= Zeiger =<br />
Zeiger (engl. ''Pointer'') sind Variablen, die die Adresse von Daten oder Funktionen enthalten und belegen 16 Bits. Die Größe hängt mit dem adressierbaren Speicherbereich zusammen und der GCC reserviert dann den entsprechenden Platz.<br />
Ggf. ist es also günstiger, Indizes auf Arrays (Listen) zu verwenden, so dass der GCC für die Zeigerarithmetik den erforderlichen RAM nur temporär benötigt.<br />
<br />
Siehe auch: [[Zeiger]]<br />
<br />
= Speicherzugriffe =<br />
<br />
Atmel AVR-Controller verfügen typisch über drei Speicher:<br />
<br />
* [[RAM]]: Im RAM (genauer statisches RAM/SRAM) wird vom gcc-Compiler Platz für Variablen reserviert. Auch der Stack befindet sich im RAM. Dieser Speicher ist "flüchtig", d.h. der Inhalt der Variablen geht beim Ausschalten oder einem Zusammenbruch der Spannungsversorgung verloren.<br />
<br />
* Programmspeicher: Ausgeführt als FLASH-Speicher, seitenweise wiederbeschreibbar. Darin ist das Anwendungsprogramm abgelegt.<br />
<br />
* [[EEPROM]]: Nichtflüchtiger Speicher, d.h. der einmal geschriebene Inhalt bleibt auch ohne Stromversorgung erhalten. Byte-weise schreib/lesbar. Im EEPROM werden typischerweise gerätespezifische Werte wie z.&nbsp;B. Kalibrierungswerte von Sensoren abgelegt.<br />
<br />
Einige AVRs besitzen keinen RAM-Speicher, lediglich die Register können als "Arbeitsvariablen"<br />
genutzt werden. Da die Anwendung des avr-gcc auf solch "kleinen" Controllern ohnehin selten sinnvoll ist und auch nur bei einigen RAM-losen Typen nach [http://lightner.net/avr/ATtinyAvrGcc.html "Bastelarbeiten"] möglich ist, werden diese Controller hier nicht weiter berücksichtigt. Auch EEPROM-Speicher ist nicht auf allen Typen verfügbar. Generell sollten die nachfolgenden Erläuterungen auf alle ATmega-Controller und die größeren AT90-Typen übertragbar sein. Für die Typen ATtiny2313, ATtiny26 und viele weitere der "ATtiny-Reihe" gelten die Ausführungen ebenfalls.<br />
<br />
Siehe auch:<br />
* [[Binäre Daten zum Programm hinzufügen]]<br />
== RAM ==<br />
<br />
Die Verwaltung des RAM-Speichers erfolgt durch den Compiler, im Regelfall ist beim Zugriff auf Variablen im RAM nichts Besonderes zu beachten. Die Erläuterungen in jedem brauchbaren C-Buch gelten auch für den vom avr-gcc-Compiler erzeugten Code.<br />
<br />
Um Speicher dynamisch (während der Laufzeit) zu reservieren, kann '''malloc()''' verwendet werden. malloc(size) "alloziert" (~reserviert) einen gewissen Speicherblock mit '''size''' Bytes. Ist kein Platz für den neuen Block, wird NULL (0) zurückgegeben.<br />
<br />
Wird der angelegte Block zu klein (groß), kann die Größe mit realloc() verändert werden. Den allozierten Speicherbereich kann man mit free() wieder freigeben. Wenn das Freigeben eines Blocks vergessen wird spricht man von einem "Speicherleck" (memory leak).<br />
<br />
malloc() legt Speicherblöcke im '''Heap''' an, belegt man zuviel Platz, dann wächst der Heap zu weit nach oben und überschreibt den Stack, und der Controller kommt in Teufels Küche. Das kann leider nicht nur passieren wenn man insgesamt zu viel Speicher anfordert, sondern auch wenn man Blöcke unterschiedlicher Größe in ungünstiger Reihenfolge alloziert/freigibt (siehe Artikel [[Heap-Fragmentierung]]). Aus diesem Grund sollte man malloc() auf Mikrocontrollern sehr sparsam (am besten gar nicht) verwenden.<br />
<br />
Beispiel zur Verwendung von malloc():<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
<br />
void foo(void) {<br />
// neuen speicherbereich anlegen,<br />
// platz für 10 uint16<br />
uint16_t* pBuffer = malloc(10 * sizeof(uint16_t));<br />
<br />
// darauf zugreifen, als wärs ein gewohnter Buffer<br />
pBuffer[2] = 5;<br />
<br />
// Speicher (unbedingt!) wieder freigeben<br />
free(pBuffer);<br />
}<br />
</syntaxhighlight><br />
<br />
Wenn (wie in obigem Beispiel) dynamischer Speicher nur für die Dauer einer Funktion benötigt und am Ende wieder freigegeben wird, bietet es sich an, statt malloc() '''alloca()''' zu verwenden. Der Unterschied zu malloc() ist, dass der Speicher auf dem Stack reserviert wird, und beim Verlassen der Funktion automatisch wieder freigegeben wird. Es kann somit kein Speicherleck und keine Fragmentierung entstehen.<br />
<br />
siehe auch:<br />
* http://www.nongnu.org/avr-libc/user-manual/malloc.html<br />
<br />
== Flash mit PROGMEM und pgm_read ==<br />
<br />
→ [http://nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html avr-libc: Doku zu avr/pgmspace.h]<br />
<br />
Ein Zugriff auf Konstanten im Programmspeicher ist mittels avr-gcc erst ab Version 4.7 "transparent" möglich. Um Daten aus dem Flash zu lesen, muss die AVR-Instruktion LPM (''Load from Program Memory'') erzeugt werden, bei Controllern mit mehr als 64kiB Flash auch ELPM.<br />
<br />
Dazu gibt es das AVR-spezifische GCC-Attribut <tt>progmem</tt>, mit dem eine Variablendeklaration im ''static storage''<ref>Variablen der Speicherklasse ''static storage'' haben eine unbegrenzte Lebensdauer. Beispiel für solche Variablen sind globale Variablen, aber auch static-Variablen innerhalb einer Funktion gehören dazu. Beispiele für Variablen, die nicht ''static storage'' sind: auto-Variablen ("normale" lokale Variablen), register-Variablen, durch malloc geschaffene Objekte, etc.</ref> markiert werden kann:<br />
<syntaxhighlight lang="c"><br />
const int value __attribute__((progmem)) = 1;<br />
</syntaxhighlight><br />
<br />
Effekt ist, dass die so markierte Variable nicht im RAM sondern im Flash angelegt wird. Wird durch "normalen" C-Code auf solch eine Variable zugegriffen, wird jedoch aus der gleichen Adresse aus dem RAM gelesen und nicht aus dem Flash! Das ist ein Fehler, den der Compiler aber nicht anzeigt!<br />
<br />
<syntaxhighlight lang="c"><br />
int test = value; // Fehler! PROGMEM Konstanten müssen mit den pgm_read-Funktionen gelesen werden!<br />
</syntaxhighlight><br />
<br />
Zum Lesen aus dem Flash stellt die avr-libc daher zahlreiche Makros zur Verfügung. Zudem wird das Makro <tt>PROGMEM</tt> definiert, das etwas Tipparbeit spart:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
const int value PROGMEM = 1;<br />
</syntaxhighlight><br />
<br />
<tt>progmem</tt> funktioniert im Wesentlichen wie ein Section-Attribut, das die Daten in der Section <tt>.progmem.data</tt> ablegt. Im Gegensatz zum Section-Attribut werden jedoch noch weitere Prüfungen unternommen, ab avr-gcc 4.6 etwa muss die entsprechende Variable <tt>const</tt> sein.<br />
<br />
=== Integer und float ===<br />
<br />
Zum Lesen von Skalaren stellt die avr-libc folgende Makros zu Verfügung, die jeweils ein Argument erhalten: Die 16-Bit Adresse des zu lesenden Wertes<ref>Damit ist der mögliche Speicherbereich für Flash-Konstanten auf 64kiB begrenzt. Einige pgmspace-Funktionen ermöglichen den Lesezugriff auf den gesamten Flash-Speicher, intern via Assembler-Anweisung ELPM. Die Initialisierungswerte des Speicherinhalts jenseits der 64kiB-Marke müssen dann jedoch auf anderem Weg angelegt werden, d.h. nicht per PROGMEM. Evtl. eigene Section und Linker-Optionen. Alt und nicht ganz korrekt: Die avr-libc pgmspace-Funktionen unterstützen nur die unteren 64kiB Flash bei Controllern mit mehr als 64kiB.</ref><br />
<br />
:{| {{Tabelle}}<br />
|+ Übersicht der <tt>pgm_read</tt> Funktionen aus<br/>dem Header <tt>avr/pgmspace.h</tt> der avr-libc<br />
|-<br />
! Gelesener Wert || <tt>pgm_read_xxx</tt> || Anzahl Bytes<br />
|-<br />
| <tt>uint8_t</tt> || <tt>pgm_read_byte</tt> || 1<br />
|-<br />
| <tt>uint16_t</tt> || <tt>pgm_read_word</tt> || 2<br />
|-<br />
| <tt>uint32_t</tt> || <tt>pgm_read_dword</tt> || 4<br />
|-<br />
| <tt>float</tt> || <tt>pgm_read_float</tt><ref>ab avr-libc 1.7.0</ref> || 4<br />
|}<br />
<br />
Soll ein Zeiger gelesen werden, so verwendet man <tt>pgm_read_word</tt> und castet das Ergebnis zum gewünschten Zeiger-Typ.<br />
<br />
;Beispiele:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
/* Byte */<br />
const uint8_t aByte PROGMEM = 123;<br />
<br />
/* int-Array */<br />
const int anArray[] PROGMEM = { 18, 3 ,70 };<br />
<br />
void foo (void)<br />
{<br />
/* Zeiger */<br />
static const uint8_t* const aPointer PROGMEM = &aByte;<br />
<br />
uint8_t a = pgm_read_byte (&aByte);<br />
int a2 = (int) pgm_read_word (&anArray[2]);<br />
const uint8_t* p = (const uint8_t*) pgm_read_word (&aPointer);<br />
}<br />
</syntaxhighlight><br />
<br />
=== Blöcke ===<br />
<br />
In den Flash-Funktionen der avr-libc sind keine der pgm_read_xxxx Nomenklatur folgenden Funktionen, die Speicherblöcke auslesen oder vergleichen. Die enstprechende Funktionen sind Varianten von <tt>memcpy</tt>, <tt>memcmp</tt> und heißt <tt>memcpy_P</tt>, <tt>memcmp_P</tt>, usw. Für weitere Funktionen und deren Prototypen siehe die Dokumentation der avr-libc.<br />
<br />
=== Strings ===<br />
<br />
Strings sind in C nichts anderes als eine Abfolge von Zeichen und einem <tt>'\0'</tt> als Stringende. Der prinzipielle Weg ist daher identisch zum Lesen von Bytes, wobei auf die [[FAQ#Wie funktioniert String-Verarbeitung in C?|Besonderheiten von Strings]] wie 0-Terminierung geachtet werden muss.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
size_t my_string_length (const char* addr)<br />
{<br />
size_t length = 0;<br />
<br />
while (pgm_read_byte (addr++))<br />
{<br />
len++;<br />
}<br />
return length;<br />
}<br />
</syntaxhighlight><br />
<br />
Zur Unterstützung des Programmierers steht das Repertoire der str-Funktionen auch in jeweils eine Variante zur Verfügung, die mit dem Flash-Speicher arbeiten kann. Die Funktionsnamen tragen den Suffix <tt>_P</tt>. Darüber hinaus gibt es das Makro <tt>PSTR</tt>, das ein String-Literal im Flash-Speicher ablegt und die Adresse des Strings liefert:<br />
<br />
Die nachfolgende Funktion liefert 0 zurück, wenn string_im_ram gleich "Hallo Welt" ist. Mit strcmp (String Compare) können wir zwei Strings vergleichen. Der Rückgabewert kann hierbei folgende Werte haben:<br><br />
0 die Strings sind gleich<br />
>0 das erste ungleiche Zeichen in string_im_ram ist größer als in "Hallo Welt"<br />
<0 das erste ungleiche Zeichen in string_im_ram ist kleiner als in "Hallo Welt"<br />
<br><br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
int foo (const char* string_im_ram)<br />
{<br />
return strcmp_P (string_im_ram, PSTR ("Hallo Welt"));<br />
}<br />
</syntaxhighlight><br />
<br />
Zu beachten ist, dass <tt>PSTR</tt> nur innerhalb von Funktionen verwendet werden kann.<br />
<br />
; Array aus Strings:<br />
<br />
Arrays aus Strings im Flash-Speicher werden in zwei Schritten angelegt:<br />
<br />
# Zuerst die einzelnen Elemente des Arrays und<br />
# im Anschluss ein Array, in dem die Startaddressen der Strings abgelegt werden.<br />
<br />
Zum Auslesen wird zuerst die Adresse des gewünschten Elements aus dem Array im Flash-Speicher gelesen, die im Anschluss dazu genutzt wird, um auf das Element (den String) selbst zuzugreifen.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
static const char str1[] PROGMEM = "Hund";<br />
static const char str2[] PROGMEM = "Katze";<br />
static const char str3[] PROGMEM = "Maus";<br />
<br />
const char * const array[] PROGMEM = <br />
{<br />
str1, str2, str3<br />
};<br />
<br />
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]<br />
void read_string (char* buf, size_t i)<br />
{<br />
// Lese die Adresse des i-ten Strings aus array[]<br />
const char *parray = (const char*) pgm_read_word (&array[i]);<br />
<br />
// Kopiere den Inhalt der Zeichenkette vom Flash ins RAM<br />
strcpy_P (buf, parray);<br />
}<br />
</syntaxhighlight><br />
<br />
Eine weitere Möglichkeit ist, die Strings in einem 2-dimensionalen char-Array abzulegen anstatt deren Adresse in einem 1-dimensionalen Adress-Array zu speichern.<br />
<br />
Vorteil ist, dass der Code einfacher wird. Nachteil ist, dass bei unterschiedlich langen Strings Speicherplatz verschwendet wird, weil sich die Array-Dimension and der Länge des längsten Strings orientieret. Bei in etwa gleich langen Strings kann es aber sogar Speicherplatz sparen, denn es die Adressen der einzelnen Strings müssen nicht abgespeichert werden.<ref>In unserem Hund-Katze-Maus Beispiel belegt die erste Variante 22 Bytes Daten und 18 Bytes Code, die zweite Variante mit 2-dimensionalem Array belegt 18 Bytes Daten und 20 Bytes Code. Gemessen wurde mit avr-gcc 4.8 -Os für ATmega8.</ref><br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
// Die "6" ist 1 plus die Länge des längsten Strings ("Katze")<br />
const char array[][6] PROGMEM = <br />
{<br />
"Hund", "Katze", "Maus"<br />
};<br />
<br />
// Liest den i-ten String von array[] und kopiert ihn ins RAM nach buf[]<br />
void read_string (char* buf, size_t i)<br />
{<br />
// Kopiere den Inhalt der i-ten Zeichenkette vom Flash ins RAM<br />
strcpy_P (buf, array[i]);<br />
}<br />
</syntaxhighlight><br />
<br />
Siehe dazu auch die avr-libc FAQ: [http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array How do I put an array of strings completely in ROM?]<br />
<br />
=== Warum so kompliziert? ===<br />
<br />
Zu dem Thema, warum die Verabeitung von Werten aus dem Flash-Speicher so kompliziert ist, sei hier nur kurz erläutert: Die Harvard-Architektur des AVR weist getrennte Adressräume für Programm (Flash) und Datenspeicher (RAM) auf. Der C-Standard sieht keine unterschiedlichen Adressräume vor.<br />
<br />
Hat man zum Beispiel eine Funktion string_an_uart (const char* s) und übergibt an diese Funktion die Adresse einer Zeichenkette, dann weiß die Funktion nicht, ob die Adresse in den Flash-Speicher oder das RAM zeigt. Weder aus dem Pointer-Wert, also dem Zahlenwert, noch aus dem "const" kann auf den Ort der Ablage geschlossen werden.<br />
<br />
Einige AVR-Compiler bilden die Harvard-Architektur ab, indem sie in einen Pointer nicht nur die Adresse speichern, sondern auch den Ablageort wie ''Flash'' oder ''RAM''. In einem Aufruf einer Funktion wird dann bei Pointer-Parametern neben der Adresse auch der Speicherbereich, auf den der Pointer zeigt, übergeben.<br />
<br />
Dies hat jedoch auch Nachteile, denn bei jedem Zugriff über einen Zeiger muss zur ''Laufzeit'' entschieden werden, wie der Zugriff auszuführen ist und entsprechend länglicher und langsamer wird der erzeugte Code.<br />
<br />
Siehe auch:<br />
* [http://www.nongnu.org/avr-libc/user-manual/index.html Dokumentation der avr-libc] Abschnitte Modules/Program Space String Utilities und Abschnitt Modules/Bootloader Support Utilities<br />
<br />
=== Variablenzugriff >64kB ===<br />
<br />
Die Zeiger beim avr-gcc sind nur 16 Bit breit, können somit also nur 64kiB Datenspeicher adressieren. Als Funktionspointer können sie beim AVR bis zu 128 kiB Programmspeicher adressieren, weil Funktionsadressen immer 16-Bit Worte adressieren und nicht Bytes. Um Flashzugriff jenseits von 64KiB zu bewerkstelligen gibt es mehrere Möglichkeiten:<br />
<br />
* Address-Spaces wie <tt>__flash1</tt> oder <tt>__memx</tt>, siehe Abschnitt "[[#Jenseits von flash|Jenseits von __flash]]".<br />
* Die Funktionen bzw. Makros <tt>pgm_read_xxx_far</tt> der AVR-Libc, wie im folgenden beschrieben.<br />
<br />
Unverständlicherweise gibt es in der AVR-Libc keine Funktion, um 32-Bit Pointer zu erhalten. Hier schafft ein eigenes GNU-C99 Makro Abhilfe:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <avr/pgmspace.h><br />
<br />
//====================================================================<br />
// Macro to access strings defined in PROGMEM above 64kB<br />
//--------------------------------------------------------------------<br />
#define FAR(var) \<br />
({ uint_farptr_t tmp; \<br />
__asm__ ( \<br />
"ldi %A0, lo8(%1)" "\n\t" \<br />
"ldi %B0, hi8(%1)" "\n\t" \<br />
"ldi %C0, hh8(%1)" \<br />
: "=d" (tmp) \<br />
: "i" (&(var))); \<br />
tmp; \<br />
})<br />
//-------------------------------------------------------------------<br />
<br />
//===================================================================<br />
// Define a section above 64kiB (FAR_SECTION)<br />
// and add the required linker argument below<br />
// -Wl,--section-start=.far_section=0x10000<br />
//--------------------------------------------------------------------<br />
#define FAR_SECTION __attribute__((__section__(".far_section")))<br />
//--------------------------------------------------------------------<br />
<br />
//====================================================================<br />
// Just a Sample<br />
//--------------------------------------------------------------------<br />
<br />
const char MyString[] FAR_SECTION = "Hier liegt mein FAR-Teststring!";<br />
const char MyBmp64[] FAR_SECTION = {0xAA,0xBB,0xCC,0xDD,0xEE,0xFF,0x00};<br />
<br />
int main(void)<br />
{<br />
char MyChar;<br />
DDRC = 0xFF;<br />
do<br />
{<br />
MyChar = pgm_read_byte_far(FAR(MyBmp64));<br />
PORTC = MyChar;<br />
}<br />
while(MyChar);<br />
}<br />
</syntaxhighlight><br />
<br />
D.h. man muss<br />
* Das Makro <tt>FAR</tt> im Quellcode einfügen<br />
* Die Definition der neuen Section <tt>FAR_SECTION</tt> einfügen<br />
* Die Variablen mit dieser Section kennzeichnen<br />
* Dem Linker mittels Kommandozeilenoption die Startadrese dieser Section mitteilen<br />
<br />
Der Zugriff auf diese Variablen kann nur mittels direkter Pointerarithmetik erfolgen, eine Indizierung von Arrays mit variablem Index ist nicht möglich.<br />
<br />
<syntaxhighlight lang="c"><br />
int n=3;<br />
MyChar = pgm_read_byte_far(FAR(MyBmp64)+n);<br />
</syntaxhighlight><br />
<br />
== Flash mit __flash und Embedded-C ==<br />
<br />
Ab Version 4.7 unterstützt avr-gcc ''Adress-Spaces'' gemäß dem Embedded-C Dokument ISO/IEC TR18037. Der geläufigste Adress-Space ist <tt>__flash</tt>, der im Gegensatz zu <tt>progmem</tt> kein GCC-Attribut ist, sondern ein Qualifier und damit syntaktisch ähnlich verwendet wird wie <tt>const</tt> oder <tt>volatile</tt>.<br />
<br />
GCC kennt keine eigene Option zum Aktivieren von Embedded-C, es wird als GNU-C Erweiterung behandelt. Daher müssen C-Module, die Address-Spaces verwenden, mit <tt>-std=gnu99</tt> o.ä. compiliert werden.<br />
<br />
<syntaxhighlight lang="c"><br />
static const __flash int value = 10;<br />
<br />
int get_value (void)<br />
{<br />
return value;<br />
}<br />
</syntaxhighlight><br />
<br />
# Im Gegensatz zu <tt>progmem</tt> sind keine speziellen Bibliotheksfunktionen oder -makros für den Zugriff mehr notwendig: Der Code zum Lesen der Variable ist "normales" C.<br />
# Die Variable wird im richtigen Speicherbereich (Flash) angelegt.<br />
# <tt>__flash</tt> ist nur zusammen mit read-only Objekten oder Zeigern, d.h. nur zusammen mit <tt>const</tt>, erlaubt.<br />
# Zugriffe wie im obigen Beispiel können (weg)optimiert werden. Das Beispiel entspricht einem "<tt>return 10</tt>". Es besteht keine Notwendigkeit, für <tt>value</tt> überhaupt Flash-Speicher zu reservieren.<br />
<br />
Auch Zeiger-Indirektionen sind problemlos möglich. Zu beachten ist, dass <tt>__flash</tt> auf der richtigen Seite des "<tt>*</tt>" in der Zeigerdeklaration bzw. -definition steht:<br />
* '''Rechts vom <tt>*</tt>:''' Der Zeiger selbst liegt im Flash<br />
* '''Links vom <tt>*</tt>:''' Der Zeiger enthält eine Flash-Adresse<br />
<br />
<syntaxhighlight lang="c"><br />
// val ist eine Variable im Flash<br />
const __flash int val = 42;<br />
<br />
// pval liegt auch im Flash und enthält die Adresse von val<br />
const __flash int* const __flash pval = &val;<br />
<br />
char get_val (void)<br />
{<br />
// liest den Wert von val über die in pval abgelegte Adresse<br />
return *pval;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Blöcke ===<br />
<br />
Um Speicherbereiche vom Flash in den RAM zu kopieren, gibt es zwei Möglichkeiten: Zum einen können wie bei <tt>progmem</tt> beschreiben die Funktionen der avr-libc wie <tt>memcpy_P</tt>, <tt>memcmp_P</tt>, <tt>movmem_P</tt>, etc. verwendet werden:<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
// Eine Datenstruktur<br />
typedef struct<br />
{<br />
int id;<br />
char buf[10];<br />
} data_t;<br />
<br />
extern void uart_send (const void*, size_t);<br />
<br />
void send_data (const __flash data_t *pdata)<br />
{<br />
// buf wird auf dem Stack angelegt<br />
data_t buf;<br />
<br />
// Kopiere Daten vom Flash nach buf ins RAM<br />
memcpy_P (&buf, pdata, sizeof (data_t));<br />
<br />
// Sende die Daten in buf<br />
uart_send (&buf, sizeof (data_t));<br />
}<br />
</syntaxhighlight><br />
<br />
Zum anderen kann eine Struktur auch über direktes Kopieren ins RAM geladen werden:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdlib.h><br />
<br />
// Eine Datenstruktur<br />
typedef struct<br />
{<br />
int id;<br />
char buf[10];<br />
} data_t;<br />
<br />
extern void uart_send (const void*, size_t);<br />
<br />
void send_data (const __flash data_t *pdata)<br />
{<br />
// Kopiere Daten ins RAM. buf wird auf dem Stack angelegt<br />
const data_t buf = *pdata;<br />
<br />
// Verwendet die Daten in buf<br />
uart_send (&buf, sizeof (data_t));<br />
}<br />
</syntaxhighlight><br />
<br />
=== Strings ===<br />
<br />
Natürlich können auch Strings im Flash abgelegt werden und auch mit Funktionen wie <tt>strcpy_P</tt> aus der avr-libc verarbeitet werden. Zudem ist es möglich, Flash-Zeiger mit der Adresse eines String-Literals zu initialisieren:<br />
<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
#define FSTR(X) ((const __flash char[]) { X } )<br />
<br />
const __flash char * const __flash array[] = <br />
{<br />
FSTR ("Hund"), FSTR ("Katze"), FSTR ("Maus")<br />
};<br />
<br />
size_t get_len (uint8_t tier)<br />
{<br />
return strlen_P (array[tier]);<br />
}<br />
</syntaxhighlight><br />
<br />
Leider sieht der Embedded-C Draft nicht vor, String-Literale direkt in einem anderen Adress-Space als ''generic'' anzulegen, so dass hier der Umweg über <tt>FSTR</tt> genommen werden muss. Dieses Konstrukt ist nur ausserhalb von Funktionen möglich und kann daher nicht als Ersatz für <tt>PSTR</tt> aus der avr-libc dienen.<br />
<br />
Soll <tt>array</tt> ein 2-dimensonales Array sein anstatt ein 1-dimensionales Array von Zeigern, dann geht das ohne große Verrenkungen:<br />
<br />
<syntaxhighlight lang="c"><br />
// Die 6 ergibt sich aus 1 plus der Länge des längsten Strings "Katze"<br />
const __flash char array[][6] = <br />
{<br />
"Hund", "Katze", "Maus"<br />
};<br />
</syntaxhighlight><br />
<br />
Weiters besteht die Möglichkeit, <tt>array</tt> analog anzulegen, wie man es mit <tt>PROGMEM</tt> machen würde: Jeder String wird explizit angelegt und seine Adresse bei der Initialisierung von <tt>array</tt> verwendet. Dies entspricht dem ersten Beispiel eines 1-dimensionalen Zeigerarrays:<br />
<br />
<syntaxhighlight lang="c"><br />
static const __flash char strHund[] = "Hund";<br />
static const __flash char strKatze[] = "Katze";<br />
static const __flash char strMaus[] = "Maus";<br />
<br />
const __flash char * const __flash array[] = <br />
{<br />
strHund, strKatze, strMaus<br />
};<br />
</syntaxhighlight><br />
<br />
=== Casts ===<br />
<br />
Embedded C fordert, dass zwei Adress-Spaces entweder disjunkt sind – d.h. sie enthalten keine gemeinsamen Adressen – oder aber ein Space komplett im anderen enthalten ist, also eine Teilmengen-Beziehung besteht. Die Adress-Spaces von avr-gcc sind so implementiert, dass jeder Space Teilmenge jedes anderes ist. Zwar haben Spaces wie RAM und Flash physikalisch keinen Speicherbereich gemein, allerdings ermöglicht diese Implementierung das Casten von Zeigern zu unterschiedlichen Adress-Spaces<ref>Im Gegensatz zu einem Attribute wie <tt>progmem</tt> ist ein (Adress Space) Qualifier Teil des Zeiger-Typs.</ref>: <br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdbool.h><br />
<br />
char read_char (const char *address, bool data_in_flash)<br />
{<br />
if (data_in_flash)<br />
return *(const __flash char*) address;<br />
else<br />
return *address;<br />
}<br />
</syntaxhighlight><br />
<br />
Der Cast selbst erzeugt keinen zusätzlichen Code, da eine RAM-Adresse und eine Flash-Adresse die gleiche Binärdarstellung haben. Allerdings wird über den nach <tt>__flash</tt> gecasteten Zeiger anders zugegriffen, nämlich per LPM.<br />
<br />
=== Jenseits von __flash ===<br />
<br />
Ausser <tt>__flash</tt> gibt es auch folgende Address-Spaces:<br />
<br />
==== <tt>__flash</tt>''N'' ====<br />
<br />
<tt>__flash</tt>''N'' mit ''N'' = 1..5 sind fünf weitere Spaces, die analog zu <tt>__flash</tt> funktionieren und deren Zeiger ebenfalls 16 Bit breit sind. avr-gcc erwartet, dass die zugehörigen Daten, welche in die Section <tt>.progmem</tt>''N''<tt>.data</tt> abgelegt werden, so lokatiert sind, dass das high-Byte der Adresse (Bits 16..23) gerade ''N'' ist.<br />
<br />
Weil Daten- und Code-Layout höchst projektspezifisch sind, werden diese Sections im Standard Linker-Skript nicht beschrieben. Um funktionsfähigen Code zu erhalten, muss daher ein eigenes Linker-Skript zur Verfügung gestellt werden, das diese Sections beschreibt, oder es kann eine Erweiterung des Standard Skripts bereitgestellt werden falls dies möglich ist.<br />
<br />
;Beispiel: Eine Applikation, die <tt>__flash2</tt> verwendet. Die zugehörende Section <tt>.progmem2.data</tt> wird hinter <tt>.text</tt> angeordnet aber vor den Initializern für <tt>.data</tt>. Dazu wird beim Linken das ld-Skript Fragment per <tt>-Tflash12.ld</tt> angegeben, welches dann an der gewünschten Stelle in das default Skript eingefügt wird:<br />
:{| <!-- Tabelle bitte für korrekte Einrückung belassen --><br />
|-<br />
|<pre><br />
SECTIONS<br />
{<br />
.flash2 :<br />
{<br />
. = MAX (ABSOLUTE(0x20000), .);<br />
PROVIDE (__flash2_start = .);<br />
. = ALIGN(2);<br />
*(.flash2.text*)<br />
*(.progmem2.data*)<br />
PROVIDE (__flash2_end = .);<br />
<br />
ASSERT (__flash2_start == __flash2_end || __flash2_start >= ABSOLUTE(0x20000),<br />
"__flash2 data in .progmem2.data below 0x20000");<br />
ASSERT (__flash2_start == __flash2_end || __flash2_end <= ABSOLUTE(0x30000),<br />
"__flash2 data in .progmem2.data exceeds 0x30000");<br />
}<br />
}<br />
INSERT AFTER .text<br />
</pre><br />
|}<br />
<br />
==== <tt>__memx</tt> ====<br />
<br />
Dieser Address-Space implementiert 3-Byte Zeiger und unterstützt Lesen über 64KiB-Segmentgrenzen hinweg. Das MSB (Bit 23) gibt dabei an, ob der <tt>__memx</tt>-Zeiger eine Flash-Adresse enthält (Bit23 = 0) oder eine RAM-Adresse (Bit23 = 1), was folgenden Code erlaubt:<br />
<br />
<syntaxhighlight lang="c"><br />
const __memx int a_flash = 42;<br />
const int a_ram = 100;<br />
<br />
int get_a (const __memx int* pa)<br />
{<br />
return *pa;<br />
}<br />
<br />
int main (void)<br />
{<br />
return get_a (&a_flash) + get_a (&a_ram);<br />
}</syntaxhighlight><br />
<br />
Dies bedeutet, dass erst zur ''Laufzeit'' entschieden werden kann, ob <tt>get_a</tt> die Daten aus dem RAM oder aus dem Flash lesen soll, was <tt>__memx</tt> im Vergleich zu den anderen Address-Spaces langsamer macht. Ausserdem ist zu beachten, dass <tt>__memx</tt>-Zeiger zwar 24-Bit Zeiger sind, die zugrundeliegende Adress-Arithmetik jedoch gemäß dem C-Standard erfolgt, also als 16-Bit Arithmetik. Bestehende Funktion der avr-libc wie z.B. printf_P funktionieren damit ebensowenig wie printf! Wenn man <tt>__memx</tt> verwenden will, braucht man dafür eigene Funktionen.<br />
<br />
=== __flash, progmem und Portierbarkeit ===<br />
<br />
Da ab er aktuellen Compilerversion 4.7 sowohl <tt>__flash</tt> als auch <tt>PROGMEM</tt> und die <tt>pgm_read</tt>-Funktionen zur Verfügung stehen, ergibt sich die Frage, welche Variante "besser" ist und wie zwischen ihnen hin- und her zu portieren ist.<br />
<br />
Zunächst sei erwähnt, dass <tt>__flash</tt> kein Ersatz für <tt>PROGMEM</tt> ist, sondern lediglich eine Alternative dazu. Das "alte" progmem wird weiterhin mir gleicher Semantik unterstützt, so dass alter Code ohne Änderungen mit den neueren Compilerversionen übersetzbar bleibt.<br />
<br />
Von der Codegüte her dürften sich keine großen Unterschiede ergeben. Es ist nicht zu erwarten, dass die eine oder die andere Variante wesentlich besseren oder schlechteren Code erzeugt — von einer Ausnahme abgesehen: Der Wert beim Zugriff ist zur Compilezeit bekannt und kann daher eliminiert werden.<br />
<syntaxhighlight lang="c"><br />
static const __flash char x[] = { 'A', 'V', 'R' };<br />
<br />
char foo (void)<br />
{<br />
return x[2];<br />
}<br />
</syntaxhighlight><br />
Dies wird übersetzt wie "<tt>return 'R';</tt>", und das Array <tt>x[]</tt> kann komplett wegoptimiert werden und entfallen.<br />
<br />
==== progmem → __flash ====<br />
<br />
Portierung in diese Richtung bedeutet, alten Code anzupassen. Zwingend ist die Portierung nicht, da <tt>progmem</tt> weiterhin unterstützt wird.<br />
Allerdings ist eine Quelle mit <tt>__flash</tt> besser lesbar, denn der Code wird von den <tt>pgm_read</tt>-Funktionen befreit, die vor allem bei Mehrfach-Indirektion den Code ziemlich verunstalten und unleserlich machen können.<br />
Weiterer Vorteil von <tt>_flash</tt> ist, daß eine striktere Typprüfung erfolgen kann.<br />
<br />
Eine Portierung wird man in zwei Schritten vornehmen:<br />
<br />
;1. Definitionen von Flash-Variablen werden angepasst:<br />
<br />
Vorher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
static const char hund[] PROGMEM = "Hund";<br />
static const char katze[] PROGMEM = "Katze";<br />
static const char maus[] PROGMEM = "Maus";<br />
<br />
const char * const tier[] PROGMEM = <br />
{<br />
hund, katze, maus<br />
};<br />
</syntaxhighlight><br />
|}<br />
<br />
Nachher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
static const __flash char hund[] = "Hund";<br />
static const __flash char katze[] = "Katze";<br />
static const __flash char maus[] = "Maus";<br />
<br />
const __flash char * const __flash tier[] = <br />
{<br />
hund, katze, maus<br />
};<br />
</syntaxhighlight><br />
|}<br />
<br />
Der Header <tt>avr/pgmspace.h</tt> wird nicht mehr benötigt. Im Gegensatz zu <tt>progmem</tt> müssen Qualifier immer links von der definierten Variablen stehen; bei Attributen wie <tt>progmem</tt> ist das mehr oder weniger egal.<br />
<br />
Nachdem diese Anpassung erfolgreich abgeschlossen ist, folgt Schritt<br />
<br />
; 2. Der Code wird von <tt>pgm_read</tt>-Aufrufen bereinigt:<br />
<br />
Vorher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <avr/pgmspace.h><br />
<br />
extern const char *tier[];<br />
<br />
char first_letter (uint8_t i)<br />
{<br />
const char* ptier = (const char*) pgm_read_word (&tier[i]);<br />
return (char) pgm_read_byte (&ptier[0]);<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
Nachher:<br />
:{|<br />
|-<br />
|<syntaxhighlight lang="c"><br />
#include <stdint.h><br />
<br />
extern const __flash char * const __flash tier[];<br />
<br />
char first_letter (uint8_t i)<br />
{<br />
return tier[i][0];<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
== Dateien direkt im Flash einbinden ==<br />
<br />
Wenn man größere Dateien direkt im Programm einbinden will, ohne sie vorher in C Quelltext umzuwandeln, muss man das mit dem Linker machen. Wie das geht steht hier.<br />
<br />
* [http://www.atmel.com/webdoc/avrlibcreferencemanual/FAQ_1faq_binarydata.html Atmel, avr gcc Dokumentation]<br />
* [http://nongnu.org/avr-libc/user-manual/FAQ.html#faq_binarydata Nongnu avr gcc Dokumentation]<br />
<br />
Wie man das dann praktisch umsetzt, sieht man in diesem Beitrag.<br />
<br />
* [https://www.mikrocontroller.net/topic/361429?goto=4056910#4056910 Forumsbeitrag]: Binärdateien mittels Linker einbinden<br />
* [https://www.mikrocontroller.net/topic/361429?goto=4056910#4056947 Forumsbeitrag]: Ein kleines Tool zum Umwandeln von Binärdateien in C-Quelltext.<br />
<br />
== Flash in der Anwendung schreiben ==<br />
<br />
Bei AVRs mit "self-programming"-Option – auch bekannt als [[Bootloader]]-Support – können Teile des Flash-Speichers vom Anwendungsprogramm beschrieben werden. Dies ist nur möglich, wenn die Schreibfunktion in einem besonderen Speicherbereich, der Boot-Section des Programmspeichers/Flash, abgelegt ist.<br />
<br />
Bei einigen kleinen AVRs gibt es keine gesonderte Boot-Section, bei diesen kann der Flashspeicher von jeder Stelle des Programms geschrieben werden. Für Details sei hier auf das jeweilige Controller-Datenblatt und die Erläuterungen zum Modul boot.h der avr-libc verwiesen. Es existieren auch Application-Notes dazu bei atmel.com, die auf avr-gcc-Code übertragbar sind.<br />
<br />
Siehe auch: <br />
* Forumsbeitrag [http://www.mikrocontroller.net/topic/163632#1561622 Daten in Programmspeicher speichern]<br />
<br />
== EEPROM ==<br />
<br />
Möchte man Werte aus einem Programm heraus so speichern, dass sie auch nach dem Abschalten der Versorgungsspannung noch erhalten bleiben und nach dem Wiederherstellen der Versorgungsspannung bei erneutem Programmstart wieder zur Verfügung stehen, dann benutzt man das EEPROM.<br />
<br />
Schreib- und Lesezugriffe auf den EEPROM-Speicher erfolgen über die im Modul eeprom.h der avr-libc definierten Funktionen. Mit diesen Funktionen können einzelne Bytes, Datenworte (16 Bit), Fließkommawerte (32 Bit, single-precision, float) und Datenblöcke geschrieben und gelesen werden.<br />
<br />
Diese Funktionen kümmern sich auch um diverse Details, die bei der Benutzung des EEPROMs normalerweise notwendig sind:<br />
* EEPROM-Operationen sind im Vergleich relativ langsam. Man muss daher darauf achten, dass eine vorhergehende Operation abgeschlossen ist, ehe die nächste Operation mit dem EEPROM gestartet wird. Die in der avr-libc implementierten Funktionen aus eeprom.h berücksichtigten dies. Soll beim Aufruf einer EEPROM-Funktion sichergestellt werden, dass diese nicht intern in einer Warteschleife auf den Abschluss der vorherigen Operation wartet, kann vorher per eeprom_is_ready testen, ob der Zugriff auf den EEPROM-Speicher sofort möglich ist.<br />
* Es ist darauf zu achten, dass die EEPROM-Funktionen nicht durch einen Interrupt unterbrochen werden. Einige Phasen des Zugriffs sind zeitkritisch und müssen in einer definierten bzw. begrenzten Anzahl von Takten durchgeführt werden. Durch einen unterbrechenden Interrupt würde diese Restriktion nicht mehr eingehalten. Auch dieses Detail wird von den avr-libc Funktionen berücksichtigt, so dass man sich als C-Programmierer nicht darum kümmern muss. Innerhalb der Funktionen werden Interrupts vor der "EEPROM-Sequenz" global deaktiviert und im Anschluss, falls vorher auch schon eingeschaltet, wieder aktiviert.<br />
<br />
Man beachte, dass der EEPROM-Speicher nur eine begrenzte Anzahl von Schreibzugriffen zulässt. Beschreibt man eine EEPROM-Zelle öfter als die im Datenblatt zugesicherte Anzahl (typisch 100.000), wird die Funktion der Zelle nicht mehr garantiert. Dies gilt für jede einzelne Zelle. <br />
<br />
Bei geschickter Programmierung (z.&nbsp;B. Ring-Puffer), bei der die zu beschreibenden Zellen regelmäßig gewechselt werden, kann man eine deutlich höhere Anzahl an Schreibzugriffen, bezogen auf den gesamten EEPROM-Speicher, erreichen. Auf jeden Fall sollte man aber eine Abschätzung über die zu erwartende Lebensdauer des EEPROM durchführen. Wird ein Wert im EEPROM im Durchschnitt nur einmal pro Woche verändert, wird die garantierte Anzahl der Schreibzyklen innerhalb der voraussichtlichen Verwendungszeit des Controllers sicherlich nicht erreicht werden. Welcher Controller ist schon 100000 / 52 = 1923 Jahre im Einsatz? In diesem Fall lohnt es sich daher nicht, erweiterte Programmfunktionen zu implementieren, mit denen die Anzahl der Schreibzugriffe minimiert wird.<br />
<br />
Eine weitere Möglichkeit, Schreibzyklen einzusparen, besteht in der Vorabprüfung, ob der zu speichernde Wert im EEPROM bereits enthalten ist und nur veränderte Werte zu schreiben. In aktuelleren Versionen der avr-libc sind bereits Funktionen enthalten, die solche Prüfungen enthalten (eeprom_update_*).<br />
<br />
Eine dritte Möglichkeit speichert alle Daten zunächst im RAM, wo sie beliebig oft beschrieben werden können. Nur beim Ausschalten oder beim Ausfall der Stromversorgung werden die Daten in den EEPROM geschrieben. Wie man das richtig macht sieht man im Artikel [[Speicher#EEPROM Schreibzugriffe minimieren | Speicher]].<br />
<br />
Lesezugriffe können beliebig oft durchgeführt werden. Sie unterliegen keinen Einschränkungen in Bezug auf deren Anzahl. <br />
<br />
=== EEMEM ===<br />
Um eine Variable im EEPROM anzulegen, stellt die avr-libc das Makro EEMEM zur Verfügung:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdint.h><br />
#include <avr/eeprom.h><br />
<br />
/* Byte */<br />
uint8_t eeFooByte EEMEM = 123;<br />
<br />
/* Wort */<br />
uint16_t eeFooWord EEMEM = 12345;<br />
<br />
/* float */<br />
float eeFooFloat EEMEM;<br />
<br />
/* Byte-Array */<br />
uint8_t eeFooByteArray1[] EEMEM = { 18, 3, 70 };<br />
uint8_t eeFooByteArray2[] EEMEM = { 30, 7, 79 };<br />
<br />
/* 16-bit unsigned short feld */<br />
uint16_t eeFooWordArray1[4] EEMEM;<br />
</syntaxhighlight><br />
<br />
Die grundsätzliche Vorgehensweise ist identisch zur Verwendung von PROGMEM. Auch hier erzeugt man sich spezielle attributierte Variablen (EEMEM erledigt das), die vom Compiler/Linker nicht wie normale Variablen behandelt werden. Compiler/Linker kümmern sich zwar darum, dass diesen Variablen eine Adresse zugewiesen wird, diese Adresse ist dann aber die Adresse der 'Variablen' im EEPROM. Um die dort gespeicherten Werte zu lesen bzw. zu schreiben, übergibt man diese Adresse an spezielle Funktionen, die die entsprechenden Werte aus dem EEPROM holen bzw. das EEPROM neu beschreiben.<br />
<br />
Die mittels EEMEM erzeugten 'Variablen' sind also mehr als Platzhalter zu verstehen, denn als echte Variablen. Es geht nur darum, im C-Programm symbolische Namen zur Verfügung zu haben, anstatt mit echten EEPROM-Adressen hantieren zu müssen, etwas, das grundsätzlich aber auch genauso gut möglich ist. Nur muss man sich in diesem Fall dann selbst darum kümmern, dass mehrere 'Variablen' ohne Überschneidung im EEPROM angeordnet werden.<br />
<br />
=== Bytes lesen/schreiben ===<br />
<br />
Die avr-libc Funktion zum Lesen eines Bytes heißt eeprom_read_byte. Parameter ist die Adresse des Bytes im EEPROM. Geschrieben wird über die Funktion eeprom_write_byte mit den Parametern Adresse und Inhalt. Anwendungsbeispiel:<br />
<br />
<syntaxhighlight lang="c"><br />
#define EEPROM_DEF 0xFF<br />
<br />
void eeprom_example (void)<br />
{<br />
uint8_t myByte;<br />
<br />
// myByte lesen (Wert = 123)<br />
myByte = eeprom_read_byte (&eeFooByte);<br />
<br />
// der Wert 99 wird im EEPROM an die Adresse der<br />
// Variablen eeFooByte geschrieben<br />
myByte = 99;<br />
eeprom_write_byte(&eeFooByte, myByte); // schreiben<br />
<br />
myByte = eeprom_read_byte (&eeFooByteArray1[1]); <br />
// myByte hat nun den Wert 3<br />
<br />
// Beispiel fuer eeprom_update_byte: die EEPROM-Zelle wird nur<br />
// dann beschrieben, wenn deren Inhalt sich vom Parameterwert<br />
// unterscheidet. In diesem Beispiel erfolgt also kein Schreib-<br />
// zugriff, da die Werte gleich sind.<br />
eeprom_update_byte(&eeFooByte, myByte);<br />
<br />
<br />
// Beispiel zur "Sicherung" gegen leeres EEPROM nach "Chip Erase"<br />
// (z. B. wenn die .eep-Datei nach Programmierung einer neuen Version<br />
// des Programms nicht in den EEPROM uebertragen wurde und EESAVE<br />
// deaktiviert ist (unprogrammed/1)<br />
// <br />
// Vorsicht: wenn EESAVE "programmed" ist, hilft diese Sicherung nicht<br />
// weiter, da die Speicheraddressen in einem neuen/erweiterten Programm<br />
// moeglicherweise verschoben wurden. An der Stelle &eeFooByte steht<br />
// dann u.U. der Wert einer anderen Variable aus einer "alten" Version.<br />
<br />
uint8_t fooByteDefault = 222;<br />
if ((myByte = eeprom_read_byte (&eeFooByte)) == EEPROM_DEF)<br />
{<br />
myByte = fooByteDefault;<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
=== Wort lesen/schreiben ===<br />
<br />
Schreiben und Lesen von Datenworten erfolgt analog zur Vorgehensweise bei Bytes:<br />
<br />
<syntaxhighlight lang="c"><br />
// lesen<br />
uint16_t myWord = eeprom_read_word (&eeFooWord);<br />
<br />
// schreiben<br />
eeprom_write_word (&eeFooWord, 2222);<br />
</syntaxhighlight><br />
<br />
=== Block lesen/schreiben ===<br />
<br />
Lesen und Schreiben von Datenblöcken erfolgt über die Funktionen <code>eeprom_read_block()</code> bzw. <code>eeprom_write_block()</code>. Die Funktionen erwarten drei Parameter: die Adresse der Quell- bzw. Zieldaten im RAM, die EEPROM-Adresse und die Länge des Datenblocks in Bytes als <code>size_t</code>.<br />
<syntaxhighlight lang="c"><br />
uint8_t myByteBuffer[3];<br />
uint16_t myWordBuffer[4];<br />
<br />
void eeprom_block_example (void)<br />
{<br />
/* Datenblock aus EEPROM lesen */<br />
<br />
/* liest 3 Bytes ab der von eeFooByteArray1 definierten EEPROM-Adresse<br />
in das RAM-Array myByteBuffer */<br />
eeprom_read_block (myByteBuffer, eeFooByteArray1, 3);<br />
<br />
/* dito mit etwas Absicherung betr. der Länge */<br />
eeprom_read_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));<br />
<br />
/* und nun mit 16-Bit Array */<br />
eeprom_read_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));<br />
<br />
/* Datenblock in EEPROM schreiben */<br />
eeprom_write_block (myByteBuffer, eeFooByteArray1, sizeof(myByteBuffer));<br />
eeprom_write_block (myWordBuffer, eeFooWordArray1, sizeof(myWordBuffer));<br />
}<br />
</syntaxhighlight><br />
<br />
=== Fließkommawerte lesen/schreiben ===<br />
<br />
In der avr-libc stehen auch EEPROM-Funktionen für Variablen des Typs float (Fließkommazahlen mit "einfacher" Genauigkeit) zur Verfügung.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/eeprom.h><br />
<br />
float eeFloat EEMEM = 12.34f;<br />
<br />
float void eeprom_float_example(float value)<br />
{<br />
/* float in EEPROM schreiben */<br />
eeprom_write_float(&eeFloat, value);<br />
<br />
/* float aus EEPROM lesen */<br />
return eeprom_read_float(&eeFloat);<br />
}</syntaxhighlight><br />
<br />
=== EEPROM-Speicherabbild in .eep-Datei ===<br />
<br />
Mit den zum Compiler gehörenden Werkzeugen kann der aus den Variablendeklarationen abgeleitete EEPROM-Inhalt in eine Datei geschrieben werden. Die übliche Dateiendung ist .eep, Daten im Intel Hex-Format. Damit können Standardwerte für den EEPROM-Inhalt im Quellcode definiert werden. <br />
<br />
Makefiles nach WinAVR/MFile-Vorlage enthalten bereits die notwendigen Einstellungen, siehe dazu die Erläuterungen im [[AVR-GCC-Tutorial/Exkurs Makefiles|Exkurs Makefiles]].<br />
<br />
Der Inhalt der eep-Datei muss ebenfalls zum Mikrocontroller übertragen werden, wenn die Initialisierungswerte aus der Deklaration vom Programm erwartet werden. Ansonsten enthält der EEPROM-Speicher nach der Übertragung des Programmers mittels ISP abhängig von der Einstellung der EESAVE-Fuse<ref>vgl. Datenblatt Abschnitt Fuse Bits</ref> nicht die korrekten Werte:<br />
; EESAVE = 0 (programmed): Die Daten im EEPROM bleiben erhalten. Werden sie nicht neu geschrieben, so enthält das EEPROM evtl. Daten, die nicht mehr zum Programm passen.<br />
; EESAVE = 1 (unprogrammed): Beim Programmieren werden die Daten im EEPROM gelöscht, also auf 0xff gesetzt.<br />
<br />
Als Sicherung kann man im Programm nochmals die Standardwerte vorhalten, beim Lesen auf 0xFF prüfen und gegebenenfalls einen Standardwert nutzen. Das geht natürlich nur, wenn 0xFF selbst nicht als Datenwert vorkommen kann.<br />
<syntaxhighlight lang="c"><br />
#define DUTY_CYCLE_DEFAULT 0x80<br />
<br />
uint8_t eeDutyCycle EEMEM; // Platzhalter für EEPROM<br />
uint8_t DutyCycle; // die echte Variable<br />
<br />
<br />
int main(void)<br />
{<br />
DutyCycle = eeprom_read_byte( &eeDutyCycle );<br />
if( DutyCycle == 0xFF ) // das allererste mal. Im EEPROM steht noch kein gültiger Wert<br />
{<br />
DutyCycle = DUTY_CYCLE_DEFAULT;<br />
eeprom_writeByte( &eeDutyCycle, DutyCycle );<br />
}<br />
<br />
...<br />
</syntaxhighlight><br />
<br />
=== Direkter Zugriff auf EEPROM-Adressen ===<br />
<br />
Will man direkt auf bestimmte EEPROM Adressen zugreifen, dann sind folgende IAR-kompatiblen Makros <tt>_EEGET</tt> und <tt>_EEPUT</tt> hilfreich, um sich die Typecasts zu ersparen.<br />
<br />
;Hinweis: Die nachfolgend gezeigten Makros und Zugriffe auf absolute Adressen sind in Normalfall nicht nötig und nur auf sehr wenige, spezielle Fälle beschränkt! Im Normalfall sollte man auf absolute Adressen möglichst nicht zugreifen und den Compiler seine Arbeit machen lassen, der verwaltet die Variablen und deren Adressen meist besser als der Programmierer. Der Zugriff auf Variablen im EEPROM sollte immer über ihren Namen erfolgen.<br />
<br />
Verwendung:<br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/eeprom.h><br />
<br />
_EEPUT (0x20, 128); // Byte-Wert 128 an Adresse 0x20 schreiben<br />
...<br />
uint8_t val = _EEGET (0x20); // EEPROM-Wert von Adresse 0x20 lesen<br />
</syntaxhighlight><br />
<br />
=== Was steckt dahinter? - EEPROM-Register ===<br />
Auch wenn es normalerweise keinen Grund gibt, in C selbst an den Steuerregistern herumzuschrauben - die eeprom Funktionen erledigen das alles zuverlässig - der Vollständigkeit halber der registermässige technische Unterbau.<br />
Um das EEPROM anzusteuern, sind drei Register von Bedeutung:<br />
;EEAR: Hier werden die Adressen eingetragen zum Schreiben oder Lesen. Dieses Register unterteilt sich nochmal in EEARH und EEARL, da in einem 8-Bit-Register keine 512 Adressen adressiert werden können.<br />
;EEDR: Hier werden die Daten eingetragen, die geschrieben werden sollen, bzw. es enthält die gelesenen Daten.<br />
;EECR: Ist das Kontrollregister für das EEPROM<br />
<br />
Das EECR steuert den Zugriff auf das EEPROM und ist wie folgt aufgebaut:<br />
<br />
:{| class="wikitable" style="text-align:center"<br />
|+ '''Aufbau des EECR-Registers'''<br />
|-<br />
!Bit<br />
| 7 || 6 || 5 || 4 || 3 || 2 || 1 || 0<br />
|-<br />
! Name<br />
| - || - || - ||- || EERIE || EEMWE || EEWE || EERE<br />
|-<br />
! Read/Write<br />
| R || R || R || R || R/W || R/W || R/W || R/W<br />
|-<br />
!Init Value<br />
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0<br />
|}<br />
<br />
'''Bedeutung der Bits'''<br />
<br />
;Bit 4-7: nicht belegt<br />
<br />
;Bit 3 (EERIE): ''EEPROM Ready Interrupt Enable'': Wenn das Bit gesetzt ist und globale Interrupts erlaubt sind in Register SREG (Bit 7), wird ein Interrupt ausgelöst nach Beendigung des Schreibzyklus (EEPROM Ready Interrupt). Ist einer der beiden Bits 0, wird kein Interrupt ausgelöst.<br />
<br />
;Bit 2 EEMWE): ''EEPROM Master Write Enable'': Dieses Bit bestimmt, dass, wenn EEWE = 1 gesetzt wird (innerhalb von 4 Taktzyklen), das EEPROM beschrieben wird mit den Daten in EEDR bei Adresse EEAR. Wenn EEMWE = 0 ist und EEWE = 1 gesetzt wird, hat das keine Auswirkungen. Der Schreibvorgang wird dann nicht ausgelöst. Nach 4 Taktzyklen wird das Bit EEMWE automatisch wieder auf 0 gesetzt. Dieses Bit löst den Schreibvorgang nicht aus, es dient sozusagen als Sicherungsbit für EEWE.<br />
<br />
;Bit 1 (EEWE): ''EEPROM Write Enable'': Dieses Bit löst den Schreibvorgang aus, wenn es auf 1 gesetzt wird, sofern vorher EEMWE gesetzt wurde und seitdem nicht mehr als 4 Taktzyklen vergangen sind. Wenn der Schreibvorgang abgeschlossen ist, wird dieses Bit automatisch wieder auf 0 gesetzt und, sofern EERIE gesetzt ist, ein Interrupt ausgelöst. Ein Schreibvorgang sieht typischerweise wie folgt aus:<br />
:# EEPROM-Bereitschaft abwarten (EEWE=0) <br />
:# Adresse übergeben an EEAR<br />
:# Daten übergeben an EEDR<br />
:# Schreibvorgang auslösen in EECR mit Bit EEMWE=1 und EEWE=1<br />
:# (Optional) Warten, bis Schreibvorgang abgeschlossen ist<br />
<br />
;Bit 0 EERE: ''EEPROM Read Enable'': Wird dieses Bit auf 1 gesetzt wird das EEPROM an der Adresse in EEAR ausgelesen und die Daten in EEDR gespeichert. Das EEPROM kann nicht ausgelesen werden, wenn bereits eine Schreiboperation gestartet wurde. Es ist daher zu empfehlen, die Bereitschaft vorher zu prüfen. Das EEPROM ist lesebereit, wenn das Bit EEWE=0 ist. Ist der Lesevorgang abgeschlossen, wird das Bit wieder auf 0 gesetzt, und das EEPROM ist für neue Lese- und Schreibbefehle wieder bereit. Ein typischer Lesevorgang kann wie folgt aufgebaut sein:<br />
:# Bereitschaft zum Lesen prüfen (EEWE=0)<br />
:# Adresse übergeben an EEAR<br />
:# Lesezyklus auslösen mit EERE = 1<br />
:# Warten, bis Lesevorgang abgeschlossen EERE = 0<br />
:# Daten abholen aus EEDR<br />
<br />
= Die Nutzung von sprintf und printf =<br />
<br />
Um komfortabel, d.h. formatiert, Ausgaben auf ein Display oder die serielle Schnittstelle zu tätigen, bieten sich '''sprintf''' oder '''printf''' an. Alle *printf-Varianten sind jedoch ziemlich speicherintensiv und der Einsatz in einem Mikrocontroller mit knappem Speicher muss sorgsam abgewogen werden.<br />
<br />
Bei '''sprintf''' wird die Ausgabe zunächst in einem Puffer vorbereitet und anschließend mit einfachen Funktionen zeichenweise ausgegeben. Es liegt in der Verantwortung des Programmierers, genügend Platz im Puffer für die erwarteten Zeichen bereitzuhalten.<br />
<br />
<syntaxhighlight lang="c"><br />
#include <stdio.h><br />
#include <stdint.h><br />
<br />
// ...<br />
// nicht dargestellt: Implementierung von uart_puts (vgl. Abschnitt UART)<br />
// ...<br />
<br />
uint16_t counter;<br />
<br />
// Ausgabe eines unsigned Integerwertes<br />
void uart_puti( uint16_t value )<br />
{<br />
uint8_t puffer[20];<br />
<br />
sprintf( puffer, "Zählerstand: %u", value );<br />
uart_puts( puffer );<br />
}<br />
<br />
int main()<br />
{<br />
counter = 5;<br />
<br />
uart_puti( counter );<br />
uart_puti( 42 );<br />
}<br />
</syntaxhighlight><br />
<br />
Eine weitere elegante Möglichkeit besteht darin, den STREAM stdout (Standardausgabe) auf eine eigene Ausgabefunktion umzuleiten. Dazu wird dem Ausgabemechanismus der C-Bibliothek eine neue Ausgabefunktion bekannt gemacht, deren Aufgabe es ist, ein einzelnes Zeichen auszugeben. Wohin die Ausgabe dann tatsächlich stattfindet, ist Sache der Ausgabefunktion. Im Beispiel unten wird auf UART ausgegeben. Alle anderen, höheren Funktionen wie z.&nbsp;B. '''printf''', greifen letztendlich auf diese primitive Ausgabefunktion zurück. <br />
<br />
<syntaxhighlight lang="c"><br />
#include <avr/io.h><br />
#include <stdio.h><br />
<br />
void uart_init(void);<br />
<br />
// a. Deklaration der primitiven Ausgabefunktion<br />
int uart_putchar(char c, FILE *stream);<br />
<br />
// b. Umleiten der Standardausgabe stdout (Teil 1)<br />
static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );<br />
<br />
// c. Definition der Ausgabefunktion<br />
int uart_putchar( char c, FILE *stream )<br />
{<br />
if( c == '\n' )<br />
uart_putchar( '\r', stream );<br />
<br />
loop_until_bit_is_set( UCSRA, UDRE );<br />
UDR = c;<br />
return 0;<br />
}<br />
<br />
void uart_init(void)<br />
{<br />
/* hier µC spezifischen Code zur Initialisierung */<br />
/* des UART einfügen... s.o. im AVR-GCC-Tutorial */<br />
<br />
// Beispiel: <br />
//<br />
// myAVR Board 1.5 mit externem Quarz Q1 3,6864 MHz<br />
// 9600 Baud 8N1<br />
<br />
#ifndef F_CPU<br />
#define F_CPU 3686400<br />
#endif<br />
#define UART_BAUD_RATE 9600<br />
<br />
// Hilfsmakro zur UBRR-Berechnung ("Formel" laut Datenblatt)<br />
#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)<br />
<br />
UCSRB |= (1<<TXEN) | (1<<RXEN); // UART TX und RX einschalten<br />
UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 <br />
<br />
UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );<br />
UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );<br />
}<br />
<br />
int main(void)<br />
{<br />
int16_t antwort = 42;<br />
uart_init();<br />
<br />
// b. Umleiten der Standardausgabe stdout (Teil 2)<br />
stdout = &mystdout;<br />
<br />
// Anwendung<br />
printf( "Die Antwort ist %d.\n", antwort );<br />
return 0;<br />
}<br />
<br />
// Quelle: avr-libc-user-manual-1.4.3.pdf, S.74<br />
// + Ergänzungen<br />
</syntaxhighlight><br />
<br />
<br />
Sollen Fließkommazahlen ausgegeben werden, muss im Makefile eine andere (größere) Version der [[FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio|printflib]] eingebunden werden.<br />
<br />
= Anmerkungen =<br />
<references/><br />
<br />
= TODO =<br />
* Aktualisierung Register- und Bitbeschreibungen an aktuelle AVR<br />
* "naked"-Funktionen [http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html][http://arduino.stackexchange.com/questions/8758/arduino-interruption-on-pin-change]<br />
<br />
[[Kategorie:avr-gcc Tutorial| ]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=100643
Avr-gcc Bugs
2019-06-05T11:07:23Z
<p>Gjlayde: /* Bugs */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| 8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=Avr-gcc_Bugs&diff=100642
Avr-gcc Bugs
2019-06-05T11:05:14Z
<p>Gjlayde: /* Fixed */</p>
<hr />
<div>== Bugs ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|-<br />
| [http://gcc.gnu.org/PR87376 87376] || Miscompilation with __memx and long long addition<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
<br />
|-<br />
| [http://gcc.gnu.org/PR86869 86869] || ICE when taking address of array member of __memx struct pointer<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86776 86776] || Need updating for CVE-2017-5753<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86635 86635] || Wrong code with __memx and __gtsf2<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR86040 86040] || RAMPZ not cleared after reading from __flashN<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64-bit comparison<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81073 81073] || Link failure as C++ misses to instanciate some objects<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR80573 80573] || ICE: in assign_temp, at function.c:961<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78707 78707] || ICE: in push_reload, at reload.c:1349 (sscanf_flt-f1.c)<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR78497 78497] || -save-temps adds -Wimplicit-fallthrough warnings<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR68384 68384] || LTO error for global register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR67352 67352] || incorrect warning with -Waddr-space-convert and struct in __flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR65657 65657] || read from __memx tramples function argument<br />
| → [http://gcc.gnu.org/PR86635 86635]<br />
|-<br />
| [http://gcc.gnu.org/PR64331 64331] || avr.c:reg_unused_after uses outdated reg_dead notes<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR63630 63630] || ICE: Spill fail<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR62084 62084] || ICE: in convert_debug_memory_address (__memx, -g)<br />
| middle-end → [http://gcc.gnu.org/PR52472 52472]<br />
|-<br />
| [http://gcc.gnu.org/PR57597 57597] || ICE: in get_section, Segmentation fault with -fmerge-all-constants<br />
| varasm<br />
|-<br />
| [http://gcc.gnu.org/PR57503 57503] || Wrong extension of multiply operand<br />
| tree-vrp<br />
|-<br />
| [http://gcc.gnu.org/PR57482 57482] || --help=optimizers reports a wrong list <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56479 56479] || ICE: can't allocate two 4-byte variables to "a" for inline asm<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56442 56442] || postreload uses clobbered register<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/bugzilla/showdependencytree.cgi?id=56183 56183]'''<br />
| ''Problems with register allocation''<br />
| meta-bug<br />
|-<br />
| [http://gcc.gnu.org/PR56164 56164] || ICE: spill fail with __flash keyword<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54330 54330] || Wrong optimization for code from fixed-bit.c<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53615 53615] || Buffer overflow in the compiler?<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR53372 53372] || Section attribute ignored with address space<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52663 52663] || ICE: in purge_dead_edges, at cfgrtl.c:2462<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR52305 52305] || ICE: in avr_print_operand: unknown mode (const_double) <br />
| asm<br />
|-<br />
| '''[http://gcc.gnu.org/PR50925 50925]''' || ICE: spill failure in newlib build<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR50739 50739] || nameless error with -fmerge-all-constants<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR49775 49775] || ICE: in based_loc_descr<br />
| dwarf-2<br />
|-<br />
| '''[http://gcc.gnu.org/PR42204 42204]''' || update_eliminables should be called in reload after something changes <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36571 36571] || Default untyped return for AVR is byte register. <br />
| <br />
|}<br />
<br />
== Binutils / avr-libc ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t4" <br />
!PR||Description||Note<br />
|- <br />
!colspan="3"| binutils<br />
|-<br />
| [http://sourceware.org/PR16005 16005] || Linker crash with --relax<br />
|<br />
|-<br />
| [http://sourceware.org/PR13812 13812] || .trampolines location in linker script cause "internal error: out of range error"<br />
|<br />
|-<br />
| [http://sourceware.org/PR12494 12494] || Relaxation leads to wrong code optimization<br />
|<br />
|- <br />
!colspan="3"| binutils fixed<br />
|-<br />
| [http://sourceware.org/PR21621 21621] || Wrong / missing warning "skipping two-word instruction"<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21849 21849] || Locate .progmemx.* at a higher address<br />
| 2.29.x<br />
|-<br />
| [http://sourceware.org/PR21683 21683] || Support __gcc_isr pseudo-instruction<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21583 21583] || Move .jumptables to a higher address<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21569 21569] || Merge avr.sc and avrtiny.sc<br />
| 2.29<br />
|-<br />
| [http://sourceware.org/PR21472 21472] || Add new emulation for ATtiny416 et al. (don't put .rodata in RAM)<br />
| 2.29 <br />
|-<br />
| [http://sourceware.org/PR21404 21404] || Assertion fail in bfd/elf32-avr.c:2145<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20849 20849] || Don't put .rodata in RAM on AVR_TINY.<br />
| 2.28<br />
|-<br />
| [http://sourceware.org/PR20789 20789] || Fix relaxation of negative DIFF relocs.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20254 20254] || Relocs at end of section are not processed with .align.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR20221 20221] || Wrong code with .align and linker relaxation.<br />
| 2.26<br />
|-<br />
| [http://sourceware.org/PR15043 15043] || Support -mrmw option for LAC, LAT, LAS and XCH.<br />
| 2.25<br />
|-<br />
| [http://sourceware.org/PR14058 14058] || Internal overflow error on > 128kB flash<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13899 13899]''' || Wrong relaxation of R_AVR_16_PM with gs()<br />
| 2.23<br />
|-<br />
| '''[http://sourceware.org/PR13697 13697]''' || Wrong symbol values with --gc-sections and empty .data<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13503 13503] || Support RELOCs to represent a byte<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR13410 13410] || Relocation truncated to fit: R_AVR_13_PCREL against symbol...<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12742 12742] || mingw32 and --enable-lto in Canadian cross build<br />
| 2.23<br />
|-<br />
| [http://sourceware.org/PR12161 12161] || Unconforming ELF file causes SIGSEGV in avr-ld<br />
| 2.23, 2.22.x<br />
|- <br />
!colspan="3"| avr-libc<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9416 P-9416] || [patch,AVR_TINY] Avoid constraint "w" in delay_basic.h<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9400 P-9400] || [patch] Add avrxmega3 multilibs<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/patch/?9187 P-9187] || [patch,AVR_TINY] Support 16-bit xtoa functons and more string functions.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/patch/?8729 P-8729] || [patch,avr/interrupt.h] Add ISR_NOICF, ISR_FLATTEN. Fix namespace of identifiers.<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?49567 49567] || Use meta-info from --print-multi-lib and --print-multi-directory<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38135 38135] || Install stdfix-avrlibc.h<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?38125 38125] || Distribute gcrt1.S<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36571 36571] || stdint.h: INTn_C not standard compliant<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?36454 36454] || string.h: Error for long long in C90<br />
| 1.8.1<br />
|-<br />
| '''[http://savannah.nongnu.org/bugs/?35407 35407]''' || Missing multilib versions for tiny-stack targets<br />
| &radic;<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?34695 34695] || stdint.h fixed-width int types without __attribute__((mode))<br />
|<br />
|-<br />
| [http://savannah.nongnu.org/bugs/?33698 33698] || RJMP/RCALL can cause "relocation truncated to fit: R_AVR_13_PCREL" linker error<br />
| &radic; ?<br />
|}<br />
<br />
== Optimierung ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t2"<br />
! PR || Optimization || Note<br />
|-<br />
| [http://gcc.gnu.org/PR88209 88209] || Inefficient array initialization<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR84211 84211] || Perform a post-reload register optimization pass<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR82658 82658] || Right-shifting 8-bit unsigned integers.<br />
| C++<br />
|-<br />
| [http://gcc.gnu.org/PR81625 81625] || v4.7 ... v8 is bloating code by > 25% compared to v3.4<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81611 81611] || gcc un-learned loop / post-increment optimization <br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR81540 81540] || tree-switch-conversion leads to code bloat<br />
| tree-ssa<br />
|-<br />
| [http://gcc.gnu.org/PR81533 81533] || Constructing an object that can be initialized at at load-time <br />
| c++<br />
|-<br />
| [http://gcc.gnu.org/PR80929 80929] || Division with constant no more optimized to mult<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR65082 65082] || Wasted cycles when using a register based varible<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR56439 56439] || unnecessary spill for global and local register variables<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR55181 55181] || Expensive shift loop instead of bit-testing instruction<br />
|<br />
|-<br />
| [http://gcc.gnu.org/PR54816 54816] ||shift is better than widening mul <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR54378 54378] || Code bloat for long << shifts<br />
| <br />
|-<br />
| '''[http://gcc.gnu.org/PR53049 53049]''' || expand/TER unappropriate moving unspec volatile<br />
| middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52664 52664] || gcc.dg/tree-ssa/pr31261.c fails<br />
| ssa<br />
|-<br />
| [http://gcc.gnu.org/PR52278 52278] || inefficient register allocation for SUBREGs<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR49807 49807] || Missed byte (subreg) extraction when storing to volatile mem<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49491 49491] || Superfluous move because of unnecessary spill for 2-operand insn<br />
| RA<br />
|-<br />
| [http://gcc.gnu.org/PR39760 39760] || register allocation costs are not well described on AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38629 38629] || target-specific parameters for inline heuristics not defined for AVR <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR36884 36884] || ifcvt poor optimization <br />
| RTL-optimize, -fno-if-conversion<br />
|-<br />
| [http://gcc.gnu.org/PR36561 36561] || store using long array index not hoisted out of loop <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR30908 30908] || tree cost for types which are > WORD_SIZE <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR27663 27663] || missed-optimization transforming a byte array to unsigned long<br />
| patch upstream<br />
|-<br />
| [http://gcc.gnu.org/PR18065 18065] || usual arithmetic conversion not applying correctly<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR11180 11180] || Optimization decrease performance of struct assignment. <br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR3507 3507] || appalling optimisation with sub/cmp on multiple targets<br />
| <br />
|}<br />
<br />
== Debug-Info, Build, ... ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t3"<br />
!PR||Debug-Info, Build, Ada, Fortran||Note<br />
|-<br />
| [http://gcc.gnu.org/pr52641 52641] || Test cases fail for 16-bit int targets<br />
| testsuite<br />
|}<br />
<br />
== Erweiterungen ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t5"<br />
! PR || Extensions || Note<br />
|-<br />
| [http://gcc.gnu.org/PR84163 84163] || Allow address space qualifier for compound literals<br />
| C<br />
|-<br />
| [http://gcc.gnu.org/PR57390 57390] || Support fixed-point types in C++<br />
| C++<br />
|}<br />
<br />
== Ungültig ==<br />
<br />
{| {{Tabelle}} border="1"<br />
! PR || Invalid || Note<br />
|-<br />
| [http://gcc.gnu.org/PR61044 61044] || Computed goto with label differences does not work<br />
| → Label differences not suported on AVR:<br/>[http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html Labels as Values]<br />
|-<br />
| [http://gcc.gnu.org/PR57501 57501] || crttn24a.o missing path with -mmcu=attiny24a<br />
| → Caused by [http://savannah.nongnu.org/bugs/?35407 AVR-LibC #35407]<br />
|-<br />
| [http://gcc.gnu.org/PR52474 52474] || mulhisi3: arithmetics produce completely wrong result<br />
| → Caused by patch from Atmel<br />
|-<br />
| [http://gcc.gnu.org/PR38549 38549] || eicall not properly set for > 128K program space <br />
| → [http://gcc.gnu.org/PR50820 50820]<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
! PR || Won't fix || Note<br />
|-<br />
| [http://sourceware.org/PR14406 14406] || Support .progmem<N>.data sections in the default ld script<br />
| → [https://sourceware.org/bugzilla/show_bug.cgi?id=14406#c2 Begründung + Beispiel für ld-Skript Erweiterung]<br />
|-<br />
| [http://gcc.gnu.org/PR56254 56254] || Support __builtin_avr_delay_cycles with non-const delays<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR49857 49857] || Put constant switch-tables into flash<br />
| (patch)<br />
|-<br />
| [http://gcc.gnu.org/PR43745 43745] || Put VTABLES in Flash<br />
| <br />
|-<br />
| [http://gcc.gnu.org/PR38342 38342] || __attribute__((progmem)) not propagated from typedef to data<br />
| → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716] <br />
|}<br />
<br />
== Fixed ==<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t7"<br />
! PR || Fixed || Note<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR85805 85805] || Wrong code for 64 bit comparisons on avr-gcc<br />
| 8.3 combine<br />
|-<br />
| [http://gcc.gnu.org/PR85495 85495] || lto-wrapper.exe: fatal error: file too short: No error<br />
| 8.0 LTO<br />
|-<br />
| [http://gcc.gnu.org/PR83801 83801] || String constant in __flash not put into .progmem<br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83729 83729] || ICE in convert_memory_address_addr_space_1 at explow.c:300 <br />
| 8.0 C<br />
|-<br />
| [http://gcc.gnu.org/PR83738 83738] || Don't save registers in main / auto-add OS_task to main<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81754 81754] || Building of avr compiler broken<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR20296 20296]<br/>[http://gcc.gnu.org/PR81268 81268]<br />
| Speeding up small ISRs<br/>Support __gcc_isr pseudo-instruction<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81075 81075] || Move jump-tables out of .text<br />
| 8.0<br />
|-<br />
| [http://gcc.gnu.org/PR81072 81072] || Add XMEGA devices with flash seen in RAM address space<br />
| 8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR84209 84209] || Don't split SP in split2<br />
| 7.4<br />
|-<br />
| [http://gcc.gnu.org/PR81910 81910] || ICE with "address" attribute on type<br />
| 7.3, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81487 81487] || ld.exe: error: asprintf failed<br />
| 7.2, 6.5, 5.5 mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR81473 81473] || Build fails due to INT8_MIN and friends<br />
| 7.2<br />
|-<br />
| [http://gcc.gnu.org/PR81407 81407] || C++: Error if a variable in progmem needs constructing<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR81305 81305] || avrtiny uses LDS for SREG with -O0<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80492 80492] || Wrong code whith loop unrolling and local asm regs<br />
| 7.2, 6.4 tree<br />
|-<br />
| [http://gcc.gnu.org/PR79883 79883] || i18n: untranslated "interrupt" or "signal"<br />
| 7.2, 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR75964 75964] || Insn-combiner removes comparison after ABS<br />
| 7.2, 6.5, 5.5 rtl<br />
|-<br />
| [http://gcc.gnu.org/PR78883 78883] || ICE triggered by change to combine.c<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78562 78562] || Wrong warning for built-in functions with -flto<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR78093 78093] || New variable attribute "absdata" to enable LDS / STS on Reduced Tiny<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71948 71948] || Make [http://gcc.gnu.org/onlinedocs/gcc/AVR-Variable-Attributes.html progmem] work on reduced Tiny by adding 0x4000 to symbols<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71678 71678] || ICE from switch / case on long long (casesi + DImode)<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR71676 71676] || casesi won't handle switch values larger than 16 bits<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR60300 60300] || Minor prologue improvement w.r.t code size<br />
| 7.0<br />
|-<br />
| [http://gcc.gnu.org/PR41076 41076] || Pessimal code for logical OR of 8-bit fields<br />
| 7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR67353 67353] || Option-ize Warning "appears to be a misspelled signal / interrupt handler"<br />
| 6.5, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR80462 80462] || Incorrect warning: uninitialized variable 'xxx' put into program memory area<br />
| 6.4, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR77326 77326] || Invalid optimization omits comparison<br />
| 6.3, 5.5<br />
|-<br />
| [http://gcc.gnu.org/PR72767 72767] || Some branches report too small insn length<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71976 71976] || insn-combine removes 64-bit shift<br />
| 6.2, 5.5 <br />
|-<br />
| [http://gcc.gnu.org/PR71151 71151] || Strings in .progmem.gcc_sw_section with -fdata-sections + const merging<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR71103 71103] || ICE: unrecognizable insn: QImode subreg of symbol_ref, const or label_ref<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR71053 71053] || volatile read-and-test loop optimized to test loop (without read)<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR70677 70677] || Disable <tt>-fcaller-saves</tt> per default<br />
| 6.2<br />
|-<br />
| [http://gcc.gnu.org/PR30417 30417] || Wrap spec generating -Tdata into %{!Tdata:...}<br />
| 6.2, 5.5, 4.9.4<br />
|-<br />
| [http://gcc.gnu.org/PR67839 67839] || Bit addressable instructions generated for invalid memory address<br />
| 6.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR65296 65296] || fix various issues with avr specs files<br />
| 5.2 → [http://savannah.nongnu.org/bugs/?44574 avr-libc #44574]<br />
|-<br />
| [http://gcc.gnu.org/PR65192 65192] || ICE: attiny: In tiny_valid_direct_memory_access_range<br />
| 5.0 (transient)<br />
|-<br />
| [http://gcc.gnu.org/PR52472 52472] || ICE: in convert_debug_memory_address, at cfgexpand.c (__memx, -g)<br />
| 5.0<br />
|}<br />
<br />
=== Älter als v5 ===<br />
<br />
{| {{Tabelle}} border="1" class="sortable" id="t8"<br />
! PR || Fixed || Note<br />
|-<br />
| [http://gcc.gnu.org/PR65196 65196] || ICE: avr_adjust_insn_length uses recog_memoized on invalid insn<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR64452 64452] || ICE: When passing struct member to varargs function<br />
| 4.9.3, 4.8.5<br />
|-<br />
| [http://gcc.gnu.org/PR63633 63633] || ICE: unrecognizable insn with mult insns<br />
| 4.9.3<br />
|-<br />
| [http://gcc.gnu.org/PR63223 63223] || Make jumptables work with -Wl,--section-start,.text=<br />
| 4.9.2<br />
|-<br />
| [http://gcc.gnu.org/PR61443 61443] || ICE: unrecognizable insn when varargs argument is indirect addr-space access<br />
| 4.9.1, 4.8.4<br />
|-<br />
| [http://gcc.gnu.org/PR61055 61055] || Wrong test instruction after increment (-O1 or -fno-peephole2)<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR60991 60991] || Stack corruption when using __memx pointers or __int24 in large stack frame<br />
| 4.9.1, 4.8.3, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56833 56833] || Postreload uses clobbered register<br />
| 4.9.0<br />
|-<br />
| [http://gcc.gnu.org/PR50807 50807] || Constructor writing to RAM for variable in Flash<br />
| 4.9.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR60486 60486] || Superfluous or missing comparision after addition or subtraction<br />
| 4.8.3<br />
|-<br />
| [http://gcc.gnu.org/PR59396 59396] || Wrong warning with ISR() and LTO<br />
| 4.8.3, 4.8.1<br />
|-<br />
| [http://gcc.gnu.org/PR57844 57844] || ICE: unrecognizable addqi3 insn with -msp8 and frame size of 128 bytes<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57631 57631] || Use assembler name for sanity checking of ISR names<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR57516 57516] || Incorrect fixed-point rounding result in the overflow case<br />
| 4.8.2<br />
|-<br />
| [http://gcc.gnu.org/PR57506 57506] || Some devices are present twice in avr-mcus.def<br />
| 4.8.2, 4.7.4<br />
|-<br />
| [http://gcc.gnu.org/PR56263 56263] || Provide strict address-space checking<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR56064 56064] || Fold VIEW_CONVERT_EXPR with FIXED_CST<br />
| 4.8.0 tree-ssa <br />
|-<br />
| [http://gcc.gnu.org/PR54814 54814] || ICE: Hundreds of spill fails in test suite for class R0_REG<br />
| 4.8.0.<br />
|-<br />
| [http://gcc.gnu.org/PR54854 54854] || Remove <tt>-mshort-calls</tt> option<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54815 54815] || missed optimization with operations with constant operands<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR54222 54222] || ISO/IEC TR 18037 fixed-point support<br />
| 4.8.0<br />
|-<br />
| [http://gcc.gnu.org/PR53344 53344] || Assemble 3-byte symbols<br />
| 4.8.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR55974 55974] || Wrong suffix for __INT24_MAX__, __UINT24_MAX__ with -mint8<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55897 55897] || Allocate __memx data to .progmemx.data<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR55243 55243] || [ada] STAMP variable is not defined in t-avr<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR50293 50293] || -flto fails if GCC is installed in directory with space in path name<br />
| 4.7.3<br />
|-<br />
| [http://gcc.gnu.org/PR54536 54536] || Incorrect library_name for at90usb1287<br />
| 4.7.2, 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR54476 54476] || Time/memory hog with __builtin_avr_delay_cycles (-1ul) on 64-bit hosts<br />
| 4.7.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR54461 54461]''' || Add configure option for better AVR-Libc integration<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR54220 54220] || Naked functions need frame at -O0<br />
| 4.7.2, 4.6.4<br />
|-<br />
| '''[http://gcc.gnu.org/PR53595 53595]''' || Code size increase of +10% between two 4.7.1 snapshots<br />
| 4.7.2<br />
|-<br />
| [http://gcc.gnu.org/PR53448 53448] || __attribute__((aligned(2))) ignored<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53256 53256]''' || Attribute 'interrupt' shall override attribute 'signal'<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR53065 53065] || ICE: in replace_reg_with_saved_mem, at caller-save.c:1125<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR53033 53033]''' || Wrong register number for 3-byte loads via X<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR52737 52737]''' || -mtiny-stack shall not influence multilib selection<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52692 52692] || Add support for avr-specific built-ins + LTO<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52545 52545] || SECTION_EXCLUDE flag clobbers SECTION_MACH_DEP<br />
| 4.7.1 other<br />
|-<br />
| '''[http://gcc.gnu.org/PR52543 52543]''' || lower-subreg.c: code bloat of 300%-400% for multi-word memory splits<br />
| '''HACK''' 4.7.1 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR52508 52508] || HAVE_RAMPZ as condition to set RAMPZ prior to flash-read is no more appropriate<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52507 52507] || movmem loop for __memx address space uses wrong loop label<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52506 52506] || XMEGA: Wrong order of save/restore of RAMPX/Y/Z/D SFRs in ISR pro-/epilogue<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52505 52505] || __memx address space reading unintentionally from RAM<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52496 52496] || avr-specific built-ins missing memory barrier<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52488 52488] || ICE: unreconizable addqi -2000 insn<br />
| 4.7.1<br />
|-<br />
| [http://gcc.gnu.org/PR52484 52484] || Missing __memx insn because of wrong register footprint<br />
| 4.7.1 <br />
|-<br />
| [http://gcc.gnu.org/PR52461 52461] || XMEGA+EBI: RAMPZ clobbered<br />
| 4.7.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR51527 51527]''' || ICE: 'convert_to_integer' enters infinite recursion for __int24<br />
| 4.7.1 c<br />
|-<br />
| [http://gcc.gnu.org/PR46261 46261] || ICE: when compiled with -mint8 <br />
| 4.7.1, 4.6.4, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR52261 52261] || Add XMEGA support<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR52148 52148] ||ICE: spill_failure for movmemhi<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51782 51782]''' || Missing address-space information leads to wrong code<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR51425 51425] || no SBIS/SBIC instructions<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR51409 51409]''' || Building avr-gcc fails if configured for other languages than from C family<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51345 51345] || Devices with 8-bit SP need their own multilib(s)<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR51050 51050] || ICE: invalid rtl sharing found in the insn (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR51002 51002] || SP_H register is used even on targets that do not have it (ATtiny26)<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50931 50931] || Support a 24-bit scalar integer mode<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50910 50910] || Inefficient division by 2<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50887 50887] || Support ACCUMULATE_OUTGOING_ARGS <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50775 50775]''' || Register allocator sets up frame and frame pointer with low register pressure<br />
| 4.7.0, ra<br />
|-<br />
| [http://gcc.gnu.org/PR50616 50616] || ICE: lto1.exe: invalid resolution in the resolution file<br />
| 4.7.0, lto, mingw32<br />
|-<br />
| [http://gcc.gnu.org/PR50566 50566] || Add support for better logging by means of -mlog=<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50465 50465] || Use insn attribute to depict if and how instruction lengths have to be adjusted<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50449 50449] || Loading some 32-bit constants not optimal<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50448 50448] || Missed optimization accessing struct component with integer address<br />
| 4.7.0 middle-end<br />
|-<br />
| [http://gcc.gnu.org/PR50447 50447] || Better support of AND, OR, XOR and PLUS with constant integers<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50446 50446] || Implement rotate patterns with offset 1<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR50358 50358] || Implement [u]maddqihi4 [u]msubqihi4 patterns<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR50063 50063]''' || wrong code for gcc.dg/torture/pta-ptrarith-3.c<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49939 49939] || Skip 2-word instructions if applicable<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49903 49903] || Redundant comparisons in binary-seach switch/case expansion<br />
| 4.7.0 FIXME<br />
|-<br />
| [http://gcc.gnu.org/PR49881 49881] || Inefficient stack manipulation around calls<br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR49868 49868]''' || Implement named address space to place/access data in flash memory<br />
| 4.7.0 ← [http://sourceware.org/PR13503 binutils PR13503]<br />
|- <br />
| [http://gcc.gnu.org/PR49864 49864] || ICE: in maybe_record_trace_start, at dwarf2cfi.c:2439<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR49687 49687] || Missed optimization for widening MUL<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR49313 49313] || Inefficient libgcc implementations for avr<br />
| 4.7.0 ABI<br />
|-<br />
| [http://gcc.gnu.org/PR47597 47597] || ICE: call frame debugging information is not handled when case is post_dec <br />
| 4.7.0<br />
|-<br />
| '''[http://gcc.gnu.org/PR46278 46278]''' || avr-gcc 4.5.1 doing suboptimal reloads using X <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR45099 45099] || Warning could be issued for use of register variables that will fail.<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR43746 43746] || -fmerge-constants and -fmerge-all-constants don't work at AVR target <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR42210 42210] || optimizing assignment to a bit field<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR39621 39621] || Delaying operation to end of function causes high stack usage<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR36467 36467] || Missed optimization with pointer arithmetic and mul* <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR35860 35860] || [4.3/4.4/4.5/4.6 Regression] [avr] code bloat caused by -fsplit-wide-types <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34888 34888] || Stack patterns not optimal <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34792 34792] || c++ worse than c compiler at 8-bit optimisations <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34791 34791] || optimisation of 8-bit logic sometimes fails <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34790 34790] || no sibling call optimisation<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR34789 34789] || sometimes the compiler keeps addresses in registers unnecessarily <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR33049 33049] || bit extraction non optimal, inversing logic solves problem<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29560 29560] || Poor optimization for byte shifts <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR29524 29524] || [4.3/4.4/4.5/4.6 Regression] Too much RAM used: __clz_tab[] linked<br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR18145 18145] || Do not emit __do_copy_data or __do_clear_bss if .data or .bss is empty. <br />
| 4.7.0<br />
|-<br />
| [http://gcc.gnu.org/PR17994 17994] || avr-gcc does not output a dwarf2 .debug_frame section <br />
| 4.7.0<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR52741 52741] || -mtiny-stack must not make assumptions on upper 8 bits of SP/FP<br />
| 4.6.4<br />
|-<br />
| [http://gcc.gnu.org/PR51756 51756] || Wrong warning: uninitialized variable put into program memory area<br />
| 4.6.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR51374 51374]''' || insn combine reorders volatile memory accesses<br />
| 4.6.3 middle-end<br />
|-<br />
| '''[http://gcc.gnu.org/PR50820 50820]''' || Use EIND consistently<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR50816 50816] || Discriminators are emitted in DWARF 2 format <br />
| 4.6.2<br />
|- <br />
| '''[http://gcc.gnu.org/PR50652 50652]''' || Incorrect data start value for ATmega164A<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR50289 50289] || call-prologues saving/restoring global register variables<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49824 49824] || Missing documentation for OS_task and OS_main attributes <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49764 49764] || [avr-g++] Rejects attribute progmem<br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR49487 49487] || ICE: bytewise rotate<br />
| 4.6.2<br />
|-<br />
| '''[http://gcc.gnu.org/PR46779 46779]''' || wrong code generation for values held in R28/R29 <br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR34734 34734] || attribute((progmem)) not handled properly in C++ for AVRs<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?33716 avr-libc #33716]<br />
|-<br />
| [http://gcc.gnu.org/PR44643 44643] || ICE: in c-typeck.c<br />
| 4.6.2 → [http://savannah.nongnu.org/bugs/?32988 avr-libc #32988]<br />
|-<br />
| '''[http://gcc.gnu.org/PR39633 39633]''' || missing 8-bit comparison (*cmpqi)<br />
| 4.6.2, 4.5.4<br />
|-<br />
| [http://gcc.gnu.org/PR39386 39386] || different computation results for O1 and O0 executables <br />
| 4.6.2<br />
|-<br />
| [http://gcc.gnu.org/PR48459 48459] || [4.6/4.7 Regression] avr: Assertion failure with -gdwarf-2<br />
| 4.6.1<br />
|-<br />
| '''[http://gcc.gnu.org/PR45263 45263]''' || registers used in __do_global_ctors can get clobbered <br />
| 4.6.1, 4.5.4<br />
|-<br />
|colspan="3" align="center"|&nbsp;<br />
|-<br />
| [http://gcc.gnu.org/PR45261 45261] || Doesn't indicate failure status when it doesn't support (attiny2313A) <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR42240 42240]''' || [4.3/4.4 Regression] wrong epilogue on naked function <br />
| 4.5.3<br />
|-<br />
| '''[http://gcc.gnu.org/PR41885 41885]''' || Rotate patterns do not correctly consider overlap. <br />
| 4.5.0<br />
|}<br />
<br />
== Weblinks ==<br />
<br />
* [https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=WAITING&bug_status=REOPENED&cf_gcctarget=avr&cf_gcctarget_type=allwordssubstr&cf_known_to_fail_type=allwords&cf_known_to_work_type=allwords&product=gcc&query_format=advanced&order=changeddate%2Cbug_status%2Cpriority%2Cassigned_to%2Cbug_id&query_based_on= gcc.gnu.org/bugzilla: avr]<br />
* [http://savannah.nongnu.org/bugs/?group=avr-libc avr-libc: Fehler]<br />
<br />
[[Kategorie: avr-gcc]]</div>
Gjlayde
https://www.mikrocontroller.net/index.php?title=4000_Stellen_von_Pi_mit_ATtiny2313&diff=100482
4000 Stellen von Pi mit ATtiny2313
2019-04-09T18:54:02Z
<p>Gjlayde: Typo</p>
<hr />
<div>[[Bild:attiny2313.jpg|thumb|right|ATtiny2313 im [[IC-Gehäuseformen|DIL]]-Gehäuse]]<br />
Als neulich im Foren nach einem<br />
: ''"rechenintensiven Beispielprogramm für den kleinen ATtiny2313 in C oder ASM"''<ref>[http://www.mikrocontroller.net/topic/248373 Forum: AVR Atiny2313: ''"Suche rechenintensivs Beispielprogramm für ATtiny2313"'']</ref><br />
gesucht wurde und als Vorschlag ein<br />
: ''"Pi auf 1000 Stellen"''<ref>[http://www.mikrocontroller.net/topic/248373#2544249 Forum: AVR Atiny2313: ''"Pi auf 1000 Stellen"'']</ref><br />
kam, wolle ich es genauer wissen. Auch wenn der Vorschlag eher als Scherz aufzufassen ist — sind C-Compiler inzwischen so gut, daß damit π auf tausende Stellen berechnet werden kann? Bei einem Assembler-Programm hätte ich da keine Bedenken; aber C?<br />
<br />
Der [[AVR]] ATtiny2313 ist bekanntlich ein 8-Bit [[Mikrocontroller]] mit 2048 Bytes an Programmspeicher und 128 Bytes RAM. Die Aufgabe erfordert also eine spezielle Herangehensweise, denn nicht alle zu berechnenden Stellen sind gleichzeitig im RAM des µC speicherbar: bereits berechnete Stellen sollen ausgegeben werden, und an der Ausgabe-Schnittstelle sollen Ziffernweise die Nachkommastellen von π heraus purzeln.<br />
<br />
== Die Formel ==<br />
<br />
Das theoretisch-algorithmische Rüstzeug dafür ist lange bekannt und das Web ist voll davon: Eine 1995 von Simon Plouffe gefundene Reihendarstellung<ref>Für einen Beweis siehe [http://www.pi314.net/eng/plouffe.php The World of π: Proof: Formula BBP].</ref> für&nbsp;π:<br />
:<math><br />
\pi=\sum_{k=0}^\infty \frac1{16^k}<br />
\left(\frac4{8k+1}-\frac2{8k+4}-\frac{1}{8k+5}-\frac1{8k+6}\right)<br />
</math><br />
Die Anwendung der Darstellung besteht dabei nicht in stupidem Auswerten bis zur gewünschten Genauigkeit, sondern es wird die n-te Nachkommastelle von π damit bestimmt ''ohne'' vorherige oder nachfolgende Ziffern der Darstellung zu bestimmen.<br />
Der einzige Wehrmutstropfen ist, daß die Darstellung zur Basis&nbsp;16 erhalten wird und nicht wie gewohnt zur Basis&nbsp;10 — aber immerhin liefert die Formel ''überhaupt'' erst einen Weg, um die Berechnung auf einer kleinen Hardware mit 2k Programmspeicher ausführen zu können.<br />
Auch dieser Weg ist hinreichend oft im Internet erklärt — je nach Seite mehr oder weniger gut. Eine gute Erklärung findet sich etwa in der Wikipedia<ref>[http://fr.wikipedia.org/wiki/Formule_BBP#Exploitation_de_la_formule_pour_calculer_les_chiffres_apr.C3.A8s_la_virgule_de_.CF.80 Wikipédia: Formule BBP]: Exploitation de la formule pour calculer les chiffres après la virgule de π</ref><br />
<br />
Die ganze Aufgabe besteht also nur noch darin, den Algorithmus hinzuschreiben und zu compilieren — und zu hoffen, dass das erzeugte Programm in den kleinen Programmspeicher eines ATtiny hineinpasst.<br />
<br />
Gerade der letzte Punkt ist nicht selbstverständlich, denn die Anwendung der obigen Formel verlangt den Einsatz von Fließkomma-Arithmetik. Zwar ist auch eine<br />
Implementierung mittels Festkomma-Zahlen möglich, aber ich wollte mit den Bordmitteln der C-Sprache auskommen: Ohne Inline-Assembler Hacks, ohne umständliches Hin-und-Herwandeln und Skalieren, ohne Implementierung eigener Divisionroutinen, etc. Das Programm kann daher auch als Stresstest für die Tools verstanden werden.<br />
<br />
Als Sprache wählte ich C99 und als Compiler avr-gcc<ref>[http://gcc.gnu.org/ GCC]: The GNU Compiler Collection</ref> 4.7 oder neuer, so daß ein Executable erzeugen wird, das in die 2k Programmspeicher eines ATtiny2313 hineinpasst.<br />
<br />
== Der Quelltext: C99 == <br />
<br />
Zur Implementierung ist hier nicht viel zu sagen; die Quellen sind ausführlich kommentiert. Nur noch einige Anmerkungen:<br />
* Die Quellen sind so allgemein gehalten, dass das Programm auch für einen PC übersetzt und dort ausgeführt werden kann.<br />
* Wird für AVR übersetzt, erfolgt die Ausgabe der berechneten Ziffern auf der UART-Schnittstelle. Für Compiler- und Linker-Optionen siehe die Quellkommentare.<br />
* Bei einer Taktfrequenz von 20 MHz dauert die Berechnung der ersten 1000 hex-Ziffern etwa 3–4 Minuten. Verdoppelt man die Anzahl der Ziffern, ist die 4-fache Rechenzeit zu erwarten.<br />
* Der Algorithmus liefert brauchbare Resultate für die ersten 4096 Nachkommastellen von&nbsp;π. Danach reichten die verwendeten 16-Bit int für ganze Zahlen nicht mehr aus, und für 32-Bit Zahlen ist der Programmspeicher des ATtiny2313 zu klein.<br />
* Der Algorithmus berechnet wie gesagt Nachkommastellen der Hexadezimaldarstellung von π. 4000 hex-Nachkommastellen entsprechen übrigens ca. 4800 Dezimalstellen: log 16 / log 10 ≈ 6/5.<br />
* Die Ausgabe lässt sich etwa vergleichen mit "First 8366 Hex Digits of PI"<ref>[http://www.herongyang.com/Cryptography/Blowfish-First-8366-Hex-Digits-of-PI.html www.herongyang.com]: First 8366 Hex Digits of π</ref><br />
* Den Quelltext gibt es auch hier als bereits fertig kompiliertes Atmel Studio 6.1 SP2 Project (inkl. Hex und ELF): [[Medium:4000Pi.zip]] (60KB)<br />
<br />
<pre><br />
/* pi.c: Compute the first 4000 hexadecimal digits of pi<br />
on an AVR ATtiny2313 microcontroller. */<br />
/*<br />
Language: C99<br />
Compiler: An AVR toolchain based on avr-gcc 4.7 or newer and AVR-Libc<br />
if you like to compile for AVR ATtiny2313, or a C99-compliant<br />
compiler if you like to run this program on a PC.<br />
<br />
Hardware: AVR ATtiny2313 which is an 8-bit microcontroller with<br />
128 Bytes of RAM and 2048 Bytes of program memory.<br />
http://www.atmel.com/Images/doc2543.pdf (Manual, PDF, 4 MB)<br />
http://www.atmel.com/Images/doc2543S.pdf (Summary, PDF, 500 kB)<br />
<br />
Compile: You need a reasonably optimizing compiler and floating point<br />
implementation, or otherwise the program won't fit into the<br />
tiny silicon. Notice that the code below is *vanilla* C with<br />
IEEE-754 floating point arithmetic and without assembler or<br />
fixed-point hacks. <br />
<br />
The program is generic enough to run on a PC. If you use GCC,<br />
just compile with the following command line and run pi.exe<br />
<br />
gcc pi.c -o pi.exe -std=c99 -O2 -lm<br />
<br />
The only compiler that produces code small enough for the<br />
AVR ATtiny2313 is avr-gcc 4.7+ together with AVR-Libc.<br />
<br />
avr-gcc pi.c -o pi.elf $(CFLAGS) $(OPT) $(DEFS) $(LDFLAGS)<br />
<br />
with the following abbreviations for convenience:<br />
<br />
CFLAGS = -std=c99 -mmcu=attiny2313<br />
OPT = -Os -mcall-prologues -fno-split-wide-types<br />
-fno-caller-saves -fno-tree-loop-optimize <br />
LDFLAGS = -Wl,--relax -Wl,--gc-sections -lm<br />
DEFS = -DF_CPU=22118400 -DBAUDRATE=115200 -DHOST_WINDOWS<br />
<br />
For documentation of GCC see http://gcc.gnu.org/onlinedocs<br />
<br />
DEFS represents the UART setup. In my circuit I use a<br />
22.1184 MHz quartz which is a bit of overclocking but is so<br />
convenient with baud rates. Depending on your configuration,<br />
you will use other values for F_CPU and BAUDRATE, see below.<br />
<br />
The first 1000 digits of pi take about 3 minutes at 22 MHz.<br />
For 4000 digits, multiply this time by 16.<br />
<br />
The time to get the first n digits of pi with this method is roughly<br />
<br />
T(n) = K * n^2<br />
<br />
so that, given the time for the computation of n digits, you can easily<br />
compute K and estimate how long the computation will take for other<br />
values of n. K will depend on the clock speed you use, for example.<br />
<br />
Some software metrics for the AVR binary compiled as above:<br />
<br />
Program Size: Less than 2000 of 2048 bytes<br />
<br />
RAM Usage:<br />
Static storage : 0 bytes<br />
Static stack usage : ~ 50 bytes<br />
Dynamic : 0 bytes<br />
Total : 40% of 128 bytes<br />
<br />
Coding Style: Stroustrup<br />
Indentation: 4 Space<br />
*/<br />
<br />
#include <stdlib.h><br />
#include <stdint.h><br />
#include <math.h><br />
<br />
// Factor out some platform/compiler dependencies<br />
<br />
#if defined (__AVR__) && defined (__GNUC__)<br />
<br />
// Running on AVR<br />
# include <avr/io.h><br />
# include <avr/wdt.h><br />
# define cput(C) uart_putc(C)<br />
static void uart_init (void);<br />
static void uart_putc (const char);<br />
<br />
#else // ! avr-gcc<br />
<br />
// Running on PC<br />
# include <stdio.h><br />
# define wdt_reset() (void) 0<br />
# define uart_init() (void) 0<br />
static void cput (char c) <br />
{<br />
fputc (c, stdout);<br />
fflush (stdout);<br />
}<br />
<br />
#endif // avr-gcc<br />
<br />
// return a * b mod n<br />
// <br />
// 0 <= a < n <br />
// 0 <= b < n<br />
//<br />
// This is a school-book implementation of multiplication that allows for<br />
// larger moduli compared to (a * b) % n.<br />
//<br />
// The implementation widens the range of valid moduli from<br />
// \sqrt{1+UINT_MAX} to (1+UINT_MAX)/2. Or vice versa, it allows us<br />
// to use a smaller type for the modulus -- 16 bits in the AVR case.<br />
//<br />
// Moreover, ATtiny2313 has no hardware multiplyer or divider, anyway.<br />
// We have to cope with 2048 bytes of program memory and are happy<br />
// to avoid dragging in library routines if possible.<br />
<br />
static unsigned mod_mul (unsigned a, unsigned b, unsigned n)<br />
{<br />
unsigned ab = 0;<br />
<br />
while (1)<br />
{<br />
if (a % 2 == 1)<br />
{<br />
ab += b;<br />
if (ab >= n)<br />
ab -= n;<br />
}<br />
<br />
a = a / 2;<br />
if (a == 0)<br />
return ab;<br />
<br />
b = b * 2;<br />
if (b >= n)<br />
b -= n;<br />
}<br />
}<br />
<br />
// Return 16^k mod n<br />
//<br />
// Exponentiation with the same approach as above except<br />
// that we binary-expand the exponent instead of a factor.<br />
<br />
static unsigned mod_pow16 (unsigned k, unsigned n)<br />
{<br />
unsigned p = 1;<br />
unsigned _16 = 16;<br />
<br />
if (n == 1)<br />
return 0;<br />
<br />
while (_16 >= n)<br />
_16 -= n;<br />
<br />
while (1)<br />
{<br />
if (k % 2 == 1)<br />
p = mod_mul (_16, p, n);<br />
<br />
k = k / 2;<br />
if (k == 0)<br />
break;<br />
<br />
_16 = mod_mul (_16, _16, n);<br />
}<br />
<br />
return p;<br />
}<br />
<br />
// Helper for the function below. Return a value in (-2,2) that<br />
// is equivalent to s mod 1.<br />
<br />
static float tame (float s)<br />
{<br />
int8_t si = (int8_t) lrintf (s);<br />
<br />
if (si <= -2 || si >= 2)<br />
s -= si;<br />
<br />
return s;<br />
}<br />
<br />
// The finite part mod 1 of sigma_j, i.e. partial sum where the exponent<br />
// of 16 is >= 0. By "mod 1" we always mean "up to some integer",<br />
// i.e. the result needs not to be normalized to [0,1).<br />
<br />
static float sigma_a (unsigned n, uint8_t j)<br />
{<br />
float s = 0.0f;<br />
<br />
for (unsigned k = n-1; k+1 != 0; k--)<br />
{<br />
unsigned j_8k = j + 8*k;<br />
<br />
s += mod_pow16 (n-k, j_8k) / (float) j_8k;<br />
<br />
// Cut down the sum and don't let it grow too big.<br />
// The bigger the number grows the less precision is<br />
// left for the fractional part we are interested in.<br />
<br />
s = tame (s);<br />
<br />
wdt_reset();<br />
}<br />
<br />
return s;<br />
}<br />
<br />
#define MARGIN 10<br />
<br />
static float sigma_b (unsigned n, uint8_t j)<br />
{<br />
float s = 0;<br />
float _16 = 1.0f;<br />
<br />
for (unsigned k = n; k <= n + MARGIN; k++)<br />
{<br />
s += _16 / (8*k + j);<br />
_16 /= 16;<br />
<br />
wdt_reset();<br />
}<br />
<br />
return s;<br />
}<br />
<br />
// Compute an approximation of 16^n * sigma(j) mod 1<br />
// where<br />
//<br />
// sigma_j = \sum_0^oo 1 / (16^k * (8k + j))<br />
//<br />
// The sum is split into two parts:<br />
// sigma_a is the finite sum up to n.<br />
// sigma_b is the finite sum from n+1 to oo<br />
// and approximated by a sum from n+1 to n+MARGIN<br />
<br />
float sigma (unsigned n, uint8_t j)<br />
{<br />
return sigma_a (n, j) + sigma_b (n, j);<br />
}<br />
<br />
// Compute pi * 16^n up to some integer<br />
// using a Bailey-Borwein-Plouffe formula for pi: <br />
//<br />
// pi = 4*sigma_1 - 2*sigma_4 - sigma_5 - sigma_6<br />
//<br />
// with the definition of sigma_j from above. All this<br />
// is explained very nicely in the French wikipedia at<br />
// http://fr.wikipedia.org/wiki/Formule_BBP<br />
// <br />
// For a proof define the power series<br />
//<br />
// sigma_j (x) = \sum x^{8k} / (8k + j)<br />
//<br />
// write the sum as an integral and evaluate it at<br />
// x = sqrt(1/2), see http://www.pi314.net/eng/plouffe.php<br />
<br />
float pi_n (unsigned n)<br />
{<br />
float s = 0.0;<br />
<br />
for (uint8_t i = 0; i < 4; i++)<br />
{<br />
// j[i] = 1, 4, 5, 6<br />
uint8_t j = i ? i + 3 : 1;<br />
<br />
// c[i] = 4, -2, -1, -1<br />
int8_t c = -1;<br />
if (i == 0) c = 4;<br />
if (i == 1) c = -2;<br />
<br />
s += c * sigma (n, j);<br />
}<br />
<br />
return s;<br />
}<br />
<br />
// We computed pi_n = 16^n * pi mod 1.<br />
// Get the first fractional hexadecimal digit by multiplying<br />
// with 16 and extracting digit 0 of the result. Voila!<br />
<br />
static uint8_t pi_dig16 (unsigned n)<br />
{<br />
return 15 & lrintf (floorf (16 * pi_n (n)));<br />
}<br />
<br />
// Map 0 <= n < 16 to its hexadecimal ASCII digit<br />
// '0', '1', ... 'F'<br />
<br />
static uint8_t hexdigit (uint8_t n)<br />
{<br />
n += '0';<br />
return n > '9' ? n + 'A'-'0'-10 : n;<br />
}<br />
<br />
int main (void)<br />
{<br />
uart_init();<br />
<br />
cput ('\n');<br />
cput ('3');<br />
cput ('.');<br />
<br />
// As explained above, 16-bit integers limitate us to moduli <= 2^15.<br />
// The biggest modulus for n is 8n+6 so that for n >= 4096 we expect<br />
// garbage from the implementation if 16-bit integers are used like<br />
// with avr-gcc. In fact, we get garbage for n > 4100.<br />
// It's not exacly 4095 because of the denominators in sigma_a that<br />
// delay the garbage for some values of n.<br />
<br />
// Easy going 4000 hex-digits of pi.<br />
<br />
for (unsigned n = 0; n < 4000; n++)<br />
{<br />
// Print a line break after every 64 digits. That way the output<br />
// can easily be compared with, e.g. the hexadecimal representation<br />
// of pi from blowfish listed in "First 8366 Hex Digits of PI" from<br />
// http://www.herongyang.com/Cryptography/<br />
<br />
if (n % 64 == 0)<br />
cput ('\n');<br />
<br />
// Get the n+1-th hexadecimal digit of pi and<br />
// output it as ASCII character.<br />
<br />
cput (hexdigit (pi_dig16 (n)));<br />
}<br />
<br />
cput ('\n');<br />
<br />
return 0;<br />
}<br />
<br />
/************************************************************************/<br />
// We are running on ATtiny2313 bare metal, of course.<br />
// Provide some minimalist output routine that writes to UART.<br />
/************************************************************************/<br />
<br />
#ifdef __AVR__<br />
<br />
// !!! You must have set the fuses appropriately to run the !!!<br />
// !!! controller at desired F_CPU. Defining F_CPU is needed !!!<br />
// !!! to get correct values to set up the UART. !!!<br />
// !!! !!!<br />
// !!! DEFINING F_CPU WILL NOT CHANGE THE FREQUENCY! !!!<br />
<br />
void uart_init (void)<br />
{<br />
// Define F_CPU and BAUDRATE depending on your hardware setup.<br />
// For my setup, it's the followin defines in avr-gcc's command line:<br />
// -DF_CPU=22118400 -DBAUDRATE=115200<br />
<br />
unsigned ubrr = -.6 + F_CPU / (8L * BAUDRATE);<br />
<br />
UBRRH = ubrr >> 8;<br />
UBRRL = ubrr;<br />
<br />
// Enable UART transmitter, data mode 8N1, asynchronous.<br />
<br />
UCSRA = (1 << U2X) | (1 << TXC);<br />
UCSRB = (1 << TXEN);<br />
UCSRC = (1 << UCSZ1) | (1 << UCSZ0);<br />
}<br />
<br />
/////////////////////////////////////////////////////////////////<br />
<br />
// Write one char to UART (non-buffered, blocking version).<br />
<br />
void uart_putc (char c)<br />
{<br />
while (!(UCSRA & (1 << UDRE)))<br />
wdt_reset();<br />
UDR = c;<br />
<br />
#ifdef HOST_WINDOWS<br />
if (c == '\n')<br />
uart_putc ('\r');<br />
#endif // HOST_WINDOWS<br />
}<br />
<br />
void exit (int x)<br />
{<br />
(void) x;<br />
<br />
while (1)<br />
wdt_reset();<br />
}<br />
#endif // __AVR__<br />
</pre><br />
<br />
== Weblinks ==<br />
<references/><br />
<br />
[[Kategorie:AVR-Projekte]]<br />
[[Kategorie:AVR-Arithmetik]]<br />
[[Kategorie:PC-Programmierung]]</div>
Gjlayde