Pages: [1]   Go Down
Author Topic: Help to upgrade avr-libc to a newer version in the arduino ide  (Read 1886 times)
0 Members and 1 Guest are viewing this topic.
Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello, this is my first post!!! (take care of this and about my not perfect english) :-)

I have a problem to compile a sketch into the arduino original IDE (under windows).
My problem is very strange and very long because i have tried without success many ways to resolve it!
Let's go...

----- How the problem come out -----
I wrote a sketch for arduino Mega 2560 and the original Ethernet shield.
For the purpose I have found a library that seems to be ok.
http://www.webweavertech.com/ovidiu/weblog/archives/000477.html
It use the micro-SD on the Ethernet shield and like a webserver send all the page requested by a broswer.

I modified the example called “FileUpload” by adding a function and an handler to manage a GET request with parameters (.../example.htm?param1=123).
All things work ok!!!
I receive the parameter from the browser and, in my function, I manage it correctly! (obviously the arduino IDE compile it without problems).

But this webserver freeze in a particular condition!
All the functions in arduino locks: I used a blinking led, in a cooperative task mode, like an heartbeat and it don't blink anymore when the arduino freeze.
Using some debug I found that the cause is a browser request of the file “favicon.ico” (the little icon on the left of the address bar) after a reset of arduino.
More debug shown me that the function, called from the library, that freeze is malloc()!
Malloc() (memory allocation) is called many times but freeze only in that code flow position (the call is made for allocate 8 byte when I have more than 6kB free...)

Google shown me that malloc() in avr-libc 1.6.4 (arduino 0022) have a bug:
http://savannah.nongnu.org/bugs/?22567
http://savannah.nongnu.org/bugs/?25723


Seems that in the avr-libc 1.7.1 (the last update available) these bugs have been corrected so I want to upgrade the arduino libc to this version and compile again.


----- How I tried to solve the problem -----
Arduino ide use winavr to compile.
I have seen that replacing the folder “avr” in the path “...\arduino\hardware\tools\” with the installation path of a newer version of winavr I can upgrade the avr-libc.

At this point the problem is that winavr in not more manteined... (last update is 20100110 / libc 1.6.7 and don't work: arduino freeze) http://arduino.cc/forum/index.php/topic,61093.0.html

So I tried to use MHV tools http://www.makehackvoid.com/group-projects/mhvavrtools or Atmel's toolchain http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4118&category_id=163&family_id=607&subfamily_id=760
that both have the avr-libc 1.7.1 version.

In both cases I substituted the folder “avr” and tried to compile (the avr tools also need an “#include math.h” somewhere...) but I receive from the compiler the same error:


----- The final problem -----

In file included from c:\programmi\arduino\hardware\tools\avr\bin\../lib/gcc/avr/4.5.2/../../../../avr/include/util/delay.h:42:0,
                 from c:\programmi\arduino\hardware\tools\avr\bin\../lib/gcc/avr/4.5.2/../../../../avr/include/avr/delay.h:37,
                 from C:\Programmi\arduino\hardware\arduino\cores\arduino\/wiring_private.h:30,
                 from C:\Programmi\arduino\hardware\arduino\cores\arduino\WInterrupts.c:34:
c:\programmi\arduino\hardware\tools\avr\bin\../lib/gcc/avr/4.5.2/../../../../avr/include/math.h:426:15: error: expected identifier or '(' before 'double'
c:\programmi\arduino\hardware\tools\avr\bin\../lib/gcc/avr/4.5.2/../../../../avr/include/math.h:426:15: error: expected ')' before '>=' token


Seems that there is a problem with the function at row 426 in the file math.h


--- math.h ---
418:/**
419:    The round() function rounds \a __x to the nearest integer, but rounds
420:    halfway cases away from zero (instead of to the nearest even integer).
421:    Overflow is impossible.
422:
423:    \return The rounded value. If \a __x is an integral or infinite, \a
424:    __x itself is returned. If \a __x is \c NaN, then \c NaN is returned.
425: */
426:extern double round (double __x) __ATTR_CONST__;
427:#define roundf   round      /**< The alias for round().   */


like in this post http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=84750&start=0 seems that somewere the round function is declared as a macro, but I am not able to find where.

I want to find a secure way to upgrade the avr folder and compile (successfully) with the arduino ide and an avr-libc upgraded and this post may be a reference to all the arduino user community.
I prefer to adopt the atmel's toolchains that seems to be more updated

Thank for replies and I wait for someone that can help me to understand what don't work.
Sorry again for the length of the exposition.
« Last Edit: July 08, 2011, 11:01:05 am by flyeagle » Logged

"Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa." - Albert Einstein

Global Moderator
Dallas
Offline Offline
Shannon Member
*****
Karma: 200
Posts: 12772
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


This is what I do to "upgrade" to the latest WinAVR version...
http://arduino.cc/forum/index.php/topic,37965.msg281176.html#msg281176
http://arduino.cc/forum/index.php/topic,60649.msg437771.html#msg437771
http://arduino.cc/forum/index.php/topic,51984.msg371307.html#msg371307
Logged

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok. This is what i have yet done. But arduino freeze in the same manner.
Last winavr version have avr-libc 1.6.7 but i think that i need 1.7.1 version.
But using atmel's toolchain (avr-libc 1.7.1) i have the compiler error, and i don't understand why...

What can i do to find the source of the compiler error?
Logged

"Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa." - Albert Einstein

Global Moderator
Dallas
Offline Offline
Shannon Member
*****
Karma: 200
Posts: 12772
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


Hold down the Shift key and click Verify.
Logged

"The old Europe"
Offline Offline
Edison Member
*
Karma: 1
Posts: 2005
Bootloaders suck!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Regarding 'round'. You need to disable the macro in 'wiring.h'.
Logged

• Upload doesn't work? Do a loop-back test.
• There's absolutely NO excuse for not having an ISP!
• Your AVR needs a brain surgery? Use the online FUSE calculator.
My projects: RGB LED matrix, RGB LED ring, various ATtiny gadgets...
• Microsoft is not the answer. It is the question, and the answer is NO!

Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Coding Badly:
  I tried the option Shift + Verify (i didn't know) and i saw all the compiler options plus the files' path compiled... but nothing interesing about my compiler problem.
Thank you anyhow

@madworm
  I opened the "wiring.h" in arduino core folder and I found the fucked macro that locks the compiling process.
Thank you very much!

Code:
---- wiring.h ----
78:#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
79:[b]#define round(x)     ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))[/b]
80:#define radians(deg) ((deg)*DEG_TO_RAD)

Commenting the row #79 I can compile correctly!!! Finally!!! :-)

Unfortunately Arduino works worst: it receive from the browser a trash request (random characters) :-(

I think that the last hope to run my webserver correctly is to overhaul TinyWebServer code perhaps removing the use of malloc... a long process indeed.

Returning to the topic question now i have partially an answer:
  1- avr-libc can be upgraded with Atmel's tools simply substituting a folder
  2- if I have some macros error I can disable their in the file "wiring.h" simply commenting the right row
  3- is possible that something don't works well... debug!!!

But i don't understand why the macro in "wiring.h" create compiler error with a newer "avr folder" version...
Compiling with the original arduino 0022 "avr" folder the round macro works well;
compiling with the Atmel's "avr" folder the round  macro makes errors...
Why?

Thanks
« Last Edit: July 09, 2011, 05:32:29 am by flyeagle » Logged

"Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa." - Albert Einstein

Grand Blanc, MI, USA
Offline Offline
Faraday Member
**
Karma: 93
Posts: 3968
CODE is a mass noun and should not be used in the plural or with an indefinite article.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

This is what I do to "upgrade" to the latest WinAVR version...
http://arduino.cc/forum/index.php/topic,37965.msg281176.html#msg281176

Old thread I know, but just wanted to say thanks. Been meaning to try this for some time, and I would have tried the same approach but always good to find that the trail has already been blazed. Of course I probably would have had to find the part about relocating avrdude.conf the hard way!

All seems well so far, which leads me again to wonder why the latest version isn't included in the IDE, whether there are some known gotchas or whatever.
Logged

MCP79411/12 RTC ... "One Million Ohms" ATtiny kit ... available at http://www.tindie.com/stores/JChristensen/

Global Moderator
Dallas
Offline Offline
Shannon Member
*****
Karma: 200
Posts: 12772
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Old thread I know, but just wanted to say thanks.

You are welcome!

Quote
All seems well so far, which leads me again to wonder why the latest version isn't included in the IDE, whether there are some known gotchas or whatever.

I wonder that too.  After years of using the "new" toolset I have yet to find a reason to switch back to the old version.
Logged

Pages: [1]   Go Up
Jump to: