
Napisałem, a w zasadzie jeszcze coś nie coś chce napisać, programik który analizuje dane z plików *asm wygenerowanych przez kompilator sdcc dla mikrokontrolerów serii PIC18XXXX.
Program ma być pomocny w określaniu zasobów które może zużyć program który piszemy na mikrokontroler. Po prostu przy większym programie można łatwiej to ogarnąć.
Działa z wersją sdcc 3.6.0. Jak z innymi, nie wiem. Generalnie program pisałem pod linuksa którego używam, ale że nie używa jakiś nadzwyczajnych funkcji, być może da się bez problemu skompilować na inne systemy.
Możliwości, opcje:
1. -a wszystkie pliki asm
analizuje pliki *asm i tworzy plik _listnamefun.txt, oraz wyświetla informacje indywidualne funkcji np:
codename sstck regx regf ramf rams resstack
S_pff__pf_read 52 40 40 107 111 0
S_pff__pf_open 27 40 18 107 111 0
S_pff__pf_mount 44 40 33 107 111 0
codename sstck regx regf ramf rams resstack
S_t07t_ivec_0x2_tc_int 0 4 0 54 165 0
S_t07t_ivec_0x1_tch_int 0 4 0 54 165 0
S_t07t__main 8 4 2 54 165 0
S_t07t__tch_int 9 4 0 54 165 0
S_t07t__tc_int 9 4 0 54 165 0
codename - nazwa asemblerowa
sstck - zużycie stosu programowego przez funkcje
regx - maxymalne zużycie rejestrów na plik *(1)
regf - maxymalne zużycie rejestrów na funkcje
ramf - zarezerwowana ilość ram
rams - sumaryczna zarezerwowana ilość ram
resstack - zarezerwowana wielkość stosu programowego
ad.(1) Rejestry rezerwowane są głównie na początku ram i określone w pliku linkera
2. -s
analizuje plik _listnamefun.txt i wyświetla sumaryczne dane dla funkcji które nie są wywoływane, np:
name sstck regf hstck +l+h ?lh sumhs
ivec_0x2_tc_int 9 0 0 2
ivec_0x1_tch_int 9 0 0 2
_main 174 40 9 192 183 11
name - nazwa prawie jak w C
sstck - sumaryczne zużycie stosu programowego przez funkcje
regf - sumaryczne (maxymalne) zużycie rejestrów przez funkcje
hstck - sumaryczne zużycie stosu sprzetowego przez funkcje
+l+h - zużycie stosu programowego przez funkcje wraz z sumą przerwań
?lh - zużycie stosu programowego przez funkcje wraz z największą wartością z przerwań
sumhs - sumaryczne zużycie stosu sprzętowego przez funkcje (ilość wywołań, razem ze znalezionymi przerwaniami )
By program uwzględnił stosy z przerwań należy je nazwać:
tch_int - dla wysokiego priorytetu
tc_int - dla niskiego
Code: c
3. -cs plik_linkera
znajduje największy ostatni blok pamięci, przyda się do określenia gdzie ma być stos
Program na wyjście błędów wysyła czasem informacje, np o nieznalezionych skokach:
Spoiler:
call global not found __mullong ...skip
Program nie zawsze wszystko idealnie policzy:
1. Gdyby były przemieszane różne kody ze skokami lokalnymi w których stos rośnie, a gdzie indziej gdzie stos maleje, a jeśli skoki będą warunkowe to jeszcze pogarsza sytuacje. W tej chwili program nie uwzględnia skoków lokalnych.
2. Nie policzy sum w funkcjach wywoływanych przez wskaźniki do funkcji.
3. Nie policzy funkcji bibliotecznych linkowanych do projektu.
4. Program pokazuje wszystko co znajdzie w plikach, jednak nie wszystko jest umieszczane w końcowym programie przez linker. Np nieużywane funkcje nie są umieszczane w końcowym pliku.
W planach:
1. Chce dodać analize plików po deasemblacji. W takich plikach jest troche mniej niektórych informacji, ale jest cały projekt. Uzupełniłoby to troche wiedzy w zakresie stosu funkcji bibliotecznych.
2. W jakiś sposób uwzględnić funkcje wywoływane wskaźnikiem na funkcje.
Są takie przypadki że można je policzyć z pliku asm, ale w wielu nie jest to oczywiste. Myśle o pliku, gdzie można określić ręcznie jakie funkcje są wywoływane przez jakie. Jednak nawet w takim wypadku można uwzględnić jedynie maksymalne wartości, jeśli wywołań jest więcej niż dwa do różnych funkcji.
Link do ściągnięcia kodu
Macie jakieś uwagi, dygresje itp., w miare możliwości uwzględnie itp.
Cool? Ranking DIY