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


 
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 60.06 Kraj: Divača (Kačiče)
|
Objavljeno: Sre Nov 07, 2007 3:06 am Naslov sporočila: |
|
|
ARM definitivno ! _________________ Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo. |
|
Nazaj na vrh |
|
 |
bostjang Član

Pridružen-a: Tor 03 Jan 2006 15:29 Prispevkov: 3469 Aktiv.: 14.65 Kraj: Postojna
|
Objavljeno: Tor Nov 20, 2007 12:01 pm Naslov sporočila: |
|
|
Evo malo pozen odgovor.
Kot primer navajam kodo, ki prenaša podatke iz pomnilnika na zunanje vodilo. Slednje uporablja ARM strojni vmesnik, nanj pa je v mojem primeru priključena CF kartica v 16 bitnem načinu. Uporabljal sem CARM s parametrom OPTIMIZE (7,SPEED), zunanje vodilo je imelo nastavljena 2 čakalna cikla.
Najprej napisana koda je tale:
Koda: |
int a=1000;
for (;a;a--){
EXT16 = *(u16_t *)buf;
buf += 2;
}
|
Prevede se tako:
Koda: |
for (;a;a--){
L_94:
EXT16 = *(u16_t *)buf;
MOV R0,R6 ; buf
LDRH R1,[R0,#0x0] ; buf
MOV R0,#0x80000000
STRH R1,[R0,#0x0]
buf += 2;
ADD R6,R6,#0x0002 ; buf
}
SUB R4,R4,#0x0001 ; a
MOV R0,R4 ; a
CMP R0,#0x0000 ; a
BNE L_94 ; Targ=0xDC
|
Za en prehod zanke ARM potrebuje 15 ciklov. V kodi me moti vsakokratno nalaganje naslova za prenos podatkov, neuporaba hkratnega inkrementiranja indeksnega registra, premikanje števca po registrih za dekrementacijo in dodatno testiranje, ki se sicer lahko opravi z ukazom za odštevanje.
Ko sem uporabil vse omenjene tehnike in napisal kodo v zbirniku, je ta izgledala takole:
Koda: |
void write_buf(char *buffer, int count){
__asm{
LDR R3,=0x10100000
LDR R4,=0x80000000
LOOP:
LDRH R2,[R0],#0x2 ; EXT16 = *(u16_t *)buf; buf += 2;
STRH R2,[R4]
SUBS R1,R1,#0x1 ; a--;
LOOP1:
BNE LOOP
}
}
|
Zdaj se v zanki izvaja pol manj ukazov (4 namesto 9). Za en prehod zanke koda potrebuje 10 ciklov oz. 50 % hitreje. To sem ugotovil z merjenjem, ki je dalo boljši rezultat kot simulacija, čeprav je bila tudi slednja hitrejša.
Med poizkušanjem sem ugotovil, da EMC ne ustavlja jedra med pisanjem podatkov na zunanje vodilo, to sem uporabil za nadaljnjo optimizacijo, kjer sem hitrost še podvojil s pomočjo 32-bitnega prenosa. O tem mogoče kdaj drugič.
Tukaj lahko dodam, da so razlike še večje pri kopiranju po RAM-u, ker lahko ARM z enim ukazom naloži in shrani tudi več 32-bitnih besed. Z ustrezno kodo se lahko doseže za mikrokrmilnik že zavidljive hitrosti (do nekje 100 MB/s). |
|
Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Tor Nov 20, 2007 12:26 pm Naslov sporočila: |
|
|
Citiram: |
Za kateri procesor obstajajo knjižnice za IP komunikacijo, kateri procesor je najprimerje vzeti v tem primeru. |
Sicer vas večina nad tem ne bo navdušena ampak glede TCP/IP je v primeru če moraš hitro neko stvar razviti izredno uporaben Rabbit (na primer RCM3700). Stvarco dobiš na modulu s konektorjem RJ45 in pinoutom uCja. Nekaj časa nazaj sem napisal en program za UDP komunikacijo. Preprosto uporabiš kar funkcije iz knjižnice:
Za pošiljanje udp_send(&sock, packet, UDP_length)
Sprejem udp_recv(&sock, buf, sizeof(buf))
itd...
Torej hardware že narejen plus knjižnice.... rabiš kakšno urco da nanj postaviš svojo spletno stran.
Poleg rabiš še software Dynamic C, ki pa prav tako stane.
Ni ravno primerno za neke serije, je pa zanimivo za hobi uporabo.
http://www.rabbitsemiconductor.com/ _________________ LP, Matjaž |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Tor Nov 20, 2007 12:29 pm Naslov sporočila: |
|
|
Pri "EMC ne ustavlja jedra" si verjetno hotel povedati, da EMC sam po sebi ne zahteva dodatnih cakalnih stanj (kar se zdi logicno, vodilo med jedrom in EMC mora biti ultra-hitro)? Namrec, zasedenost CPUja je tudi v tem primeru 100%. Predvidevam, da ne uporabljas DMA.
Ena opomba, en ukaz za load ali store ne pomeni en cikel ampak n+2 ciklov, kjer je n stevilo podatkov. Stevilo podatkov je omejeno s stevilom registrov. |
|
Nazaj na vrh |
|
 |
bostjang Član

Pridružen-a: Tor 03 Jan 2006 15:29 Prispevkov: 3469 Aktiv.: 14.65 Kraj: Postojna
|
Objavljeno: Tor Nov 20, 2007 1:27 pm Naslov sporočila: |
|
|
Točno tako.
EMC (External Memory Controller) postavlja na AHB (Advanced High-performance Bus) čakalne cikle le v primeru, da se prejšnje pisanje še ni izvršilo in v primeru branja seveda. Med pisalnimi čakalnimi cikli zato CPU izvaja naprej program. To sem ugotovil eksperimentalno, ne iz ARM-ove dokumentacije.
DMA-ja ne uporabljam, kar je vidno iz kode. Uporabljam LPC2214, ki nima DMA-ja.
Ne trdim, da en ukaz load ali store pomeni traja en cikel. Daljše trajanje ukazov se tudi vidi iz mojih primerov. |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Tor Nov 20, 2007 1:33 pm Naslov sporočila: |
|
|
Saj nisem rekel, da trdis. Samo napisal sem opombo, da ne bo koga zavedlo. |
|
Nazaj na vrh |
|
 |
bostjang Član

Pridružen-a: Tor 03 Jan 2006 15:29 Prispevkov: 3469 Aktiv.: 14.65 Kraj: Postojna
|
Objavljeno: Tor Nov 20, 2007 1:46 pm Naslov sporočila: |
|
|
Oprosti za moj komentar, se strinjam z opombo. |
|
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: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|