käynnistyskoodi

B

brunokasimin

Guest
Mikä on todella käynnistyskoodi?Mistä tiesin, Startup-koodi suoritetaan heti nollaustoiminnon tavoite system.I on etsivät helppoa selitystä google mutta ei voinut löytää yksinkertainen selitys .. Voiko joku selittää minulle helppo yksityiskohtaisesti?

 
Käynnistys-koodi on lisätty, että kääntäjän omaan C-ohjelmaan ja sijaitsevat reset vektori on linkittäjän.Se yleensä vain Alustaa pinosta osoitinta ja jos sinulla on maailmanlaajuinen varables, statiikka ja vakiot, se Alustaa niitä.
Se sitten teidän tärkein () "-toiminto, joka käynnistää ohjelman.
Lähdekoodia käynnistysvaiheesta tiedosto on jossakin kääntäjään hakemistoja, se on yleensä vain pieni tiedosto, ehkä kokoajaa tai C, lue käsikirjan, voit muokata sitä, jos haluat jotain tapahtuu ennen soittoa tärkein () ".

 
Kyllä, käynnistämis-koodi on koodi, joka vaatii tärkein () 'aloittaaksesi ohjelman.
Tässä on lähdekoodia käynnistysvaiheesta tiedoston jota Microchip Mplab C30 kääntäjään.Löydät lähdekoodia käynnistysvaiheesta tiedoston sinun kääntäjä on '\ lib \ src "hakemistoja.Koodi on sijoitettu reset vektori on linkittäjän ja käynnistää ensin prosessorin reset.
Voit muokata koodi, jos haluat tehdä jotain ennen soittoa tärkein () ".

Code:

;;

; C Run-time käynnistyslevyn moduuli dsPIC30 C-kääntäjän.

; (C) Copyright 2002,2004,2007 Microchip Technology, Kaikki oikeudet pidätetään

;;

; Perusjäämä versio, tiedot käynnistystoimien tukea.

; Linkittäjän kuormien tämä versio kun - tieto-init

; Vaihtoehto on valittu.

;;

; Ks crt1.s varten vaihtoehtoinen versio ilman

; Tiedot käynnistystoimien tukea.

;;

; Entry __reset tulee hallita laitteen reset-ja

; Toimii seuraavasti:

;;

; 1.
alustaa pino ja pino raja rekisteri

; 2.
alustaa psv ikkuna jos __const_length> 0

; 3.
prosessi tietojen käynnistystoimien template

; 4.
soittaa käyttäjän _main saapumispisteet

;;

; Sidotut kohtaan. Init, jotka voidaan kohdentaa

; Johonkin tiettyyn osoitteeseen linkittäjän komentosarjoja.

;;

; Tukee nolla-parametri muodossa tärkeimmät () oletuksena.

; Jos symboli __ARGV on määritelty, tukee kahden parametrin

; Muodossa tärkeimmät ().

;;

; Un-kommentti seuraavan rivin määritellä tunnuksen __ARGV:

;;. Equiv __ARGV, 1

;;. EQU __30F2010, 1

. include "p30f2010.inc". jaksossa. init, koodi. maailmanlaajuinen __resetPRI

. ifdef __C30ELF

. tyyppi __resetPRI @ toiminto

. endif

__resetPRI:

. heikko __reset

. ifdef __C30ELF

. tyyppi __reset @ toiminto

. endif

__reset:

;;

; Alusta pino, PSV, ja tietojen

;;

; Rekistereitä käytetään: w0

;;

; Panokset (määritelty käyttäjän tai linkittäjän):

;; __SP_init

;; __SPLIM_init

;;

; Tuotokset:

; (Ei palaa - nollaa käsittelijä)

;;

; Calls:

;; __psv_init

;; __data_init

;; _main Tai __main

;;mov # __SP_init, w15; alustaa w15

mov # __SPLIM_init, w0;

mov w0, _SPLIM; alustaa SPLIM

NOP ja odota 1 syklircall __psv_init; alustaa psv

rcall __data_init; alustaa tiedot

; Tyhjentää w0, joten ARGC = 0. ifdef __ARGV

rcall __main; soittaa kahden parametrin tärkeimmät () setup

. muuta

puhelun _main; soittaa käyttäjän tärkeimmät ()

. endif. pword 0xDA4000; pysäyttää simulaattori

reset; nollata prosessori. heikko __psv_init

__psv_init:

;;

; Alusta psv ikkuna jos _constlen> 0

;;

; Rekistereistä käytetään: w0

;;

; Panokset (määritelty linkittäjän):

;; __const_length

;; __const_psvpage

;;

; Tuotokset:

; (None)

;;bclr _CORCON, # psv, poista PSV (oletus)

mov # __const_length, w0;

cp0 w0; testi pituus vakioita

bra z, 1f; br jos nollamov # __const_psvpage, w0;

mov w0, _PSVPAG; PSVPAG = psvpage (vakiot)

bset _CORCON, # psv; mahdollistaa psv1: return; ja poistu. heikko __data_init

__data_init:

;;

; Käsitellä tietoa init template

;;

; Malli on null-irtisanotaan, asiakirjat

; Vuonna seuraavassa muodossa:

;;

; Struct data_record (

; Char * dst; / * kohde-URL-osoite * /

; Int len; / * pituus bytes * /

; Int muodossa; / * format code * /

; Char dat [0]; / * muuttujan pituus tiedot * /

;);

;;

; Rekistereistä käytetään: w0 w1 w2 W3 W4 W5

;;

; Panokset (määritelty linkittäjän):

;; __dinit_tbloffset

;; __dinit_tblpage

;;

; Tuotokset:

; (None)

;;

; Calls:

;; __memcpypd3

;;

. equiv FMT_CLEAR, 0; muodossa koodit

. equiv FMT_COPY2, 1;

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

mov # __dinit_tblpage, w1;

bra 4f; br jatkaa1: lisää w0, # 2, w0; mallipohjaa = 2

addc w1, # 0, w1;

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

lisätä w0, # 2, w0; mallipohjaa = 2

addc w1, # 0, w1;

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

lisätä w0, # 2, w0; mallipohjaa = 2

addc w1, # 0, w1;

CLR W4; ylempi = FALSE (oletus)cp W5, # FMT_CLEAR; testi-muodossa

bra nz, 2f; br jos ei FMT_CLEAR;; FMT_CLEAR - selkeät määränpää muistia

joulukuu W3, W3; vähenemä & koe len

bra n, 4f; br jos negatiivinenToistan W3;

clr.b [w2 ]; selvää muistia

bra 4f; br jatkaa;; FMT_COPY2, FMT_COPY3 - kopio tavua

2: cp W5, # FMT_COPY2; testi-muodossa

bra z, 3f; br jos FMT_COPY2setm W4; ylempi = TRUE3: rcall __memcpypd3; kopioi 2 tai 3 tavua4: mov w1, _TBLPAG; TBLPAG = tblpage (malli)

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

cp0 w2;

bra nz, 1b; silmukka ei ole nolla dstretlw # 0, w0; exit (tyhjentää ARGC myös)__memcpypd3:

;;

; Kopioi tiedot ohjelman muistiin tiedot muistista

;;

; Rekistereistä käytetään: w0 w1 w2 W3 W4 W5

;;

; Panokset:

; W0, w1 = lähde osoite (24 bittiä)

; W2 = URL-osoite (16 bittiä)

; W3 = määrän tavuja (parillinen vai pariton)

; W4 = ylempi tavu lippu (0 = false)

;;

; Tuotokset:

; W0, w1 = seuraava lähde osoite (24 bittiä)

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

mov w0, W5; W5 = tbloffset (src)

lisätä w0, # 2, w0; src = 2

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

joulukuu W3, W3; num --

bra z, 2f; br jos tehtävätblrdl.b [W5 -], [w2 ]; dst = hi byte

joulukuu W3, W3; num --

bra z, 2f; br jos tehtäväcp0 W4; testi ylempi lippu

bra z, 1b; br jos vääriätblrdh.b [W5], [w2 ]; dst = ylempi tavu

joulukuu W3, W3; num --

bra nz, 1b; br, jos ei tehdä2: return; poistuaksesi. ifdef __ARGV

__main:

;;

; Alusta pinon frame tukea

; Kahden parametrin muodossa tärkeimmät ()

;;

; Rekistereistä käytetään: w0 w1

;;

; Panokset:

; (None)

;;

; Tuotokset:

; (None)

;;

; Calls:

;; _main

;;

lnk # 6; rakentaa kehysmov # 0, w0; tallentaa null terminaattori

mov.b w0, [w15-6], että ohjelman nimisub 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

puhelun _main; soittaa käyttäjän tärkeimmät ()ulnk; tuhota frame

return; ja poistu

. endif. loppuun
 

Welcome to EDABoard.com

Sponsor

Back
Top