RTV forum PL | NewsGroups PL

Porównanie prędkości programowania flash i EEPROM w emulatorze STK500v2 z Allegro

Powolność programatora STK500v2

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Porównanie prędkości programowania flash i EEPROM w emulatorze STK500v2 z Allegro

Grzegorz Kurczyk
Guest

Sun Feb 28, 2010 10:39 pm   



Witam
Od jakiegoś czasu używam programatorka z USB zakupionego na allegro.
Emuluje on STK500v2. Flash AVR-ka programuje się błyskawicznie, ale
eeprom koszmarnie wolno. Przykładowo 20kB flasha - 6,2s a jedyne 418
bajtów eepromu ponad 40 sekund !!!. Czy to "urok" wszystkich STK500 czy
tylko tego jednego ? Sklecone na szybko usbasp programuje bez porównania
szybciej.

Pozdrawiam
Grzegorz

Adam Dybkowski
Guest

Mon Mar 01, 2010 8:59 pm   



W dniu 2010-02-28 22:39, Grzegorz Kurczyk pisze:

Quote:
Od jakiegoś czasu używam programatorka z USB zakupionego na allegro.
Emuluje on STK500v2. Flash AVR-ka programuje się błyskawicznie, ale
eeprom koszmarnie wolno. Przykładowo 20kB flasha - 6,2s a jedyne 418
bajtów eepromu ponad 40 sekund !!!. Czy to "urok" wszystkich STK500 czy
tylko tego jednego ? Sklecone na szybko usbasp programuje bez porównania
szybciej.

Powinno być znacznie szybciej. Poszukaj w archiwum grupy, w zeszłym roku
był wątek o wydajności programowania AVRów różnymi programatorami.
Wyszło na to, że im nowszy wynalazek Atmela tym szybszy - wygrały wtedy
chyba AVR One oraz ISP mkII.

Sprawdź przy okazji, co masz w środku programatora. Jeżeli popierdułkę w
rodzaju USB obsługiwanego programowo przez AVRa (z prędkością LowSpeed
czyli 1,5Mbps) to nic dziwnego. Ja mam klona gadającego jak STK500v2 ale
na pokładzie jest układ FT232 i śmiga na 12Mbps. Ale to i tak wolno w
miarę działa (w stosunku do wydajności programowania ograniczanej przez
sam programowany AVRek) ze względu na algorytm STK500v2, zakładający
m.in. komunikację z pecetem na 115200 bps przez "wirtualny" COM oraz
mały bufor programowania (częste małe paczki danych i potwierdzenia do
przesyłania z/do peceta).

--
Adam Dybkowski
http://dybkowski.net/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

Grzegorz Kurczyk
Guest

Mon Mar 01, 2010 10:34 pm   



Użytkownik Adam Dybkowski napisał:
Quote:
W dniu 2010-02-28 22:39, Grzegorz Kurczyk pisze:

Od jakiegoś czasu używam programatorka z USB zakupionego na allegro.
Emuluje on STK500v2. Flash AVR-ka programuje się błyskawicznie, ale
eeprom koszmarnie wolno. Przykładowo 20kB flasha - 6,2s a jedyne 418
bajtów eepromu ponad 40 sekund !!!. Czy to "urok" wszystkich STK500 czy
tylko tego jednego ? Sklecone na szybko usbasp programuje bez porównania
szybciej.

Powinno być znacznie szybciej. Poszukaj w archiwum grupy, w zeszłym roku
był wątek o wydajności programowania AVRów różnymi programatorami.
Wyszło na to, że im nowszy wynalazek Atmela tym szybszy - wygrały wtedy
chyba AVR One oraz ISP mkII.

Sprawdź przy okazji, co masz w środku programatora. Jeżeli popierdułkę w
rodzaju USB obsługiwanego programowo przez AVRa (z prędkością LowSpeed
czyli 1,5Mbps) to nic dziwnego. Ja mam klona gadającego jak STK500v2 ale
na pokładzie jest układ FT232 i śmiga na 12Mbps. Ale to i tak wolno w
miarę działa (w stosunku do wydajności programowania ograniczanej przez
sam programowany AVRek) ze względu na algorytm STK500v2, zakładający
m.in. komunikację z pecetem na 115200 bps przez "wirtualny" COM oraz
mały bufor programowania (częste małe paczki danych i potwierdzenia do
przesyłania z/do peceta).


Właśnie mam wręcz przeciwnie i to mnie dziwi. Popierdułka sklecona na
szybko z programowym USB (usbasp na ATmega8) popindala jak mały
samochodzik, a klon z FT232 tak się ślimaczy ale tylko przy
programowaniu eepromu. Programatorek to AVR PROG z firmy SIBIT. Teraz
patrzę, że jest nowy firmware. Spróbuję zaaplikować i zobaczymy :-)

Pozdrawiam
Grzegorz

rock
Guest

Tue Mar 02, 2010 2:18 am   



Jeśli chodzi o programowanie EEPROM z poziomu nowszych AVR Studio
to niestety tak będzie. Trochę szybciej (tak gdzieś z 50%) będzie z
poziomu AVR DUDE.
Po prostu Atmel w swoim środowisku stosuje z zapasem zalecane
odstępy czasowe (Twd_eeprom) między kolejnymi bajtami podczas zapisu
do pamięci EEPROM.
To że USBASP zakaszania podczas zapisu do eeprom-u wynika tylko z
niefrasobliwości
twórców oprogramowania obsługującego ten standard.

Pozdrawiam.

J.F.
Guest

Tue Mar 02, 2010 9:00 am   



On Sun, 28 Feb 2010 22:39:00 +0100, Grzegorz Kurczyk wrote:
Quote:
Emuluje on STK500v2. Flash AVR-ka programuje się błyskawicznie, ale
eeprom koszmarnie wolno. Przykładowo 20kB flasha - 6,2s a jedyne 418
bajtów eepromu ponad 40 sekund !!!.

A sprawdzales czy to kazy bajt dlugo, czy czeka 39s, i dopiero zaczyna
programowac ?
Ewentualnie odwrotnie - programuje w sekunde, a potem czeka.

Moze byc jakis problem z emulacja przerwan ..


J.

Grzegorz Kurczyk
Guest

Tue Mar 02, 2010 9:27 am   



Użytkownik rock napisał:
Quote:
Jeśli chodzi o programowanie EEPROM z poziomu nowszych AVR Studio
to niestety tak będzie. Trochę szybciej (tak gdzieś z 50%) będzie z
poziomu AVR DUDE.
Po prostu Atmel w swoim środowisku stosuje z zapasem zalecane
odstępy czasowe (Twd_eeprom) między kolejnymi bajtami podczas zapisu
do pamięci EEPROM.
To że USBASP zakaszania podczas zapisu do eeprom-u wynika tylko z
niefrasobliwości
twórców oprogramowania obsługującego ten standard.


To ze straaaaasznym zapasem. Wg specyfikacji Atmel zaleca 9ms. Dajmy dwa
razy tyle plus dwie do równego rachunku czyli 20ms. Z tego wynika, że te
400 bajtów powinno się zaprogramować w czasie ok 8s a nie 40s !
Równoległy STK200 na kilku opornikach lub buforze też pocinał sporo
szybciej :-)

Pozdrawiam
Grzegorz

Grzegorz Kurczyk
Guest

Tue Mar 02, 2010 10:03 am   



Autopoprawka.
Odpowiadam sam sobie Smile
Problem dotyczy systemu Linux. Pod WinXP jest ok. Podejrzewam kwestię
konfiguracji /dev/ttyUSB0

Pozdrawiam
Grzegorz

Adam Dybkowski
Guest

Tue Mar 02, 2010 11:22 pm   



W dniu 2010-03-02 10:03, Grzegorz Kurczyk pisze:

Quote:
Autopoprawka.
Odpowiadam sam sobie Smile
Problem dotyczy systemu Linux. Pod WinXP jest ok. Podejrzewam kwestię
konfiguracji /dev/ttyUSB0

Miło wiedzieć. Też mam ten USBowy programator firmy SIBIT i żadnych
problemów (pod WinXP). Czy nowy firmware coś zmienia szczególnego?

--
Adam Dybkowski
http://dybkowski.net/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

Grzegorz Kurczyk
Guest

Tue Mar 02, 2010 11:49 pm   



Użytkownik Adam Dybkowski napisał:
Quote:

Miło wiedzieć. Też mam ten USBowy programator firmy SIBIT i żadnych
problemów (pod WinXP). Czy nowy firmware coś zmienia szczególnego?


Niestety pod Linuxem nadal to samo. Coś musi być z obsługą FTDI pod
linuxem. Nie wgrywałem żadnych specjalnych sterowników. Linux
(Ubuntu9.10) sam wykrył programator jako /dev/ttyUSB0 i tak ustawiłem
avrdude. Ruszyło od pierwszego kopa, ale właśnie z taką niespodzianką.
Coś mi się wydaje, że problem jest związany z buforowaniem w FTDI.
Podczas programowania eepromu lecą krótkie paczki (programowanie bajt po
bajcie). Przy programowaniu flascha lecą całe strony i bufor FTDI szybko
się zapełnia i dane szybko pojawiają się po stronie RS-a.

Pozdrawiam
Grzegorz

Adam Dybkowski
Guest

Thu Mar 04, 2010 12:44 am   



W dniu 2010-03-02 23:49, Grzegorz Kurczyk pisze:

Quote:
Niestety pod Linuxem nadal to samo. Coś musi być z obsługą FTDI pod
linuxem. Nie wgrywałem żadnych specjalnych sterowników. Linux
(Ubuntu9.10) sam wykrył programator jako /dev/ttyUSB0 i tak ustawiłem
avrdude. Ruszyło od pierwszego kopa, ale właśnie z taką niespodzianką.
Coś mi się wydaje, że problem jest związany z buforowaniem w FTDI.
Podczas programowania eepromu lecą krótkie paczki (programowanie bajt po
bajcie). Przy programowaniu flascha lecą całe strony i bufor FTDI szybko
się zapełnia i dane szybko pojawiają się po stronie RS-a.

W sterowniku dla Windows jest okienko ustawień zaawansowanych, gdzie
można m.in. zmniejszyć czas oczekiwania przed wysłaniem danych (gdy
bufor nie jest zapełniony, standardowo 16ms a minimalnie 1ms). Może masz
gdzieś też upchnięte podobne ustawienia w Linuxie, albo można jest
ustawić niestandardowym ioctl'em? Wtedy nie problem dodać to nawet w
źródłach avrdude.

--
Adam Dybkowski
http://dybkowski.net/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

Grzegorz Kurczyk
Guest

Fri Mar 05, 2010 12:51 am   



W dniu 04.03.2010 00:44, Adam Dybkowski pisze:
Quote:

W sterowniku dla Windows jest okienko ustawień zaawansowanych, gdzie
można m.in. zmniejszyć czas oczekiwania przed wysłaniem danych (gdy
bufor nie jest zapełniony, standardowo 16ms a minimalnie 1ms). Może masz
gdzieś też upchnięte podobne ustawienia w Linuxie, albo można jest
ustawić niestandardowym ioctl'em? Wtedy nie problem dodać to nawet w
źródłach avrdude.

Choroba, pod Linuxem w ogóle jakoś dziwnie działa obsługa portów
szeregowych. Nawet na RS-ie czysto sprzętowym (normalny COM1 wbudowany w
płytę) ma taki dziwny efekt przy wysyłaniu krótkich paczek po kilka
bajtów. Przykładowo kawałek kodu w C.

int handle = 0;
handle = open("/dev/ttyS0", O_RDWR);
for(int i = 1000; i; i--) {
write(handle, "abcd", 4);
tcdrain(handle); // czeka na opróżnienie bufora nadajnika
}
close(handle);

daje mi taki efekt, że wysyłane są paczki po cztery bajty, a między nimi
jest 20ms przerwy !!! Poszperałem na góglu, ale znalazłem tylko ludzi
mających podobny problem (choć ta zwłoka nie była aż tak duża).
Pierwszy raz robię obsługę RS-a pod linuxem i trochę mnie to zmartwiło.
Znają Koledzy może jakiś parametr (coś w stylu timeouta), który
zmniejszałby tę zwłokę? Dziwne to trochę, bo o ile rozumiem zwłokę w
wysyłaniu w przypadku gdy FIFO nie jest jeszcze zapełnione (choć
nadajnik powinien rozpocząć nadawanie z chwilą pojawienia się pierwszego
bajtu w buforze), to w przypadku wymuszenia nadawania trochę to bez sensu.

Pozdrawiam
Grzegorz

hobgoblin
Guest

Fri Mar 05, 2010 8:29 am   



On Mar 5, 8:51 am, Grzegorz Kurczyk
<grzegorz.usun...@control.slupsk.pl> wrote:
Quote:

Choroba, pod Linuxem w og le jako dziwnie dzia a obs uga port w
szeregowych. Nawet na RS-ie czysto sprz towym (normalny COM1 wbudowany w
p yt ) ma taki dziwny efekt przy wysy aniu kr tkich paczek po kilka
bajt w. Przyk adowo kawa ek kodu w C.

int handle = 0;
handle = open("/dev/ttyS0", O_RDWR);
for(int i = 1000; i; i--) {
        write(handle, "abcd", 4);
        tcdrain(handle); // czeka na opr nienie bufora nadajnika}

close(handle);

daje mi taki efekt, e wysy ane s paczki po cztery bajty, a mi dzy nimi
jest 20ms przerwy !!!

Uzywasz kernela 2.4? W 2.6 "tick" jest 10x krotszy (10ms->1ms). Nie
znam implementacji tcdrain ale prawdopodobnie nie czeka ona na
zakonczenie transmisji w petli, a oddaje CPU schedulerowi.

Zamiast tcdrain sprobuj uzyc (nie sprawdzalem w praktyce):

do {
ioctl(handle, TIOCSERGETLSR, &lsr);
} while (lsr & TIOCSER_TEMT);

-hob

Grzegorz Kurczyk
Guest

Fri Mar 05, 2010 9:32 am   



W dniu 05.03.2010 07:29, hobgoblin pisze:
Quote:
Uzywasz kernela 2.4? W 2.6 "tick" jest 10x krotszy (10ms->1ms). Nie
znam implementacji tcdrain ale prawdopodobnie nie czeka ona na
zakonczenie transmisji w petli, a oddaje CPU schedulerowi.

Jajko z serii 2.6.

Quote:

Zamiast tcdrain sprobuj uzyc (nie sprawdzalem w praktyce):

do {
ioctl(handle, TIOCSERGETLSR,&lsr);
} while (lsr& TIOCSER_TEMT);


Właśnie coś w tym stylu kombinowałem, ale podpowiedź Kolegi bardzo dużo
mi pomogła. Działa, z drobną poprawką. Odwrotny warunek przy while.
Potrzebne mi to jest m.inn. do wysyłania danych przez bufor RS485
sterowany sygnałem RTS. W efekcie końcowym wyszło coś takiego:

ioctl(handle, TIOCMGET, &status);
status &= ~TIOCM_RTS;
ioctl(handle, TIOCMSET, &status);

write(handle, Out_data, strlen(Out_data));
do {
ioctl(handle, TIOCSERGETLSR, &lsr);
} while(!(lsr & TIOCSER_TEMT));

ioctl(handle, TIOCMGET, &status);
status |= TIOCM_RTS;
ioctl(handle, TIOCMSET, &status);

Wygląda niby dobrze, ale na oscyloskopie widzę niekiedy taką sytuację,
że RTS przeszło na moment w stan aktywny (ok 20..30us), a nie poszedł
żaden bajt. Po południu sprawdzę czy ta "ramka" jest gubiona czy
faktycznie wychodzi z następnym aktywnym RTS.

Dzięki za podpowiedź.
Pozdrawiam
Grzegorz

Grzegorz Kurczyk
Guest

Fri Mar 05, 2010 9:40 am   



W dniu 05.03.2010 09:32, Grzegorz Kurczyk pisze:
Quote:
Wygląda niby dobrze, ale na oscyloskopie widzę niekiedy taką sytuację,
że RTS przeszło na moment w stan aktywny (ok 20..30us), a nie poszedł
żaden bajt. Po południu sprawdzę czy ta "ramka" jest gubiona czy
faktycznie wychodzi z następnym aktywnym RTS.

P.S. Coś mi się wydaje, że to co obserwowałem, może wynikać ze
"złośliwego przypadku" wyzwalania oscyloskopu analogowego. Wieczorkiem
podepnę to pod cyfrówkę z długim rekordem, albo do drugiego komputera i
zobaczę co wyłazi z drugiej strony :-)

Pozdrawiam
Grzegorz

hobgoblin
Guest

Fri Mar 05, 2010 11:29 am   



On Mar 5, 5:32 pm, Grzegorz Kurczyk
<grzegorz.usun...@control.slupsk.pl> wrote:
Quote:

Jajko z serii 2.6.

Dziwne. Nie bede sie na ten temat wypowiadal bo juz dawno w tym nie
grzebalem.

Quote:
Potrzebne mi to jest m.inn. do wysyłania danych przez bufor RS485
sterowany sygnałem RTS.

Moze da sie to zrobic sprzetowo? (man stty)

Quote:
W efekcie końcowym wyszło coś takiego:
[...]
Wygląda niby dobrze, ale na oscyloskopie widzę niekiedy taką sytuację,
że RTS przeszło na moment w stan aktywny (ok 20..30us), a nie poszedł
żaden bajt. Po południu sprawdzę czy ta "ramka" jest gubiona czy
faktycznie wychodzi z następnym aktywnym RTS.

Nie wiem. Na wszelki wypadek dorzuc sprawdzanie wyniku ioctl'a. Moze
petla konczy sie zbyt wczesnie?

Wez tez pod uwage, ze ten kod moze w kazdej chwili byc wywlaszczony.
Miedzy RTS i ramka (i na odwrot) moga trafic sie duze opoznienia.

Pozdrawiam,
-hob

elektroda NewsGroups Forum Index - Elektronika Polska - Porównanie prędkości programowania flash i EEPROM w emulatorze STK500v2 z Allegro

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map