Próbuję napisać program dla ATTiny13. Mój problem polega na tym, że ma ogromne ograniczenia wielkości. Tworząc mój pierwszy program Hello World, zajęło 100 bajtów miejsca na program, aby światło się włączało i wyłączało! Czy są jakieś opcje, które mogę dać avr-gcc, aby zmniejszyć ten rozmiar? Ponadto, co jest w crt0? Nie przepadam za montażem AVR, więc nie rozumiem go zbyt wiele…
Nie chcę schodzić do montażu dla tego projektu.
avr
attiny
programming
compiler
Earlz
źródło
źródło
Odpowiedzi:
crt0 to procedura uruchamiania dla uC. Procedury wykonują konfigurację rejestrów, a także inicjalizację danych.
Czy 100 bajtów zawiera tablicę wektorów przerwań? Nie jestem pewien co do ATtiny13, ale ATtiny25 / 45/85 ma 15 wektorów przerwań. Zajmie to 30 bajtów.
gcc ma opcję łączenia w twoim crt0. Możesz wziąć plik AVR crt0.S i zmodyfikować go. To nie jest bardzo długie, więc nie powinno być trudne.
źródło
/avr-libc-1.6.7/avr/lib/avr2/attiny13/crttn13.S
Możesz użyć avr-objdump -d .elf, aby zobaczyć, co jest generowane:
Przeanalizujmy to trochę:
Tablica wektorów przerwań 20 bajtów (przynajmniej niektóre wpisy można pominąć, jeśli nalegasz i obiecujesz, że nigdy nie włączysz odpowiednich przerwań).
Czyści SREG (nie jestem pewien, czy to jest naprawdę potrzebne), zapisuje 0x9f (RAMEND) do SPL (wskaźnik stosu) i przeskakuje do main. Ostatni rjmp jest trochę zbędny. (możesz obiecać, że nigdy nie wrócisz z głównego)
Domyślna procedura przerwania dla tych przerwań, które nie zostały zastąpione w C. (takie same reguły jak dla wektorów __)
Twój główny proc. Mocno.
Te dwa nie są bardzo przydatne. _exit jest prawdopodobnie wymagany przez standard C i __stop_program jest potrzebny, aby działał tak, jak powinien.
źródło
Jakie jest twoje ostateczne zastosowanie? ATtiny13 ma 1kB flasha i możesz z tym wiele zrobić w C. Crt0 to środowisko uruchomieniowe C avr-libc. Zawiera rzeczy takie jak obsługa stosu, dzięki czemu można używać funkcji z argumentami i zwracanymi wartościami.
100 bajtów na osadzoną konfigurację C nie jest takie złe i ma stały rozmiar. Podwojenie linii logiki programu niekoniecznie spowoduje, że będzie to 200 bajtów. Na jakim poziomie optymalizacji się kompilujesz? Powinieneś być w „-Os”. Jak to kompilujesz? Pliki Makefile w projektach demonstracyjnych dostępnych na stronie avr-libc są całkiem dobre i wyczerpujące.
Prosty program włączania / wyłączania LED poniżej zajmuje 62 bajty na ATtiny13 z „-Os” na avr-gcc 4.3.3. z CrossPack-AVR:
Usunięcie wywołań _delay_ms () powoduje, że zajmuje on 46 bajtów.
Większy przykład na ATtiny13 to moje prototypy Smart LED . Ten kod zawiera 3-kanałowe oprogramowanie PWM, konwersję kolorów HSV na RGB, automat stanów i odczytuje dwa przyciski. Nie jest dobrze napisany i ma 864 bajtów. W wersji avr-gcc 3.x był jeszcze mniejszy. (z jakiegoś powodu avr-gcc 4 spowodował, że prawie wszystkie programy wzrosły o kilka bajtów)
źródło
avr-gcc -std=c99 -Wall -Os -mmcu=attiny13 -o hello.out helloworld.c
jest odpowiednią linią w moim makefile (utworzonym przez siebie). i używam prawie identycznego kodu, z wyjątkiem tego, żeby przełączyć diodę LED, której używamPORTB &= ~(1 << LED);
i takJeśli brakuje Ci miejsca, wypróbuj wbudowany stół roboczy IAR - ich bezpłatna wersja „kickstart” ma limit rozmiaru kodu słowa 4K, więc wystarczająco dużo dla ATTiny i prawdopodobnie lepsza optymalizacja niż gcc
źródło
Takie urządzenia są często programowane w asemblerze, co powoduje mniejsze pliki wykonywalne. Warto podjąć wysiłek i nauczyć się z niego korzystać.
źródło