avr-gcc - usuniecie "nadmiarowego" kodu

Dec 26, 2005 6 Replies

Witam!



Chciałbym wziąść sprawy w swoje ręce:



a) Nie chce aby w wynikowym kodzie pojawiała się sekcja .text z całą masą wektorów przerwań/etc. W ogóle nie ma być generowany kod inicjujacy zmienne globalne.



b) Nie chce inicjacji stosu z main(). Konkretnie taka funkcja:



main() { }



ma się kompilowac do nieskończonej pętli i ani instrukcji więcej (w ostateczności może to być funkcja _exit).



Czy ktoś może mi powiedzieć jak to osiągnąć w avr-gcc ? Czytam dokumentacje, ale na razie nic nie trafiłem.



Nie ukrywam, ze postanowiłem zrobić bootloader i te "śmieci" troche przeszkadzają. A gotowca nie moge wykorzystac, bo mam troche nietypowy protokół ... :)


gdzie¶ widzia³em np takie opcje linkera

-nostartfiles -nodefaultlibs

nie wiem na ile to spe³ni oczekiwania, ale mo¿e bêdzie bli¿ej

pozdrawiam

Należałoby dodać jeszcze własną (okrojoną) wersję crt inaczej nie ma pewności, że po starcie uC sterowanie zostanie przekazane do main. Natomiast dodanie __attribute__ ((naked)) do main pozwoli na pozbycie się inicjalizacji stosu.

Dziękuje za info, ale tego zdania nie rozumiem. Jak to nie ma pewności ? Jesli ustawie funkcje main w odpowiedniej sekcji to raczej powinna skopilowac się tam, gdzie ustawie ją w linkerze. Np. od 0x0000 albo na początku bootloadera.

Jakie widzisz konkretnie zagrożenia* ?

Faktycznie wycieło stos. Zostało jednak coś takiego:

ldi r24, 0x00 ldi r25, 0x00

nie ma tez _exit ani nieskończonej pętli (co sobie sam zrobie). Po co jednak te dwie instrukcjie ?

[*] Własnie wpadło mi do głowy inna kolejnośc funkcji w bootoladerze i "main" może nie wypaść jako pierwsza.

Dizęki, jest już bardzo blisko. Jedyne co zostało to sekcja "zero" ktora posiada tylko:

00000000 <_zero_>: 0: 08 95 ret

Diabli wiedzą po co ;)

Całośc wygląda teraz tak:

Disassembly of section .bootloader:

0001e000 <main>: 1e000: 80 e0 ldi r24, 0x00 ; 0 1e002: 90 e0 ldi r25, 0x00 ; 0 Disassembly of section .zero: 00000000 <_zero_>: 0: 08 95 ret

gdzie 1e000 to początek mojej sekcji .bootloader (wyssany z palca na razie).

Ok już jasne :)

Mój błąd, przy normalnej kompilacji sekcja .zero się nie pojawia. Mam już całkowiecie czysty kod :)

Dziękuje za pomoc i powoli zaczynam rzeźbę bootloadera.

[...]

Parę dni temu pisałem o tym:

formatting link

Pewnie zadeklarowałeś, że main ma zwrócić zmienną typu int. Jak zmienisz na void, to te instrukcje znikną.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required