Bug i binutils för ATtiny4/5/9/10/20/40

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Bug i binutils för ATtiny4/5/9/10/20/40

Inlägg av stekern »

Jag tänkte att jag ska sätta upp en varningens flagga till folk som tänker använda de i titeln nämnda avrerna, så de slipper nån timmes hårslitande...
Problemet är att dessa avrer har endast stöd för en 16-bit variant av LDS och STS instruktionerna (de vanliga är 32-bit), men avr-as har inte stöd för detta.
gcc genererar LDS på globala och statiska variabler, så ingen av dessa fungerar som de skall.

Så här kan man göra för att se buggen i aktion:

Kod: Markera allt

$ avr-as --version
GNU assembler (GNU Binutils) 2.20.1.20100303
Copyright 2009 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `avr'.

$ cat lds_sts_test.S
        lds     r24, 0x42
        sts     0x42, r24

$ avr-as -mmcu=attiny10 lds_sts_test.S -o lds_sts_test.o
$ avr-objdump -D lds_sts_test.o

lds_sts_test.o:     file format elf32-avr


Disassembly of section .text:

00000000 <.text>:
   0:   80 91 42 00     lds     r24, 0x0042
   4:   80 93 42 00     sts     0x0042, r24

För att komma runt problemet kan man antingen använda patchen här:
http://www.wutj.info/attiny10-binutils-patch
eller så kan man använda sig av funktioner som dessa på alla sina globala och statiska variabler:

Kod: Markera allt

/*
 * Workaround for a assembler bug
 * (32-bit lds will be inserted instead of 16-bit)
 */
uint8_t get_u8(uint8_t *addr)
{
	uint8_t retval;

	__asm__ __volatile__(
		"ld      %0, %a1\n"
		: "=r" (retval)
		: "e" (addr)
	 );

	return retval;
}

void set_u8(uint8_t *addr, uint8_t value)
{
	__asm__ __volatile__(
		"st      %a0, %1\n"
		:
		: "e" (addr), "r" (value)
	 );
}
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Bug i binutils för ATtiny4/5/9/10/20/40

Inlägg av snigelen »

Det är bara en av många buggar i avr-gcc/as/libc för den familjen. Jag tror de flesta, inklusive denna, är fixade i Atmels senaset toolchain (3.4.1).
Den genererar korrekt kod med ditt testprogram:

Kod: Markera allt

Disassembly of section .text:

00000000 <.text>:
   0:	82 a1       	lds	r24, 0x42
   2:	82 a9       	sts	0x42, r24
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: Bug i binutils för ATtiny4/5/9/10/20/40

Inlägg av stekern »

Jo, jag märkte också att det var fixat i Atmels egna version (efter att jag skrivit inlägget).
Kan ändå vara bra att veta detta, eftersom den binutils som kommer med många Linux distar har denna bugg.
Skriv svar