avr-gcc adresy funkcji

Mar 23, 2015 25 Replies

Wtiam.



Mam taki problem.



Czy jest taka mo¿liwo¶æ ¿eby adresy funkcji w momencie kompilacji/linkowania projektu zrzuciæ do jakiego¶ pliku? Chodzi o to ¿e mam tablicê adresów funkcji np:



typedef int( * HANDLER)(void); HANDLER handler[] = {h1, h2, h3};



I teraz wy³uskaæ to np: z plików .o.



Udaje mi siê to ze zmiennymi które zawieraj± np: napisy (sta³e) w ten sposób ¿e umieszczam je w oddzielnej sekcji w pliku nazwy.c



char nazwy[] __attribute__((section(".dataflashsection"))) = {"nazwa1", "nazwa2"};



i przy wykonywaniu make wy³uskujê to za pomoc±



avr-objcopy -j .dataflashsection -O binary nazwy.o nazwy.bin



i warto¶ci zmiennych mam w pliku nazwy.bin



Niestety kiedy robiê tak z adresami funkcji to w pliku wynikowym s± tylko zera. Umieszczam zmienn± handler w pliku handler.c i dalej



HANDLER handler[] __attribute__((section(".dataflashsection"))) = {h1, h2, h3};



avr-objcopy -j .dataflashsection -O binary handler.o handler.bin



Czy jest na to jaki¶ sposób?



Pozdrawiam Pawe³


Widzê ¿e siedzi to w pliku map, ale jak to automatem wy³uskaæ?

W dniu 2015-03-23 o 19:50, pawel pisze:

Może awk?

pawel snipped-for-privacy@poczta.onet.pl> napisa³(a):

A jaki system? Jak Windows to mo¿na w PowerShellu:

$fileContent = [io.file]::ReadAllText("plik.map") $fileContent | Select-String '\.text\.([a-zA-Z0-9_-]+)\s+([0-9a-fx]+)\s+' -AllMatches | Foreach {$_.Matches} | Foreach {$_.Groups[1].Value + " " + $_.Groups[2].Value}

pawel snipped-for-privacy@poczta.onet.pl> napisa³(a):

A jaki system? Jak Windows, to mo¿na w PowerShellu:

$fileContent = [io.file]::ReadAllText("plik.map") $fileContent | Select-String '\.text\.([a-zA-Z0-9_-]+)\s+([0-9a-fx]+)\s+' -AllMatches | Foreach {$_.Matches} | Foreach {$_.Groups[1].Value + " " + $_.Groups[2].Value}

Windows. A mo¿e jest jaka¶ opcja ¿eby linker wyrzuci³ to w trakcie konsolidacji? Nie jestem z tym zbyt dobrze obyty.

W dniu poniedziałek, 23 marca 2015 21:31:15 UTC+1 użytkownik bravo napisał:

A moze ten tool sie przyda

formatting link
avr-nm w avr-gcc.

Pzdr Krystian

kompilacji/linkowania

A nie możesz użyć avr-objdump? Tylko już na pliku zawierającym zlinkowaną całość bo inaczej będą adresy lokalne obiektu. Warto też skomplikować całość z opcją -g wtedy objdump wygeneruje mix źródła z asm + adresy.

Pliki .o nie zawieraja *jeszcze* adresów.

Napisz dokładnie do czego to potrzebujesz. Prawdopodobnie szukasz czegoś innego niż myślisz.

A jak go wygenerowaæ? Bo linker generuje mi tylko program wynikowy .bin.

Pozdrawiam Pawe³

Te¿ ju¿ do tego doszed³em :)

Chodzi o oszczêdno¶æ pamiêci ram oczywi¶cie :) Na pocz±tku programu muszê odwo³aæ siê do tych funkcji tzn przekazaæ je jako parametr do innej funkcji bibliotecznej i zapomnieæ tzn zwolniæ pamiêæ ram. Poniewa¿ do atmegi mam pod³±czon± pamiêæ dataflash i mogê przesy³aæ na ni± pliki binarne i tekstowe to chcia³bym:

- wygenerowaæ plik z adresami funkcji po kompilacji

- za³adowaæ go na sta³ê do dataflash

- pó¼niej przy ka¿dym uruchomieniu programu zaalokowaæ pamiêæ odczytaæ do niej zawarto¶æ pliku z adresami przekazaæ do funkcji bibliotecznej i zwolniæ pamiêæ.

Pawe³

A elf"a nie generuje? Spróbuj:

avr-objdump -tShd file.bin > dump

E tam nie zawierają, zawierają adresy jako absolutne lokalne offsety obiektu ;)

objdump -tShd main.o |less Disassembly of section .text:

00000000 <init_leds>:

void init_leds(void) {

ClrWdt();

0: 24030001 li v1,1 4: 3c020000 lui v0,0x0 8: ac430000 sw v1,0(v0)

Kto zgadnie architekturę ;)?

Generuje. Ale to nie jest dla debugera?

Niestety File format not recognized

Pawe³

Chyba nie rozumiem. Próbujesz kod przechowywać w zew. flash a później go ładować do ram i tam go uruchamiać? Wydawało mi się, że atnega ma arch. harvard i ciężko będzie coś takiego zrobić. No chyba, że ma możliwość adresowania (uruchamiania) kodu z zew. flasha poprzez dodatkowe piny typu external bus.

Nic z tych rzeczy. Chcê pobraæ tylko adresy funkcji zapisane w pliku (wska¼niki). Jak mam wska¼nik do funkcji to przecie¿ mogê j± wykonaæ. Oczywi¶cie s± to wska¼niki do funkcji w pamiêci programu :)

Pawe³

A wywołanie jej "normalnie" jest złe, bo...? Czy czasem nie zaczynasz rozwiązywać problemy nie istniejące w innych arch.? Czemu nie użyjesz mcu odpowiedniego do danego zadania?

AVR mają harvarda i takie sztuczki sa kłopotliwe.

A dlaczego nie może być w Flash? Jeśli może, a boisz się że zajmie RAM w czasie inicjacji zmiennych globalnych, to zainteresuj się skryptem linkera i atrybutami sekcji. Przypuszczalnie jesteś w stanie taką "tablicę adresów funkcji" w trywialny sposób sobie zrobić bezpośrednio we flashu. Swoją drogą robi się tak tablicę wektorów przerwań w wielu cpu napędzanych gcc.

Mam dwa pliki .bin i .elf. U¿y³em polecenia na pliku .elf i wyplu³o masê informacji trochê podobnych do tych z pliku .map :)

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required