 |
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: Pon Jan 03, 2011 11:33 pm Naslov sporočila: GCC ima kdo izkušnje oziroma to obvlada? |
|
|
Ali kdo tukaj obvlada GCC (GNU Compiler Collection).
Zanima me par stvari v zvezi z "arm-none-eabi-gcc" compilerjem in z "arm-none-eabi-ld" linkerjem. |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Tor Jan 04, 2011 3:41 am Naslov sporočila: |
|
|
Kaj te pa zanima?
LP! |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Tor Jan 04, 2011 6:58 am Naslov sporočila: |
|
|
Imam 2 vprašanji vbistvu:
Kaj mogoče veš ali je bolje inštalirati kar GNU binutils ali naj kar raje uporabim paket code Sourcery G++ Lite? Prevajal bom za ARM9 jedro.
Kako bi izgledala terminalska ukaza za compilanje, linkanje za ARM9 jedro? Ne vem namreč katero linker skripto moram izbrati za ARM 9 jedro...
LP Žiga |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Sre Jan 05, 2011 4:02 pm Naslov sporočila: |
|
|
Hej.
Jaz bi na tvojem mestu uporabil Code Sourcery paket.
Kar se pa tice ukazov za prevajanje, imas pa tukaj kar nekaj branja in poskusanja pred sabo.
Za prevajanje rabis naslednje stvari:
- gcc - c prevajalnik
- ld - linker
- tvoj program (.c)
- 'boot' assembler kodo
- linker skripto
- po moznosti Makefile
Normalno prevajanje z gcc-jem je tako:
gcc source.c -o program
kjer je source.c izvorna C koda, program je pa (izhodno) ime za program. Tukaj bo ze gcc opravil delo linkerja, kar pa v primeru embedded compilerja ne bo slo. Ti moras namrec uporabit svojo linker skripto, s katero linkerju poves, kje je v tvojem sistemu ram, kje rom (flash), in katere dele programa naj da v kaksen del pomnilnika.
Torej v tvojem primeru prevajanje izvajas tako (lahko si napises Makefile skripto, ki bo poskrbela za pravilno klicanje programov, samo to je ze cisto druga tema):
1. prevedes boot kodo (prevedes brez linkanja - compiler ti zgenerira samo object file):
gcc start.S -c -o start.o
2. prevedes svoj program (isto brez linkanja):
gcc source.c -c -o source.o
3. zlinkas svoje object file s svojo linker skripto:
ld -Tskripta.ld -o program.arm start.o source.o
4. iz zgeneriranega .elf fajla naredis .bin primeren za programiranje cipa:
objcopy -O binary program.arm program.bin
To je bil en schnellkurz, ce pa bos resno delal s gcc-jem, si bos moral prebrati nekaj dokumentacije, npr. parametri za gcc, kako napisati Makefile, kako napisati linker skripto, kako napisati boot kodo, ...
Za zacetek najdi nekje na internetu kaksen primer za gcc za tvoj procesor, ki vsebuje vsaj boot kodo in linker skripto, po moznosti pa se Makefile. Boot koda mora najmanj nastaviti stack, skopirati data sekcijo iz roma, pocisititi bss sekcijo in skociti v c-jevsko main() funkcijo. Linker skripta je pa lahko zelo preprosta, v njej lahko samo definiras lokacijo in velikost RAMa in ROMa, ter za zacetek lahko vse sekcije usmeris v ram (s tem odpade se kopiranje data sekcije!).
Kot sem rekel, za zacetek najdi nek primer na internetu in ga predelaj, ko se bodo pojavila kaksna nova vprasanja, pa kar napisi.
LP! |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Sre Jan 05, 2011 8:33 pm Naslov sporočila: |
|
|
No takole. Sem si namestil Code Sourcery (poiskusno dobo ne Lite) Moj mikroprocesor je LPC3141, ki ima jedro ARM926EJ-s, kar je razlog, da v ukaz vključim opcijo mcpu=arm926ej-s. Moj ukaz izgleda takole:
Koda: |
arm-none-eabi-gcc -Wall -mcpu=arm926ej-s program.c -o executable |
Ukaz mi na žalost ne vrne rezultata temveč napako:
Koda: |
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 00008020
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x14): undefined reference to `_sbrk'
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text+0x1c): undefined reference to `_write'
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text+0x14): undefined reference to `_close'
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text+0x18): undefined reference to `_fstat'
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text+0x14): undefined reference to `_isatty'
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text+0x1c): undefined reference to `_lseek'
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libc.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text+0x1c): undefined reference to `_read'
collect2: ld returned 1 exit status
|
Če dobro preberem napako vidim besedo undefined reference to. Po tem sklepam, da napaka tiči v tem, da so reference do večih funkcij funkcij (_read_r, _lseek_r, _isatty_r,... ) nerazrešljive brez zunanje knjižnice imenovane libc.a. Očitno se compiler ne zlinka
na omenjeno knjižnico. Zatorej sklenem, da v ukaz dodam pot do knjižnice (naj te ne bega pot, ki je pot v linux-u) in moj ukaz nato izgleda takole.
Koda: |
arm-none-eabi-gcc -Wall -mcpu=arm926ej-s /home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a program.c -o executable |
Kljub temu, da sem navedel pot do knjižnice pa mi javi isto napako. Poiskusil sem tudi naslednje. In namreč, da bi najprej source datoteko le scompilal tako, da dobim objektno datoteko in šele nato bi to objektno datoteko zlinkal v executable file. Source datoteko sem poiskusil zlinkati z ukazom
Koda: |
arm-none-eabi-gcc -Wall -mcpu=arm926ej-s program.c -c |
kar mi vrne objektno datoteko program.o. Sledi drugi korak, kjer poiskusim objekt zlinkati z ukazom
Koda: |
arm-none-eabi-ld program.o |
ki mi vrne napako
Koda: |
arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 00008000
program.o: In function `main':
program.c:(.text+0x7c): undefined reference to `printf' |
Dodam pot do knjižice libc.a, ki vsebuje funkcijo printf.
Koda: |
arm-none-eabi-ld /usr/lib/libc.a program.o |
kar mi zopet vrže novo napako,
Koda: |
rm-none-eabi-ld: /usr/lib/libc.a(printf.o): Relocations in generic ELF (EM: 3)
arm-none-eabi-ld: /usr/lib/libc.a(printf.o): Relocations in generic ELF (EM: 3)
/usr/lib/libc.a: could not read symbols: File in wrong format
|
No ker še vedno ne obupam poiskusim navesti pot še do druge libc.a knjižnice v inštalacijski mapi codesourcery (cs). Za to uporabim spodnji ukaz.
Koda: |
arm-none-eabi-ld program.o /home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a |
Ukaz zopet vrne napako:
Koda: |
arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 00008000
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-vfprintf.o): In function `_vfprintf_r':
vfprintf.c:(.text+0x5fc): undefined reference to `__aeabi_dcmplt'
vfprintf.c:(.text+0x758): undefined reference to `__aeabi_dcmpeq'
vfprintf.c:(.text+0x78c): undefined reference to `__aeabi_dcmpeq'
vfprintf.c:(.text+0x83c): undefined reference to `__aeabi_idivmod'
vfprintf.c:(.text+0x854): undefined reference to `__aeabi_idiv'
vfprintf.c:(.text+0xd6c): undefined reference to `__aeabi_uldivmod'
vfprintf.c:(.text+0xd88): undefined reference to `__aeabi_uldivmod'
vfprintf.c:(.text+0x12c4): undefined reference to `__aeabi_dcmpeq'
vfprintf.c:(.text+0x1960): undefined reference to `__aeabi_dcmpeq'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-dtoa.o): In function `quorem':
dtoa.c:(.text+0x48): undefined reference to `__aeabi_uidiv'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-dtoa.o): In function `dtoa':
dtoa.c:(.text+0x2b8): undefined reference to `__aeabi_dcmpeq'
dtoa.c:(.text+0x384): undefined reference to `__aeabi_ui2d'
dtoa.c:(.text+0x3a4): undefined reference to `__aeabi_dsub'
dtoa.c:(.text+0x3b0): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0x3bc): undefined reference to `__aeabi_dadd'
dtoa.c:(.text+0x3cc): undefined reference to `__aeabi_i2d'
dtoa.c:(.text+0x3d8): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0x3ec): undefined reference to `__aeabi_dadd'
dtoa.c:(.text+0x3f8): undefined reference to `__aeabi_d2iz'
dtoa.c:(.text+0x410): undefined reference to `__aeabi_dcmplt'
dtoa.c:(.text+0x420): undefined reference to `__aeabi_i2d'
dtoa.c:(.text+0x434): undefined reference to `__aeabi_dcmpeq'
dtoa.c:(.text+0x460): undefined reference to `__aeabi_dcmpgt'
dtoa.c:(.text+0x640): undefined reference to `__aeabi_ddiv'
dtoa.c:(.text+0x688): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0x6b4): undefined reference to `__aeabi_ddiv'
dtoa.c:(.text+0x6e4): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0x71c): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0x774): undefined reference to `__aeabi_dcmplt'
dtoa.c:(.text+0x7b0): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0x7dc): undefined reference to `__aeabi_i2d'
dtoa.c:(.text+0x7e4): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0x7f0): undefined reference to `__aeabi_dadd'
dtoa.c:(.text+0x824): undefined reference to `__aeabi_dsub'
dtoa.c:(.text+0x838): undefined reference to `__aeabi_dcmpgt'
dtoa.c:(.text+0x85c): undefined reference to `__aeabi_dcmplt'
dtoa.c:(.text+0x89c): undefined reference to `__aeabi_ddiv'
dtoa.c:(.text+0x8a4): undefined reference to `__aeabi_dsub'
dtoa.c:(.text+0x8d8): undefined reference to `__aeabi_d2iz'
dtoa.c:(.text+0x8e0): undefined reference to `__aeabi_i2d'
dtoa.c:(.text+0x8f4): undefined reference to `__aeabi_dsub'
dtoa.c:(.text+0x90c): undefined reference to `__aeabi_dcmplt'
dtoa.c:(.text+0x928): undefined reference to `__aeabi_dsub'
dtoa.c:(.text+0x930): undefined reference to `__aeabi_dcmplt'
dtoa.c:(.text+0x960): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0x974): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0x990): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0x9c0): undefined reference to `__aeabi_d2iz'
dtoa.c:(.text+0x9c8): undefined reference to `__aeabi_i2d'
dtoa.c:(.text+0x9dc): undefined reference to `__aeabi_dsub'
dtoa.c:(.text+0xa14): undefined reference to `__aeabi_dadd'
dtoa.c:(.text+0xa30): undefined reference to `__aeabi_dcmpgt'
dtoa.c:(.text+0xa48): undefined reference to `__aeabi_dsub'
dtoa.c:(.text+0xa58): undefined reference to `__aeabi_dcmplt'
dtoa.c:(.text+0xa88): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0xb18): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0xb20): undefined reference to `__aeabi_dcmpge'
dtoa.c:(.text+0xb3c): undefined reference to `__aeabi_ddiv'
dtoa.c:(.text+0xb40): undefined reference to `__aeabi_d2iz'
dtoa.c:(.text+0xb4c): undefined reference to `__aeabi_i2d'
dtoa.c:(.text+0xb54): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0xb64): undefined reference to `__aeabi_dsub'
dtoa.c:(.text+0xb84): undefined reference to `__aeabi_dadd'
dtoa.c:(.text+0xb98): undefined reference to `__aeabi_dcmpgt'
dtoa.c:(.text+0xbb0): undefined reference to `__aeabi_dcmpeq'
dtoa.c:(.text+0xc1c): undefined reference to `__aeabi_dmul'
dtoa.c:(.text+0xc30): undefined reference to `__aeabi_dcmpeq'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-mprec.o): In function `__s2b':
mprec.c:(.text+0x17c): undefined reference to `__aeabi_idiv'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-mprec.o): In function `__ratio':
mprec.c:(.text+0xaa4): undefined reference to `__aeabi_ddiv'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-mprec.o): In function `_mprec_log10':
mprec.c:(.text+0xae0): undefined reference to `__aeabi_dmul'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x14): undefined reference to `_sbrk'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text+0x1c): undefined reference to `_write'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text+0x14): undefined reference to `_close'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text+0x18): undefined reference to `_fstat'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text+0x14): undefined reference to `_isatty'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text+0x1c): undefined reference to `_lseek'
/home/ziga/Projects/cs/arm-none-eabi/lib/armv5te/libc.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text+0x1c): undefined reference to `_read'
|
Tu se vse konča in ne vem več, kaj naj naredim. Se trudim in berem vse manuale, ki jih je priložil codesourcery + knjigo o GCC, pa mi nekako ne gre tole.
Ima mogoče kdo kako idejo? Če se bo komu tole sploh dalo brati. |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Čet Jan 06, 2011 12:39 am Naslov sporočila: |
|
|
No, me veseli, da si se malo potrudil in še nisi odnehal.
Vendar nisi dobro prebral, kaj sem ti napisal, nisi dobro prebral priložene dokumentacije (Getting Started, 4.1 Building an Application), in verjetno nisi poguglal napake, kjer je že prvi zadetek dober namig, kaj bi lahko bilo narobe.
Najprej o libc : kot prvo, to je (osnovna) knjižnica, ki je ne podaš kot nek izvoren c fajl prevajalniku, ampak se že privzeto vključi v tvoj program, razen če eksplicitno ne zahtevaš drugače. Knjižnice se drugače vključuje v program s parametrom -l, npr. -lm za math lib. Tebi ne manjka ta knjižnica, ampak low-level sistemske funkcije, t.i. syscall-i, ki jih ta knjižnica nima - jasno, za to ponavadi poskrbi operacijski sistem, v tvojem primeru brez operacijskega sistema ( t.i. barebone sistem), pa moraš za te funkcije poskrbeti drugače - jih napišeš sam oz. so del neke druge knjižnice.
Druga napaka pa omenja manjkajoč _start simbol - to je pa tista boot koda, o kateri sem govoril - _start je namreč t.i. entry point oz. točka, na kateri se program začne izvajat. Ta se mora ponavadi nahajati na naslovu reset vektorja procesorja.
Vse to boš rešil z uporabo primerne linker skripte, kot je napisano v Getting Started dokumentu, citiram:
Citiram: |
Sourcery G++ requires that you specify a linker script with the -T option to build applications for bare-board targets. Linker errors like undefined reference to `read' are a symptom of failing to use an appropriate linker script. Default linker scripts are provided in arm-none-eabi/lib. Refer to Chapter 5, “CS3™: The CodeSourcery Common Startup Code Sequence” for information about the boards and linker scripts supported by Sourcery G++ Lite. You must also add the processor options for your board, as documented in that chapter, to your compile and link command lines. |
Veselo naprej na delo, pa veliko uspeha!
LP! |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Čet Jan 06, 2011 8:50 am Naslov sporočila: |
|
|
OOO res hvala za tale info. Ravno tole, ko si ti citiral sem miljonkrat prebral pa sem predvideval, da je nekaj s tem ampak mi ni kapnilo. No bom sedaj poiskusil nekaj v tem smislu.
Preden začnem bi samo vprašal ali je moj ukaz za pretvorbo iz program.c v program.o v redu, ali je že na tem mestu potrebno navesti kaj, kar potem uporabi linker?
Koda: |
arm-none-eabi-gcc -Wall -mcpu=arm926ej-s program.c -c |
Upam, da je okej, ker mi ne javi napak. V kolikor je okej, potem grem lahko mirne vesti na linker, drugače pa sem malo v dvomih stalno.
Hvala. |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Čet Jan 06, 2011 9:40 am Naslov sporočila: |
|
|
Je OK. Najprej vse C oz. asm fajle prevedeš v objektno kodo, nato jih pa zlinkaš.
Druga opcija je pa, da kar prevajalniku podaš linker skripto z -T parametrom, in jo bo potem prevajalnik poslal linkerju, takole:
Koda: |
rm-none-eabi-gcc -Wall -mcpu=arm926ej-s program.c -o program.elf -Tlink_skripta.ld |
LP! |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Čet Jan 06, 2011 11:35 am Naslov sporočila: |
|
|
Trenutno sem v službi, pa ne morem nič stestirati. Bom obvestil o rezultatih ko pridem domov. Zaenkrat bi samo še nekaj vprašal. Kaj bi delovalo če bi najprej z compilerjem prevedel iz .c v .o in nato uporabil ukaz za linker?
Koda: |
arm-none-eabi-ld program.o -Tlinker_skripta.ld |
Predvidevam, da mi nastavitve -mcpu=arm926ej-s v zgornjem ukazu ni več treba uporabiti kaj ne?
PS: Tole z linker skripto je lažja pot a mi najbolj všeč, ker prikrije, kaj se dogaja v ozadju. Raje bi se naučil, kako sam napišem 'boot' assembler kodo, linker skripto in Makefile. Če bi to znal bi bla BOMBA  |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Čet Jan 06, 2011 7:13 pm Naslov sporočila: |
|
|
No in še obljubljeni rezultati.
Po prebiranju dokumentacije sem naletel na primerno linker skripto, ki je v bistvu za mikrokontroler LPC3250 a ima procesor enako jedro, kot moj LPC3141, tako da mislim, da nebi smelo biti težav.
Program sem skompilal kot je prikazano spodaj.
Koda: |
arm-none-eabi-gcc -Wall -mcpu=arm926ej-s program.c -o program.elf -Tphycore-lpc3250-ram.ld
|
kar sicer sproducira .elf datoteko a vrne tudi napako.
Koda: |
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libcs3unhosted.a(unhosted-_close.o): warning: IO function '_close' used
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libcs3unhosted.a(unhosted-_fstat.o): warning: IO function '_fstat' used
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libcs3unhosted.a(unhosted-isatty.o): warning: IO function '_isatty' used
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libcs3unhosted.a(unhosted-_lseek.o): warning: IO function '_lseek' used
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libcs3unhosted.a(unhosted-_read.o): warning: IO function '_read' used
/home/ziga/Projects/cs/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/armv5te/libcs3unhosted.a(unhosted-_write.o): warning: IO function '_write' used
|
.elf datoteko sem nato s pomočjo ukaza objcopy spravil v .bin datoteko
Koda: |
arm-none-eabi-objcopy -O binary program.elf program.bin
|
No ko to binary datoteko poizkušam naložiti na moj target (uporabljam aplikacijo dfu-util), mi vrne napako. Pa sem spet malo obtičal. Mislim, da je ta napaka posledica napake že višje zgoraj.
Nalaganje:
Koda: |
sudo dfu-util -D program.bin
|
Napaka:
Koda: |
dfu-util - (C) 2007-2008 by OpenMoko Inc.
This program is Free Software and has ABSOLUTELY NO WARRANTY
Opening USB Device 0x0000:0x0000...
Claiming USB DFU Runtime Interface...
Determining device status: state = dfuDNLOAD-IDLE, status = 0
WARNING: Runtime device already in DFU state ?!?
Found Runtime: [0x0471:0xdf55] devnum=2, cfg=0, intf=0, alt=0, name="UNDEFINED"
Claiming USB DFU Interface...
Setting Alternate Setting ...
Determining device status: state = dfuDNLOAD-IDLE, status = 0
aborting previous incomplete transfer
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
Error obtaining DFU functional descriptor: error sending control message: Broken pipe
Transfer Size = 0x1000
bytes_per_hash=708
Starting download: [dfu_download error -32
Error during download
|
|
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.65 Kraj: Zagorje ob Savi
|
Objavljeno: Čet Jan 06, 2011 10:19 pm Naslov sporočila: |
|
|
71GA je napisal/a: |
kar sicer sproducira .elf datoteko a vrne tudi napako.
|
To niso napake, ampak opozorila - warningi. Je tudi v dokumentaciji napisano, zakaj in kako. Sem poguglal namesto tebe:
Citiram: |
Getting Started Guide, section 3.1.1.5.2
CS3 is designed to support boards where there may be no operating
system. To allow functions like open and write to work, a semihosting
feature is supported, in conjunction with the debugger. With semihosting
enabled, these system calls are translated into equivalent function
calls on your host system. You can only use these function calls while
connected to the debugger; if you try to use them when disconnected from
the debugger, you will get a hardware exception.
The hosted CS3 linker scripts provide the semihosting support, and as
such programs linked with them may only be run with the debugger. The
unhosted CS3 linker scripts provide stub versions of the system calls,
which return an appropriate error value in errno. If such a stub system
call is required in the executable, the linker also produces a warning.
Such a warning may indicate that you have left debugging code active,
and that your executable is larger than it might need to be. |
Mogoče bi tudi razmislil o neuporabi funkcij kot so printf, scanf, malloc ipd. To so funkcije, za katere rabiš te sistemske klice, in jih lahko napišeš sam, po potrebi.
Citiram: |
.elf datoteko sem nato s pomočjo ukaza objcopy spravil v .bin datoteko
|
Kar pa delaš tu naprej, pa ne morem vedeti, če je pravilno. Postopek z objcopy se uporablja, če program nalagaš preko JTAGa ali serijskega porta direktno v pomnilnik oz. flash (jaz sem mislil, da boš počel to), kaj točno rabi pa ta tvoj dfu-util program, moraš pa prebrati v navodilih.
Drugače dvomim, da je težava s tistimi warningi, ki si jih prilepil zgoraj, bolj verjetno je, da ta dfu-util hoče komunicirati z nekim programom (kakšen bootloader, npr. uboot?) na procesorju, in ta komunikacija ne uspe. Mogoče .bin ni pravi format, poskusi kar z .elf.
Tukaj ti ne morem več pomagati, bo treba malo dokumentacije prebrati
Mimogrede, kakšen board sploh uporabljaš?
LP! |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Pet Jan 07, 2011 1:26 pm Naslov sporočila: |
|
|
Takole sem si prebral poglavje, ki govori o CS3 in 3 fazah za CS3 startup phase, ki mene najbolj zanima, saj mi takorekoč zaradi tega javlja napake. Glede posameznih 3 faz je bolj malo napisanega a sem si ob branju ogledal linker skripto generic.ld in si pomagal z njo pa še vedno mi ni skoraj nič jasno.
HARD RESET PHASE:
kar sem ugotovil iz tega podpoglavja je to, da ukaz __cs3_reset začne fazo in da vklopi memory controller in postavi memory map. To fazo končamo z ukazom za vklop naslednje faze. Pove samo še to, da se koda za hard reset nahaja v sekciji .cs3.reset. To sekcijo sem res našel znotraj linker skripte generic. ld in izgleda takole:
Koda: |
*(.cs3.reset)
__cs3_start_asm_sim = DEFINED(__cs3_start_asm) ? __cs3_start_asm : __cs3_start_asm_sim;
|
No tega si nekako ne znam razložiti...
ASSEMBLY INITIALIZATION PHASE:
Se začne z __cs3_start_asm in se konča z __cs3_start_c. Tu se bojda pripravi stack za poganjanje C kode
C INITIALIZATION PHASE:
Se začne z ukazom --cs3_start_c. Ta faza pa naj bi pripravila podatkovna področja, poganjala konstruktorje za statično določljive objekte in naj bi poklicala tudi funkcijo main.
Tu se najbrž potlej kliče naš napisani program. A meni tu nikakor ni jasno, kako naj bi jaz napisal nekaj podobnega za moj procesor LPC3141. Sploh ne vem kje začeti...
|
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Ned Jan 30, 2011 12:02 pm Naslov sporočila: |
|
|
Mogoče kdo priporoča literaturo za pisanje linker skript in boot kode za ARM? |
|
Nazaj na vrh |
|
 |
domen_puncer Član

Pridružen-a: Čet 01 Maj 2008 13:30 Prispevkov: 78 Aktiv.: 0.37 Kraj: Ljubljana, Mozirje
|
Objavljeno: Ned Jan 30, 2011 12:58 pm Naslov sporočila: |
|
|
Hja, ce gres tako nizko, dvomim, da bos nasel dosti "enostavnega" branja.
Poglej ld manual, za boot kodo bo treba pa malo nastudirat arm7tdmi/arm-cortex-m3 trm (technical reference manual).
Dosti prav pridejo tudi primeri. Nic nimam proti, ce ukrades oboje iz [slovenščina je zame španska vas] mojega projektka: http://repo.or.cz/w/cbaos.git/tree/HEAD:/arch (reset handlerji v crt.c za vsako arhitekture; handlanje .data/.bss sekcij v init.c; linker skripte po ld direktorijih).
Ce ze pa ves kaj tocno ne ves, me pa poisci na ircu al nekje. _________________ Tiskanje sudoku |
|
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: 6 dni
Powered by phpBB © 2001, 2005 phpBB Group
|