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 

ARM Linux cross-compiler
Pojdi na stran 1, 2  Naslednja
 
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
valekovski
Član
Član



Pridružen-a: Sob 18 Feb 2012 20:34
Prispevkov: 11
Aktiv.: 0.07

PrispevekObjavljeno: Sob Feb 18, 2012 8:44 pm    Naslov sporočila:  ARM Linux cross-compiler Odgovori s citatom

Hej

Na tem forumu sem nov, upam da sem postal v tapravo temo.

Zanima me, če je že kdo tukaj naložil linux na arm in sprogramiral v Cju. Imam FRI-SMS sistem (če kdo pozna), to je AT91SAM9260 proc. Iščem pa delujoč cross compiler. Na sistem je naložen linux kernel.

Preizkusil sem že gnuarm in arm-linux-gcc (vprašanje, če nista enaka), prevedel sem hello world s printf, pa se nič ne zgodi. Gnuarm celo povzroči segmentation fault se mi zdi. Aha, poizkusil sem tudi z opcijo -mcpu=arm9, rezultat isti.

Prosil bi za nasvet, če je že kdo delal s tem, da ne pogrevam tople vode Razz Hvala.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Mbili
Član
Član



Pridružen-a: Tor 03 Jan 2012 20:14
Prispevkov: 34
Aktiv.: 0.21
Kraj: Ljubljana

PrispevekObjavljeno: Sob Feb 18, 2012 9:34 pm    Naslov sporočila:   Odgovori s citatom

Najlažje prideš do cross-compilerja za fri-sms preko buildroot okolja. Na FRI-SMS spletnih straneh imaš že konfiguracijsko datoteko za buildroot 2011.11, ki ga dobiš na Buildroot spletni strani. Samo razpakiraš v Linuxu in v mapo buildroot-2011.11 skopiraš .config datoteko s FRI-SMS spletne strani. Poženeš še make in na buildroot-2011.11/output/... dobiš poleg GNU ASM še C, C++ cross-compilerje. Verjetno boš pred make moral na Linuxu instalirati še kakšen flex, itn., na kar te bo make pri buildroot že opomnil.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
valekovski
Član
Član



Pridružen-a: Sob 18 Feb 2012 20:34
Prispevkov: 11
Aktiv.: 0.07

PrispevekObjavljeno: Ned Feb 19, 2012 12:32 am    Naslov sporočila:   Odgovori s citatom

O super, hvala! To sem pa popolnoma spregledal. Povem kako se izide, ko bom imel čas stestirati, upam da že jutri. lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
valekovski
Član
Član



Pridružen-a: Sob 18 Feb 2012 20:34
Prispevkov: 11
Aktiv.: 0.07

PrispevekObjavljeno: Ned Feb 19, 2012 8:13 pm    Naslov sporočila:   Odgovori s citatom

Super! Zadeva deluje as advertised. Še enkrat hvala. LP
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
valekovski
Član
Član



Pridružen-a: Sob 18 Feb 2012 20:34
Prispevkov: 11
Aktiv.: 0.07

PrispevekObjavljeno: Tor Apr 10, 2012 8:58 pm    Naslov sporočila:   Odgovori s citatom

Hej, ponovno bi rabil malo pomoči.

Nastavil sem si arm-linux-gcc compiler in zadeva deluje. Rad pa bi še vključil assembler kodo zraven. Se pravi imam večino datotek spisano v cju, za krmiljenje periferije pa sem napisal nek assembler file, ki pa ga tale compiler noče prevesti.. Kako bi se tega lotil? Inline assemblerju bi se rad izognil, ker je nepregleden, pa ne podpira vsega, kolikor vem. Poizkusil sem tudi tako, da sem projekt prevedel z winideo, in potem probal tiste objektne fajle (spisane v asm) preprosto zlinkati na ostale c datoteke, pa ne gre. Kakšen nasvet bi bil zelo dobrodošel.

lp, Val

EDIT: Hm, ali pa če uporabim tist GNU asm ki je prišel zraven toolchaina in potem poizkusim to zlinkati.. Ok, to sem še spregledal..
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Mbili
Član
Član



Pridružen-a: Tor 03 Jan 2012 20:14
Prispevkov: 34
Aktiv.: 0.21
Kraj: Ljubljana

PrispevekObjavljeno: Tor Apr 10, 2012 9:18 pm    Naslov sporočila: icon_funny  Odgovori s citatom

Rešitev je že v vrstici EDIT: Smile .
LP M.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
valekovski
Član
Član



Pridružen-a: Sob 18 Feb 2012 20:34
Prispevkov: 11
Aktiv.: 0.07

PrispevekObjavljeno: Tor Apr 10, 2012 9:24 pm    Naslov sporočila:   Odgovori s citatom

Hehe, ok, hvala. Bom poizkusil in sporočim Razz lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
valekovski
Član
Član



Pridružen-a: Sob 18 Feb 2012 20:34
Prispevkov: 11
Aktiv.: 0.07

PrispevekObjavljeno: Čet Apr 12, 2012 12:26 am    Naslov sporočila:   Odgovori s citatom

Hm ok, zadeva res deluje kot oglaševano, hvala.

Imam pa neke zelo zoprne probleme z linkerjem in linker skriptami. Če sem že začel temo, bom napisal tukaj ko zrihtam, če bo še komu prav prišlo.

lp, val
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 Avg 03, 2012 9:03 am    Naslov sporočila:   Odgovori s citatom

V čem pa je problem z linker skripto? V njej samo določiš, kako želiš razporediti različne dele programa, ki so spremenjljivke, konstante...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
valekovski
Član
Član



Pridružen-a: Sob 18 Feb 2012 20:34
Prispevkov: 11
Aktiv.: 0.07

PrispevekObjavljeno: Pet Avg 03, 2012 2:25 pm    Naslov sporočila:   Odgovori s citatom

Hej

No od tega je že nekaj časa, pa nisem mel ravno časa še tukaj razlagati.. Ne spomnim se točno kaj je že bilo, ampak če se prav spomnim je bil problem z uClibc, nekaj ni našel DLLjev. To sem potem rešil preprosto s statičnim linkanjem knjižnic..

Drugače sem pa nad armom obupal, ker za linux zgleda ni nobene podpore, za bare metal pa ne obstaja podpora za IP sockete. Da bi v linuxu ves tist API interface po svoje implementiral ni šans. Lahko bi portiral knjižnice za bare-metal na linux, problem pa je da bi moral kar lep del prepisati, ker je treba vse pomnilniško preslikat, saj kernel ne dovoljuje direktnega dostopa do registrov (logično).

Tako da sem prešaltal na arduino, razvoj je sicer zelo hiter moram rečt, nauči se človek veliko. Moram pa opozorit da je arduino dokaj igrača.. Za kakšne resne zadeve lahko pozabite, trenutno recimo imam banalne probleme s pregrevanjem, ethernet shield (revizija 3 že) ima še kar problem v dizajnu in vleče preveč toka in se posledično greje. Tudi zunanje napajanje je delikatno, ker ima regulator voltaže in če povlečemo preveč toka zadeva začne crkavati zaradi pregrevanja Very Happy Tako da lol, odsvetujem. Razen za kakšne preproste stvari.

LP, Val
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Mbili
Član
Član



Pridružen-a: Tor 03 Jan 2012 20:14
Prispevkov: 34
Aktiv.: 0.21
Kraj: Ljubljana

PrispevekObjavljeno: Sob Avg 11, 2012 11:29 am    Naslov sporočila:   Odgovori s citatom

Samo dodajam, da je za ARM-e in Linux ogromno prosto dostopnega materiala (primerov izvorne kode, HW projektov, ...), IP socketi so mala malica (par vrstic kode in dela) ... Je pa treba poznati kakšno stvar bolj v podrobnost. Pri Arduinu so vse zoprne podrobnosti skrite v knjižnicah. Zelo hitro lahko povežeš in sprogramiraš kakšno manjšo stvar, ko pa želiš res kaj večjega, se zadeva počasi ustavi. Pri ARM ploščicah je začetek težji. Na začetku se moraš naučit kup stvari, ko pa stvar enkrat steče, se praktično ne moreš ustavit.

LP M.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
valekovski
Član
Član



Pridružen-a: Sob 18 Feb 2012 20:34
Prispevkov: 11
Aktiv.: 0.07

PrispevekObjavljeno: Sob Avg 11, 2012 3:12 pm    Naslov sporočila:   Odgovori s citatom

Hej

Hvala za odgovor Mbili. No kot sem rekel, sem nad izvedbo arduinota res kar malo razočaran. Seveda je za pričakovati tradeoff med enostavnostjo razvoja (višji nivo) in performansami, samo so preveč poneumili zadevo in performanse preveč trpijo. Recimo ethernet shield se greje ko svinja in me poskušajo načrtovalci arduinota zdaj prepričati, da je to "normalno" in da to ni problem.. Tako da res je, arduino moram žal reči da je igrača, je pa dokaj super za začetnike, da se nekaj naučijo. Recimo ARM je malenkost bolj kompleksen in moje znanje o elektrotehniki je malo pomankljivo, ker sem frijevc in če bi moral zadevo implementirati na armu in misliti na SW in HW probleme hkrati, bi bilo zoprno, pri arduinotu sem se lahko posvetil temu KAJ delam in ne KAKO bom to naredil.. No, vsaj kar se SW tiče, tako da so mi ostali večinoma samo problemi, kam gre kakšen uporček, kako povezati rele itd.

Kar se arma tiče sem opazil, da ima buildroot neki "API", ampak ga nisem znal uporabit (nobene dokumentacije, še headerji so slabo komentirani), nekje sem celo zasledil, da je to samo interface za katerega naj bi potem napisali svoje gonilnike. Drugače arm poznam relativno dobro, delal sem že z interrupti, periferijo, timerji v asemblerju itd., ampak se mi zdi nesmiselno recimo na roke implementirati I2C protokol ali kaj takega, ker je bilo to že neštetokrat razvito in je to nesmiselna potrata časa.

Drugače sem pa googlal za primere na linuxu in nisem našel praktično NIČ. KOMAJ sem našel primer za GPIO (krmiljenje ledice), pa še to je bilo sicer napisano v Cju, ampak nizkonivojsko s pisanjem vrednosti direktno v registre itd., skratka ni se uporabljalo APIja, ki ga naj bi ponujal buildroot. Naprej niti nisem brskal, za kšno podporo znakovnim lcdjem itd.

Zdaj sem diplomo praktično že v celoti implementiral na arduinotu (spet, zoprno je gretje in upam da mi ne požge hiše, če je to tudi "normalno" lol..), vseeno bi prosil, če imaš kakšen link z materialom, ki si ga omenjal za arm linux, bi bil zelo hvaležen. Ker arduino ni baš nekaj heh.

lp, Val
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Mbili
Član
Član



Pridružen-a: Tor 03 Jan 2012 20:14
Prispevkov: 34
Aktiv.: 0.21
Kraj: Ljubljana

PrispevekObjavljeno: Ned Avg 12, 2012 12:39 pm    Naslov sporočila:   Odgovori s citatom

Živ,

Buildroot je samo orodje za izgradnjo OS programja embedded Linux sistemov (prevajalnik, busybox in osnovni datotečni sistem, za standardne škatlice lahko prevede tudi nalagalnik 1 in 2 ter Linux jedro). Za API pa moraš uporabit Linux API sistema, ki si ga dobil s pomočjo Buildroot-a. Z HW-om delaš v glavnem preko /dev/...

Val, javi kateri primeri te bolj zanimajo (napr. I2C, GPIO, socketi, ...), ker je vseh področij preveč.

LP M.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
valekovski
Član
Član



Pridružen-a: Sob 18 Feb 2012 20:34
Prispevkov: 11
Aktiv.: 0.07

PrispevekObjavljeno: Ned Avg 12, 2012 5:40 pm    Naslov sporočila:   Odgovori s citatom

Hej

Hvala za odgovor. Ok recimo konkretno, povežeš na board znakovni LCD, s tistim standardnim driverjom od Hitachija, HD44780 al kaj je že. Kdo bi na roke pisal vso podporo za to, skratka, rabimo že napisano podporo. Predvidevam, da ima nekaj veze s temle http://lxr.free-electrons.com/source/drivers/misc/arm-charlcd.c.

No konkretno, če se prav spomnim sem skušal eno izmed teh knjižnic uporabit in je compiler metal cel kup napak ven, ker ni našel headerjev (čeprav sem imel zbuildano za določeno armovo ploščico in so bili flagi že nastavljeni za at91sam). Vredu, definiram točno kje naj išče in se pojavi še 10x več napak, ker spet ne najde dependencijev, popravim še tisto (nastavim, kje naj išče lib) in ponovi vajo, spet cel kup dependencijev še od tistega. To je bil zame nekako deal breaker, ker sem se [cenzurirano] cel teden s temi dependenciji in mi ni uspelo niti ene stvari zrihtati.

Kot lahko vidiš konkretno na zgornjem linku, source nima komentiranih niti prototipov funkcij (v headerjih tudi ni, sem preveril), jaz naj pa potem kaj, cel teden ugibam, kaj kakšna funkcija počne? Recimo prva funkcija charlcd_interrupt(int irq, void *data), kakšen interrupt, interrupt česa? Kaj počne? Potem je vseeno, če si napišem podporo za vse sam. Žal, tako je.

Še enkrat, nočem bit jerk, ampak jaz se pač nisem znašel iz tega, mogoče sem preveč noob..

Drugače pa hvala še enkrat, na začetku si bil v ogormno pomoč, ker niti za buildroot nisem vedel. Smile

LP, Val

EDIT:
Aja bom se pa moral tudi v arma spustit, ker arduino je res preveč igrača, tako da, pomoč zelo dobrodošla. Za diplomo pa že je kar je Razz No PIC kontrolerji so tudi zelo vredu kar sem gledal, cenovno dostopni, so pa namenjeni predvsem manjšim, specifičnim potrebam, če sem prav dojel. Ampak ja no, definitivno treba najti alternativo arduinotu Very Happy
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Mbili
Član
Član



Pridružen-a: Tor 03 Jan 2012 20:14
Prispevkov: 34
Aktiv.: 0.21
Kraj: Ljubljana

PrispevekObjavljeno: Pon Avg 13, 2012 7:49 pm    Naslov sporočila:   Odgovori s citatom

Hmm, pri primeru, ki ga navajaš je tako. Izvorno kodo arm-charlcd.c boš kot uporabniški program težje uporabil, ker je napisana kot gonilnik jedra in mora biti skupaj z jedrom tudi prevedena. Zato ti je prevajalnik tudi javljal kup napak, ko si jo skušal prevesti, saj ni našel podprogramov in header datotek iz jedra. Poleg tega kot uporabniški program nima dostopa do GPIO. Ker je arm-charlcd.c napisan za Versatile ARM plošče, ki imajo svojo specifiko, brez predelave ni uporaben za AT91SAM9260 mikrokrmilnike.

Če nujno potrebuješ tudi Linux, potem ali napišeš svoj gonilnik in se zgleduješ po arm-charlcd.c, ali pa uporabiš GPIO dostop preko /dev/mem. Tu je "mušter" za delo preko /dev/mem

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>


#define MAP_SIZE 4096UL // virt. mem. page size is 4096B
#define MAP_MASK (MAP_SIZE-1)

#define PIO_BASE_ADDR 0xFFFFF600U // PIO port B
#define PIO_PSR 0x08 // offset of PIO Status Register
#define PIO_OER 0x10 // offset of Output Enable Register
#define PIO_SODR 0x30 // offset of Set Output Data Register

#define PIN_ON_OFF (1U << 16) // PB16 - port B pin 16

int mem_dev;
void *map_base;

void open_gpio_control(void)
{
void *virt_addr;
unsigned int value;

if ((mem_dev = open("/dev/mem",O_RDWR | O_SYNC)) < 0)
{
printf("Error %d opening MEM interface\n%s\n", errno, strerror(errno));
exit(-1);
}

map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, mem_dev, PIO_BASE_ADDR &~MAP_MASK);
if (map_base == (void*) -1)
{
printf("Memory map error %d\n%s\n", errno, strerror(errno));
exit(-1);
}

// some GPIO write and read - access to PIO port B registers on AT91SAM9260
...
virt_addr = (void*)((char*)map_base + ((PIO_BASE_ADDR + PIO_OER) & MAP_MASK)); // assign address
*((volatile unsigned int *)virt_addr) = PIN_ON_OFF; // do gpio write

...

virt_addr = (void*)((char*)map_base + ((PIO_BASE_ADDR + PIO_PSR) & MAP_MASK)); // assign address
value = *((volatile unsigned int *)virt_addr); // do gpio read
...
}

void close_gpio_control(void)
{
if (map_base != (void*) -1)
{
if (munmap(map_base, MAP_SIZE) == -1)
printf("Memory unmap failed.\n");
}
if (mem_dev != -1)
close(mem_dev);
}

int main()
{
mem_dev = -1;
map_base = (void*) -1;

atexit(close_gpio_control);

open_gpio_control();

...

return(0);
}


Če ne potrebuješ Linux-a in delaš cel projekt kot C aplikacijo, potem je težav manj, saj ni navideznih naslovov in dostopaš do V/I registrov preprosto na naslovih, ki so v tovarniških papirjih za ARM.

Znakovni LCD na FRI-SMS ploščo, ki jo imaš, povežeš recimo na signale od PB0 naprej (PIO vrata B pin 0, pin 1, ...), ki so prosti. LCD mora biti tak z napajanjem 3.3V. Potem pa s programom nastavljaš in brišeš bite na posameznih signalih.

LP Mbili
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
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
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
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