Vraag:
Wat gebeurt er als ik exit () aanroep vanuit mijn programma?
asheeshr
2014-02-14 07:28:33 UTC
view on stackexchange narkive permalink

In setup of loop , als ik een exit (0) -aanroep zou toevoegen, waar zou de controle dan naar worden doorgegeven? Wat zou de volgende staat van de microcontroller zijn? Zou het de uitvoering stoppen en uitschakelen?

Ik gebruik een Arduino Uno uit revisie 2.

Ik denk dat het gewoon stopt. Het zou de klok niet uitschakelen of uitschakelen.
De rest van het geheugen moet worden gevuld met 'NOP'-assembly-instructies, die slechts een paar klokcycli pauzeren
Twee antwoorden:
#1
+12
mpflaga
2014-02-14 10:00:10 UTC
view on stackexchange narkive permalink

Mijn eerste gok is verkeerd. Ik had gedacht dat het gewoon zou terugkeren van de lus en de kernbibliotheek zou gewoon lus () opnieuw aanroepen. Ik zie echter dat de volgende code is gemaakt. Merk op dat __stop_program een ​​harde lus is ...

Een uittreksel van de lijst van Blink.ino, met exit (0) toegevoegd:

  // de lusroutine loopt over en opnieuw voor altijd: void loop () {digitalWrite (led, HIGH); // zet de LED aan (HOOG is het spanningsniveau) vertraging (1000); // wacht op een tweede digitalWrite (led, LOW); // schakel de LED uit door de spanning LOW te vertragen (1000); // wacht op een tweede exit (0);}  

De demontage van het bovenstaande:

  // de lusroutine wordt voor altijd opnieuw en opnieuw uitgevoerd : void loop () {digitalWrite (led, HIGH); // zet de LED aan (HIGH is het spanningsniveau) 100: 80 91 00 01 lds r24, 0x0100 104: 61 e0 ldi r22, 0x01; 1106: 0e 94 ca 01 bel 0x394; 0x394 <digitalWrite> vertraging (1000); // wacht op een tweede 10a: 68 ee ldi r22, 0xE8; 232 10c: 73 e0 ldi r23, 0x03; 3 10e: 80 e0 ldi r24, 0x00; 0110: 90 e0 ldi r25, 0x00; 0112: 0e 94 f7 00 bel 0x1ee; 0x1ee <delay> digitalWrite (led, LOW); // schakel de LED uit door de spanning LAAG te maken 116: 80 91 00 01 lds r24, 0x0100 11a: 60 e0 ldi r22, 0x00; 0 11c: 0e 94 ca 01 bel 0x394; 0x394 <digitalWrite> vertraging (1000); // wacht op een tweede 120: 68 ee ldi r22, 0xE8; 232122: 73 e0 ldi r23, 0x03; 3124: 80 e0 ldi r24, 0x00; 0 126: 90 e0 ldi r25, 0x00; 0 128: 0e 94 f7 00 bel 0x1ee; 0x1ee <delay> exit (0); 12c: 80 e0 ldi r24, 0x00; 0 12e: 90 e0 ldi r25, 0x00; 0
130: 0e 94 1e 02 bel 0x43c; 0x43c <_exit> ... 0000043c <_exit>: 43c: f8 94 cli0000043e <__stop_program>: 43e: ff cf rjmp.-2; 0x43e <__stop_program>  

Merk op dat als _exit cli niet had aangeroepen, interrupts dingen zouden kunnen doen. Maar dat is niet het geval.

ʻAvr-objdump -S {gecompileerd * .elf-bestand} `produceert een bestand dat de C-code bevat die naar elke sectie van de assembly-code leidt. Het is veel gemakkelijker te volgen.
aaaand ik heb het net geprobeerd, en het zendt niet correct inline C-code uit voor de lusfunctie. Wel verdomme?
Whoa, buitengewoon vreemd. Ik heb het project gecompileerd met [Stino] (https://github.com/Robot-Will/Stino) in plaats van de arduino-editor, de `* .elf` daarvan gedecompileerd, en * dan * krijg ik de juiste symbolen voor foutopsporing. Ik denk dat de Arduino-teksteditor / knop-macro (ik weiger het een IDE te noemen omdat het dat niet is) het verwijderen van de foutopsporingsinformatie van ** alleen ** het gecompileerde C ++ -bestand, om een ​​of andere bizarre en domme reden.
Er ** is ** een verklaring, en het heeft te maken met de manier waarop de IDE uw bestanden naar een tijdelijke locatie kopieert. U kunt dit "repareren" door avr-objdump te vertellen waar de bron is: `avr-objdump -S -I / pad / naar / de / sketch / map xxx.elf`. Dat is het sketch * mappad *, niet het .ino-bestand zelf. Dan zou je de C-bron in de dump moeten krijgen.
#2
+11
Jesse Laning
2014-02-14 07:42:56 UTC
view on stackexchange narkive permalink

Nou, ik heb het net getest met mijn Arduino Uno en het stopte gewoon de code volledig en liet alle outputs zoals ze waren toen de code stopte met werken (dus er bleef een LED achter die ik aan had). Er lijkt geen IO-opschoning te zijn wanneer u exit aanroept. Dit was wat ik had verwacht omdat de Arduino IDE de setup- en loop-functies biedt, als je de ATMEGA * 28 programmeert met een andere AVR IDE, begin je met de hoofdfunctie zoals alle C / C ++ -programma's. De setup- en loop-functies zijn niet standaard op AVR MCU's.

Opmerking: Door op de resetknop te drukken, wordt de code opnieuw gestart, mocht je je dit afvragen.

Goed om te weten. Ik was op zoek naar iets meer gedetailleerd en op een * lager * niveau. Bij het aanroepen van ʻexit (0) `zijn de gedemonteerde instructies (IIRC)` __stop_program`, `cli` en een spinlock. Ik wilde controleren of dat klopt met een uitleg van hoe de besturing wordt doorgegeven, d.w.z. call stack pop ?, ISR call?
Ah, nou, ik heb arduino niet op zo'n laag niveau onderzocht, voor die informatie wil je misschien de atmel-website bekijken.


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...