Jasne, że się da. Ja pisałem "nie może" w sensie "nie powinien", a nie "nie da się". Potwierdza to chyba przykład programu, który podałem. Nie używam keila (tak samo jak avr-gcc ;-) ). Czy robi to domyślnie, czy po podaniu jakichś specjalnych parametrów do optymalizacji? Moim zdaniem w drugim przypadku świadczy to o jego przewadze w stosunku do avr-gcc, a w pierwszym odwrotnie ;-)
I jeszcze prośba. Podeślij kod wynikowy, z chęcią obejrzę.
Albert
Didn't find your answer? Ask the community — no account required.
K
Krzysztof Rudnik
U¿ytkownik "Zbych" snipped-for-privacy@onet.pl napisa³ w wiadomo¶ci news:ct7thm$e8b$ snipped-for-privacy@julia.coi.pw.edu.pl...
Wlasnie, jedna instrukcje (zoptymalizowana wesja pustej funkcji) latwo przeoczyc. Daj:
static test() { }
i wtedy jej nie bedzie.
Juz ktos napisac w innym watku, moze powtorze: piszemy kazda funkcje w oddzielnym pliku .c wyniki (pliki .o) laczymy w biblioteke statyczna .a (ar w normalnym gcc) linkujemy ta biblioteke (plik z main dobrze jest zostawic na zewnatrz biblioteki jako .o - wtedy biblioteka bedzie mogla sie jeszcze do czegos przydac)
W takiej wersji z biblioteki zostana pobrane tylko uzywane w programie funkcje.
Krzysiek Rudnik
Z
Zbych
Pewnego dnia Krzysztof Rudnik przemówił ludzkim głosem:
dalej jest
i ta recepta mi się podoba :-)
J
J.F.
bo programiscie zalezy na krotkim kodzie :-)
I przeciez jest wygodny, wiec nie bedzie przepisywal z wydrukow linkera gdzie ten dana funkcje wstawil. Wiec linker wie ze jest wstawiona :-)
J.
J
J.F.
Sprawdz najpierw czy w tych 17 bajtach nie miesci sie 1 bajt procedury test :-)
Ale i tak moze byc to sprawka kompilatora - nie ma tresci to nie skompilowal .. chociaz powinien, bo byc moze sa odwolania w innym pliku.
J.
J
J.F.
W sumie powinno - dosc skomplikowane bedzie sprawdzenie przez kompilator ze jest to funkcja nieuzywana.
J.
J
J.F.
I co - ma dopelnic nopami i czy przesuwac kod ?
J.
K
Krzysztof Rudnik
Static - czyli moze byc uzyta tylko wewnatrz jednego pliku - przy odpowiednich opcjach optymalizacji gcc takie rzeczy pomija. Nie pamietam, czy nie daje ostrzezenia.
Krzysiek Rudnik
W
Wojtek Kaniewski
dla niektórych architektur to jest obsługiwane przez gcc i ld, ale akurat dla avr nie. zresztą co innego zmienić rodzaj relokacji i wstawić inną daną w konkretne miejsce w kodzie (nie trzeba przypadkiem używać
-fPIC?), co innego usuwać i przestawiać kawałki kodu będące z punktu widzenia linkera jedną logiczną całością.
w.
A
AK
Albert Bartoszko napisał(a):
Np. IAR dla AVR
A
Albert Bartoszko
Użytkownik AK napisał:
[...]
A można prosić o kod wynikowy / ustawienia parametrów kompilacji?
Albert
J
JS
W artykule snipped-for-privacy@4ax.com autorem którego mieni się J.F, napisano:
Jak dopełni, zysk będzie w jednym cyklu czasu wykonania mniej, czyli taki sobie.
Jak przesunie - oprócz w.w. się kod skróci, ale co linker się bajtami namacha, to jego. Nie wspominając już, że musi wiedzieć, którymi.
Sprawdziłem na programie dla ATmegi128:
- rozmiar kodu wynikowewgo ok. 100k (bez bibliotek i stałych),
- 3208 instrukcji call,
- 768 instrukcji można zamienić na rcall (pewnie nieco więcej, nie analizowałem dokładnie), wtedy kod skróciłby się o ok. 1.5%
Wywołania wewnątrzmodułowe (nawet funkcji statycznych) są też realizowane przez call. Optymalizacja wykonywana podczas generowania kodu (w obrębie jednostki kompilacji), realizowana tylko przez komilator, mogłaby być znacznie prostsza do realizacji (i być może da to większość korzyści możliwych do osiągnięcia tą metodą, bez potrzeby angażowania linkera).
int ext_function(int y) { y *= 2; return abs(y); }
-------------------------------------------------------- I teraz wyniki kompilacji i linkowania: rozmiar rozmiar rozmiar kodu pliku pliku wynikowego test.c test_2.c
Pliki kompilowane w postaci jak powyzej 5884 141 8
Pliki kompilowane z usunietym wywolaniem funkcji <function1> (zaremowane) 5778 135 8
Pliki kompilowane z usunietym wywolaniem funkcji <function1> i z usunieta sama funkcja <function1> 5778 35 8
Jak widac, w przypadku drugim, cala funkcja zostala usunieta przez _linker_ ,
Kompilator: IAR AVR 3.10C Opcje kompilacji i linkowania:
------------------------------------------------------------------- MAKE Version 5.2 Copyright (c) 1987, 2000 Borland Compiling src\test.c iccavr -I \INC\DLIB\ -I \INC\ -I ..\Common\ -I ..\common\rtos\include -I Include -o _obj\ --cpu=m128
Tue, 25 Jan 2005 09:12:53 +0100, na pl.misc.elektronika, Willy napisał(a):
THX - ale chyba na razie to odpuszczę i poczekam na release.
J
Jurek Szczesiul
Mon, 24 Jan 2005 20:04:18 +0100, na pl.misc.elektronika, Ania i Grześ napisał(a):
Sorry, nie podałem kompletu - sprawdź na
formatting link
-> forum avrgcc, powinien byc gdzieś na początku anons.
Odnowiłem też dystrybucję na
formatting link
:
- avr-gcc 3.4.3 ( release ) z patchem obsługi stałych w formacie binarnym, wyjściem dla debuggera elf/dwarf2 i poprawionym zgrubnie błędem instrukcji MUL dla attiny 13/2313;
- binutils 2.15 ( bez nie wspieranego już konwertera elf-coff );
- najnowsze avr-libc 1.2.0 ( z manualem html otwieranym z poziomu menu AvrSide ).
Cały folder można rozpakować w dowolne miejsce bez nadpisywania istniejacych w WinAvr plików. Jeśli użyjesz AvrSide to wystarczy ustawić odpowiednio scieżkę dostępu. Jeśli używasz make - można wpisać żądaną wersję kompilatora do makefile ( CC = ... ) .
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.