W którymkolwiek z nich setup
lub loop
, jeśli miałbym dodać exit(0)
połączenie, gdzie przekazano by kontrolę? Jaki byłby następny stan mikrokontrolera? Czy zatrzymałoby to wykonywanie i wyłączanie?
Korzystam z wersji 2 Arduino Uno.
programming
arduino-uno
asheeshr
źródło
źródło
NOP
instrukcjami asemblera, które zatrzymują się na kilka cykli zegaraOdpowiedzi:
Moje początkowe przypuszczenie jest błędne. Myślałem, że po prostu wróci z pętli, a biblioteka podstawowa po prostu ponownie wywoła loop (). Widzę jednak, że utworzono następujący kod. Zauważ, że __stop_program jest twardą pętlą ...
Wyciąg z wykazu Blink.ino z dodanym wyjściem (0):
Demontaż powyższego:
Zauważ, że jeśli _exit nie wywołałby cli, przerwania byłyby w stanie robić różne rzeczy. Ale tak nie jest.
źródło
avr-objdump -S {compiled *.elf file}
tworzy plik zawierający kod C prowadzący do każdej sekcji kodu asemblera. O wiele łatwiej jest śledzić.*.elf
, a następnie otrzymuję odpowiednie symbole debugowania. Myślę, że edytor tekstu Arduino / makro-przycisk (odmawiam nazywania go IDE, ponieważ tak nie jest), usuwa informacje debugowania tylko ze skompilowanego głównego pliku C ++, z jakiegoś dziwnego i głupiego powodu.avr-objdump -S -I/path/to/the/sketch/folder xxx.elf
. To jest ścieżka do folderu szkicu , a nie sam plik .ino. Następnie powinieneś pobrać źródło C na zrzut.Cóż, właśnie przetestowałem go z moim Arduino Uno i po prostu całkowicie zatrzymałem kod i zostawiłem wszystkie wyjścia takie, jakie były, gdy kod przestał działać (więc zostawił zapaloną diodę LED). Wydaje się, że nie ma czyszczenia IO, gdy wywołujesz exit. Tego się spodziewałem, ponieważ Arduino IDE zapewnia funkcje konfiguracji i pętli. Jeśli programujesz ATMEGA * 28 za pomocą dowolnego innego AVR IDE, zaczniesz od funkcji głównej, jak wszystkie programy C / C ++. Funkcje konfiguracji i pętli nie są standardowe w mikrokontrolerach AVR.
Uwaga: Naciśnięcie przycisku resetowania powoduje ponowne uruchomienie kodu, jeśli się zastanawiasz.
źródło
exit(0)
zdemontowanego instrukcji są (IIRC)__stop_program
,cli
oraz Spinlock. Chciałem sprawdzić, czy jest to poprawne, wyjaśniając, w jaki sposób przekazywana jest kontrola, tj. Pop stos wywołań pop?