Een paar vragen - Wat main () functie

B

bharaths_jois

Guest
Hi ppl, Ik heb de volgende paar vragen

1.Wat is het prototype van de main ()?Is het compiler afhankelijk?

2.Lijkt net een vage vraag, maar wat zal er gebeuren als ik een afslag van de main () functie in een embedded systeem,
waarbij de belangrijkste wordt aangeroepen door ind_crt0 na initialisatie van het geheugen blokken, enz. ..?

3.Kunt van mening zijn dat de uitvoering gaat uit van de belangrijkste (voor de moment) ...Is er iemand die bereid zou zijn om te luisteren naar wat we het rendement van main ()?

 
Traditioneel, main () retourneert een int aan het aanroepende programma, 0 voor succes en een andere waarde, een foutcode.C begon het leven in een Unix omgeving.
De meeste embedded systemen negeren de terugkeer van grote waarde (), het uitvoeren van een reset wanneer main () retourneert.
De broncode voor de start-up bestand, 'ind_crt0' voor uw compiler is normaliter verstrekt.Je zou kunnen wijzigen van de broncode te maken wat het gebruik van de return waarde van de main ().

 
Dank u voor het antwoord.Bovendien, hoe zit het met de argumenten die doorgegeven worden aan main ()?I, tot nu toe niet hebben gebruikt.Het zou goed zijn als u kon geven me een voorbeeld waar in een embedded systeem, argumenten worden doorgegeven aan de hoofd-en worden gebruikt door de belangrijkste in de aanvraag, indien aanwezig.

 
Ik kan niet denken aan een toepassing in embedded code waar passerende argumenten naar () zou van enig nut.Behalve misschien om enkele code draagbare tussen processor varianten.
Hoewel er moet een aantal situaties waar dit nuttig is?
Hier is de start-code van de Pic30 tools compiler.Zoals u kunt zien, als je het symbool __ARGV, de twee versie van de belangrijkste parameter wordt ondersteund.

main (int argc, char * argv [])Code:;;

;; C runtime-module voor het opstarten dsPIC30 C compiler.

; (C) Copyright 2002,2004,2007 Microchip Technology, Alle rechten voorbehouden

;;

;; Primaire versie, met gegevens initialisatievector ondersteuning.

;; De linker laadt deze versie als de - gegevens-init

;; Optie is gekozen.

;;

;; Zie dossier crt1.s voor de alternatieve versie zonder

;; Gegevens initialisatievector ondersteuning.

;;

;; Entry __reset neemt de controle op het apparaat gereset en

;; Voert de volgende:

;;

; 1.
initialiseren stack en stack beperken registreren

;; 2.
initialiseren PSV venster als __const_length> 0

;; 3.
verwerking van de gegevens initialisatievector sjabloon

; 4.
oproep van de gebruiker _main ingangsadres

;;

;; Assigned punt. Init, die kan worden toegewezen

; Op een specifiek adres in het linker-scripts.

;;

;; Steunt de nul-parameter vorm van main () standaard.

; Als het symbool __ARGV is gedefinieerd, ondersteunt de twee-parameter

;; Vorm van main ().

;;

;; Un-comment de volgende regel te definiëren symbool __ARGV:

;;. Equiv __ARGV, 1

;;. EQU __30F2010, 1

. include "p30f2010.inc". sectie. init, code. wereldwijde __resetPRI

. ifdef __C30ELF

. Type __resetPRI, @ functie

. endif

__resetPRI:

. zwakke __reset

. ifdef __C30ELF

. Type __reset, @ functie

. endif

__reset:

;;

;; Initialize stapel, PSV, en gegevens

;;

;; Registers gebruikt: w0

;;

;; Inputs (gedefinieerd door gebruiker of linker):

;; __SP_init

;; __SPLIM_init

;;

;; Uitgangen:

;; (Niet terugkeren - opnieuw de verwerker)

;;

;; Verzoekt:

;; __psv_init

;; __data_init

;; _main Of __main

;;mov # __SP_init, w15; initialiseren w15

mov # __SPLIM_init, w0;

mov w0, _SPLIM; initialiseren SPLIM

nop, wacht 1 cyclusrcall __psv_init; initialiseren PSV

rcall __data_init; initialiseren gegevens

; Wist w0, dus argc = 0. ifdef __ARGV

rcall __main; gesprek twee belangrijkste parameter () instellen

. anders

oproep _main; gesprek gebruiker main ()

. endif. pword 0xDA4000; stopzetting van de simulator

reset; resetten van de processor. zwakke __psv_init

__psv_init:

;;

;; Initialize PSV venster als _constlen> 0

;;

;; Registers gebruikt: w0

;;

;; Inputs (gedefinieerd door de linker):

;; __const_length

;; __const_psvpage

;;

;; Uitgangen:

;; (Geen)

;;bclr _CORCON, # PSV; PSV uitschakelen (standaard)

mov # __const_length, w0;

cp0 w0; test lengte van constanten

bra z, 1f; br als nulmov # __const_psvpage, w0;

mov w0, _PSVPAG; PSVPAG = psvpage (constanten)

bset _CORCON, # PSV; staat PSV1: terugkeer; en uitgang. zwakke __data_init

__data_init:

;;

;; Gegevens verwerken init sjabloon

;;

;; Het sjabloon is null-geseponeerd, met records

; In de volgende vorm:

;;

;; Data_record struct (

;; Char * dst; / * bestemming adres * /

;; Int len; / * lengte in bytes * /

;; Int formaat; / * formaat code * /

;; Char dat [0]; / * variabele lengte gegevens * /

;);

;;

;; Registers gebruikt: w0 w1 w2 w3 W4 W5

;;

;; Inputs (gedefinieerd door de linker):

;; __dinit_tbloffset

;; __dinit_tblpage

;;

;; Uitgangen:

;; (Geen)

;;

;; Verzoekt:

;; __memcpypd3

;;

. equiv FMT_CLEAR, 0; formaat codes

. equiv FMT_COPY2, 1;

. equiv FMT_COPY3, 2;mov # __dinit_tbloffset, w0; w0, w1 = sjabloon

mov # __dinit_tblpage, w1;

beha 4f; br te blijven1: voeg w0, # 2, w0; sjabloon = 2

addc w1, # 0, w1;

mov w1, _TBLPAG; TBLPAG = tblpage (sjabloon)tblrdl.w [w0], w3; w3 = len

voeg w0, # 2, w0; sjabloon = 2

addc w1, # 0, w1;

mov w1, _TBLPAG; TBLPAG = tblpage (sjabloon)tblrdl.w [w0], W5; W5 = formaat

voeg w0, # 2, w0; sjabloon = 2

addc w1, # 0, w1;

clr W4; bovenste = FALSE (standaard)cp W5, # FMT_CLEAR; test-formaat

beha nz, 2f; br indien niet FMT_CLEAR;; FMT_CLEAR - duidelijke bestemming geheugen

dec w3, w3; decrement & testen len

bra n, 4f; br als negatiefherhalen w3;

clr.b [w2 ]; duidelijk geheugen

beha 4f; br te blijven;; FMT_COPY2, FMT_COPY3 - exemplaar bytes

2: cp W5, # FMT_COPY2; test-formaat

bra z, 3f; br indien FMT_COPY2setm W4; bovenste = TRUE3: rcall __memcpypd3; exemplaar 2 of 3 bytes4: mov w1, _TBLPAG; TBLPAG = tblpage (sjabloon)

tblrdl.w [w0], w2; w2 = volgende dst

cp0 w2;

beha nz, 1b; lus over de niet-nul dstretlw # 0, w0; afslag (argc wist ook)__memcpypd3:

;;

;; Kopiëren van gegevens uit programma geheugen voor gegevens geheugen

;;

;; Registers gebruikt: w0 w1 w2 w3 W4 W5

;;

;; Inputs:

;; W0, w1 = bronadres (24 bits)

;; W2 = bestemmingsadres (16 bits)

;; W3 = aantal bytes (even of oneven)

;; W4 = bovenste byte vlag (0 = false)

;;

;; Uitgangen:

;; W0, w1 = volgende bronadres (24 bits)

;;1: mov w1, _TBLPAG; TBLPAG = tblpage (SRC)

mov w0, W5; W5 = tbloffset (SRC)

voeg w0, # 2, w0; src = 2

addc w1, # 0, w1;tblrdl.b [W5 ],[ w2 ]; dst = lo byte

dec w3, w3; num --

bra z, 2f; br zo gedaantblrdl.b [W5 -], [w2 ]; dst = hi byte

dec w3, w3; num --

bra z, 2f; br zo gedaancp0 W4; test bovenste vlag

bra z, 1b; br als valstblrdh.b [W5], [w2 ]; dst = bovenste byte

dec w3, w3; num --

beha nz, 1b; br indien niet gedaan2: terugkeer; afslag. ifdef __ARGV

__main:

;;

;; Initialiseer een stack frame te steunen

; De twee-parameter vorm van main ()

;;

;; Registers gebruikt: w0 w1

;;

;; Inputs:

;; (Geen)

;;

;; Uitgangen:

;; (Geen)

;;

;; Verzoekt:

;; _main

;;

lnk # 6; construeren framemov # 0, w0; bewaart een null-terminator

mov.b w0, [w15-6]; voor programmanaamsub w15, # 6, w1

mov w1 [w15-4], argv [0] = & pgmname

mov w0, [w15-2], argv [1] = 0mov # 1, w0; w0 = argc

sub w15, # 4, w1; w1 = & argv

oproep _main; oproep van de gebruiker main ()ulnk; vernietigen frame

terugkeer; en uitgang

. endif. einde
 

Welcome to EDABoard.com

Sponsor

Back
Top