[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/block cause hangin A
From: |
Stu Bell |
Subject: |
RE: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/block cause hangin ATmega256x |
Date: |
Wed, 9 Apr 2008 08:15:44 -0600 |
"Is avr-gcc for avr6 ready to use?" Yes, with warnings. Since gcc
insists on the size of a function pointer to be 2 bytes, anything using
function pointers must be used with caution. If the function resides in
the lower half of flash, the 2 byte pointer works fine.
The problem is when the function resides in upper memory. Then, the 2
byte pointer will point to the wrong place.
Note that normal function calls work fine. Avr-gcc has been modified to
handle that case, through the use of the linker "trampoline" section.
It is just function pointers that give problems.
I've been using avr-gcc with the ATmega2560 for over 2 years now.
Although I'm picky about how my modules are linked (so the functions
that have pointers reside in low flash), the code is successful.
I will admit that I would not recommend the avr6 to people with little
experience in programming.
Best regards,
Stu Bell
DataPlay (DPHI, Inc.)
-----Original Message-----
From: address@hidden
[mailto:address@hidden On Behalf Of
Dmitry K.
Sent: Wednesday, April 09, 2008 12:24 AM
To: address@hidden
Subject: Re: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/block cause
hangin ATmega256x
Hm...
Is avr-gcc for avr6 ready to use?
I have try avr-gcc 4.4-20080404 (4.3.0 does not support avr6) with
binutils 2.18. In result the small program without any EEPROM usage and
without any inline functions gives incorrect
code:
/* avr-gcc 4.4-20080404 + binutils 2.18 produce incorrect code: the
foo4()
function stores 0 value to 'vp' variable.
Options: -W -Wall -Os -mmcu=atmega2560 */
#define BIGCODE() asm volatile (".rept 30000\n\tnop\n\t.endr")
void (* volatile vp) (void);
__attribute__((noinline)) void foo1 (void) { BIGCODE(); vp = foo1; }
__attribute__((noinline)) void foo2 (void) { BIGCODE(); vp = foo2; }
__attribute__((noinline)) void foo3 (void) { BIGCODE(); vp = foo3; }
__attribute__((noinline)) void foo4 (void) { BIGCODE(); vp = foo4; }
int main ()
{
foo1 ();
foo2 ();
foo3 ();
foo4 ();
return 0;
}
I will see the bug report later.
Dmitry.
_______________________________________________
AVR-libc-dev mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/avr-libc-dev
- RE: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/block causehangin ATmega256x, (continued)
- RE: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/block causehanginATmega256x, Stu Bell, 2008/04/09
- RE: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/block causehanginATmega256x, Weddington, Eric, 2008/04/09
- RE: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/blockcausehanginATmega256x, Weddington, Eric, 2008/04/09
- Re: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/blockcausehanginATmega256x, Dmitry K., 2008/04/09
- Re: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/blockcausehanginATmega256x, Dmitry K., 2008/04/09
- Re: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/block causehanginATmega256x, Erik Christiansen, 2008/04/09
- RE: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/blockcausehanginATmega256x, Stu Bell, 2008/04/10
- RE: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/block cause hangin ATmega256x,
Stu Bell <=
- Re: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/block cause hangin ATmega256x, Dmitry K., 2008/04/09
- RE: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/block causehangin ATmega256x, Weddington, Eric, 2008/04/09
- Re: [avr-libc-dev] [bug #22878] eeprom_*_word/dword/block causehangin ATmega256x, Dmitry K., 2008/04/09