C, AVR - funkcja - wyłączenie zapisywania/p

Aug 05, 2014 20 Replies

Witam



Jak w C (avr-gcc, AVR) wyłączyć zapisywanie zmiennych do stosu (czy gdzie to tam jest zapisywane) przy wchodzeniu do funkcji i przywracanie tych zmiennych przy powrocie z funkcji ? Program nie używa przerwań, więc chyba nie jest to konieczne.



Paweł


Użytkownik "pp" snipped-for-privacy@32213231.pl napisał w wiadomości news:lrpaj3$ti1$ snipped-for-privacy@speranza.aioe.org...

Uzyć asemblera zamiast C lub nie stosować funkcji.

W dniu 2014-08-05 03:04, pp pisze:

Nie da się. Takie jest ABI.

formatting link

To nie ma nic do rzeczy.

Przy "naked" trzeba ręcznie tworzyć ramkę na stosie (jeśli jest potrzebna), zadbać o odtworzenie oryginalnego stanu rejestrów R18–R27, R30, R31 jeśli zostały zmienione i na koniec ręcznie wstawić rozkaz powrotu z funkcji. Raczej nie jest to wygodny przepis na usunięcie "niepotrzebnych" push/pop.

Jak już pytacz chce eksperymentować to może poczytać sobie o atrybucie OS_task, który tylko blokuje zapamiętywanie stanu rejestrów.

W dniu 05.08.2014 o 03:04 pp snipped-for-privacy@32213231.pl pisze:

Po 1 nie zapisuje zmiennych na stosie, tylko przekazuje je w rejestrach od R25 do R8, dopiero jak jest ich wicej to na stosie. To co odkłada na stosie to prolog i epilog funkcji, można to wyłączyć przez atrybut naked np: ISR(TIMER0_OVF_vect, ISR_NAKED) ale wtedy o rejestr stanu i inne rejestry musisz zadbać sam, jAKIE TO JUŻ Zbych napisał.

Użyć zmiennych globalnych (poza funkcjami, także poza main) oraz wszystkie funkcje muszą być postaci: void funkcja(void) i wtedy jedyne co ląduje na stosie to adres powrotu funkcji. Jeśli nawet to jest za dużo, to nie używaj funkcji w ogóle. K.

A gdzie maja byc zapisywane?..

A.L.

snipped-for-privacy@wp.pl pisze:

Asembler jest nie na moją głowę. Używałem trochę asemblera przy 8051 ale z tym jest chyba jeszcze 2x więcej roboty.

John Smith pisze:

Ok, dzięki, chyba trochę to pomogło.

Zbych pisze:

Chyba mam na to za stare avr-gcc - 3.4.3: warning: `OS_task' attribute directive ignored

O kurczę, ale z ciebie kustosz :-) Aktualna wersja na stronie atmela to 4.7.

Zbych pisze:

Chyba więcej kłopotu niż pożytku przy przechodzeniu na nowsze wersje. Jak coś dobrze działa - wolę tego nie ruszać. Oprogramowanie linuksowe to jeden wielki burdel. W ogóle, odnoszę wrażenie, że programiści linuksowi to ludzie inteligentni inaczej.

Czy ja wiem... mi się wydaje, że assembler AVR jest bardziej logiczny, niż assembler 51.

Chodzi mi tylko o jak najszybszą realizację funkcji (zegar 128 kHz).

Zrób ją inline (nie ma gwarancji że kompilator wtedy i tak zrobi z niej inline) albo makrodefinicję (wtedy masz gwarancję). Ile masz pamięci programu?

Ok, ale wtedy program zajmuje więcej miejsca.

2kB

W dniu 07.08.2014 o 15:25 pp snipped-for-privacy@32213231.pl pisze:

No to rybki albo akwarium, decyduj się.

Pisz w asemblerze najważniejsze funkcje to parę bajtów odzyskasz, wbrew pozorom asembler do AVR-a wcale nie jest gorszy od 51, a powiedziałbym że prostszy bno jest więcej rejestrów uniwersalnych i w miarę dobrze opisany.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required