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

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

Reply to
invalid unparseable
Loading thread data ...

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

Reply to
Adam Dybkowski

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

Reply to
invalid unparseable

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

Reply to
Adam Dybkowski

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

Reply to
invalid unparseable

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?

Reply to
identyfikator: 20040501

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.

Reply to
Adam Dybkowski

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

Reply to
identyfikator: 20040501

identyfikator: 20040501 pisze:

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

Reply to
Adam Dybkowski

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.