Programımdan exit () yöntemini çağırdığımda ne olur?


17

Birinden setupveya loopbir exit(0)çağrı ekleyecek olsaydım, kontrol nereye geçecekti? Mikrodenetleyicinin bir sonraki durumu ne olurdu? Yürütmeyi durdurur ve kapanır mı?

Bir revizyon kullanıyorum 2 Arduino Uno.


Bence sadece duruyor. Saati kapatmaz, kapanmaz.
TheDoctor

Hafızanın geri kalanı, NOPsadece birkaç saat döngü için duraklayan montaj ifadeleri ile doldurulmalıdır
TheDoctor

Yanıtlar:


12

İlk tahminim yanlış. Ben sadece döngü dönecekti ve çekirdek kütüphane sadece tekrar döngü () olacağını düşünürdüm. Ancak, aşağıdaki kod oluşturulduğunu görüyorum. __Stop_program'ın zor bir döngü olduğunu fark etmek ...

Çıkış (0) eklenmiş bir Blink.ino listesinin özeti:

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
  exit(0);
}

Yukarıdakilerin sökülmesi:

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
 100:   80 91 00 01     lds r24, 0x0100
 104:   61 e0           ldi r22, 0x01   ; 1
 106:   0e 94 ca 01     call    0x394   ; 0x394 <digitalWrite>
  delay(1000);               // wait for a second
 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     call    0x1ee   ; 0x1ee <delay>
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
 116:   80 91 00 01     lds r24, 0x0100
 11a:   60 e0           ldi r22, 0x00   ; 0
 11c:   0e 94 ca 01     call    0x394   ; 0x394 <digitalWrite>
  delay(1000);               // wait for a second
 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     call    0x1ee   ; 0x1ee <delay>
  exit(0);
 12c:   80 e0           ldi r24, 0x00   ; 0
 12e:   90 e0           ldi r25, 0x00   ; 0
 130:   0e 94 1e 02     call    0x43c   ; 0x43c <_exit>

...

0000043c <_exit>:
 43c:   f8 94           cli

0000043e <__stop_program>:
 43e:   ff cf           rjmp    .-2         ; 0x43e <__stop_program>

_Exit, cli çağrmasaydı kesmeler bir şeyler yapabilirdi. Ancak durum böyle değil.


avr-objdump -S {compiled *.elf file}montaj kodunun her bölümüne yönlendiren C kodunu içeren bir dosya üretir. Takip etmek çok daha kolay.
Connor Wolf

aaave ben sadece denedim, ve döngü işlevi için doğru satır içi C kodu yayan değil. Ne oluyor be?
Connor Wolf

Vay, son derece garip. Projeyi arduino editörü yerine Stino ile derledim, *.elfondan ayrıştırdım ve sonra uygun hata ayıklama sembollerini aldım. Arduino metin editörü / düğme-makro (ben değil çünkü bir IDE demeyi reddediyorum) şey bazı tuhaf ve aptal bir nedenle , sadece derlenmiş ana C ++ dosyasından hata ayıklama bilgi soyma olduğunu düşünüyorum .
Connor Wolf

Orada olan bir açıklama ve geçici bir konuma yolu ile IDE kopyalar dosyalarınızı yapmaktır. Bunu avr-objdump kaynağının nerede olduğunu söyleyerek "düzeltebilirsiniz" avr-objdump -S -I/path/to/the/sketch/folder xxx.elf . Eskiz klasörü yolu budur , .ino dosyasının kendisi değil. O zaman C kaynağını çöplükte almalısınız.
Nick Gammon

11

Peki ben sadece benim Arduino Uno ile test ve sadece tamamen kodu durdurdu ve kod çalışmayı durdurduğunda olduğu gibi tüm çıkışları bıraktı (bu yüzden üzerinde bir LED bıraktı). Çıkışı çağırdığınızda bir GÇ temizleme işlemi yok gibi görünüyor. ATMEGA * 28'i diğer herhangi bir AVR IDE ile programladığınızda, tüm C / C ++ programları gibi ana işlevle başlarsanız, Arduino IDE kurulum ve döngü işlevlerini sağladığından beklediğim buydu. Kurulum ve döngü işlevleri AVR MCU'larda standart değildir.

Not: Sıfırlama düğmesine basmak merak ediyorsanız kodu yeniden başlatır.


Bunu bildiğim iyi oldu. Daha ayrıntılı ve daha alt düzeyde bir şey arıyordum . Çağırmayı exit(0)demonte talimatları vardır (IIRC) __stop_program, clive bir sayaç kilidi. Kontrolün nasıl geçildiğine dair bir açıklama ile doğru olup olmadığını kontrol etmek istedim yani çağrı yığını pop ?, ISR çağrısı?
asheeshr

Ah, bu kadar düşük bir seviyede arduino'ya bakmadım, bu bilgi için atmel web sitesini kontrol etmek isteyebilirsiniz.
Jesse Laning
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.