Tiedän, että tietokoneissa käyttöjärjestelmä vastaanottaa main ()
-funktion palauttaman arvon, mutta mitä tapahtuu main ()
-funktiossa mikro-ohjain?
Tiedän, että tietokoneissa käyttöjärjestelmä vastaanottaa main ()
-funktion palauttaman arvon, mutta mitä tapahtuu main ()
-funktiossa mikro-ohjain?
Mikrokontrollerissa main ()
: n ei todellakaan odoteta koskaan poistuvan, ja käyttäytymistä, jos se tapahtuu, ei ole määritelty - joten kuka itse kirjoitti mikrokontrollerin C-ajoajan. Olen nähnyt järjestelmiä, jotka:
main ()
-ympäristön ympärillä, joten jos se poistuu, sitä yksinkertaisesti kutsutaan uudelleen. main ()
koskaan poistuu. main ()
. Tätä kutsutaan "juoksemiseksi rikkaruohoon". En ole koskaan nähnyt sellaista, joka todella tekisi mitään lainkaan main ()
-arvon palauttamalla arvolla. Jos tämä on asia, josta todella välität, sinun kannattaa katsoa - ja mahdollisesti muokata - järjestelmän C-ajonaikaisen kirjaston lähdekoodia.
Yleinen väärinkäsitys / myytti on, että int main
on ainoa standardin määrittelemä kelvollinen muoto. Se ei ole totta.
C-standardi puhuu kahdesta toteutuksesta: isännöitystä ja erillisestä. "Toteutus" tarkoittaa tässä tapauksessa kääntäjää. Isännöidyt kääntäjät kääntyvät tietylle käyttöjärjestelmälle ja vapaasti seisovat kääntäjät kääntyvät tietylle paljaalle metallille. Sulautetut järjestelmät ovat melkein aina vapaasti seisovia järjestelmiä - jopa RTOS: n tapauksessa.
Vapaasti seisovat toteutukset voivat käyttää mitä tahansa muotoa main ()
: lle, niillä ei edes tarvitse olla toimintoa kutsutaan pää. Useimmiten he käyttävät muotoa void main (void)
, koska ei ole mitään järkeä palauttaa mitään.
Tärkeää on ymmärtää, että main ()
-muodon päättää aina kääntäjä eikä koskaan ohjelmoija.
Vapaasti seisovat toteutukset, jotka tekevät palauttavat jotain kohdasta main ()
, ovat hyvin kyseenalaisia. Saa miettimään, lukevatko kääntäjän laatineet ihmiset todella standardin ...
C-kielistandardi sallii toteutuksen määrittelemän muunnelman void main (void)
, ja tämä on sulautettujen järjestelmien tavanomainen muoto - yksinkertaisesti siksi, että niiden ei odoteta palaavan.
Jos tarkastellaan kääntäjän asetuksia, siellä on yleensä käynnistyshakukoodinpätkä, jota kutsutaan palautusvektorista, joka suorittaa jonkin verran perusalustusta (mukaan lukien esim. Alustamisarvojen kopioiminen muuttujiksi) ennen kuin kutsutaan main (). p> Tämä on myös (yleensä) ääretön silmukka, tai ehkä suorittaa nollaus, jos main ()
palaa
Se (kuten muutkin mainitut vastaukset) riippuu työkaluketjustasi, mutta esimerkiksi GCC: ssä main
on koottu muihin toimintoihin, joten sen palautusarvo tallennetaan kutsukäytäntöjen mukaisesti (ARM I am Jos et käytä oikeaa, ei GCC: n kanssa, se asetetaan R0: een juuri ennen paluuta).
Luulen, että se on samanlainen kuin AVR-GCC: ssä, joten mukautettu komentosarja voi käyttää tätä arvoa pääpalautusten jälkeen.
Et pääse C: hen ilman uudelleenkäynnistystä. Käynnistyskoodi on ihanteellisessa muodossa kirjoitettuna asm: nä (jos C: ssä sinulla on kana- ja muna-ongelma), valmistaa ympäristön suorittamista varten. C asettaa pinon, valmistelee .data, preps .bss , soittaa sitten pääpuhelimelle. Jotkut ihmiset ajattelevat, että tärkein ei koskaan palaa, mutta baremetalin kauneus on kaikki sinun. Voit varmasti palata pääkeskuksesta mcu: lla, esimerkiksi kun tapahtuu jotain kohtalokasta, tai jos suunnittelusi on 100% tapahtuman (keskeytyksen) ohjaama, asenna kaikki oheislaitteet ja keskeytykset, palaa sitten ja anna käynnistysvyösi pyöriä loputtomassa silmukassa, joka on jonkin aikaa kauniimpi (1) jatkaa; pääkoodissa ().
Monet ihmiset käyttävät säilöttyjä kirjastoja ja ympäristöjä saadakseen baremetalin tuntumaan baremetalilta, ja vaikka he ovat vastuussa sen alla tapahtuvasta toiminnasta, älä näe tai hallitse sitä. Jälleen osa baremetalin kauneutta.
Mitä tapahtuu, kun päätuotot riippuvat järjestelmästä, olipa kyseessä käyttöjärjestelmä tai mcu: n baremetali. Viisas muotoilu antaisi tärkeimmille mahdollisuuden palata käynnistysvyöhykkeeseen ja valita sitten suunniteltavasta mallista riippuen ainakin ääretön silmukka.
main () on kääntäjälle vain yksi funktion nimi suurimmaksi osaksi, jotkut työkaluketjut lisäävät ylimääräisiä juttuja nähdessään kyseisen toiminnon, joten sinun tulee käyttää tätä toimintoa varovasti baremetalissa välttääksesi ylimääräisiä matkatavaroita tällaisessa resurssirajoitteisessa ympäristössä . Ei ole viisasta käyttää C-merkintäkohtaa kuin nimeä main () ongelman välttämiseksi, mutta luonnollisesti siihen liittyy yleensä koko asian hallinnan hallinta eikä vain muutaman rivin lisääminen jollekin muulle hiekkalaatikolle (oman bootstrapin ja mahdollisesti linkerin kirjoittaminen) komentosarja ja seurauksena mahdollisesti myös kirjastot (ei huono idea).
Kun otat haltuunsa, voit varmasti saada palautusarvon tärkeimmistä merkityksistä, taas keskeytyksestä johtuvan suunnittelun tapauksessa main () voisi yksinkertaisesti aloittaa asiat liikkeessä ja palata sitten loputtomaan tai odottaa keskeytyssilmukkaabootstrap, mutta voit halutessasi palautusarvon aiheuttaa toiminnan, ellei nolla, sitten kelloportti, tai asettaa kaikki oheislaitteet nollaamaan alhaisen virran epäonnistuneen käynnistyksen.
Lyhyt vastaus: Paluuarvo menee eetteriin, kun yleensä laskeudut äärettömään silmukkaan joko suoraan tai sen jälkeen, kun käynnistyshihna on olettanut tapahtuneen jotain pahaa, ja sammuttanut tai poistanut tekemäsi mitä tahansa, mitä olet määrittänyt sovelluksesi osassa.Mikä tahansa hiekkalaatikko, joka ei salli main (): n palauttamista, on hiekkalaatikko, jota ei tarvitse käyttää, sillä tulisi olla ainakin minimaalinen tuki (ääretön silmukka).
Lyhyempi vastaus: Kuka saa palautusarvon?Teet kuten olet vastuussa tästä sovelluksesta ja sen seurauksena käynnistyshihnasta.