Go Down

Topic: [MAC] Aggiornamento IDE 1.0x all'ultima versione Atmel Toolchain (Read 38311 times) previous topic - next topic

gpb01

In attesa di aggiornare il primo post, intanto, chi volesse scaricare la cartella avr già pronta da sostituire all'interno dell'IDE 1.0.5 versione OS X, può seguire questo link : http://www.phoenixsea.ch/downloads/AVR/avr_3.4.3.zip  (circa 50 MB).

Per inciso, ci ho già messo dentro anche l'ultima versione di AVRDUDE (6.0.1) ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

Primo post del thread aggiornato con i necessari link.

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

#92
Dec 05, 2013, 01:39 pm Last Edit: Dec 05, 2013, 01:58 pm by gpb01 Reason: 1
Allora, vediamo i problemini che si incontrano con questa nuova versione ... per ora ho questi :

Code: [Select]

/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void store_char(unsigned char, ring_buffer*)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:98:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if (i != buffer->tail) {
                   ^
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In function 'void __vector_18()':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:127:21: warning: unused variable 'c' [-Wunused-variable]
      unsigned char c = UDR0;
                    ^
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In member function 'void HardwareSerial::begin(long unsigned int, byte)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:368:11: warning: unused variable 'current_config' [-Wunused-variable]
  uint8_t current_config;
          ^
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp: In member function 'virtual size_t HardwareSerial::write(uint8_t)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/HardwareSerial.cpp:467:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  while (i == _tx_buffer->tail)
                          ^
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h: In member function 'IPAddress::operator uint32_t()':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:51:55: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
    operator uint32_t() { return *((uint32_t*)_address); };
                                                      ^
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h: In member function 'bool IPAddress::operator==(const IPAddress&)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:52:75: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
    bool operator==(const IPAddress& addr) { return (*((uint32_t*)_address)) == (*((uint32_t*)addr._address)); };
                                                                          ^
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/IPAddress.h:52:108: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
    bool operator==(const IPAddress& addr) { return (*((uint32_t*)_address)) == (*((uint32_t*)addr._address)); };
                     ^

/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.cpp: In member function 'size_t Print::print(const __FlashStringHelper*)':
/Users/gpb01/Desktop/Prove Toolchain/Arduino 1.0.5 TL 3.4.3.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Print.cpp:44:23: warning: '__progmem__' attribute ignored [-Wattributes]
   const char PROGMEM *p = (const char PROGMEM *)ifsh;


... dove, il più grave, che andrebbe risolto, è l'ultimo, riguardante, come al solito, PROGMEM ;)

Così come è ... ignora l'attributo PROGMEM che viene usato dalla Print.cpp ... con le ovvie conseguenze del caso :(

Guglielmo
Search is Your friend ... or I am Your enemy !

PaoloP


lestofante

ma perchè ora non esiste più progmem, è già deprecato nelle versioni in uso adesso se non erro.

Il punto è che se si sistemassero le lib per essere compatibili alla versione attuale E alla versione standard avremmo risolto il problema all'origine. E le modifiche sono da proporre sul github.
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

gpb01

Non credo ... è semplicemente cambiata la sintassi ...

... la vecchia :

Code: [Select]
const prog_uint16_t pippo PROGMEM = 1;

diventa, nella nuova sintassi : :

Code: [Select]
const uint16_t pippo __attribute__ (( __progmem__ )) = 1;

oppure :

Code: [Select]
PROGMEM static const uint16_t pippo = 1;

... entrambe NON danno problemi con la nuova Toolchain ;)

Poi, ancora più in dettaglio, se si usa C++11 diventa :

Code: [Select]
const uint16_t pippo [[gnu::__progmem__]] = 1;

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

Il guaio è che non riesco a correggere quella riga (44) della Print.cpp ...

Code: [Select]
const char PROGMEM *p = (const char PROGMEM *)ifsh;

... modifico da un lato e mi da errore dall'altro e videversa  :~ :~ :~

Guglielmo
Search is Your friend ... or I am Your enemy !

astrobeed

Anche se non è MAC l'attuale toolchain Atmel per Windows, precompilata, alla fine ha gli stessi problemi, è inutilizzabile con il core di Arduino.
Scientia potentia est

gpb01


Anche se non è MAC l'attuale toolchain Atmel per Windows, precompilata, alla fine ha gli stessi problemi, è inutilizzabile con il core di Arduino.


Ma si, ormai è chiaro, NON è un problema di ambiente, è la stessa cosa su tutti gli ambienti, è ... un problema nel "core" di Arduno  !

Certo, magari, riuscendo a trovare una qualche soluzione, la si potrebbe proporre su Github ... così che la incorporino definitivamente. ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

nid69ita


Non credo ... è semplicemente cambiata la sintassi ...
... la vecchia :
Code: [Select]
const prog_uint16_t pippo PROGMEM = 1;
diventa, nella nuova sintassi : :
Code: [Select]
const uint16_t pippo __attribute__ (( __progmem__ )) = 1;


Ma la PROGMEM non è una #define ?
Se si, si potrebbe "aggiungere" o cambiare questa define come "__attribute__ (( __progmem__ )) "  ?
my name is IGOR, not AIGOR

gpb01


Ma la PROGMEM non è una #define ?
Se si, si potrebbe "aggiungere" o cambiare questa define come "__attribute__ (( __progmem__ )) "  ?


Rimandato a Settembre, vai a studiare ... http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html ...  XD XD XD

Guglielmo
Search is Your friend ... or I am Your enemy !

astrobeed

Scientia potentia est

nid69ita

#102
Dec 05, 2013, 03:24 pm Last Edit: Dec 05, 2013, 03:36 pm by nid69ita Reason: 1


Ma la PROGMEM non è una #define ?
Se si, si potrebbe "aggiungere" o cambiare questa define come "__attribute__ (( __progmem__ )) "  ?

Rimandato a Settembre, vai a studiare ... http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html ...  XD XD XD
Guglielmo


Boh, forse non ho capito io ma al link che hai messo si vede che la PROGMEM è una define:
Code: [Select]
#define PROGMEM   __ATTR_PROGMEM__

Perciò questo
Code: [Select]
const prog_uint16_t pippo PROGMEM = 1;
diventa con l'attuale toolchain
Code: [Select]
const prog_uint16_t pippo  __ATTR_PROGMEM__ = 1;

Ma se la nuova sitassi è questa:
Code: [Select]
const uint16_t pippo __attribute__ (( __progmem__ )) = 1;
modificare la #define in
Code: [Select]
#define PROGMEM  (__attribute__ (( __progmem__ )))
Non porterebbe la sostituzione alla nuova sintassi ?
my name is IGOR, not AIGOR

lestofante

https://github.com/arduino/Arduino/pull/1448

(notare che spunta sempre fuori leo)
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Maurotec

#104
Dec 05, 2013, 03:52 pm Last Edit: Dec 05, 2013, 03:57 pm by MauroTec Reason: 1
mmm....le risate me le faccio volentieri, ma si tratta comunque di una macro, quindi una #define.

L'attributo è "__attribute__ (( __progmem__ ))".
Quando il parser di gcc incontra __attribute__ sa che deve comportarsi in modo diverso in base all'attributo specificato dopo il token __attribute__. Di attributi oltre a __progmem__ c'è n'è tanti altri alcuni dipendenti dalla architettura e/o piattaforma.

Allora la define PROGMEM sarà simile a:
Code: [Select]

#define PROGMEM             __attribute__ (( __progmem__ ))


Il problema con il core parte da qui:
Code: [Select]

//  WString.h - String library for Wiring & Arduino
class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))


PSTR(s)   ((const PROGMEM char *)(s)), è un cast di una literal string a puntatore in progmem, cioè:
Code: [Select]

((const PROGMEM char *)("miastringinprogmem"))


La define F totalmente espansa diventa:
Code: [Select]
(reinterpret_cast<const __FlashStringHelper *>(((const __attribute__ (( __progmem__ )) char *)("miastringinprogmem")))
Che equivale a dire: miastringinprogmem viene trasformata in un puntatore const PROGMEM char * il quale viene interpretato come puntatore a FlashStringHelper che è una forward declare di una classe inesistente. Tutto sto popò di cast solo per fare in modo che C++ sia in grado di scegliere il metodo corretto da chiamare.

La print da così:
Code: [Select]

size_t Print::print(const __FlashStringHelper *ifsh)
{
 const char PROGMEM *p = (const char PROGMEM *)ifsh;
 size_t n = 0;

dovrebbe diventare
Code: [Select]

size_t Print::print(const __FlashStringHelper *ifsh)
{
 const PROGMEM char *p = (const PROGMEM char *)ifsh;
 size_t n = 0;

Anche se p dovrebbe essere:
Code: [Select]

PGM_P p =  (const PROGMEM char *)ifsh;

PROGMEM dice:
Attribute to use in order to declare an object being located in flash ROM.

Mentre const __FlashStringHelper *ifsh è un puntatore e pertanto il cast dovrebbe essere ancora più semplice
Code: [Select]

PGM_P p =  (PGM)ifsh;


Purtroppo io non posso provare.

Tutti gli altri errori sono dei warning che da bravo il compilatore emette e che è possibile farli scomparire usando il flag opportuno inserito nella variabile ambiente CXX_FLAGS, ma ovviamente non è la soluzione corretta, in quanto questi warning sono utili quando scriviamo codice che ancora non sappiamo lavori correttamente.

Ciao.

Go Up