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

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ł

Reply to
pp
Loading thread data ...

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.

Reply to
konsul41

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

Nie da się. Takie jest ABI.

formatting link

To nie ma nic do rzeczy.

Reply to
Zbych

"naked".

Reply to
JDX

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.

Reply to
Zbych

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ł.

Reply to
janusz_k

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.

Reply to
John Smith

A gdzie maja byc zapisywane?..

A.L.

Reply to
A.L.

Ok, dziękuje wszystkim za odpowiedzi.

Reply to
pp

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.

Reply to
pp

John Smith pisze:

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

Reply to
pp

Zbych pisze:

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

Reply to
pp

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

Reply to
Zbych

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.

Reply to
pp

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

Reply to
Gof

Zmiennych czy rejestrów?

Reply to
Gof

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

Reply to
pp

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?

Reply to
Gof

Ok, ale wtedy program zajmuje więcej miejsca.

2kB
Reply to
pp

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.

Reply to
janusz_k

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.