Arduino: skillnader i binär/optimering mellan Linux och Win

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
JanErik
Inlägg: 3191
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Arduino: skillnader i binär/optimering mellan Linux och Win

Inlägg av JanErik »

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).
Senast redigerad av JanErik 10 oktober 2015, 18:20:53, redigerad totalt 1 gång.
Användarvisningsbild
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

Inlägg av lillahuset »

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?
JanErik
Inlägg: 3191
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: Arduino: skillnader i binär/optimering mellan Linux och

Inlägg av JanErik »

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?
Användarvisningsbild
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

Inlägg av lillahuset »

Jo det borde man kunna förvänta sig.
nifelheim
Den första
Inlägg: 2489
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: Arduino: skillnader i binär/optimering mellan Linux och

Inlägg av nifelheim »

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. :-)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino: skillnader i binär/optimering mellan Linux och

Inlägg av sodjan »

> ...Ä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?
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Arduino: skillnader i binär/optimering mellan Linux och

Inlägg av Micke_s »

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?
JanErik
Inlägg: 3191
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: Arduino: skillnader i binär/optimering mellan Linux och

Inlägg av JanErik »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino: skillnader i binär/optimering mellan Linux och

Inlägg av sodjan »

Får du inga LIST eller MAP fil som säger vad som faktiskt länkas in?
JanErik
Inlägg: 3191
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: Arduino: skillnader i binär/optimering mellan Linux och

Inlägg av JanErik »

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
JanErik
Inlägg: 3191
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: Arduino: skillnader i binär/optimering mellan Linux och

Inlägg av JanErik »

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?
Nerre
Inlägg: 27223
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Arduino: skillnader i binär/optimering mellan Linux och

Inlägg av Nerre »

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?
JanErik
Inlägg: 3191
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: Arduino: skillnader i binär/optimering mellan Linux och

Inlägg av JanErik »

Relaterat till interrupten kan det vara eftersom den felande builden inte ger några.
JanErik
Inlägg: 3191
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: Arduino: skillnader i binär/optimering mellan Linux och

Inlägg av JanErik »

Verkar som detta har fått en lösning!
Se exemplet på http://labalec.fr/erwan/?p=497 ,

Kod: Markera allt

byte syncWord = 199;
Och https://code.google.com/p/panstamp/sour ... cc1101.cpp ,

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

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

Kod: Markera allt

byte syncWord[2] = {199, 0};
Skriv svar