Jeg var bare nysgerrig efter, hvordan AVR-arkitekturen administrerer fejl, der ville få et almindeligt skrivebordsprogram til at gå ned. Jeg taler om logiske fejl, for eksempel matematiske problemer, der er udefinerede. Såsom at dele med 0 og få en kvadratrode af et negativt tal. Først forventede jeg, at ved at give en fejl til AVR-chippen, ville den bare returnere 0. Men jeg kørte dette program:
void setup () {Serial.begin (9600);} void loop () {int x = 0; int p = 50; int resultat; resultat = p / x; Serial.println (resultat); resultat = sqrt (-10); forsinkelse (1000); Serial.println (resultat); forsinkelse (10000);}
og fik denne output:
42949672950
Efter dette blev jeg virkelig forvirret . Hvorfor tager resultat
variablen den maksimale værdi af en usigneret lang
? Da jeg erklærede en int
, skal mikrocontrolleren have dedikeret 2 bytes dynamisk hukommelse til denne variabel, men tilsyneladende lykkedes det på en eller anden måde at få yderligere 2 byte til at gemme dataene. Kan dette betyde, at AVR-chippen kan ødelægge data på andre hukommelsesplaceringer, mens de allokerer nye data til den variabel, der netop blev tilført udefineret til den? Okay måske sætter AVR-chippen bare matematisk vrøvl til 4294967295. Men nej i eksemplet med at få kvadratroden på -10 ser vi, at værdien blev 0. Selvom dette sandsynligvis er en funktion, der behandles af et bibliotek, så måske er der en slags beskyttelse mod disse fejl. Jeg forsøgte også at køre programmet ovenfor, men med en byte
-variabel til -resultatet
i stedet for int
.
ugyldig opsætning () {Seriel.begynder (9600);} ugyldig sløjfe () {int x = 0; int p = 50; int resultat; resultat = p / x; Serial.println (resultat); resultat = sqrt ( -10); forsinkelse (1000); Serial.println (resultat); forsinkelse (10000);}
Og resultatet blev det samme. Så er der en slags dokumentation om fejlhåndtering i AVR, da dette er vigtigt at vide under udvikling.
P.S. Alt blev kørt på en ægte Atmega 328p chip på en arduino nano.