Krzysztof Wesołowski » język C http://kwesoly.net Programowanie, elektronika, automatyka - doświadczenia i projekty Wed, 07 Sep 2011 14:03:29 +0000 pl-PL hourly 1 Usuwanie nieużywanych funkcji z programu http://kwesoly.net/programowanie/avr/usuwanie-nieuzywanych-funkcji-z-programu/ http://kwesoly.net/programowanie/avr/usuwanie-nieuzywanych-funkcji-z-programu/#comments Mon, 17 Aug 2009 18:37:05 +0000 http://kwesoly.net/?p=380 W trakcie tworzenia biblioteki do obsługi wyświetlacza 7 segmentowego (7 segmentów+kropka) doszedłem do wniosku,  że  najbardziej eleganckie rozwiązanie to stworzenie osobnego pliku C dla tej biblioteki, wraz z nagłówkami z prototypami funkcji jak i z konfiguracją. Niestety napisanie kilku funkcji ustawiających liczbę na wyświetlaczu spowodowało znaczny rozrost programu - nieużywane funkcje, często bardzo obszerne, trafiły do pliku *.o a następnie do wygenerowanego HEXa zajmując miejsce, pomimo iż nie wszystkie były używane.

Po przetrząśnięciu kawałka internetu znalazłem rozwiązanie, którego efekty są naprawdę znaczące (usunięcie zbędnych funkcji potrafi zaoszczędzić dużo miejsca gdy korzystamy z bibliotek zawierających funkcje na każdą okazję), i w związku z tym warte powtórzenia w wielu innych programach - pozwoli to uniknąć ręcznego usuwania nieużywanego kodu z "biblioteki".

Ustawienie kompilatora

Okno Project Properties z dodanym poleceniem ffunctions-sections

Okno Project Properties z dodanym poleceniem ffunctions-sections

Aby móc usuwać nieużywane funkcje, muszą one w pliku wynikowym kompilatora być odrębnymi częściami. Zachowanie takie wymusza dodatkowy argument w poleceniu kompilatora:

-ffunction-sections

Dodanie takiej komendy w projekcie przy użyciu Makefile:

CFLAGS += -ffunction-sections

Przy korzystaniu z Środowiska Eclipse dla AVR należy z kolei polecenie dodać w ustawieniach projektu.

Z menu Eclipse wybieramy Project -> Properties,
następnie odnajdujemy C/C++ build -> Settings.
I przy wybranym configu Release, w zakładce Tool Settings wybieramy Optimizations z zakładki AVR Compiler. W polu Other Optimizations flag dopisujemy nasze "-ffunction-sections"

Ustawienia linkera

Ustawienia projektu - włączenie gc-sections

Okno Project Properties z dodanym poleceniem gc-sections

Poprzednio dodane polecenie umieści każdą funkcję w osobnej części pamięci - sekcji. Teraz pozostaje poinformowanie linkera, iż sekcje nie używane mają zostać usunięte - umożliwia to polecenie przekazane do linkera -gc-sections (gc od garbage collector). Tego również można dokonać poprzez plik Makefile lub ustawienia projektu.

Dla Makefile wystarczająca modyfikacja to

-Wl,-gc-sections

Z kolei w Eclipse będąc już w Project -> Properties-> C/C++ build -> Settings ->(Release) Wchodzimy w zakładkę AVR C Linker->General, i dodajemy polecenie "-Wl,-gc-sections"

U mnie taka modyfikacja ustawień pozwoliła na przykład usunąć jedyną funkcję używającą arytmetyki zmiennoprzecinkowej, zamieniając 2,5kB programu w 600bajtów.

]]> http://kwesoly.net/programowanie/avr/usuwanie-nieuzywanych-funkcji-z-programu/feed/ 2 Multipleksowany 4 cyfrowy wyświetlacz 7 segmentowy http://kwesoly.net/elektronika/wyswietlacz-7-segmentowy/ http://kwesoly.net/elektronika/wyswietlacz-7-segmentowy/#comments Sat, 15 Aug 2009 22:31:33 +0000 http://kwesoly.net/?p=367 Kontynuując powiększanie mojego zbioru prototypowych płytek ułatwiających prototypownie układów elektronicznych i naukę programowania, wykonałem płytkę z 4 cyfrowym wyświetlaczem LED.

Kilka zdjęć gotowego układu:

led7seg_06 led7seg_04 led7seg_03 led7seg_05 led7seg_02 led7seg_01

Główne zalety takiego układu:

  • Jasny wyświetlacz - prąd pojedynczego segmentu to 60mA i czas świecenia 1/4 długości cyklu.
  • Standardowy interfejs - 8 pinów do wybierania segmentu (aktywne stanem wysokim)  i 4 piny do wybierania wyświetlacza (aktywne stanem niskim).
  • Odrębne zasilenie (zmniejsza zakłócenia na płytce z uC).

Poniżej zamieszczam schemat tego układu:

Wyświetlacz LED 7 segmentowy - schemat

]]>
http://kwesoly.net/elektronika/wyswietlacz-7-segmentowy/feed/ 2