Kysymys:
Kuka saa main (): n palauttaman arvon?
user18118
2013-01-22 22:25:05 UTC
view on stackexchange narkive permalink

Tiedän, että tietokoneissa käyttöjärjestelmä vastaanottaa main () -funktion palauttaman arvon, mutta mitä tapahtuu main () -funktiossa mikro-ohjain?

Käytän aina void main () -toimintoa, kun käytän C: tä PIC-mikrokontrollereihin. Kun käytetään C-kääntäjiä mikro-ohjaimille, sillä ei todellakaan ole väliä ollenkaan. Koska ei ole käyttöjärjestelmää, joka toimisi (sano) "main.c". Jos mikrokontrollerissa on jotain RTOS: n kaltaista, käyttöjärjestelmä on "main.c".
Ei oikeastaan ​​kaksoiskappale, mutta ainakin liittyvä: http://electronics.stackexchange.com/q/30830/4950
Käynnistystoiminnon määrittely ei yleensä ole sinun tehtäväsi päättää. Käyttämäsi ympäristö dokumentoi tuetut käynnistystoiminnon lomakkeet. Isännöityjä C-toteutuksia vaaditaan tukemaan kahta "pää" -muotoa kahdella eri allekirjoituksella, jotka molemmat palauttavat "int". Jos käytät vapaasti seisovaa C-toteutusta, kyseinen toteutus määrää, miten sinun pitäisi kirjoittaa käynnistystoiminto. Et voi kirjoittaa `void` -palautustoimintoa vain siksi, että se ei palaa. Palautumattomuuden * käyttäytyminen * eroaa toiminnon * tyypistä *, joka vaikuttaa yleisiin soittokäytäntöihin.
Viisi vastused:
Dave Tweed
2013-01-22 22:50:27 UTC
view on stackexchange narkive permalink

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:

  • Onko implisiittinen silmukka main () -ympäristön ympärillä, joten jos se poistuu, sitä yksinkertaisesti kutsutaan uudelleen.
  • Käytä yksinkertaista "hyppää itsellesi" -silmukkaa (tai HALT-käskyä), joka suoritetaan, jos main () koskaan poistuu.
  • Suorita loput koodimuistista joka seuraa kutsua 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.

Voitit minut siihen. +1 synkronisuudesta.
C-standardia, joka määrittelee "main ()": n palautusarvoksi "int", ei tietenkään ole suunniteltu käyttöjärjestelmävapaata mikrokontrolleria ajatellen. Joten tämä on määrittelemätöntä käyttäytymistä ja mitä tahansa voi tapahtua C-ajoajastasi riippuen, kuten Dave listasi.
C-käyttöjärjestelmävapaalla mikrokontrollerilla toimivaa C: tä voidaan pitää erillisenä toteutuksena, ja C-standardi ei edes vaadi vapaasti seisovaa ympäristöä, jolla * olisi * "main ()", ja vielä vähemmän määritetään sen palautusarvo. Se on toteuttajan tehtävä.
@ndim - hiusten jakamiseksi `void main (void)` on * toteutuksen määrittelemää käyttäytymistä *, ei * määrittelemätöntä käyttäytymistä *.
@MichaelEdenfield: todellakin. C: n * kaikki * -koodi on kuitenkin määritelty funktioiden perusteella, joten upeaa järjestelmää * ei ole koskaan mahdollista kirjoittaa kokonaan C: ksi; täytyy olla ainakin pieni kokoamiskieli (tai mikä tahansa), joka asettaa minimaalisen ympäristön, jotta voidaan kutsua C-funktio. Tämän toiminnon ilmeisin nimi on `main ()`.
@ndim C-standardin mukaan minkä tahansa pään muoto on hieno.Oletko lukenut standardin?Vielä tärkeämpää on, oletko tarkistanut, missä alaosassa on osio, jossa määritetään `main`-muodon` int` muoto?5.1.2.2 Isännöity ympäristö.
Ainakin * minun * käynnistyskoodi jatkaa maailmanlaajuisten hävittäjien soittamista, joten kaikki stdoutille kirjoitetut tiedot huuhdellaan edelleen.
Selittääksesi yllä olevan @Lundin's-kommentin: C-standardi tuntee "isännöidyn ympäristön" (eli ohjelman, joka toimii oikein oikealla käyttöjärjestelmällä), jossa "main (...)" * palauttaa `int '.Ja sitten on "vapaasti seisova ympäristö" (eli ohjelma, joka toimii pohjimmiltaan paljaalla metallilla), jossa "käynnistyksen yhteydessä kutsutun toiminnon nimi ja tyyppi ovat toteutuksen määrittelemät".Joten mikään menee mikrokontrolleriympäristösi, ja katsot parhaiten, mitä lähdekoodistasi luotuun binaariin sisältyvä käynnistyskoodi todella tekee purkijalla.
@ndim Jopa isännöidyssä toteutuksessa (joka ei todennäköisesti ole merkityksellistä useimmille EE-kysymyksille) päätiedot voidaan ilmoittaa toteutuksen määrittelemissä muodoissa.Standardi ei ole oikeastaan selvä.[Tiedot täältä] (http://stackoverflow.com/a/31263079/584518)
Olen myös havainnut HALT-käskyn päähypyn jälkeen, jos palaat, asia jäätyy.
@istepaniuk: Se vastaa toista luotini.Kaikilla mikro-ohjaimilla ei ole HALT-ohjeita.
Lundin
2016-06-20 11:46:30 UTC
view on stackexchange narkive permalink

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 ...

Tiedot täältä.

Andrew
2013-01-23 03:40:45 UTC
view on stackexchange narkive permalink

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

kwesolowski
2014-08-09 02:47:45 UTC
view on stackexchange narkive permalink

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.

tämä menettää pikemminkin asian
Siinä korostetaan, että se, joka kutsuu "pää", voi saada palautusarvon.Tietysti se jätetään huomiotta 99,9% tilanteissa, mutta vastaus antaa tietoa siitä, kuka voi saada tämän palautusarvon.
old_timer
2020-04-04 22:18:16 UTC
view on stackexchange narkive permalink

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.



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...