Sida 1 av 2

Arduino och definitionen av int

Postat: 14 november 2016, 08:58:10
av JanErik
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)?

Re: Arduino och definitionen av int

Postat: 14 november 2016, 09:44:29
av TomasL
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

Re: Arduino och definitionen av int

Postat: 14 november 2016, 10:18:23
av Mr Andersson
Har du haft samma arduinomodell hela tiden?
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

Postat: 14 november 2016, 11:18:40
av maDa
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

Postat: 14 november 2016, 11:22:32
av JanErik
Ja, samma kod har absolut fungerat förr.

Re: Arduino och definitionen av int

Postat: 14 november 2016, 11:39:40
av bearing
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?

Re: Arduino och definitionen av int

Postat: 14 november 2016, 11:40:30
av Icecap
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.

Re: Arduino och definitionen av int

Postat: 14 november 2016, 11:41:47
av Jan Almqvist
Kanske är det FLASH_SIZE och inte int som har ändrats?

Re: Arduino och definitionen av int

Postat: 14 november 2016, 11:44:13
av bearing
JanErik skrev:Ja, samma kod har absolut fungerat förr.
Du svarade inte på Anderssons fråga om koden tidigare körts på 128k eller en storlek som ryms i en int16?

Re: Arduino och definitionen av int

Postat: 14 november 2016, 11:47:38
av lillahuset
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

Postat: 14 november 2016, 11:51:15
av JanErik
Jan Almqvist skrev:Kanske är det FLASH_SIZE och inte int som har ändrats?
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.

Re: Arduino och definitionen av int

Postat: 14 november 2016, 11:53:20
av sodjan
> 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.

Re: Arduino och definitionen av int

Postat: 14 november 2016, 11:53:26
av Icecap
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.

Re: Arduino och definitionen av int

Postat: 14 november 2016, 11:56:07
av sodjan
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?

Re: Arduino och definitionen av int

Postat: 14 november 2016, 12:05:56
av lillahuset
Hm, det är nog *väldigt* ovanligt! Jag har nog aldrig varit med om att "int" har varit mindre än 16 bits.
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.