RTV forum PL | NewsGroups PL

Jak umieścić funkcje biblioteczne, takie jak sqrt i sin, w RAMie na AT91SAM7?

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

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak umieścić funkcje biblioteczne, takie jak sqrt i sin, w RAMie na AT91SAM7?

Paweł
Guest

Sat May 31, 2008 12:09 pm   



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

Adam Dybkowski
Guest

Sat May 31, 2008 10:04 pm   



Paweł pisze:

Quote:
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?

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

--
Adam Dybkowski
http://dybkowski.net/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

Paweł
Guest

Sat May 31, 2008 11:19 pm   



Quote:
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?

W pliku sterującym linkerem wpisujesz przecież, jakie sekcje i z jakich plików mają się znaleźć w określonych
obszarach pamięci.
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.

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

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

Adam Dybkowski
Guest

Sun Jun 01, 2008 11:40 pm   



Paweł pisze:

Quote:
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?
W pliku sterującym linkerem wpisujesz przecież, jakie sekcje i z jakich plików mają się znaleźć w określonych
obszarach pamięci.
Hmm... Mógłbyś rozwinąć drugą część stwierdzenia ("... z jakich plików...")?

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:
http://sourceware.org/binutils/docs-2.17/ld/Scripts.html
a tutaj dokładne rozwiązanie zagadnienia:
http://sourceware.org/binutils/docs-2.17/ld/Input-Section-Basics.html#Input-Section-Basics

"An input section description consists of a file name optionally
followed by a list of section names in parentheses."

--
Adam Dybkowski
http://dybkowski.net/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

Paweł
Guest

Mon Jun 02, 2008 8:41 am   



Quote:
*(.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:
http://sourceware.org/binutils/docs-2.17/ld/Scripts.html
a tutaj dokładne rozwiązanie zagadnienia:
http://sourceware.org/binutils/docs-2.17/ld/Input-Section-Basics.html#Input-Section-Basics

Dzięki, troche się przydało do poszerzenia wiedzy Smile
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

identyfikator: 20040501
Guest

Thu Jun 05, 2008 6:13 pm   



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?

Adam Dybkowski
Guest

Thu Jun 05, 2008 9:31 pm   



identyfikator: 20040501 pisze:

Quote:
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?

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.

--
Adam Dybkowski
http://dybkowski.net/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

identyfikator: 20040501
Guest

Fri Jun 06, 2008 6:30 pm   



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

Adam Dybkowski
Guest

Sat Jun 07, 2008 1:32 am   



identyfikator: 20040501 pisze:

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

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

--
Adam Dybkowski
http://dybkowski.net/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

elektroda NewsGroups Forum Index - Elektronika Polska - Jak umieścić funkcje biblioteczne, takie jak sqrt i sin, w RAMie na AT91SAM7?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map
Nasz serwis wykorzystuje pliki cookies. Korzystanie z witryny oznacza zgodę na ich zapis lub odczyt zgodnie z ustawieniami przeglądarki. Informacja o ciasteczkach