-->

niedziela, 12 sierpnia 2012

OutOfMemoryError - Android

Zaczynając pisać aplikacje na Androida nie przywiązywałem zbyt dużej wagi do jakości kodu i optymalizacji. To pociągnęło za sobą skutki w postaci błędów zgłaszanych przez użytkowników Milionera. Najczęstszym błędem przewijającym się w raportach był właśnie tytułowy błąd przepełnienia pamięci, dokładnie: java.lang.OutOfMemoryError: bitmap size exceeds VM budget...

Mimo że na moim Desire Z wszystko chodziło tak jak powinno to nawet lepsze telefonu z Androidem miały ten problem. Pierwszym krokiem było zorientowanie się jaka jest dostępna pamięć w każdej kolnej wersji Androida i jak to wszystko działa. W Androidzie wyróżniamy heap size czyli pamięć do której lokowane są nowo tworzone obiekty. Na starszych Androidach 1.6 ten obszar wynosił 16 MB. Dla wersji 2.1 to już 24 MB. Desire Z z Androidem 2.3.3 ma 32 MB. Oczywiście nie są to sztywne wartości i gorsze telefony mają mniej pamięci na aplikacje.

Warto pamiętać że istnieje także garbage collector, czyli coś w rodzaju sprzątacza. Niepotrzebne, niepowiązane obiekty są usuwane a tym samym zwalniana jest część pamięci. W wersji 2.3 garbage collector pracuje częściej i szybciej niż w 2.1. Choć i tak dla dynamicznej rozgrywki 2D/3D nie jest polecane wywoływanie go, ponieważ da się odczuć negatywny wpływ na płynność animacji.

Winą przepełniania była animacja z 11 klatek (pliki .jpg mocno skompresowane). Można było sobie poradzić w taki sposób:



Wykrywamy heap size, jeśli jest więcej niż 30 MB to możemy odtwarzać animację. To załatwiło sprawę dla słabszych telefonów (Galaxy Mini itp.), ale nie rozwiązało problemu całkowicie. Pomiędzy rozgrywkami użytkownicy trafiali nadal na ten błąd i znów wszystko się sypało. Powodem było nie czyszczenie pamięci po skończonej rozgrywce. Po każdej grze coraz więcej pamięci było zajętej przez animację a garbage collector przez istniejące referencje obiektów nie mógł tego ruszyć. Rozwiązanie takiego problemu:




Kluczową metodą jest zastąpienie animacji czymś "lżejszym" czyli np. kolorem i wywołanie System.gc(). Jest to przeciążona metoda onDestroy() dlatego nie musimy w takich przypadkach obawiać się o opóźnienia. Powyższy zabieg skutecznie przerwał serię wspomnianych błędów, być może nie jest bardzo elegancki ale działa ;]

Czytaj dalej/Read more!

środa, 8 sierpnia 2012

HD47780 - sterowanie 3 liniami [MSP430/STM8]



Wyświetlacze oparte o sterownik HD47780 są nadal bardzo popularne. Bardzo łatwo je obsłużyć, a w sieci jest cała masa przykładów, w dodatku są tanie. Najprościej  obsłużyć je w 4-bitowym trybie pracy. W takiej konfiguracji musimy poświęcić 6 wyjść mikrokontrolera (RS, E, D4, D5, D6, D7). W moim przypadku stosując takie rozwiązanie do Lanchpad'a od TI zająłem praktycznie wszystkie linie MPS430G2231, dlatego też postanowiłem poszukać jakiegoś rozwiązania, które pozwoliło by ominąć problem zajętych wyjść. Po kilku chwilach trafiłem na praktycznie gotowe rozwiązanie - 3Wires.



Na powyższym schemacie widać że potrzebny jest nam 8-bitowy rejestr przesuwny 74HC164. Takie rozwiązanie pozwala zmniejszyć sterowanie do 3 linii danych. Czas wcielić pomysł w życie, szybki layout i mamy płytkę rozmiarowo dopasowaną do standardowego wyświetlacza 2x16 ;]





Teraz jeszcze tylko trochę kodu dla MSP430:



oraz STM8:



I jak widać poniżej wszystko działa :]




Czytaj dalej/Read more!

sobota, 4 sierpnia 2012

Holo Compass - Android



Z nudów powstała druga wersja, tym razem dopasowana graficznie do Android 4.0 oraz wyżej. W założeniu miało być minimalistycznie ;]

Holo Compass




Czytaj dalej/Read more!

środa, 1 sierpnia 2012

Battery Hack - SanDisk Sansa C240

Jakiś czas temu współpracy odmówił odtwarzacz MP3 SanDisk Sansa C240. Problem pojawił się z dnia na dzień, mp3 razem z baterią nie chciała działać. Po podłączeniu do zewnętrznego źródła chodziła bez problemu i pokazywała że ładuje baterię. Jednak po odłączeniu, odtwarzacz znów się wyłączał.

Bateria na zaciskach pokazywała 0V a prąd ładowania 0mA. Ale trzeba wiedzieć że pomiędzy zaciskiem i baterią jest mała płytka PCB z miniaturowym układem do kontroli ładowania ogniwa (zwykle stabilizator liniowy + układ detekcji napięcia baterii) ;] Po zdjęciu foli maskującej, baterię można śmiało sprawdzić przed tym układem. Okazało się że jest tam około 2.7V a więc z baterią wszystko jest w porządku pomimo tego że ma zdecydowanie za małe napięcie jak na baterię litową. A więc winny jest układ kontrolujący stan ładowania na zdjęciu poniżej:




Taki układ można śmiało wymienić we własnym zakresie. Miałem podobną część z innej już niesprawnej baterii. Co prawda dawca ładował mniejszą baterię ale w niczym to nie przeszkadza, ponieważ co najwyżej mp3 będzie ładował się troszkę wolniej. Ważne jest tutaj to aby nie pomylić + z - ;], układ po wlutowaniu:



Po wymianie od razu widać efekty. Wystarczy poprawić montaż, zaizolować i mp3 dalej będzie grać ;)



Czytaj dalej/Read more!