www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

[SOLVED] Od izvornih datotek do statične knjižnice. (UBUNTU)

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Čet Jan 20, 2011 11:29 pm    Naslov sporočila:  [SOLVED] Od izvornih datotek do statične knjižnice. (UBUNTU) Odgovori s citatom

Živijo!

Me zanima ali kdo ve, kako si lahko iz izvornih datotek sestavim kakršno koli knjižnico, katero lahko nato uvažam v programe.

Situacija je, da sem dobil izvorno kodo za ADC, PWM, timerje, ... za procesor LPC3141 in sedaj moram iz teh datotek, ki so imenovane:

    lpc313x_pwm_driver.c
    lpc313x_timer_driver.c
    lpc313x_adc10b_driver.c

Imam tudi header datoteke posledično imenovane:

    lpc313x_pwm_driver.h
    lpc313x_timer_driver.h
    lpc313x_adc10b_driver.h

Kako lahko sedaj iz teh datotek na Linuxu sestavim knjižnico, da jo bom lahko nemoteno uporabljal. Zanima me še, ali so izvorne datoteke napisane tako, da so neodvisne od operacijskega sistema?

Že vnaprej se zahvaljujem za odgovore.


Nazadnje urejal/a 71GA Sre Mar 16, 2011 11:33 am; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Pet Jan 21, 2011 9:26 am    Naslov sporočila:   Odgovori s citatom

Še nekaj me zanima. V kolikor prevedem program z uporabo ukaza
Koda:
 arm-none-eabi-gcc -mcpu=926ej-s -Wall -g

Ali je potrebno objekte knjižnice prevesti z istim ukazom (z dodatkom -c), da bodo delovale na arm?
Koda:
 arm-none-eabi-gcc -mcpu=926ej-s -Wall -g -c


Če sem, prav razumel vodiče po spletu moram najprej prevesti vse source datoteke z zgornjim ukazom v objektne datoteke, katere potem nekako povežem v knjižnico z archieverjem...
Koda:
ar -cvq mojaknjiznica.a <tu navedemo objektne datoteke>

Ko je knjižnica ustvarjena bojda lahko preverimo, kateri objekti so v knjižnici. To storimo s spodnjim ukazom.
Koda:
ar -t mojaknjiznica.a

In na koncu je bojda potrebno knjiznico povezati s programom (npr. prog.c). To lahko storimo na več načinov:
Koda:
cc -o executable-name prog.c mojaknjiznica.a
cc -o executable-name prog.c -L/.../.../.../mojaknjiznica.a -lctest
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
MarkoM
Član
Član



Pridružen-a: Tor 12 Sep 2006 15:29
Prispevkov: 2825
Aktiv.: 12.34
Kraj: Lovrenc na P.

PrispevekObjavljeno: Pet Jan 21, 2011 9:44 am    Naslov sporočila:   Odgovori s citatom

V program includaš header datoteke in je to to. Mogoče bi bilo bolje, da bi se počasi začel ukvarjati s C programiranjem... v enem IDE-ju...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Pet Jan 21, 2011 10:08 am    Naslov sporočila:   Odgovori s citatom

MarkoM je napisal/a:
V program includaš header datoteke in je to to. Mogoče bi bilo bolje, da bi se počasi začel ukvarjati s C programiranjem... v enem IDE-ju...


Mislim, da ni tako enostavno, ker moja knjižnica še ni sploh narejena in jo zatorej ne morem klicati s headerji. Zakaj se ne ukvarjam z IDE? Zdi se mi, da IDE zakrije preveč stvari, ki so pomembne za celovito razumevanje. Sploh pa je to zakrivanje prisotno na operacijskem sistemu Windows, kjer operacijski sistem vse naredi kar sam... V kolikor, bi rad potlej delal kaj resnega vedno končaš tu kot jaz. Se pravi v ukazni vrstici operacijskega sistema Linux . d'oh!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
MarkoM
Član
Član



Pridružen-a: Tor 12 Sep 2006 15:29
Prispevkov: 2825
Aktiv.: 12.34
Kraj: Lovrenc na P.

PrispevekObjavljeno: Pet Jan 21, 2011 11:03 am    Naslov sporočila:   Odgovori s citatom

Če imaš .c datoteke s funkcijami in pripadajoče header datoteke, kjer so sklici na funkcije mi ni jasno kaj sploh sprašuješ.
Kjer hočeš uporabiti funkcijo iz tvojih .c datotek pač includaš header v katerem je sklic na tvojo funkcijo. Potem pa v programu enostavno kličeš funkcijo. Pa nima veze ali je windows ali linux ili nešto između.
Seveda moraš pa nekje navesti prevajalniku pot do tvojih .c datotek.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pet Jan 21, 2011 11:52 am    Naslov sporočila:   Odgovori s citatom

markom: ocitno hoce narediti svojo knjiznico, ne pa prevesti nekaj izvornih datotek v samostojec program, to je dovolj jasno napisano. Mogoce se splaca kdaj pa kdaj uporabit ukazno vrstico namesto IDE-ja, da so taksne stvari bolj jasne. Smile

71GA, moje spostovanje za trud, sem prav presenecen, ker vecina ljudi dandanes isce samo najlazjo pot do nekega rezultata, pa ce se zraven kaj naucijo ali pa ne. Ce bos kdaj resno delal z embedded sistemi ali pa mogoce celo nacrtoval lastne SOC-je, ti bo taksno znanje se zelo prav prislo.

Vendar se vedno premalo uporabljas Google Smile Kako narediti staticno knjiznico je zelo dobro razlozeno na vec mestih.

Vsi koraki, ki si jih napisal, so pravilni. Uporabi jih! Smile

71GA je napisal/a:
Še nekaj me zanima. V kolikor prevedem program z uporabo ukaza
Koda:
 arm-none-eabi-gcc -mcpu=926ej-s -Wall -g

Ali je potrebno objekte knjižnice prevesti z istim ukazom (z dodatkom -c), da bodo delovale na arm?
Koda:
 arm-none-eabi-gcc -mcpu=926ej-s -Wall -g -c



A tukaj te zanima ce je pomemben izbor arhitekture (-mcpu)? Seveda je, knjiznica mora biti prevedena za isti procesor kot tvoj program - knjniznica je namrec ze prevedena v strojni jezik, vse kar se naredi pri linkanju je relokacija kode in absolutno oz. relativno pozicioniranje spremenljivk in skokov.


LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Pet Jan 21, 2011 9:58 pm    Naslov sporočila:   Odgovori s citatom

Res hvala za tole pomoč in usmeritve fantje. Bom poročal, če mi bo uspelo sestaviti knjižnico.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Sob Jan 22, 2011 7:06 pm    Naslov sporočila:   Odgovori s citatom

Mi je uspelo s spodnjim ukazom ustvarit statično knjižnico polno objektov.
Koda:

ar -cvq liblpc3141.a ea3141_board.o ea3141_spinor.o libnosys_gnu.o lpc313x_adc10b_driver.o lpc313x_cgu_default.o lpc313x_cgu_driver.o lpc313x_crc_driver.o lpc313x_dma_driver.o lpc313x_evt_driver.o lpc313x_i2c_driver.o lpc313x_i2s_driver.o lpc313x_intc_driver.o lpc313x_ipint_driver.o lpc313x_mci_driver.o lpc313x_nand_driver.o lpc313x_pca9532_driver.o lpc313x_pwm_driver.o lpc313x_spi_driver.o lpc313x_timer_driver.o lpc313x_uart_driver.o lpc313x_wdt_driver.o lpc315x_otp_driver.o lpc315x_psu_driver.o lpc315x_rtc_driver.o lpc_api.o lpc_arm922t_cp15_driver.o lpc_bmp.o lpc_colors.o lpc_fat16.o lpc_fat16_private.o lpc_fonts.o lpc_heap.o lpc_helvr10.o lpc_lbecc.o lpc_lcd_params.o lpc_line_parser.o lpc_nandflash_params.o lpc_rom8x16.o lpc_rom8x8.o lpc_string.o lpc_swim_font.o lpc_swim_image.o lpc_swim.o lpc_winfreesystem14x16.o lpc_x5x7.o lpc_x6x13.o

Na žalost, ko knjižnico želim skompilati skupaj s katerim koli programom mi vrže napako v zvezi s header datoteko (vedno ista header datoteka).
Koda:

arm-none-eabi-gcc -mcpu=arm926ej-s -Wall -g -o executable pwm_example.c liblpc3141.a
In file included from pwm_example.c:23:0:
lpc_irq_fiq.h:28:26: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'disable_irq'
lpc_irq_fiq.h:43:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'disable_fiq'
lpc_irq_fiq.h:58:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'disable_irq_fiq'
lpc_irq_fiq.h:73:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'enable_irq'
lpc_irq_fiq.h:88:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'enable_fiq'
lpc_irq_fiq.h:103:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'enable_irq_fiq'
lpc_irq_fiq.h:118:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'disable_irq_fiq_mask'
lpc_irq_fiq.h:135:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'enable_irq_fiq_mask'
lpc_irq_fiq.h:152:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'restore_exceptions'
pwm_example.c: In function 'c_entry':
pwm_example.c:82:3: warning: implicit declaration of function 'disable_irq_fiq'
pwm_example.c:94:3: warning: implicit declaration of function 'enable_irq'

Sem gledal header pa ne vem, kje bi lahko bila napaka.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Ned Jan 23, 2011 1:44 pm    Naslov sporočila:   Odgovori s citatom

Evo napredek je... Našel sem startup source kodo startup.asm in vektor kodo vectors.asm, kateri sem spremenil v objekte in ju dodal v knjižnico. Poleg tega sem ugotovil, da sem uporabljal napačen ukaz za grajenje knjižnice. Namesto ar je potrebno uporabiti arm-none-eabi-ar in tako vse objekte skupaj z novima dvema povezati v knjižnico liblpc3141.a.

Ko želim prevesti primer programa skupaj s knjižnico, mi tokrat vrže veliko manj napak, kar pomeni, da se bližam rešitvi. Mislim, da sem že zelo blizu, ima mogoče kdo kako idejo, kaj mi še manjka. Tu je poročilo, ki ga dobim pri prevajanju:

Koda:

arm-none-eabi-gcc -g -Wall -mcpu=arm926ej-s adc_example.c liblpc3141.a -o executable
/home/ziga/projects/cs_lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 00008018
/home/ziga/projects/cs_lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x18): undefined reference to `_sbrk'
collect2: ld returned 1 exit status
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Ned Jan 23, 2011 2:28 pm    Naslov sporočila:   Odgovori s citatom

Ta napaka se verjetno navezuje na manjkajoče sistemske klice, o čemer smo govorili v eni drugi temi. Napačna linker skripta mogoče?

Definitivno pa najprej poskusi pravilno vključiti knjižnico, npr:

Koda:
gcc -static -Ipot/do/header/datotek -Lpot/do/knjiznice -llpc3141


Torej namesto da jo podaš kot izvorno datoteko gcc-ju (liblpc3141.a) napiši zgornje.

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Sob Jan 29, 2011 8:17 pm    Naslov sporočila:   Odgovori s citatom

Okej no sem poiskusil tako, kot si mi predlagal in dobim isto napako kot prej, ki je očitno povezana z linker skripto, o čemer sva razpravljala že v drugi temi.

Koda:

arm-none-eabi-gcc -Wall -mcpu=arm926ej-s adc_example.c -static -L/home/ziga/Desktop/test_lib -I/home/ziga/Desktop/test_lib -llpc3141
/home/ziga/projects/cs_lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 00008018
/home/ziga/projects/cs_lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text+0x18): undefined reference to `_sbrk'
collect2: ld returned 1 exit status

Očitno ne najde funkcij: _start, _sbrk_r
Nekaj linker skript je v neki podmapi programa codesourcery, kjer bi poiskusil z skripto "generic.ld" a ne vem, kako jo podati compilerju. Ali lahko to storim z opcijo -T in kako? Hvala.

Za mankajočimi funkcijami bom še malo pogledal na spletu in bom se oglasil, ko bom kaj novega odkril. Drugače pa obljubim, da o tem posnamem video, katerega bom objavil na youtubu in v več delih. Seveda, ko mi uspe.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Sob Jan 29, 2011 8:32 pm    Naslov sporočila:   Odgovori s citatom

No tako, ko uporabim linker skripto "generic.ld" dobim drugačen output. Zgoraj omenjenih pa ni več.
Koda:

arm-none-eabi-gcc -Wall -mcpu=arm926ej-s adc_example.c -static -L/home/ziga/Desktop/test_lib -I/home/ziga/Desktop/test_lib -llpc3141 -Tgeneric.ld
/home/ziga/projects/cs_lite/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/libcs3.a(start_c.o): In function `__cs3_premain':
start_c.c:(.text+0x28): undefined reference to `main'
collect2: ld returned 1 exit status

Očitno je še neka napaka v linker skripti v funkciji __cs3_premain...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.65
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Sob Jan 29, 2011 9:40 pm    Naslov sporočila:   Odgovori s citatom

Koda:
undefined reference to `main'


To pomeni, da ne najde funkcije main. Verjetno manjka v tvojem .c fajlu. Ali pa nisi podal prave datoteke linkerju.

LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Sob Jan 29, 2011 10:57 pm    Naslov sporočila:   Odgovori s citatom

Ali to pomeni, da sem rešil prejšnji dve napaki? S tem mislim mankajoči funkciji _start in _sbrk_r. Ali kdo mogoče ve za kako dobro literaturo o ustvarjanju svojih lastnih knjižnic, linker skript, startup fajlov, kjer bi bilo vse to razloženo?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Sre Mar 16, 2011 11:32 am    Naslov sporočila:   Odgovori s citatom

chaos je napisal/a:
Koda:
undefined reference to `main'


To pomeni, da ne najde funkcije main. Verjetno manjka v tvojem .c fajlu. Ali pa nisi podal prave datoteke linkerju.

LP!


Sem pisal na embedded artists in so mi rekli isto. Tako da v bistvu sem pravilno sestavil knjižnico, toda zafrknil sem pri c fajlu.

Hvala Chaos.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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