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
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)
);
}