Küsimus:
Mis juhtub, kui helistan oma programmist exit ()?
asheeshr
2014-02-14 07:28:33 UTC
view on stackexchange narkive permalink

Kui lisan kõne setup või loop kas exit (0) -kutsele, siis kuhu kontroll edasi antakse? Milline oleks mikrokontrolleri järgmine olek? Kas see peataks täitmise ja väljalülitamise?

Kasutan 2. redaktsiooni Arduino Uno.

Ma arvan, et see lihtsalt peatub. See ei lülitaks kella ega voolu välja.
Ülejäänud mälu peaks olema täidetud `NOP`i montaažilausetega, mis lihtsalt peatuvad paariks tsükliks
Kaks vastused:
#1
+12
mpflaga
2014-02-14 10:00:10 UTC
view on stackexchange narkive permalink

Minu esialgne oletus on vale. Ma oleksin arvanud, et see naaseb lihtsalt loopist ja tuumikukogu kutsub lihtsalt loopi () uuesti. Näen siiski, et järgmine kood loodi. Pange tähele, et __stop_program on kõva silmus ...

Blink.ino loendi väljavõte, millele on lisatud exit (0):

  // tsükli rutiin jookseb üle ja igavesti uuesti: void loop () {digitalWrite (led, HIGH); // lülitage LED sisse (HIGH on pinge tase) viivitus (1000); // oodake teist digitalWrite'i (led, LOW); // lülitage LED välja, muutes pinge LOW delay (1000); // oodake teist väljumist (0);}  

Ülaltoodu lahtiühendamine:

  // tsükli rutiin töötab igavesti ikka ja jälle : void loop () {digitalWrite (led, HIGH); // lülitage LED sisse (HIGH on pingetase) 100: 80 91 00 01 lds r24, 0x0100 104: 61 e0 ldi r22, 0x01; 1 106: 0e 94 ca 01 kõne 0x394; 0x394 <digitalWrite> viivitus (1000); // oodake sekundit 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 helista 0x1ee; 0x1ee <delay> digitalWrite (led, LOW); // lülitage LED välja, muutes pinge LOW 116: 80 91 00 01 lds r24, 0x0100 11a: 60 e0 ldi r22, 0x00; 0 11c: 0e 94 ca 01 kõne 0x394; 0x394 <digitalWrite> viivitus (1000); // oodake 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 kõne 0x1ee; 0x1ee <delay> exit (0); 12c: 80 e0 ldi r24, 0x00; 0 12e: 90 e0 ldi r25, 0x00; 0
130: 0e 94 1e 02 helista 0x43c; 0x43c <_exit> ... 0000043c <_exit>: 43c: f8 94 cli0000043e <__stop_program>: 43e: ff cf rjmp.-2; 0x43e <__stop_program>  

Pange tähele, et kui _exit poleks helistanud kliendile, saaksid katkestused asju teha. Kuid see pole nii.

`avr-objdump -S {kompileeritud * .elf-fail}` toodab faili, mis sisaldab C-koodi, mis viib komplekti koodi igasse ossa. Seda on palju lihtsam jälgida.
aaaand, ma lihtsalt proovisin seda ja see ei edasta silmusfunktsiooni C-sisest koodi õigesti. Mida kuradit?
Ohoo, äärmiselt kummaline. Koostasin projekti arduino redaktori asemel [Stino] -ga (https://github.com/Robot-Will/Stino), dekompileerisin sellest * .elfi ja * siis * saan korralikud silumissümbolid. Ma arvan, et Arduino tekstiredaktori / nupu-makro (ma keeldun seda IDE-ks nimetamast, kuna see pole nii) asi eemaldab silumisinfo ** lihtsalt ** kompileeritud põhifailist C ++, mingil veidral ja rumalal põhjusel.
Seal on ** selgitus ja see on seotud sellega, kuidas IDE teie faile ajutisse asukohta kopeerib. Selle saate "parandada", öeldes avr-objdumpile, kus on allikas: `avr-objdump -S -I / path / to / the / sketch / kausta xxx.elf`. See on visandi * kausta tee *, mitte .ino fail ise. Siis peaksite C-allika prügikasti saama.
#2
+11
Jesse Laning
2014-02-14 07:42:56 UTC
view on stackexchange narkive permalink

Noh, testisin seda lihtsalt oma Arduino Unoga ja see lihtsalt peatas koodi täielikult ja jättis kõik väljundid selliseks, nagu need olid siis, kui kood enam ei töötanud (nii et see jättis põlema LED-i, mis mul oli). Välja helistades näib, et IO puhastust ei toimu. See oli see, mida ma ootasin, sest Arduino IDE pakub seadistamise ja tsükli funktsioone. Kui programmeerite ATMEGA * 28 koos mõne muu AVR IDE-ga, alustate põhifunktsiooniga nagu kõik C / C ++ programmid. Seadistamis- ja tsüklifunktsioonid pole AVR MCU-de standardvarustuses.

Märkus: kui soovite, siis lähtestamisnupu vajutamine taaskäivitab koodi.

Hea teada. Otsisin midagi täpsemat ja * madalamal * tasemel. ʻExit (0) helistamisel on lahti võetud käsud (IIRC) `__stop_program`,` cli` ja spinlock. Tahtsin kontrollida, kas see on õige, selgitusega selle kohta, kuidas juhtelement edastatakse, st kõnepinu pop ?, ISR-i kõne?
Ah, noh, ma ei ole arduino nii madalal tasemel uurinud, selle teabe saamiseks võiksite vaadata atmeli veebisaiti.


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...