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

Pridružen-a: Sob 18 Feb 2012 20:34 Prispevkov: 11 Aktiv.: 0.07
|
Objavljeno: Sob Feb 18, 2012 8:44 pm Naslov sporočila: ARM Linux cross-compiler |
|
|
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 Hvala. |
|
Nazaj na vrh |
|
 |
Mbili Član

Pridružen-a: Tor 03 Jan 2012 20:14 Prispevkov: 34 Aktiv.: 0.21 Kraj: Ljubljana
|
Objavljeno: Sob Feb 18, 2012 9:34 pm Naslov sporočila: |
|
|
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 |
|
 |
valekovski Član

Pridružen-a: Sob 18 Feb 2012 20:34 Prispevkov: 11 Aktiv.: 0.07
|
Objavljeno: Ned Feb 19, 2012 12:32 am Naslov sporočila: |
|
|
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 |
|
 |
valekovski Član

Pridružen-a: Sob 18 Feb 2012 20:34 Prispevkov: 11 Aktiv.: 0.07
|
Objavljeno: Ned Feb 19, 2012 8:13 pm Naslov sporočila: |
|
|
Super! Zadeva deluje as advertised. Še enkrat hvala. LP |
|
Nazaj na vrh |
|
 |
valekovski Član

Pridružen-a: Sob 18 Feb 2012 20:34 Prispevkov: 11 Aktiv.: 0.07
|
Objavljeno: Tor Apr 10, 2012 8:58 pm Naslov sporočila: |
|
|
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 |
|
 |
Mbili Član

Pridružen-a: Tor 03 Jan 2012 20:14 Prispevkov: 34 Aktiv.: 0.21 Kraj: Ljubljana
|
Objavljeno: Tor Apr 10, 2012 9:18 pm Naslov sporočila: |
|
|
Rešitev je že v vrstici EDIT: .
LP M. |
|
Nazaj na vrh |
|
 |
valekovski Član

Pridružen-a: Sob 18 Feb 2012 20:34 Prispevkov: 11 Aktiv.: 0.07
|
Objavljeno: Tor Apr 10, 2012 9:24 pm Naslov sporočila: |
|
|
Hehe, ok, hvala. Bom poizkusil in sporočim lp |
|
Nazaj na vrh |
|
 |
valekovski Član

Pridružen-a: Sob 18 Feb 2012 20:34 Prispevkov: 11 Aktiv.: 0.07
|
Objavljeno: Čet Apr 12, 2012 12:26 am Naslov sporočila: |
|
|
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 |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Pet Avg 03, 2012 9:03 am Naslov sporočila: |
|
|
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 |
|
 |
valekovski Član

Pridružen-a: Sob 18 Feb 2012 20:34 Prispevkov: 11 Aktiv.: 0.07
|
Objavljeno: Pet Avg 03, 2012 2:25 pm Naslov sporočila: |
|
|
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 Tako da lol, odsvetujem. Razen za kakšne preproste stvari.
LP, Val |
|
Nazaj na vrh |
|
 |
Mbili Član

Pridružen-a: Tor 03 Jan 2012 20:14 Prispevkov: 34 Aktiv.: 0.21 Kraj: Ljubljana
|
Objavljeno: Sob Avg 11, 2012 11:29 am Naslov sporočila: |
|
|
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 |
|
 |
valekovski Član

Pridružen-a: Sob 18 Feb 2012 20:34 Prispevkov: 11 Aktiv.: 0.07
|
Objavljeno: Sob Avg 11, 2012 3:12 pm Naslov sporočila: |
|
|
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 |
|
 |
Mbili Član

Pridružen-a: Tor 03 Jan 2012 20:14 Prispevkov: 34 Aktiv.: 0.21 Kraj: Ljubljana
|
Objavljeno: Ned Avg 12, 2012 12:39 pm Naslov sporočila: |
|
|
Ž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 |
|
 |
valekovski Član

Pridružen-a: Sob 18 Feb 2012 20:34 Prispevkov: 11 Aktiv.: 0.07
|
Objavljeno: Ned Avg 12, 2012 5:40 pm Naslov sporočila: |
|
|
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.
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 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  |
|
Nazaj na vrh |
|
 |
Mbili Član

Pridružen-a: Tor 03 Jan 2012 20:14 Prispevkov: 34 Aktiv.: 0.21 Kraj: Ljubljana
|
Objavljeno: Pon Avg 13, 2012 7:49 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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
|