PasjaGSM.pl
  Jesteś w: Forum > czas procesora a skrypty NokiXa


czas procesora a skrypty NokiXa

Forum.PasjaGSM.pl » ...:Sprzęt:... » Nokia » DCT-3 » [DCT3] Modyfikacje HW i SW » NokiX » Programowanie » czas procesora a skrypty NokiXa
Poprzedni temat «» Następny temat
Autor Wiadomość
 
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 31
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-01-16, 12:14   czas procesora a skrypty NokiXa

witam wszystkich

postanowiłem tutaj o tym napisać no bo niby gdzie?? a bardzo mnie to interesuje ; )
Oczywiście będę przykłady rzucał żeby łatwiej było zrozumieć o co mi właściwie chodzi ( no właśnie o co???). Jeśli odpalamy grę/aplikację i jest ona uruchomiona więc jeśli dobrze myślę ( jeśli źle to ktoś poprawi) zjada nam coś z czasu procesora - zależnie od kodu jaki jest władowany w tymże programiku - domyślam się że jakaś długa pętla for czy coś to chyba mocno obciąża procesorek. A jak jest sprawa z patchami których tak naprawdę nie uruchamiamy tylko one siedzą gdzieś tam we flashu ( może nie tylko??) i coś tam robią - chodzi mi głownie o patch hour_beep.nrx który raz na godzinkę wykonuję odpowiednia czynność ( vibra, dźwięk, combo, nic). Pewnie nie powinienem analogii do CPU w kompie robić bo to inna bajka ale inaczej tego nie mogę zrozumieć - żeby na kompie coś się uruchamiało co ś się uruchamiało co godzinkę to ten program musi być uruchomiony. czyli w jakimś stopniu zjada nam RAM i czas procesora. Więc moje pytanko dotyczy takich patchy jak hour_beep jak to się dzieje no że one działają - no bo przecież nie uruchamiamy tego jak np gry tylko to działa cały czas czy jak? A może nokia "wie" że co godzinę ma coś takiego uruchamiać/wykonywać? Bo ten patch sprawdza, czy mamy pełną godzinę, a co by było gdyby sprawdzał nie godzinę ale np czy mamy pierwszy dzień tygodnia/miesiąca/roku? czy takie coś obciąża procek w noki czy jak??

mam nadzieję że dało się to jakoś przeczytać : )
z góry dzięki za jakiekolwiek wskazówki i pozdrawiam

druidbartek
^
 
     
AdSense


jaras 
Nowicjusz



Telefon: Nokia 5110
Operator: Plus
Pomógł: 2 razy
Wiek: 44
Dołączył: 09 Kwi 2005
Posty: 62
Skąd: "LAC: 41008" ;-)
Wysłany: 2006-01-17, 00:29   

Cześć.

A ja wiem, Stary, o co Ci chodzi. :-)

I bardzo dobrą analogię do komputera PC zrobiłeś, bo sam nawet @ yak pisał, że te programy, aplikacje (np. gry) czy inne dodatki właściwie są... cały czas w telefonie uruchomione.

No to, jak to się dzieje, że nie zżerają one 100% czasu procka?

Proste. I @ yak też już gdzieś o tym pisał. Za wszystko odpowiedzialne są tzw. dispatchery. One sobie siedzą cichutko i nic się w nich nie wykonuje, dopóki do któregoś z nich nie dotrze komunikat od systemu. Zajrzyj sobie w SDK do pliku ui_messages.h i zobaczysz, przy jakich czynnościach tak naprawdę taki dispatcher może dostawać komunikaty - przy chyba wszystkich: począwszy od naciskania klawiszy, a nawet "pipania" ich (dźwięk klawiatury), poprzez wybór opcji w menu, a nawet naciskanie kursorów, w celu zmiany pozycji belki w menu, aż do takich rzeczy jak komunikat co minutę, połączenie przychodzące, nadchodzący SMS itp.

I teraz taka funkcja z dispatcherem ma następującą konstrukcję:
Kod:
// dispatcher dostanie komunikat w argumencie, gdy zostanie wywołany

mojdispatcher(unsigned int msg)
{
    switch (msg)   // sprawdzamy komunikat: co się stało?
    {
    case MSG_D_INIT:
        // aha, użytkownik zainicjował naszą aplikację - coś robimy więc
        break;

    case MSG_D_QUIT:
        // jaka szkoda :-( - użytkownik wychodzi z naszej aplikacji :-(
        break;

    case MSG_KEYPRESS:
        // ooo, użytkownik nacisnął jakiś klawisz! - coś z tym trzeba zrobić
        msg=MSG_NOP;   // OK, obsłużyliśmy, to już niech nic innego tego nie rusza
        break;

    case MSG_INCOMING_CALL:
        // a tutaj obsłużymy sytuację, gdy połączenie przychodzące (ktoś dzwoni)
        break;
    }
    return msg;   // a to, czego nie chcemy obługiwać
                  // lub też chcemy dodatkowo obsłużyć przez system, zwracamy
                  // może jakiś inny dispatcher (nie może, a na pewno) obsłuży?
}

I tak to działa właśnie.

To jest bardzo podobne do działania programów w Windows. Tam, każde okno (a oknem w tym systemie jest WSZYSTKO: zwykłe okno, okienko dialogowe, button, pole edycyjne, a nawet pulpit - fajna ta nazwa Windows, co? ;-) ma swoją tzw. procedurę dispatchera, która niejako "opiekuje się" oknem i obsługuje wszystko, co użytkownik w takim oknie zrobi.

W tym systemie bardzo podobnie, do obsługi wszystkich rzeczy używa się komunikatów. W NokiX'ie przyjęto konwencję ich nazewnictwa MSG_*, a w Windows - konwencję WM_* (nie tylko, ale to są akurat komunikaty obsługi okien - window message).

Kiedy więc teraz użytkownik kliknie na krzyżyk w prawym górnym rogu okna - do dispatchera wysyłany jest też komunikat WM_CLOSE, kiedy zechce zminimalizować okno - WM_MINIMIZE, a kiedy naciśnie jakiś klawisz na klawiaturze, gdy okno jest aktywne (ma tzw. fokus) - WM_CHAR (i jeszcze WM_KEYDOWN i WM_KEYUP), podobnie, gdy kliknie myszą - WM_CLICK (i jeszcze WM_MOUSEDOWN i WM_MOUSEUP).

Tak naprawdę nawet funkcja dispatchera okna ma podobną budowę do tej z NokiX'a! Też oparta jest na instrukcji switch i też, nieobsłużone komunikaty oddaje się do innego dispatchera (w tym wypadku DefWindowProc() - default window procedure).

Nawet timer'y w Windows obsługuje się bardzo podobnie: tworzy się timer, przypisuje mu się jakiś czas timeout i wychodzi z dispatchera. Po upłycięciu tego czasu timeout dispatcher zostanie ponownie wywołany właśnie przez ten timer, dostając w argumencie komunikat WM_TIMER.

Po co o tym piszę?

Żeby uzmysłowić Tobie właśnie działanie progamów w telefonie. One są tam cały czas - nie ma momentu, kiedy wykasowuje się pamięć z ich kodem po wyjściu z aplikacji, tylko, gdy danej aplikacji się nieużywa - ona wówczas jest tylko nieaktywna. W momencie, gdy dotrze do niej jakiś komunikat (tutaj pierwszym komunikatem jest MSG_D_INIT, a np. w Windows jest WM_INIT) - ona się "budzi" i robi co jej kazali.

To tak jakbyś sobie wyobraził, że uruchomiłeś jakieś zadania w Windows i one są uruchomione, ale nie rysują swoich okien (ale Menedżer Zadań pokazuje, że są uruchomione - można tak zrobić, np. może być ikonka w systray'u). Powiedzmy teraz, że każda z tych aplikacji ma jakiś klawisz skrótu, który powoduje, że pokazuje ona swe okno.

OK, Ty teraz naciskasz tą kombinację klawiszy i zostaje wywołana funkcja dispatchera tego okna dostając na "dzień dobry" komunikat WM_INIT. Dzięki temu wie ona, że "aha, użytkownik otworzył okno - to trzeba coś tam zainicjować na początku pracy". Potem, gdy będziesz w tym oknie klikał, naciskał klawisze, wybierał polecenia z menu itp. - ta funkcja dispatchera będzie otrzymywać stosowne komunikaty do obsługi.

I teraz... IDENTYCZNIE JEST TUTAJ w telefonie.

Na razie nie będę tego rozwijał, żeby nie zamotać Ci we łbie ;-), ale już chyba dość dobrze opisałem podstawy programowania w NokiX'ie.

Pozdrawiam Cię serdecznie.
_________________
Jarosław Krasuski (jaras)
^
 
 
 
yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-01-17, 01:18   

Tak jest, wszystko jest oparte o system wiadomości.

Tylko technicznie poszerzę to co napisał jaras.

W nokiach DCT3 kod całego firmware'u siedzi w pamięci flash niezakodowany i bezpośrednio stamtąd CPU go wykonuje. Na PC program najpierw wczytywany jest z dysku do RAMu. Tutaj tego nie ma. Dlatego wszystkie latki, gry czy aplikacje jakie piszemy cały czas tam są gotowe do wykonania przez procesor. To, czy będą się one wykonywać cały czas i zabierać czas CPU który mógłby robić coś innego zależy tylko jak ten nasz kod "whaczymy" w kod Nokii. I tu są dwie metody.

Pierwsza to znany crackerom hook. Działa to tak, że zamiast kilku instrukcji kodu asemblera Nokii wstawiamy skok do naszego kodu gdzie oprócz niego znajdują się także usunięte instrukcje. Jest to dość dobra metoda (NokiX udostepnia do tego komende HOOK w Rexxie) ale oczywiście skok będzie wykonywany zawsze i kod będzie wolniejszy niż to pierwotnie zaprogramowała Nokia.

Inne podejscie mają dispatchery. Upraszczając sprawę system ten składa się z tablicy adresów wszystkich dispatcherów we flashu oraz zmiennej w RAMie przechowującej indeks w tej tablicy. Wiadomości przepływające przez task UI trafiają tylko do dispatchera, którego adres znajduje się polu tablicy na który wskazuje indeks. Pozostałe dispatchery nie robią nic, nie wykonują się, nie zabierają czasu procesora. Gdy one dochodzą do głosu (po wysłaniu wiadomości MSG_START_HANDLER z indeksem jako parametrem) wykonywać przestaje się poprzedni.

O ile w przypadku gier i aplikacji dispatcher to idealne rozwiązanie (i po to Nokia je wprowadziła) o tyle w przypadku np. wspomnianego hour_beep musimy użyć pierwszej metody.

To czy taka łata zwolni działanie telefonu zależy od miejsca w którym nasz kod "whaczymy". hour_beep wykorzystuje fakt, że co minutę przez task UI przelatuje wiadomość zawierająca aktualny timestamp (w którym sekundy == 00). Task UI posiada dwie pokaźne funkcje, które w dość efektywny sposób (coś ala drzewo) rozpoznają jaka wiadomość przyszła i dla każdej rozpoznanej coś tam wykonują. Na przykład dla MSG_SET_ACTION wywołują funkcję set_action() i w rezultacie ustawiają nową akcję. W takie właśnie miejsce ale odpowiedzialne za obsługę tej cominutowej wiadomości "whaczony" jest hour_beep. Spowolnienie jest minimalne, kilka dodatkowych instrukcji asemblera co minutę. Jak widzicie jest to sprawa indywidualna i dla różnych łatek szuka się takiego miejsca inaczej. A czasem niestety trzeba pogodzić się z tym, że kod łatki będzie wywoływany dość często i trochę czasu CPU jednak zje.
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 31
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-03-15, 21:22   

yak napisał/a:
hour_beep wykorzystuje fakt, że co minutę przez task UI przelatuje wiadomość zawierająca aktualny timestamp (w którym sekundy == 00).

a jest może jakaś wiadomość która przechodzi przez UI co np 1 godzinę? albo większy okres czasu? dzień, miesiąc??
bo mi by była potrzebna taka cogodzinna wiadomość
^
 
     
sander18 
Starszyzna
Nie Wie Co Pisze ;)



Telefon: nokie
Operator: Orange
Pomógł: 29 razy
Wiek: 34
Dołączył: 02 Mar 2005
Posty: 511
Skąd: z kątowni ;)
Wysłany: 2006-03-15, 21:38   

druidbartek, chyba nic z tego... w koncu w hour_beep tez byla potrzebna taka godzinna wiadomosc, a jednak sprawdza co minute... :/
_________________
W dżungli amazońskiej odkryto nowy gatunek kameleona. Ma 65 tys. kolorów i polifoniczne dzwonki :D
^
 
 
     
yak 
Starszyzna



Telefon: Kilka DCT3
Operator: Vodafone
Pomógł: 20 razy
Wiek: 37
Dołączył: 21 Gru 2004
Posty: 774
Skąd: Bochum / Niemcy
Wysłany: 2006-03-20, 22:56   

Dokładnie. Z drugiej strony mały if co minutę nikomu nie zaszkodzi :D.
_________________
NokiX Ci się podoba? Kliknij i wyraź to!
^
 
 
 
     
druidbartek 
Expert



Telefon: DCT-3
Operator: Era
Pomógł: 39 razy
Wiek: 31
Dołączył: 13 Wrz 2005
Posty: 1006
Skąd: Wrocław
Wysłany: 2006-03-30, 23:06   

yak napisał/a:
Pierwsza to znany crackerom hook. Działa to tak, że zamiast kilku instrukcji kodu asemblera Nokii wstawiamy skok do naszego kodu gdzie oprócz niego znajdują się także usunięte instrukcje...

a mam pytanie czy da radę zrobić takiego hooka żeby jednak wywalić pewną wiadomość na dobre??
tzn żeby własnym kodem zastąpić daną wiadomość
troszkę bawiłem się msg_watcherem i wpadłem na pomysł zrobienia msg_sendera -wysyła wiadomość jaką wpiszemy + argumenty jeśli takie są. I wyłapałem tą cholerną wiadomość co po pewnym czasie wyłącza nam budzik tzn zutomatycznie drzemke ustawia - jest to msg 0x6c5 no to ja bym chętnie zastąpił ją np 0x6c2 czyli ponowne uruchomienie alarmu co by mnie ucieszyło bardzo bo dzięki temu miałbym niekończący się alarm : ]

a i blokada klawiszy to jest 0x6cc jakby kto chciał : )

[ Dodano: 2006-03-30, 23:27 ]
bo narazie zrobiłem coś takiego:
_project.nrx:
Kod:
/*
   hook_alarm
   ==========
*/
pool="ENVIRONMENT"

/* inserting code */
#link_object hook_alarm

/* infect UI task */
hook find_ui_message(x2d(6c5)) hook_alarm

say "Done!"


hook_alarm.c:
Kod:
/*
** hook_alarm.c
*/
#include <nokix/all.h>

void hook_alarm(void)
{
   send_message(MSG_ALARM);
}


no i działa to jak powinno tzn zamiast tej automatycznej drzemki ponownie uruchamia suię alarm :D
ale ejstem ciekaw czy da się ( a na pewno się da : ] ) zrobić żeby zamaist tej wiadomości 0x6c5 przesłać MSG_ALARM
kod byłby krótszy :D
^
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Nie możesz ściągać załączników na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Podobne tematy
Temat Autor Forum Odpowiedzi Wysłany
Brak nowych postów Nokia 6310i. Tel. samoczynnie reset... EMEK DCT-4 1 2008-01-29, 00:56
Brak nowych postów Nokia 6030 - spozniony czas pawlored DCT-4 2 2008-03-23, 13:12
Brak nowych postów Nokia N70 - cały czas widzi zestaw sł... Ardi2 BB5 12 2009-02-04, 10:33
Brak nowych postów Jak zdiagnozować usterkę procesora RAP? jubi20 BB5 15 2009-04-12, 14:18
Brak nowych postów [n96] Resetuje się co jakiś czas evil86 BB5 1 2011-01-01, 13:20