LPC11U68 + C rychlost portu
Pavel Hudecek
edizon na seznam.cz
Úterý Červenec 26 12:21:38 CEST 2016
24 MHz by bylo, kdyby všechny pulzy měly 20,83 ns. Ale protože část z nich
má kolem 50, celkový výsledek je asi 20 MHz. Ty prodloužení jsou rozmístěny
nepravidelně, ale celá sekvence se pravidelně opakuje. O běh z RAM jsem se
nesnažil, ale nevylučuji, že ho optimalizace udělala.
Po vypnutí debuggeru se v této části nic nezmění. Ale popsání celého
displeje různými barvami a fonty se zrychlí z něco pod 40 ms na asi o malý
kousek méně. U smazání viditelná změna z původních 7,7 ms nenastane.
GPIO přes DMA mají např. LPC5410x. Ale zas mají porty na AHB a DMA mi asi
moc nepomůže. Prakticky jde o to, že ve fontu jsou nějaké bajty a podle
jednotlivých bitů se do displeje posílá 16b barva písma, nebo barva pozadí.
Zobrazení jednoho řádku ze znaku momentálně vypadá takto:
p8 =(uint8_t *) &(fnt.dat[znak+r]);
for (x=0, b=0; x<wid; x++) {
if (p8[b] & (1<<(x&7))) ili_wrI16(); else ili_wrP16();
if ((x&7)==7) b++; // dalsi byte
}
přičemž v ili_wrI16 je:
DISP_data=dispInk16;
DISP_wr=0;
DISP_wr=1;
Do poznámky ve schematu jsem si dal, že WR přesunout na stejný port jako
data, takže pak nebude potřeba DISP_wr=0.
PH
-----Původní zpráva-----
From: Jan Waclawek
> Výsledkem je cca 20/20 ns nezávisle na deklaraci,
Ako pan kolega Buchta pisal, pre casovanie je dost nepodstatne co napisete
v C, podstatne je, ako sa to prelozi. Ak Vam na tom casovani naozaj
zalezi, napiste to priamo v asm, alebo - lepsie - hladajte sposob, kde
pozadovanu funkciu urobi hardware.
Ten LPC11U6x ma jadro Cortex-M0+, ktore ma pre GPIO sukromnu zbernicu
nazvanu vtipne "Single-cycle I/O port", a GPIO v tom LPC su prave na tejto
zbernici (*). Inak (t.j. ak by boli GPIO na AHB zbernici ktorou procesor
pristupuje k ostatnym periferiam, alebo nedajboze este dalej za AHB/APB
bridge (co u LPC nie je zvykom, prave NXP machrovali ze maju ako prvi
"high-speed GPIO" priamo na AHB)) by ste 1-cyklovy pristup nedosiahli, uz
len preto nie, lebo by pristupy na GPIO bojovali o zbernicu s fetchom kodu.
Ale v suvislosti s tym vznika otazka: odkial bezi ten program? Ak dobre
citam UM, FLASH je 50ns, t.j. by ste pri 48MHz system clock mali mat
nastavene 2 waitstaty pri behu z FLASH. Pritom tam nevidim ziadny
prefetch/cache/cokolvek ine co by to zrychlilo, musi to byt beh z RAM, je
to tak?
> s nepravidelnými prodlouženími na 40 ns.
Ak je ten beh z RAM, tak toto si viem vysvetlit len pristupom k GPIO z
debuggera - mata zapnuty debugger a pozerate v nom GPIO? Ak ano, po
vypnuti debuggera prestanu tie nepravidelne predlzenia na 40ns?
> Frekvence generovaná v "burstu" je průměrně cca 20 MHz.
Snad 24MHz, nie?
(*) Pozeral som do datasheetu aj UM, a v oboch je nakreslene GPIO akoby
bolo na spolocnej zbernicovej matici - DS Fig.7, UM Fig.3. Ale to by
jednak nefungoval ten jednocyklovy pristup ako som bol pisal, druhak by sa
dalo do GPIO chodit z DMA, co sa podla mna neda - to by ste mohli Vy alebo
niekto iny schvalne aj vyskusat.
Do DMA by sa dalo chodit len kebyze ma bud GPIO nejaku dual-port strukturu,
co by ho zbytocne zozlozitovalo a ktovie ci by sa dalo vobec spravit
dostatocne rychle, alebo by muselo mat jadro AHB slave port s pristupom na
tu sukromnu "I/O port" zbernicu cez nejaky arbiter (ktory tam zase kvoli
debuggeru zrejme je) - takto to ma Cortex-M7, ale u M0+ nic take pokial
Další informace o konferenci Hw-list