Saya tahu bahwa di komputer, nilai yang dikembalikan oleh main()
fungsi diterima oleh sistem operasi. Tapi, apa yang terjadi pada main()
fungsi mikrokontroler?
microcontroller
avr
c
pengguna18118
sumber
sumber
main
dengan dua tanda tangan yang berbeda, yang keduanya kembaliint
. Jika Anda menggunakan implementasi C berdiri bebas, implementasi itu menentukan bagaimana Anda harus menulis fungsi startup. Anda tidak dapat menulisvoid
fungsi kembali hanya karena tidak kembali. The perilaku dari tidak kembali berbeda dari fungsi jenis yang mempengaruhi konvensi panggilan secara keseluruhan.Jawaban:
Pada mikrokontroler,
main()
tidak benar-benar diharapkan untuk keluar, dan perilaku jika tidak didefinisikan - jadi terserah siapa pun yang menulis runtime C untuk mikrokontroler. Saya telah melihat sistem yang:main()
, sehingga jika keluar, itu akan dipanggil lagi.main()
pernah keluar.main()
. Ini disebut "mengalir ke gulma".Saya belum pernah melihat satu yang benar-benar melakukan apa pun dengan nilai yang dikembalikan
main()
. Jika ini adalah sesuatu yang benar-benar Anda pedulikan, maka Anda harus melihat - dan mungkin memodifikasi - kode sumber untuk pustaka runtime C sistem Anda.sumber
main()
memilikiint
nilai kembali jelas tidak dirancang dengan mikrokontroler OS-kurang dalam pikiran. Jadi ini adalah perilaku yang tidak ditentukan dan apa pun dapat terjadi tergantung pada runtime C Anda, seperti yang tercantum dalam daftar.main()
, apalagi menentukan nilai kembali. Terserah implementor.void main( void )
adalah implementasi perilaku yang ditentukan , bukan perilaku yang tidak ditentukan .main()
.Kesalahpahaman / mitos yang umum adalah itu
int main
adalah satu-satunya bentuk valid yang ditentukan oleh standar. Itu tidak benar.Standar C berbicara tentang dua implementasi: di-host dan berdiri bebas. "Implementasi" dalam hal ini berarti kompiler. Compiler yang dihosting mengkompilasi untuk OS tertentu dan kompiler yang berdiri bebas mengkompilasi untuk aplikasi bare metal tertentu. Sistem tertanam hampir selalu merupakan sistem yang berdiri sendiri - bahkan dalam kasus RTOS.
Implementasi berdiri bebas dapat menggunakan formulir apa pun untuk
main()
, mereka bahkan tidak perlu memiliki fungsi yang disebut main. Paling sering, mereka menggunakan formulirvoid main (void)
, karena tidak masuk akal untuk mengembalikan apa pun.Apa yang penting untuk disadari di sini adalah bahwa selalu kompiler yang memutuskan bentuk
main()
dan tidak pernah programmer.Berdiri bebas implementasi yang melakukan kembali sesuatu dari
main()
yang sangat dipertanyakan. Membuat Anda bertanya-tanya apakah orang-orang yang membuat kompiler benar-benar membaca standar ...Detail di sini .
sumber
Standar bahasa C memungkinkan untuk variasi implementasi yang ditentukan
void main( void )
dan ini adalah bentuk yang biasa dalam sistem embedded - hanya karena mereka tidak diharapkan untuk kembali.Jika Anda melihat pengaturan kompiler, biasanya ada potongan kode bootstrap, dipanggil dari vektor reset, yang melakukan beberapa inisialisasi dasar (termasuk misalnya mengatasi nilai inisialisasi ke dalam variabel) sebelum memanggil main ().
Ini juga akan (biasanya) berada dalam loop tak terbatas, atau mungkin melakukan reset, jika
main()
kembalisumber
Itu (seperti jawaban lain yang disebutkan) tergantung pada toolchain Anda, tetapi misalnya dalam GCC
main
dikompilasi sebagai fungsi lain, sehingga nilai pengembaliannya akan disimpan sesuai dengan konvensi pemanggilan (pada ARM saya menggunakan benar bukan dengan GCC itu akan dimasukkan ke R0 sesaat sebelum kembali).Saya kira itu adalah simillar pada AVR-GCC, jadi skrip khusus dapat menggunakan nilai ini setelah pengembalian utama.
sumber
main
bisa mendapatkan nilai baliknya. Tentu saja diabaikan dalam situasi 99,9%, tetapi jawaban memberikan informasi siapa yang dapat menerima nilai pengembalian ini.