Arduino: skillnader i binär/optimering mellan Linux och Win
Arduino: skillnader i binär/optimering mellan Linux och Win
Har ett problem här - ett projekt som fungerar när det kompileras under Linux fungerar inte när det kompileras under Windows.
Använder Uno men tänkt flytta över till en Mega1280.
Har ett egenmodifierat/utvecklat bibliotek för CC1101-radiomodulerna och en sketch som använder det. Problemet är helt enkelt att binären som är kompilerad på Windows inte kan ta emot paket från radiomodulen. Sänder med en mätnod som jag ska ha i garaget, den har hela tiden samma mjukvara.
Nu får jag på inget sätt samma kod att fungera när den kompileras i Windows. Även storleken skiljer, nästan 2kB större på Windows men det varierar mellan versionerna. Har försökt radera alla katalogerna som skapas under AppData/Temp.
På Linux (LUbuntu)-sidan har jag 1.0.5+dsfg2-2.
På Windows(7) 1.0.5-r2, 1.6.2 och 1.6.5-r5 (nyaste). 1.0.5-r2 och 1.6.5-r5 har endast det behövliga biblioteket.
Det är baserat på detta http://labalec.fr/erwan/?p=497 , och i alla binärerna kan jag läsa PARTNUM- och VERSION-registren i setup-funktionen. Jag får dock ingen interrupt när ett paket borde ha kommit in. Pinnen är aktiv, går att kittla när den är flytande.
(jag har prövat flasha på Linuxmaskinen och flytta till Windowsmaskinen ifall det skulle bero på RFI etc, men nej).
Använder Uno men tänkt flytta över till en Mega1280.
Har ett egenmodifierat/utvecklat bibliotek för CC1101-radiomodulerna och en sketch som använder det. Problemet är helt enkelt att binären som är kompilerad på Windows inte kan ta emot paket från radiomodulen. Sänder med en mätnod som jag ska ha i garaget, den har hela tiden samma mjukvara.
Nu får jag på inget sätt samma kod att fungera när den kompileras i Windows. Även storleken skiljer, nästan 2kB större på Windows men det varierar mellan versionerna. Har försökt radera alla katalogerna som skapas under AppData/Temp.
På Linux (LUbuntu)-sidan har jag 1.0.5+dsfg2-2.
På Windows(7) 1.0.5-r2, 1.6.2 och 1.6.5-r5 (nyaste). 1.0.5-r2 och 1.6.5-r5 har endast det behövliga biblioteket.
Det är baserat på detta http://labalec.fr/erwan/?p=497 , och i alla binärerna kan jag läsa PARTNUM- och VERSION-registren i setup-funktionen. Jag får dock ingen interrupt när ett paket borde ha kommit in. Pinnen är aktiv, går att kittla när den är flytande.
(jag har prövat flasha på Linuxmaskinen och flytta till Windowsmaskinen ifall det skulle bero på RFI etc, men nej).
Senast redigerad av JanErik 10 oktober 2015, 18:20:53, redigerad totalt 1 gång.
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Arduino: skillnader i binär/optimering mellan Linux och
Först ska jag säga att jag vet i stort sett inget om Arduino. Mer än att det verkar populärt.
Min erfarenhet är att kompilatorbuggar är förvånansvärt ovanliga, åtminstone i gcc som är den jag brukar använda.
Får du några varningar?
Använder du optimering?
Är det inte gott nog (om än irriterande) att du kan kompilera i Linux men inte i Windows?
Min erfarenhet är att kompilatorbuggar är förvånansvärt ovanliga, åtminstone i gcc som är den jag brukar använda.
Får du några varningar?
Använder du optimering?
Är det inte gott nog (om än irriterande) att du kan kompilera i Linux men inte i Windows?
Re: Arduino: skillnader i binär/optimering mellan Linux och
Kompilatorbugg knappast men mera hur Arduino-IDE:n kör AVR-GCC och linkern.
Ja, problemet är att jag har lite behov av olika bibliotek och har olika användningsområden så jag har en laptop i skrubben som jag utvecklar vissa projekt på och vissa på desktopmaskinen (Windows i Virtualbox dock, enda installation)...
Man borde ju dock kunna förvänta sig att båda ska ge identiska binärer?
Ja, problemet är att jag har lite behov av olika bibliotek och har olika användningsområden så jag har en laptop i skrubben som jag utvecklar vissa projekt på och vissa på desktopmaskinen (Windows i Virtualbox dock, enda installation)...
Man borde ju dock kunna förvänta sig att båda ska ge identiska binärer?
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Arduino: skillnader i binär/optimering mellan Linux och
Jo det borde man kunna förvänta sig.
Re: Arduino: skillnader i binär/optimering mellan Linux och
om du inte redan har det, ändra i preferences.txt till
build.verbose=true
jämför sedan båda loggarna, eller posta dom här.
build.verbose=true
jämför sedan båda loggarna, eller posta dom här.

Re: Arduino: skillnader i binär/optimering mellan Linux och
> ...Även storleken skiljer, nästan 2kB större på...
Får du inga LIST eller MAP fil som säger vad som faktiskt länkas in?
Får du inga LIST eller MAP fil som säger vad som faktiskt länkas in?
Re: Arduino: skillnader i binär/optimering mellan Linux och
Inte så att ditt lib namn krockar med ett inbyggd i arduino lib:et? Eller att du inte har flyttat det du ska använda?
Re: Arduino: skillnader i binär/optimering mellan Linux och
Nej, alla bibliotek är ju nog under libraries/ . Heter cc1101_nspi, dvs native SPI. Det ursprungliga i PanStamp har en egen SPI-implementation men nu har jag behov att dela SPI-bussen med flera enheter.
Re: Arduino: skillnader i binär/optimering mellan Linux och
Får du inga LIST eller MAP fil som säger vad som faktiskt länkas in?
Re: Arduino: skillnader i binär/optimering mellan Linux och
Får en sån d-fil för hela projektet men ingen map-fil i den meningen kan jag hitta:
C:\Users\jskata\AppData\Local\Temp\build3641606963352046632.tmp\Weatherstation_wirelessserver_only_nspi.cpp.o: \
C:\Users\jskata\AppData\Local\Temp\build3641606963352046632.tmp\Weatherstation_wirelessserver_only_nspi.cpp \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\libraries\EEPROM/EEPROM.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\libraries\SPI/SPI.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Arduino.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/binary.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/WCharacter.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/WString.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/HardwareSerial.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Stream.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Printable.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/new.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\variants\standard/pins_arduino.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\libraries\cc1101l_nspi/cc1101_nspi.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\libraries\cc1101l_nspi/ccpacket.h
C:\Users\jskata\AppData\Local\Temp\build3641606963352046632.tmp\Weatherstation_wirelessserver_only_nspi.cpp.o: \
C:\Users\jskata\AppData\Local\Temp\build3641606963352046632.tmp\Weatherstation_wirelessserver_only_nspi.cpp \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\libraries\EEPROM/EEPROM.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\libraries\SPI/SPI.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Arduino.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/binary.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/WCharacter.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/WString.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/HardwareSerial.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Stream.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Print.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/Printable.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\cores\arduino/new.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\hardware\arduino\variants\standard/pins_arduino.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\libraries\cc1101l_nspi/cc1101_nspi.h \
C:\Users\jskata\Desktop\arduino-1.0.5-r2\libraries\cc1101l_nspi/ccpacket.h
Re: Arduino: skillnader i binär/optimering mellan Linux och
Sådär, nu har jag iaf tagit ut objektdump men hittade inte filen med kompilatorflaggor på 1.0.5-r2. Greppade genom hela katalogen efter "compiler.c.elf.flags" m.m. men fanns inte. Vart är det flyttat?
Iaf - koden, biblioteket och båda build-katalogerna finns här;
http://users.abo.fi/jskata/Arduinoproblem/
I vardera build-katalog finns också objdump.lst, den säger dock inte mycket för mig. Nån som har bättre koll?
Iaf - koden, biblioteket och båda build-katalogerna finns här;
http://users.abo.fi/jskata/Arduinoproblem/
I vardera build-katalog finns också objdump.lst, den säger dock inte mycket för mig. Nån som har bättre koll?
Re: Arduino: skillnader i binär/optimering mellan Linux och
Listfilen för den Windows-kompilerade ser jätteskumt u, interruptvektorerna ligger inte på adress 0 och uppåt som de väl borde göra? Där är också en massa debug-information som inte finns med i den Linux-kompilerade.
Det var länge sen jag rotade i liknande grejer men spontant (med tanke på att det i övrigt ser väldigt lika ut i mapparna) så verkar länkningen vara käpprätt. Jag har inte riktigt koll på vad som styr länkningen tyvärr. Men nån annan kanske har mer input.
Hmm, fast det är kanske bara disassembleringen som ser skum ut ser jag när jag kollar lite djupare... vektorerna ligger nog på rätt plats men tolkas som kod?
Det var länge sen jag rotade i liknande grejer men spontant (med tanke på att det i övrigt ser väldigt lika ut i mapparna) så verkar länkningen vara käpprätt. Jag har inte riktigt koll på vad som styr länkningen tyvärr. Men nån annan kanske har mer input.
Hmm, fast det är kanske bara disassembleringen som ser skum ut ser jag när jag kollar lite djupare... vektorerna ligger nog på rätt plats men tolkas som kod?
Re: Arduino: skillnader i binär/optimering mellan Linux och
Relaterat till interrupten kan det vara eftersom den felande builden inte ger några.
Re: Arduino: skillnader i binär/optimering mellan Linux och
Verkar som detta har fått en lösning!
Se exemplet på http://labalec.fr/erwan/?p=497 ,
Och https://code.google.com/p/panstamp/sour ... cc1101.cpp ,
Detta ledde till att den andra byten beroende på kompilering blev slumpmässig, är tänkt att vara noll och när det har råkat bli så har det fungerat.
Dvs ändrat till
Se exemplet på http://labalec.fr/erwan/?p=497 ,
Kod: Markera allt
byte syncWord = 199;
Kod: Markera allt
/**
* setSyncWord
*
* Set synchronization word
*
* 'syncH' Synchronization word - High byte
* 'syncL' Synchronization word - Low byte
* 'save' If TRUE, save parameter in EEPROM
*/
void CC1101::setSyncWord(uint8_t syncH, uint8_t syncL, bool save)
{
if ((syncWord[0] != syncH) || (syncWord[1] != syncL))
{
writeReg(CC1101_SYNC1, syncH);
writeReg(CC1101_SYNC0, syncL);
syncWord[0] = syncH;
syncWord[1] = syncL;
// Save in EEPROM
if (save)
{
EEPROM.write(EEPROM_SYNC_WORD, syncH);
EEPROM.write(EEPROM_SYNC_WORD + 1, syncL);
}
}
}
/**
* setSyncWord (overriding method)
*
* Set synchronization word
*
* 'syncH' Synchronization word - pointer to 2-byte array
* 'save' If TRUE, save parameter in EEPROM
*/
void CC1101::setSyncWord(byte *sync, bool save)
{
CC1101::setSyncWord(sync[0], sync[1], save);
}
Dvs ändrat till
Kod: Markera allt
byte syncWord[2] = {199, 0};