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ę.
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 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
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 = ... ) .
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.