Arduino och definitionen av int
Arduino och definitionen av int
Kompilerade om ett gammalt projekt här om dagen, och det fungerade inte längre av nån anledning.
Har en funktion som går igenom flashen och räknar en checksumma för att se om firmware ändrat.
Dvs
for (int i = 0; i < FLASH_SIZE; i++) {
...
}
Nu visade det sig att det var i den loopen det hängde upp sig, på en Mega1280 så FLASH_SIZE är 128000.
Printade ut i och den rullade över till -32xxx. Efter att ha ändrat till uint32_t fungerade det.
Vad har fått definitionen av int att ändras? Har uppdaterat Arduino-miljön (1.6.9) i nåt skede men har inte kvar den gamla. Det ska väl inte vara beroende av några andra bibliotek i systemet (glibc etc)?
Har en funktion som går igenom flashen och räknar en checksumma för att se om firmware ändrat.
Dvs
for (int i = 0; i < FLASH_SIZE; i++) {
...
}
Nu visade det sig att det var i den loopen det hängde upp sig, på en Mega1280 så FLASH_SIZE är 128000.
Printade ut i och den rullade över till -32xxx. Efter att ha ändrat till uint32_t fungerade det.
Vad har fått definitionen av int att ändras? Har uppdaterat Arduino-miljön (1.6.9) i nåt skede men har inte kvar den gamla. Det ska väl inte vara beroende av några andra bibliotek i systemet (glibc etc)?
Re: Arduino och definitionen av int
Problemet med talområden för typerna i C mfl är ju att de är helt plattformsberoende, det är enbart char som är definierad till en viss längd (egentligen inte den heller).
Oavsett vilket så är det fel att använda int som du gjort, det borde varit unsigned int från början, sedan huruvida int är 16 eller 32 bitar, tja som sagt det beror på plattform/kompilator.
Troligen är int'en inte omdefinierad utan troligen någon form av bugg kanske.
Du får titta i limits.h som definierar typerna, om du har någon gammal kvar
Oavsett vilket så är det fel att använda int som du gjort, det borde varit unsigned int från början, sedan huruvida int är 16 eller 32 bitar, tja som sagt det beror på plattform/kompilator.
Troligen är int'en inte omdefinierad utan troligen någon form av bugg kanske.
Du får titta i limits.h som definierar typerna, om du har någon gammal kvar
-
- Inlägg: 1397
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Arduino och definitionen av int
Har du haft samma arduinomodell hela tiden?
https://www.arduino.cc/en/Reference/Int
https://www.arduino.cc/en/Reference/Int
On the Arduino Uno (and other ATMega based boards) an int stores a 16-bit (2-byte) value. This yields a range of -32,768 to 32,767 (minimum value of -2^15 and a maximum value of (2^15) - 1).
On the Arduino Due and SAMD based boards (like MKR1000 and Zero), an int stores a 32-bit (4-byte) value. This yields a range of -2,147,483,648 to 2,147,483,647 (minimum value of -2^31 and a maximum value of (2^31) - 1).
Re: Arduino och definitionen av int
int har alltid varit -32,768 till 32,767, åtminstone på AVR/Arduino så länge jag kan minnas.
Re: Arduino och definitionen av int
Int har alltid varit int16_t i avr-gcc
Då är ju frågan om arduino studio tidigare har haft någon pre-processing som ökat din int till rätt storlek?
Då är ju frågan om arduino studio tidigare har haft någon pre-processing som ökat din int till rätt storlek?
Re: Arduino och definitionen av int
JanErik: i C är en "char" (och dess derivater) den minsta enhet som processorn kan hämta.
En "int" (och dess deriviater) är garanterat att vara den storlek som µC'n hanterar "naturligt". På en 8 bit µC blir det alltså en byte medan det på en 16-bitars blir ett word.
Sedan är (räknat i antal bits): char <= short <= long.
De 3 olika typer kan alltså rent faktisk vara på vardera 1 byte!
Detta är orsaken till att C99 och nyare har specifika storlekar i deras bibliotek och det är samtidig orsaken till att man aldrig får använda int till variabler som kan bli större än 255.
En "int" (och dess deriviater) är garanterat att vara den storlek som µC'n hanterar "naturligt". På en 8 bit µC blir det alltså en byte medan det på en 16-bitars blir ett word.
Sedan är (räknat i antal bits): char <= short <= long.
De 3 olika typer kan alltså rent faktisk vara på vardera 1 byte!
Detta är orsaken till att C99 och nyare har specifika storlekar i deras bibliotek och det är samtidig orsaken till att man aldrig får använda int till variabler som kan bli större än 255.
- Jan Almqvist
- Inlägg: 1581
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Arduino och definitionen av int
Du svarade inte på Anderssons fråga om koden tidigare körts på 128k eller en storlek som ryms i en int16?JanErik skrev:Ja, samma kod har absolut fungerat förr.
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Arduino och definitionen av int
Nja, det händer att en int i en åttabittare är 8 bit men det vanliga är 16 bit.
Re: Arduino och definitionen av int
Det började jag fundera nu, har nog ett makro som tar storleken utifrån en inbyggd define beroende på modell. Om den skulle ha get 32k tidigare av nån anledning.Jan Almqvist skrev:Kanske är det FLASH_SIZE och inte int som har ändrats?
Re: Arduino och definitionen av int
> Ja, samma kod har absolut fungerat förr.
På/till *samma* Arduino hårdvara?
> En "int" (och dess deriviater) är garanterat att vara den storlek som µC'n hanterar "naturligt". På en 8 bit µC blir det alltså en byte...
Hm, det är nog *väldigt* ovanligt! Jag har nog aldrig varit med om att "int" har varit mindre än 16 bits.
På/till *samma* Arduino hårdvara?
> En "int" (och dess deriviater) är garanterat att vara den storlek som µC'n hanterar "naturligt". På en 8 bit µC blir det alltså en byte...
Hm, det är nog *väldigt* ovanligt! Jag har nog aldrig varit med om att "int" har varit mindre än 16 bits.
Re: Arduino och definitionen av int
lillahuset: javisst - "det händer". Standarden (<C11) medger inte att man kan spika att den är en viss storlek.
Själv har jag testat storlekar på bytes osv. i en del µC-miljöer och jag har blivit överraskat en del gångar och ska jag säkra en given storlek på en variabel är "int" den sista definition jag använder.
Storleken på en byte i ett givet miljö kan man testa vid att ge en byte-variabel värdet -1. Sedan kan en shiftrutin räkna antal '1'-bits.
short, long och de variabler kan sedan refereras till detta värde då deras storlek medelst sizeof() räknas i bytes.
Man kan alltså definiera variabler till korrekt storlek med en del #if-statements och göra det plattformsoberoende.
Själv har jag testat storlekar på bytes osv. i en del µC-miljöer och jag har blivit överraskat en del gångar och ska jag säkra en given storlek på en variabel är "int" den sista definition jag använder.
Storleken på en byte i ett givet miljö kan man testa vid att ge en byte-variabel värdet -1. Sedan kan en shiftrutin räkna antal '1'-bits.
short, long och de variabler kan sedan refereras till detta värde då deras storlek medelst sizeof() räknas i bytes.
Man kan alltså definiera variabler till korrekt storlek med en del #if-statements och göra det plattformsoberoende.
Re: Arduino och definitionen av int
I min (lilla) värld är en "byte" alltid 8 bitar.
Ett ord ("word") däremit varierar med arkitekturen.
Det kanske var "int" som du menade?
Ett ord ("word") däremit varierar med arkitekturen.
Det kanske var "int" som du menade?
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Arduino och definitionen av int
Jag har varit med om det EN gång, en C-kompilator för PIC från CCS. Ett fruktansvärt dåligt skämt till kompilator.Hm, det är nog *väldigt* ovanligt! Jag har nog aldrig varit med om att "int" har varit mindre än 16 bits.