 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Sob Feb 12, 2011 11:39 am Naslov sporočila: |
|
|
domen_puncer je napisal/a: |
1<<7 je 0x80, 1<<6 je 0x40 |
To sem že pogruntal, hvala. Kar ne vem je, zakaj nebi tu preprosto uporabil ukaza .set??? V čem sta .ukaza .set in .equ različna? Sem prebral assembler manual in razlika ni omenjena niti tam. Očitno je ni
No drugače pa moram povedat, kaj delam. Sem skopiral vso kodo boot datoteke in
vso kodo linker skripte, ju nalepil eno ob drugo v sliko formata 4000x4000 in sedaj spotoma pišem sam sebi razlago. Stvari postajajo vse bolj jasne se mi je pa posvetilo, da je to nek fajni pristop zaradi preglednosti, je pa zahteven za GPU.
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Sre Feb 16, 2011 2:35 pm Naslov sporočila: |
|
|
No tukaj je slika, katero sem do sedaj izdelal in se mi zdi kar fajn zadeva. Ne razumem še vsega, zanima me dvoje:
Kaj v bootloader kodi pomenijo vrstice v zavitih oklepajih (glej sliko, ki jo prilagam), lahko mi najprej kdo pomaga razumeti prvi zaviti oklepaj. Tam so neke spremenljivke ( _undf, _swi, _pabt, dabt, ... ) ki niso nikjer definirane in tega ne razumem.
Ali lahko za .global napišem več simbolov ločenih z vejico, katere želim, da so vidni vsem objektom? npr. .global _start, start, _mainCRTStartup
Opis: |
Bootloader koda in linker skripta ena ob drugi z razlago, vsaj kar jaz vem,... a potrebujem pomoč, da končam. |
|
Velikost datoteke: |
804.17 KB |
Pogledana: |
39 krat |

|
|
|
Nazaj na vrh |
|
 |
MarkoM Član

Pridružen-a: Tor 12 Sep 2006 15:29 Prispevkov: 2825 Aktiv.: 12.34 Kraj: Lovrenc na P.
|
Objavljeno: Sre Feb 16, 2011 3:07 pm Naslov sporočila: |
|
|
Saj vem, da sem te že napadal.
Zakaj sploh rabiš razumeti vse ukaze v teh skriptah? Fetiš?
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Sre Feb 16, 2011 3:20 pm Naslov sporočila: |
|
|
MarkoM je napisal/a: |
Saj vem, da sem te že napadal.
Zakaj sploh rabiš razumeti vse ukaze v teh skriptah? Fetiš? |
Moram si napisat sam svojo bootloader kodo za LPC3141. To bom lahko naredil le in samo če bom razumel bootloader kodo in linker skripto za ARM. Ko mi to uspe, se bom lotil pisanja programov v C brez skrbi, ampak pot je še trnjeva.
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Čet Feb 24, 2011 1:32 pm Naslov sporočila: |
|
|
Zanima me če kdo ve kaj v zvezi z čiščenjem bss sekcije. Spodnji ukaz naj bi počistil bss sekcijo a ne razumem kako, saj je uporabljeni ukaz za čiščenje kar STR.
Koda: |
LDR r0, =__gnu_bssstart
LDR r1, =__gnu_bssend
MOV r2, #0
clearzi:
CMP r0, r1 /*primerjamo registra r0 (začetek bss) in r1 (konec bss)*/
BEQ clearzi_exit /*ko sta r0 in r1 enaka skočimo na labelo clearzi_exit*/
STR r2, [r0] /* ???*/
ADD r0, r0, #4 /*registru r0 prištejemo 4, kar pomeni, da sedaj kaže na pomnilniško lokacijo, ki je eno naprej od __bssstart*/
B clearzi /*vrnemo se na labelo clearzi*/
clearzi_exit:
|
Še moje vprašanje: "Ali ukaz STR kopira vsebino pomnilniške lokacije (na katero kaže r0) v register r2 ali jo izreže?" Glede na kontekst bi rekel, da jo izreže in pomnilniško lokacijo postavi na 0x0000000, ali je moj sklep pravilen ali se motim?
|
|
Nazaj na vrh |
|
 |
Benjamin Član

Pridružen-a: Tor 10 Jul 2007 11:23 Prispevkov: 116 Aktiv.: 0.53 Kraj: Trebnje, Ljubljana
|
Objavljeno: Čet Feb 24, 2011 3:49 pm Naslov sporočila: |
|
|
Shrani vrednost registra r2 v register r0.
V registru r2 je vrednost 0 zaradi te inštrukcije:
register r0 pa vsebuje lokacijo '__gnu_bssstart', ki pa se vsakokrat inkrementira za 4 bajte, kar pa si že ugotovil.
_________________ Cessna 152: "Flight Level Three Thousand, Seven Hundred"
Controller: "Roger, contact Houston Space Center" |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.64 Kraj: Zagorje ob Savi
|
Objavljeno: Čet Feb 24, 2011 4:02 pm Naslov sporočila: |
|
|
Ojej, tole si pa cisto narobe doumel. Kaksno izrezovanje neki. A ni jasno iz namembnosti tega dela kode, kaj dela?
Kako bi zbrisal - postavil na nic - del pomnilnika, ce ves njegov zacetek in konec?
Kot vidis na zacetku, v r0 nalozis zacetek, v r1 konec bss sekcije, v r2 pa vrednost 0.
Torej moras samo napisati zanko, v kateri primerjas, ce si ze prisel do konca (CMP) - potem skocis izven zanke (BEQ), drugace v pomnilnisko lokacijo, na katero kaze r0, shranis vrednost registra r2 - 0 (STR), in povecas pomnilniski kazalec v r0 za eno mesto (ADD).
Zdaj pa resno: kaj pomeni kateri operator pri store ukazu pise v VSAKEM prirocniku, knjigi, miljon internetnih straneh. Do zdaj bi pa res lahko pogledal in se naucil uporabljati enega od najbolj osnovnih ukazov, ki jih tvoj cip ima, se ti ne zdi? Ali ti je skoda truda in samo cakas, da ti bo en za vsako malenkost napisal, kaj pomeni? Glede na vecino tvojih postov se ze zdi tako.
Pa brez zamere.
LP!
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Čet Feb 24, 2011 6:40 pm Naslov sporočila: |
|
|
chaos je napisal/a: |
Ojej, tole si pa cisto narobe doumel. Kaksno izrezovanje neki. A ni jasno iz namembnosti tega dela kode, kaj dela?
Kako bi zbrisal - postavil na nic - del pomnilnika, ce ves njegov zacetek in konec?
Kot vidis na zacetku, v r0 nalozis zacetek, v r1 konec bss sekcije, v r2 pa vrednost 0.
Torej moras samo napisati zanko, v kateri primerjas, ce si ze prisel do konca (CMP) - potem skocis izven zanke (BEQ), drugace v pomnilnisko lokacijo, na katero kaze r0, shranis vrednost registra r2 - 0 (STR), in povecas pomnilniski kazalec v r0 za eno mesto (ADD).
Zdaj pa resno: kaj pomeni kateri operator pri store ukazu pise v VSAKEM prirocniku, knjigi, miljon internetnih straneh. Do zdaj bi pa res lahko pogledal in se naucil uporabljati enega od najbolj osnovnih ukazov, ki jih tvoj cip ima, se ti ne zdi? Ali ti je skoda truda in samo cakas, da ti bo en za vsako malenkost napisal, kaj pomeni? Glede na vecino tvojih postov se ze zdi tako.
Pa brez zamere.
LP! |
Hvala za odgovor... ampak se motiš glede mojega odnosa, do dela... sploh ne lenarim. Vsak dan študiram tole po 4 ure +. Očitno sem zamešal LDR in STR in se opravičujem za butasto vprašanje. Nismo vsi študirali FRI in nimamo vsi utrjenih osnov.
|
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.64 Kraj: Zagorje ob Savi
|
Objavljeno: Čet Feb 24, 2011 9:13 pm Naslov sporočila: |
|
|
Okej, če se motim, ti sam najbolj veš. Nisem hotel biti nesramen, samo jaz bi rekel, da imaš še ogromno stvari za predelati / napisati, da bi se tako dolgo ustavljal pri takem majhnem delu kode. Sicer pa nobeden ne zahteva od tebe, da bi moral za vsako ukaz ali proceduro točno vedeti, kaj počne - bi rekel, da veliko ljudi sploh ne ve, da obstaja bss sekcija in da se nekje pobriše.
Izbral si si tudi precej kompleksen mikrokontroler, za katerega boš definitivno porabil precej časa, da ga boš "zakapiral", precej več kot za kakšen AVR ali pa bolj preprost armič stila LPC2138.
Ne vem, če si že kdaj napisal, kaj točno bi rad naredil s tem tvojim mikrokontrolerjem. Če bi to malo objasnil, bi ti tudi lažje pomagali. A ne obstaja opcija, da bi uporabil linux kernel in na linuxu napisal svoj program? Tako bi se ognil bootanju procesorja, linker skriptam (bolj kot ne), startup kodi, nastavljanju pomnilniškega kontrolerja, ...
Priznam, da je s tem gcc-jem kar nekaj dela, če se prvič srečaš z njim, in spraviti malo bolj kompleksen mikroprocesor v c-jevski main tudi ni ravno lahko. Bi rekel, da imaš probleme ravno zato, ker očitno ni veliko ljudi, ki bi ta tvoj procesor uporabljalo v "golem" načinu, ampak ga vsi uporabljajo v navezi z operacijskim sistemom.
Jaz bi na tvojem mestu definitivno gledal v smeri linux kernela, samo to je samo moje mišljenje.
Daj, da ti lažje pomagamo, pripni vse, kar si naredil do sedaj (linker skripto, startup kodo, c kodo, ...), povej kateri deli ti niso jasni, pa gremo lahko skozi.
In mimogrede, tudi sam sem študiral na FE, in tudi meni niso bile jasne osnove
LP!
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Čet Feb 24, 2011 11:31 pm Naslov sporočila: |
|
|
Ravno to sem pripravljal... evo fantje plod mojega dela do sedaj je ogromna slika, ki mi je omogočila simultano branje linker skripte, startup kode in c fajla, kar je meni osebno zelo pregledno. Jaz sem pač pedagog in je to moja poklicna deformacija hehe. Skoraj vsaka vrstica ima komentar znotraj /**/,
ki mogoče ni pravilen (v kolikor najdete napako prosim postajte) poleg tega so pomembne barve:
modra črta je le komentar za določen blok,
zelena črta vas vodi do teorije, ki stoji za neko številko, ki je obarvana z zelenim markerjem
rdeča črta prikazuje povezave (branchi, loopi, povezave iz linker skripte v startup kodo itd)
Potem so tu rdeči bloki, ki nosijo tudi številko. To so deli kode, katerih zaenkrat še ne razumem in potrebujem pomoč. Bom kar napisal, kaj me v posamezni rdeči sekciji zanima:
1: Ne razumem, kdaj sploh program pride do te kode, saj branch instruction B arm926ejs_reset_handler vedno preskoči ta del kode, nobena labela pa ni definirana kot .global, da bi do nje lahko dostopal kak drug objekt. Tu mi niso razumljivi ukazi podobni temu .word 0,0,0,...
2: Tu ni velike krize ampak me zanima zakaj z SUB odštejemo #4 ter s tem naredimo premik. Omenja neko MMU tabelo, ki naj bi se začela tu in naj bi bila velika 16k, ampak kako vem, da je velika ravno 16k.
3: Tu naj bi se initializirala celotna plata, na kateri je lcd, ..., nato bi branch with link poskrbel, da se startup koda nadaljuje. Ali to lahko brišem v kolikor želim prižigati le led?
4: Tu so NOP ukazi zato, da počistijo ARM pipeline a jih prav tako kot se je to že zgodilo zgoraj vedno preskoči branch instruction.
5: Pred to sekcijo startup koda že skoči v c_entry funkcijo c programa in spodnja koda za flushanje cache nikoli ne pride v veljavo. Zanima me, ali je mogoče iz c programa skoči nazaj na kodo za flushanje cache, navsezadnje je v kodi labela dcache_flush, ki je na začetku definirana tudi z .global. V kodi za flushanje cache je tudi vrstica MOV pc, lr, a link registra nisem nastavil nikjer razen v 3 sekciji z [slovenščina je zame španska vas] (branch with link), kar je čudno. Ali mogoče že ukaz MRC postavi link register?
Upam, da mi lahko pomagate razumeti še nejasne sekcije, drugače pa mislim, da sedaj že veliko bolje razumem zadevo. Upam, da bo slika pomagala še komu drugemu razumeti boot proces za ARM926EJ-s procesor.
Zakaj to počnem? Poiskušam programirati LPC3141 na linuxu, kjer ne delajo startup kode napisane za Windows in moram na žalost napisati svojo. Ko jo bom imel lahko presedlam na C jezik ali C++, za katerega bom moral startup kodo še malo spremeniti.
Opis: |
Slika je velika 8000x6000 in požrešna do procesorja. |
|
Velikost datoteke: |
3.02 MB |
Pogledana: |
14 krat |

|
Nazadnje urejal/a 71GA Pet Feb 25, 2011 12:09 am; skupaj popravljeno 3 krat |
|
Nazaj na vrh |
|
 |
VolkD Član


 
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 59.91 Kraj: Divača (Kačiče)
|
Objavljeno: Čet Feb 24, 2011 11:54 pm Naslov sporočila: |
|
|
71GA je napisal/a: |
Jaz sem pač pedagog in je to moja poklicna deformacija hehe. Skoraj vsaka vrstica ima komentar znotraj /**/,
ki mogoče ni pravilen (v kolikor najdete napako prosim postajte) poleg tega so
|
71GA je napisal/a: |
Zakaj to počnem? Poiskušam programirati LPC3141 na linuxu, kjer ne delajo startup kode napisane za Windows in moram na žalost napisati svojo. Ko jo bom imel lahko presedlam na C jezik ali C++, za katerega bom moral startup kodo še malo spremeniti. |
Hmmm... nebi pripravil vse tole v kaki primerni obliki za objavo v naši reviji ?
_________________ Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo. |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Čet Feb 24, 2011 11:59 pm Naslov sporočila: |
|
|
VolkD je napisal/a: |
71GA je napisal/a: |
Jaz sem pač pedagog in je to moja poklicna deformacija hehe. Skoraj vsaka vrstica ima komentar znotraj /**/,
ki mogoče ni pravilen (v kolikor najdete napako prosim postajte) poleg tega so
|
71GA je napisal/a: |
Zakaj to počnem? Poiskušam programirati LPC3141 na linuxu, kjer ne delajo startup kode napisane za Windows in moram na žalost napisati svojo. Ko jo bom imel lahko presedlam na C jezik ali C++, za katerega bom moral startup kodo še malo spremeniti. |
Hmmm... nebi pripravil vse tole v kaki primerni obliki za objavo v naši reviji ? |
Brez problema, ampak ko bo končano in ko bom uspel izvesti vsaj nekaj praktičnih primerov.
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Ned Feb 27, 2011 12:45 am Naslov sporočila: |
|
|
Sem se malo igral in sem napisal preprost c program po imenu c_program.c:
Koda: |
int c_entry() {
return 0;
}
|
Potem sem pretvoril startup_kodo in c_program.c v objektno kodo za kar sem uporabil spodnja 2 ukaza:
Koda: |
arm-none-eabi-gcc -mcpu=arm926ej-s -c -o c_program.o c_program.c
arm-none-eabi-as -mcpu=arm926ej-s -c -o startup_koda.o startup_koda
|
Sedaj sem dobil 2 objektni datoteki startup_koda.o in c_program.o, kateri sem z linkerjem poiskušal povezati v executable program, kar mi vrže napako.
Koda: |
arm-none-eabi-ld startup_koda.o c_program.o -Tlinker_skripta
startup_koda.o: In function `clearzi_exit':
(.text+0x140): undefined reference to `ea3141_init'
|
Napaka se nanaša na nedefinirano referenco znotraj startup kode. Če pogledate je to tisti del startup kode, ki naj bi initializiral celotno plato. Predvidevam, da za preprost GPIO primer, kot je utripanje LED diode najbrž ne potrebujem initializacije celotne plate, zato del kode za initializacijo plate v starup kodi zakomentiram z /* in */:
Koda: |
/*[slovenščina je zame španska vas] ea3141_init*/ |
Poiskusim ponovno zlinkati program in kot rezultat dobim executable program, kar pomeni, da je moja startup koda v redu??? Upam, da sem to prebrodil sedaj. Torej kar bom poiskušal narediti naprej je, da bom v c program tako dodelal, da bom lahko uporabljal GPIO. Upam, da mi uspe.
|
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.64 Kraj: Zagorje ob Savi
|
Objavljeno: Ned Feb 27, 2011 11:20 am Naslov sporočila: |
|
|
Naj bi bilo v redu, kar čim hitreje sprobat!
Bo pa ta koda primerna za direkten vpis v RAM - če bi hotel program posneti v ROM, bi moral v linker skripti preusmeriti text in rodata sekcijo v ROM, plus dopisati v startup kodi kopiranje data sekcije iz ROM v RAM.
LP!
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Ned Feb 27, 2011 12:19 pm Naslov sporočila: |
|
|
chaos je napisal/a: |
Naj bi bilo v redu, kar čim hitreje sprobat!
Bo pa ta koda primerna za direkten vpis v RAM - če bi hotel program posneti v ROM, bi moral v linker skripti preusmeriti text in rodata sekcijo v ROM, plus dopisati v startup kodi kopiranje data sekcije iz ROM v RAM.
LP! |
To bi bilo fino, če bi želel, da se program ne izbriše ob odvzemu napajanja. Sicer vem, kako v linker skripti definirati ram in rom in kako sekcijo z ukazom npr > IROM nato posnamem tja, ampak ni mi čisto jasno, kaj je potrebno dodati v startup kodo. Predvidevam, da bi se moral malo igrati z location countrom (.). Ampak to kasneje.
Sem poiskusil naložiti executable v mikrokontroler in se je naložilo, a ne vidim rezultata, ker program tako ali tako vrne le 0.
Če se ne motim je prižiganje LED diode še najlažji način, da preverim, če program deluje. No ja v glavnem sem že gledal nekaj primerov za GPIO in vedno naredijo tako, da v header datotekah definirajo registre za set reset GPIO, nato pa te uporabljajo v c_programu.
|
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 7 dni
Powered by phpBB © 2001, 2005 phpBB Group
|