Skocz do zawartości

Błąd w WinAVR


Pomocna odpowiedź

Z tą pętlą to bym uważał. Po pierwsze nie tworzy jej GCC, to po prostu kawałek programu który jest kompilowany jak każdy inny. Wbrew pozorom funkcja main() nie jest taka wyjątkowa i można zamiast niej użyć innej nazwy.

Wspomniany kod jest w przypadku AVR zawarty w bibliotece libc (http://download.savannah.gnu.org/releases/avr-libc/), dlatego wydaje się, że jest magicznie dodawany. Ten sam kompilator, czyli gcc w wersji dla STM32 zawiera plik startowy w "jawnej" postaci i łatwiej zobaczyć co się dzieje.

Ale wracając do AVR, przykładowy kod z biblioteki wygląda tak:

	.section .init9,"ax",@progbits
#ifdef __AVR_ASM_ONLY__
XJMP	main
#else	/* !__AVR_ASM_ONLY__ */
XCALL	main
XJMP	exit
#endif	/* __AVR_ASM_ONLY__ */
;	.endfunc

Jak widać wywoływana jest funkcja main, a po jej powrocie exit(). Nie ma pętli, więc trzeba byłoby sprawdzić kod w exit().

W każdym razie powrót z main w przypadku embedded należy traktować jako błąd. Różne wersje bibliotek implementują różne zachowania - czasem nieskończoną pętlę, czasem reset, a czasem są po prostu błędne (np. STM32).

edit: kod funkcji exit() faktycznie zawiera pętlę:

	ASSEMBLY_CLIB_SECTION
.global _U(exit)
.type	_U(exit), "function"

_U(exit):
cli
XJMP	_U(_exit)

.size	_U(exit), . - _U(exit)

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...