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 

GCC ima kdo izkušnje oziroma to obvlada?
Pojdi na stran Prejšnja  1, 2, 3, 4
 
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
chaos
Član
Član



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

PrispevekObjavljeno: Ned Feb 27, 2011 1:54 pm    Naslov sporočila:   Odgovori s citatom

V startup kodo moraš samo dodati eno podobno zanko, kot je za bss - če pogledaš v linker skripto, imaš definirane naslednje labele:
- __gnu_textend - označuje konec text + rodata sekcij. Ti dve itak ostaneta v romu. Takoj za tem pa v rom zapišeš data sekcijo (s pomočjo objcopy).
- __gnu_datastart in __gnu_dataend označujeta pomnilniške lokacije v RAMu, kamor je potrebno skopirati data sekcijo, ravno tako iz njiju vidiš velikost data sekcije.

Sedaj veš, kje v ROMu imaš shranjeno data sekcijo, kam v RAM jo moraš skopirati, ter koliko je velika. Torej napišeš eno podobno zanko kot za bss sekcijo, s tem da uporabiš še eno spremenljivko (še en register), ki ga inicializiraš na vrednost __gnu_textend, ina ga skupaj s pointerjem na data sekcijo povečuješ (+4). Potem pa samo še naložiš vrednost iz tega pointerja, in to vrednost shraniš na naslov RAM pointerja.

Če pogledaš zanko za bss, moraš popraviti naslednje:
- zamenjaš __gnu_bssstart in __gnu_bssend z __gnu_datastart in __gnu_dataend
- na začetku naložiš v en register, npr r2 vrednost __gnu_textend
- pred store (STR) dodaš en load v še en drug register - npr. r3, vrednost na naslovu, kamor kaže r2
- namesto da bi pisal ničlo, popraviš store ukaz tako, da piše prebrani podatek (register r3)
- dodaš še en ADD, ki isto povečuje za 4 register r2


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: Pon Mar 14, 2011 10:40 pm    Naslov sporočila:   Odgovori s citatom

Sem čakal na ARM seminar, sem mislil, da bom kaj veliko odnesel pa je večina stvari še vedno zavita v meglo. V LPC3141 user manual sem pod poglavjem "gpio registers" našel več registrov:


    GPIO_PINS (0x130031C0)
    GPIO_MODE0 (0x130031D0)
    GPIO_MODE0_SET (0x130031D4)
    GPIO_MODE0_RESET (0x130031D8)
    GPIO_MODE1 (0x130031E0)
    GPIO_MODE1_SET (0x130031E4)
    GPIO_MODE1_RESET (0x130031E8)

V kolikor pogledam v memory map, najdem tudi register IOCONFIG (0x13003000), mislim, da je tale kar pomemben.

Ne vem kaj je mode 1 in kaj je mode 0, ne piše nikjer, Nekako se mi sanja, da so registri set, reset uporabljeni za postavitev gpio v logično 1 ali 0. Potem je tu še register GPIO_PINS, kateri je kot neki base register za gpio a ne vem kaj je njegova vloga, mogoče nastavitev vhodov izhodov?

Če kdo lahko pove kaj o tem in navede kak primer kot zgled. Nekaj sem se trudil že sam in definiral registre v header datoteki. Moja header datoteka izgleda takole:

Koda:
#ifndef lpc3141_gpio
#define lpc3141_gpio
#define REG8  (volatile unsigned char*)
#define REG16 (volatile unsigned short*)
#define REG32 (volatile unsigned int*)

#define IOCONFIG    (*(REG32 (0x13003000)))

#define GPIO_PINS   (*(REG32 (0x130031C0)))
#define GPIO_MODE0      (*(REG32 (0x130031D0)))
#define GPIO_MODE0_SET   (*(REG32 (0x130031D4)))
#define GPIO_MODE0_RESET(*(REG32 (0x130031D8)))
#define GPIO_MODE1      (*(REG32 (0x130031E0)))
#define GPIO_MODE1_SET   (*(REG32 (0x130031E4)))
#define GPIO_MODE1_RESET(*(REG32 (0x130031E8)))
#endif
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 7:28 pm    Naslov sporočila:   Odgovori s citatom

Tako, končno se mi zdi, da vem kaj počnem. V LPC3141 user manualu sem našel slednje tabele, katere najdete v priponki. Glede na lokacije registrov v tabelah (glej moj prejšnji post), sem najprej spisal header datoteko in c datoteko, kateri lahko prav tako najdete v priponki.

Vendar pa, ko želim iz izvorne kode napraviti objektno kodo mi javi napako:
Koda:
arm-none-eabi-gcc -mcpu=arm926ej-s -c -o c_program.o c_program.c
c_program.c: In function 'LEDinit':
c_program.c:11:23: error: expected ')' before ';' token
c_program.c:59:1: error: expected declaration or statement at end of input

Poiskušal sem tudi z drugo razvojno verigo, ki javi eno napako manj:
Koda:
arm-elf-gcc -mcpu=arm926ej-s -c -o c_program.o c_program.c
c_program.c: In function 'LEDinit':
c_program.c:22: error: expected ')' before ';' token

Sam napake ne najdem, ker se mi zdi, da oklepaj stoji na pravem mestu... (glej c program v priponki)



tabela1.png
 Opis:
 Velikost datoteke:  64.75 KB
 Pogledana:  5 krat

tabela1.png



tabela2.png
 Opis:
 Velikost datoteke:  18.55 KB
 Pogledana:  1 krat

tabela2.png



c_program.c
 Opis:
c program

Download
 Ime datoteke:  c_program.c
 Velikost datoteke:  3.88 KB
 Downloadano:  10 krat


lpc3141_gpio.h
 Opis:
pripadajoči header

Download
 Ime datoteke:  lpc3141_gpio.h
 Velikost datoteke:  767 Bytov
 Downloadano:  9 krat

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.64
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Sre Mar 16, 2011 7:46 pm    Naslov sporočila:   Odgovori s citatom

V headerju se ne ujemajo oklepaji.

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: Čet Mar 17, 2011 1:01 am    Naslov sporočila:   Odgovori s citatom

chaos je napisal/a:
V headerju se ne ujemajo oklepaji.

LP!


Sem popravil ja, hvala! Nisem vedel, da je lahko napaka že v headerju. Sem malo nov v tem svetu C in tako dalje. Poleg tega sem našel šeeno napako v stavku if else. Tam namreč ni bilo zavitih oklepajev... No v glavnem tukaj postam sedaj delujoče source datoteke, katerega mi je skompilalo.

Sedaj imam (upam da) program, ki mi bo na nekem gpio prižigal ugašal diodo a nisem še prepričan saj ne vem, če sem pravilno sprogramiral zadevo. V kolikor mi to uspe bom objavil na blogu obsežen video o tem.



c_program.c
 Opis:
program katerega lahko uspešno skompilate.

Download
 Ime datoteke:  c_program.c
 Velikost datoteke:  3.9 KB
 Downloadano:  2 krat


lpc3141_gpio.h
 Opis:
header, katerega uspešno skompila

Download
 Ime datoteke:  lpc3141_gpio.h
 Velikost datoteke:  759 Bytov
 Downloadano:  0 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: Čet Mar 17, 2011 11:22 pm    Naslov sporočila:   Odgovori s citatom

Program sem preiskusil tako, da sem na GPIO19 in GPIO 20 vezal elektronsko vezje na shemi. Toda nič se ne zgodi. Že v začetnem delu, kjer bi mogla dioda 10x utripnit ni nič, nato poiskušam pritisniti tipko in še vedno se dioda ne prižge. Očitno sem popolnoma narobe razumel, kako postavim izhod v logično ničlo/enko...

PS: En priključek tipke mi visi v zraku ampak mislim, da ne vpliva to nič.



Screenshot.png
 Opis:
shema vezave
 Velikost datoteke:  3.68 KB
 Pogledana:  2210 krat

Screenshot.png



Image0500.jpg
 Opis:
Še fotka vezave.
 Velikost datoteke:  91.06 KB
 Pogledana:  6 krat

Image0500.jpg


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 Mar 18, 2011 10:15 am    Naslov sporočila:   Odgovori s citatom

Seveda zadeva ne dela.... ker niti nisem spisal programa za:

    clock
    interrupt
    MMU

Ampak ne vem, kako naj to sploh napišem, ta projekt je že od začetka totalno nemogoč... itak ne morem dobit nobenega feedbacka od tega mikrokontrolerja. Toliko kode napišpem pa sploh ne vem, če karkoli deluje...

Ali mi lahko vsaj nekdo svetuje s katero izmed teh 3 zadev naj začnem?
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
Pojdi na stran Prejšnja  1, 2, 3, 4
Stran 4 od 4

 
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: 7 dni


Powered by phpBB © 2001, 2005 phpBB Group