Czy sa jakies opcje kompilatora ktorych ustawienie generowaly by mi informacje o rozmiarze i liczbie cykli konkretnej funkcji? Dokladnie chodzi mi o funkcje obsl. przerwanin.
- posted
15 years ago
Czy sa jakies opcje kompilatora ktorych ustawienie generowaly by mi informacje o rozmiarze i liczbie cykli konkretnej funkcji? Dokladnie chodzi mi o funkcje obsl. przerwanin.
In the darkest hour on Wed, 12 Nov 2008 19:50:16 +0100, roxy snipped-for-privacy@o2.pl screamed:
Tak, są.
In the darkest hour on Wed, 12 Nov 2008 19:50:16 +0100, roxy snipped-for-privacy@o2.pl screamed:
Tak, są. To znaczy pośrednio. Samemu trzeba sobie będzie rozmiar przeliczyć i policzyć cykle.
Witam,
Dnia 12.11.08 (środa), 'Artur M. Piwko' napisał(a):
Można jeszcze skorzystać z dobrodziejstw symulatora... :)
Poza tym, nietrudno sobie wyobrazić taką sytuację, w której kompilator nie byłby w stanie policzyć ilości cykli... :)
In the darkest hour on Wed, 12 Nov 2008 20:49:12 +0100, Dykus snipped-for-privacy@spam.wp.pl> screamed:
Zakładając, że umieścimy jedną funkcję w jednym pliku to rozmiar funkcji sprawdzi się całkiem prosto.
W przypadku funkcji wywoływanej w przerwaniach raczej myślałem o czymś liniowym... ;)
Jesli to tak krytyczna czasowo funkcja, ze musisz znac dokladnie przez ile cykli sie wykonuje to napisz ja w assemblerze i wlacz do programu w C.
Dla AVRów chyba jest to możliwe - tak każda instrukcja trwa określoną ilość cykli. Ale przy ARMach sprawa się komplikuje. W ARM9 NOP może trwać jeden cykl maszynowy, a może zero jeżeli na przykład będzie za poleceniem LDR. Jest to związane z tzw. interlockami:
pozdrawiam tn
tomny pisze:
[ciach]Patrz temat wątku.
roxy pisze:
Rozmiar każdej funkcji można łatwo sprawdzić w pliku .map - wystarczy odjąć adres żądanej funkcji od adresu kolejnej funkcji w sekcji .text.
Liczba cykli przecież zależy od spełnienia warunków wyznaczanych dopiero w czasie wykonania - np. skoki warunkowe, pętle itd. Użyj AVRStudio w trybie symulacji.
T.M.F. pisze:
Z asemblerem to ściema. Bardzo często da się funkcję napisać w czystym C dosyć optymalnie i przy tym niewiele gorzej niż w 100% asm. A ewentualne przenosiny w przyszłości na inny procesor pozwolą docenić implementację w C.
BTW: W firmie wiele kawałków kodu przenosiliśmy już w kierunku DSP->ARM lub DSP->AVR. Gdyby nie były w C, roboty byłoby 10x więcej. A i tak pisząc coś od razu warto myśleć, na jakich procesorach ma chodzić (na Texasowe DSP'ki 16-bitowe pisze się dość specyficznie - wiedząc, że nie ma mniejszych kawałków danych niż 16 bitów i nawet sizeof(int) wynosi 1).
Masz racje. Ale sugerowalem sie tym, ze jesli ktos potrzebuje wiedziec ile dokladnie cykli zajmuje procedura to jest to jakas krytyczna czasowo sekcja. W tym momencie trudno mowic o przenosnosci kodu, bo po skompilowaniu na inny procek wszystkie timingi szlag trafia. Druga sprawa to fakt, ze kompilator C praktycznie nie daje kontroli nad czasem wykonania procedury - rozne optymalizacje, rozne kompilatory generuja rozny kod. Wiec tym bardziej pytanie o cykle nie ma sensu.
T.M.F. pisze:
To prawda. Dlatego po sprawdzeniu, co z programu napisanego w C wyszło w asemblerze można albo skorzystać z symulatora (AVR Studio), albo z listy rozkazów i ich czasów wykonania. Akurat w przypadku AVRów jest to proste i nie ma zależności czasu wykonania instrukcji od stopnia napełnienia pipeline'a, sposobu działania i bieżącej zawartości pamięci cache, czasu dostępu do zewn. pamięci SDRAM, rodzaju pamięci z kodem programu i danymi czy innych czynników skutecznie utrudniających takie ręczne obliczenia w przypadku większych procesorów (ARM, x86, PowerPC).
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.