ARM GCC - Jak umieścić funkcje bibloteczną w RAMie?

May 31, 2008 8 Replies

Witam Robie program (na AT91SAM7) który dość intensywnie liczy. Umieszczenie funkcji w pamięci ram zasadniczo w tym wypadku przyspiesza to liczenie. Nie mam problemu z wstawieniem własnych funkcji do ramu, ale zastanawiam sie jak tam umieścić wybrane funkcje z biblioteki (np sqrt, sin). Idąc dalej jestem skłonny wydłubać z plików (np lst) nazwy funkcji realizujących np. mnożenie, dodawanie (__muldf3, __adddf3). Pytanie co zrobić aby te funkcje znalazły się w ramie? Może ktoś ma wiedze jak to ma wyglądać i się zechce podzielić



pozdrawiam



Paweł pisze:

W pliku sterującym linkerem wpisujesz przecież, jakie sekcje i z jakich plików mają się znaleźć w określonych obszarach pamięci. Wystarczy teraz podać, aby wszystkie sekcje .text z interesujących Cię bibliotek (libm, libc, libgcc - zależy o jakie funkcje dokładnie chodzi) zostały wrzucone razem z danymi preinicjalizowanymi (sekcja .data) do RAMu. Upewnij się jeszcze co do nazw sekcji bo funkcje biblioteki standardowej mogą być nie w .text tylko w czymś w rodzaju .text.gcc - sprawdź.

Hmm... Mógłbyś rozwinąć drugą część stwierdzenia ("... z jakich plików...")?

Wiem jak kierować określone sekcje w określony obszar pamięci. Ale nie wiem jak zrobić dodatkowy podział tego kierowania ze względu np. na plik źródłowy w jakim są określone funkcje.

W moim wypadku wszystkie interesujące funkcje lądują w .text. Jak pisałem powyżej, nie mam koncepcji jak rozróżnić sekcje .text z różnych bibliotek, plików. Wsadzenie całości programu do ramu odpada bo się zwyczajnie nie zmieści. Gdybyś mógł podać 3 linijki przykładu skryptu dla linkera, który wytłumaczy jak to zrobić to byłbym wdzięczny.

pozdrawiam

Paweł pisze:

Piszę z pamięci bo ARMa używam tylko w pracy. Nazwy plików, z jakich linker wyciąga sekcje, umieszcza się przed nawiasem, a w nawiasie nazwy sekcji. Masz teraz w pliku linkera pewnie coś takiego:

*(.text) a gwiazdka właśnie oznacza pobranie sekcji .text ze wszystkich plików. Podobnie np. *(.rodata*) oznacza pobranie ze wszystkich plików sekcji o nazwach zaczynających się od ".rodata" ale z możliwym dodatkowym zakończeniem (np. .rodata.gcc).

Tutaj znajdziesz dokumentację skryptów linkera:

formatting link
tutaj dokładne rozwiązanie zagadnienia:
formatting link
"An input section description consists of a file name optionally followed by a list of section names in parentheses."

Dzięki, troche się przydało do poszerzenia wiedzy :-) Jednak na ten moment to działa świetnie z plikami z własnego projektu, a nie do końca z bibliotekami (np libm.a). Wygląda na to, że (w skrypcie linkera) udaje się wyeliminować z sekcji .text niektóre pliki zawierające interesujące funkcje

*(EXCLUDE_FILE (lib_a-s_cos.o lib_a-w_sqrt.o) .text);

Niestety dodanie ich później do sekcji wpadającej do ramu czymś takim

lib_a-s_cos.o(.text);

jest nieskuteczne, bo realnie nie ma takiego pliku na dysku - siedzi on w libm.a.

Może jest jakaś sekwencja wskazująca na konkretny plik *.o w bibliotece Jakoś nie mogę odszukać jak to zrobić

pozdrawiam

a właśnie jeśli można zapytać, to jak umieszcza się procedurę w pamięci ram? oraz w ogóle jak ustala się rozdział pamięci w AVR-GCC?

identyfikator: 20040501 pisze:

No to się zdecyduj czy chodzi o AVRa, bo w wątku (patrz temat!) jest mowa o ARMach.

W procesorach AVR _nie da się_ wykonywać programu z pamięci danych a przestrzenie adresowe są rozdzielone. Nawet aby trzymać stałe w pamięci programu trzeba robić wygibasy w stylu PSTR i używać specjalnych funkcji np. strcpy_P.

W ARMach natomiast jest wspólna przestrzeń do wszystkiego (o 32-bitowych adresach). I bardzo dobrze bo to często ułatwia życie.

sory za pomyłkę, a jak to się robi w ARMach gdybym się kiedyś nimi zajmował? ;o)

identyfikator: 20040501 pisze:

Jak się będziesz kiedyś zajmował to znajdziesz odpowiedź. Przeczytaj wcześniejsze posty w tym wątku.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required