Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Program do oszacowania zużycia zasobów dla kompilatora sdcc dla PIC18XXXX

trol.six 15 Lut 2020 12:22 1380 0
  • Program do oszacowania zużycia zasobów dla kompilatora sdcc dla PIC18XXXX

    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:

    Code:

                                    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:
    Code:

                              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

    Kod: c
    Zaloguj się, aby zobaczyć kod


    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.

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    trol.six
    Poziom 31  
    Offline