Wiem, że w komputerach wartość zwracana przez main()
funkcję jest odbierana przez system operacyjny. Ale co dzieje się w main()
funkcji mikrokontrolera?
microcontroller
avr
c
użytkownik18118
źródło
źródło
main
z dwoma różnymi podpisami, które zwracająint
. Jeśli używasz wolnostojącej implementacji języka C, ta implementacja decyduje o sposobie pisania funkcji uruchamiania. Nie możesz napisaćvoid
funkcji zwracającej tylko dlatego, że ona nie zwraca. Zachowanie o powrocie nie różni się od funkcji rodzaju co wpływa na ogólne konwencje dzwoni.Odpowiedzi:
Na mikrokontrolerze
main()
tak naprawdę nie oczekuje się, że kiedykolwiek wyjdzie, a zachowanie, jeśli nie jest określone - zależy więc od tego, kto napisał środowisko uruchomieniowe C dla mikrokontrolera. Widziałem systemy, które:main()
, aby po wyjściu z niego po prostu ponownie wywołać.main()
kiedykolwiek wyjdzie.main()
. Nazywa się to „uciekaniem w chwasty”.Nigdy nie widziałem takiego, który faktycznie robi cokolwiek z wartością zwracaną przez
main()
. Jeśli tak naprawdę na tym ci zależy, powinieneś rzucić okiem - i być może zmodyfikować - kod źródłowy biblioteki środowiska uruchomieniowego C.źródło
main()
miećint
wartość zwracaną oczywiście nie został zaprojektowany z mikrokontrolerem OS-mniej w umyśle. Jest to więc nieokreślone zachowanie i wszystko może się zdarzyć w zależności od środowiska uruchomieniowego C, zgodnie z listą Dave'a.main()
tym bardziej zdefiniować jego wartość zwracaną. To zależy od implementatora.void main( void )
to zachowanie zdefiniowane w implementacji , a nie zachowanie nieokreślone .main()
.Powszechnym nieporozumieniem / mitem jest to, że
int main
jest to jedyna poprawna forma określona przez standard. To nie jest prawda.Standard C mówi o dwóch implementacjach: hostowanej i wolnostojącej. „Implementacja” w tym przypadku oznacza kompilator. Hostowane kompilatory kompilują się dla określonego systemu operacyjnego, a kompilatory wolnostojące kompilują dla określonej aplikacji bez systemu metalowego. Systemy wbudowane są prawie zawsze systemami wolnostojącymi - nawet w przypadku RTOS.
Implementacje wolnostojące mogą używać dowolnej formy
main()
, nawet nie muszą mieć funkcji o nazwie main. Najczęściej używają formularzavoid main (void)
, ponieważ nie ma sensu niczego zwracać.Ważne jest, aby zdawać sobie sprawę z tego, że to zawsze kompilator decyduje o formie,
main()
a nie programista.Wolnostojące implementacje, które coś zwracają,
main()
są bardzo wątpliwe. Sprawia, że zastanawiasz się, czy ludzie, którzy stworzyli kompilator, faktycznie czytają ten standard ...Szczegóły tutaj .
źródło
Standard języka C dopuszcza zmienność zdefiniowaną w implementacji
void main( void )
i jest to zwykła forma w systemach wbudowanych - po prostu dlatego, że nie oczekuje się ich powrotu.Jeśli spojrzysz na ustawienia kompilatora, zwykle istnieje fragment kodu bootstrap, wywoływany z wektora resetowania, który wykonuje podstawową inicjalizację (w tym np. Kopiowanie wartości inicjujących do zmiennych) przed wywołaniem main ().
Będzie to również (zwykle) w nieskończonej pętli lub może wykonać reset, jeśli
main()
powróciźródło
To (jak wspomniano inne odpowiedzi) zależy od twojego zestawu narzędzi, ale na przykład w GCC
main
jest kompilowany jako inne funkcje, więc jego wartość zwracana będzie przechowywana zgodnie z konwencjami wywoływania (na ARM używam prawa nie z GCC, to zostanie ustawiony na R0 tuż przed powrotem).Wydaje mi się, że tak jest w AVR-GCC, więc skrypt niestandardowy może użyć tej wartości po głównych zwrotach.
źródło
main
może uzyskać wartość zwrotu. Oczywiście jest to ignorowane w 99,9% sytuacjach, ale odpowiedź dostarcza informacji, kto może otrzymać tę zwracaną wartość.