Fråga:
Vad händer när jag ringer exit () från mitt program?
asheeshr
2014-02-14 07:28:33 UTC
view on stackexchange narkive permalink

I någon av inställningar eller loop , om jag skulle lägga till ett exit (0) samtal, var skulle kontrollen överföras till? Vad skulle mikrokontrollens nästa tillstånd vara? Skulle det stoppa körning och avstängning?

Jag använder en version 2 Arduino Uno.

Jag tror att det bara slutar. Det skulle inte stänga av klockan eller stänga av den.
Resten av minnet bör fyllas med monteringsuttalanden för 'NOP', som bara pausar under ett par klockcykler
Två svar:
#1
+12
mpflaga
2014-02-14 10:00:10 UTC
view on stackexchange narkive permalink

Min första gissning är fel. Jag hade trott att det helt enkelt skulle återvända från loop och kärnbiblioteket skulle bara ringa loop () igen. Men jag ser att följande kod skapades. Lägg märke till att __stop_program är en hård slinga ...

Ett utdrag av Blink.inos lista, med exit (0) tillagd:

  // looprutinen går över och om igen för alltid: void loop () {digitalWrite (led, HIGH); // slå på lysdioden (HÖG är spänningsnivån) fördröjning (1000); // vänta på en andra digitalWrite (led, LOW); // stäng av lysdioden genom att göra spänningen LÅG fördröjning (1000); // vänta på en andra utgång (0);}  

Demontering av ovanstående:

  // looprutinen går om och om igen för alltid : void loop () {digitalWrite (led, HIGH); // slå på lysdioden (HÖG är spänningsnivån) 100: 80 91 00 01 lds r24, 0x0100 104: 61 e0 ldi r22, 0x01; 1 106: 0e 94 ca 01 ring 0x394; 0x394 <digitalWrite> fördröjning (1000); // vänta på en andra 10a: 68 ee ldi r22, 0xE8; 232 10c: 73 e0 ldi r23, 0x03; 3 10e: 80 e0 ldi r24, 0x00; 0 110: 90 e0 ldi r25, 0x00; 0 112: 0e 94 f7 00 ring 0x1ee; 0x1ee <delay> digitalWrite (led, LOW); // stäng av LED-lampan genom att göra spänningen LOW 116: 80 91 00 01 lds r24, 0x0100 11a: 60 e0 ldi r22, 0x00; 0 11c: 0e 94 ca 01 ring 0x394; 0x394 <digitalWrite> fördröjning (1000); // vänta en sekund 120: 68 ee ldi r22, 0xE8; 232 122: 73 e0 ldi r23, 0x03; 3 124: 80 e0 ldi r24, 0x00; 0 126: 90 e0 ldi r25, 0x00; 0 128: 0e 94 f7 00 ring 0x1ee; 0x1ee <delay> exit (0); 12c: 80 e0 ldi r24, 0x00; 0 12e: 90 e0 ldi r25, 0x00; 0
130: 0e 94 1e 02 ring 0x43c; 0x43c <_exit> ... 0000043c <_exit>: 43c: f8 94 cli0000043e <__stop_program>: 43e: ff cf rjmp.-2; 0x43e <__stop_program>  

Observera att om _exit inte hade kallat cli, skulle avbrott kunna göra saker. Men så är inte fallet.

`avr-objdump -S {kompilerad * .elf-fil}` producerar en fil som innehåller C-koden som leder till varje avsnitt av monteringskoden. Det är mycket lättare att följa.
aaaand Jag har precis provat det och det skickar inte in C-koden korrekt för loopfunktionen. Vad i helvete?
Oj, extremt konstigt. Jag sammanställde projektet med [Stino] (https://github.com/Robot-Will/Stino) istället för arduino-redigeraren, dekompilerade '*. Själv' från det och * sedan * får jag rätt felsökningssymboler. Jag tror att Arduino textredigerare / knappmakro (jag vägrar att kalla det en IDE eftersom det inte är det) tar bort felsökningsinformationen från ** bara ** den kompilerade C ++ - filen av någon bisarr och dum anledning.
Det finns ** en förklaring, och det handlar om hur IDE kopierar dina filer till en tillfällig plats. Du kan "fixa" det genom att säga till avr-objdump var källan är: "avr-objdump -S -I / path / to / the / sketch / folder xxx.elf". Det är skiss * mappsökväg *, inte själva .ino-filen. Då borde du få C-källan i dumpningen.
#2
+11
Jesse Laning
2014-02-14 07:42:56 UTC
view on stackexchange narkive permalink

Nåväl, jag testade det bara med min Arduino Uno och det stoppade bara koden helt och lämnade alla utgångar som de var när koden slutade gå (så den lämnade en lysdiod som jag hade på). Det verkar inte finnas någon IO-sanering när du ringer till exit. Detta var vad jag förväntade mig eftersom Arduino IDE tillhandahåller inställnings- och loopfunktioner, om du programmerar ATMEGA * 28 med någon annan AVR IDE börjar du med huvudfunktionen som alla C / C ++ - program. Installations- och loopfunktionerna är inte standard på AVR MCU.

Obs: Tryck på återställningsknappen om koden, om du undrar.

Bra att veta. Jag letade efter något mer detaljerat och på en * lägre * nivå. När du ringer till 'exit (0)' är de demonterade instruktionerna (IIRC) '__stop_program', 'cli' och en spinlock. Jag ville verifiera om det är korrekt med en förklaring av hur kontrollen passeras, dvs call stack pop ?, ISR call?
Ah, ja, jag har inte tittat på arduino på en så låg nivå, för den informationen kanske du vill kolla in atmel-webbplatsen.


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...