Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 21:32


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 14 paź 2017, o 21:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

Witam

Po kompilacji niektórych programów zaraz za wektorami przerwań znajduje się coś takiego: __trampolines_end
Co to jest i do czego służy?

pozdrawiam

Andrzej



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 paź 2017, o 22:42 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

Rozumiem, że Google nic nie wypluwa? ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 02:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Polecam wytłumaczenie z http://www.avrfreaks.net/forum/what-trampolines-section:
"GCC pointers - of all types - are only 16-bits in length. That means you can address up to 128KB of FLASH memory directly with them, since FLASH is addressed as a number of 16-bit words and not bytes like SRAM.
However, that means that they cannot address data or functions located above 128KB of FLASH space. A few 8-bit AVRs have 256KB of FLASH, so this means we need a way to address the higher flash segment when we perform an indirect function call. The solution is this automatically generated "trampoline" section which contains code needed to call the higher addresses. When your code needs to get above the 128KB barrier via an indirect function call, it instead "bounces" up to the desired location via the code in the trampoline section.
"

Co po naszemu znaczy to:
"Wskaźniki GCC - wszystkich typów - mają tylko długość 16 bitów. Oznacza to, że można zaadresować nimi bezpośrednio tylko 128 KB pamięci FLASH, ponieważ adresy FLASH są adresowane za pomocą 16-bitowych słów, a nie bajtów jak SRAM.
Oznacza to jednak, że nie można zaadresować danych lub funkcji zlokalizowanych powyżej 128 KB przestrzeni FLASH. Kilka 8-bitowych AVRów ma 256 KB pamięci FLASH, więc oznacza to, że potrzebujemy sposobu na adresowanie wyższego segmentu pamięci flash przy pośrednim wywoływaniu funkcji. Rozwiązaniem jest generowana automatycznie sekcja "trampoline", która zawiera kod potrzebny do wywołania wyższych adresów. Gdy kod potrzebuje przekroczyć barierę 128KB za pomocą pośredniego wywoływania funkcji, wtedy "odbija" się do żądanej lokalizacji za pomocą kodu w sekcji trampoline.
"

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 09:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

Gogle coś pomogło, tylko że ja mam to w attiny13 :(
i czasem w atmega8, a one nie mają ponad 28kB flash.....

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 10:24 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

To wklej wygenerowaną tablicę symboli itp, żeby było się do czego odnieść. Bo ciężko zgadywać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 10:54 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

To jest fragment pliku *.map generowanego przez linker dla mikrokontrolera ATmega328, który również nie ma więcej niż 128KiB flash:
Kod:
                0x00000068                __trampolines_start = .
 *(.trampolines)
 .trampolines   0x00000068        0x0 linker stubs
 *(.trampolines*)
                0x00000068                __trampolines_end = .

Jest to normalne - podobny fragment będzie występował praktycznie w każdym pliku *.map, dla każdego mikrokontrolera avr, chyba że używasz niestandardowego skryptu linkera.
Zauważ tylko że:
  • adresy __trampolines_start oraz __trampolines_end są sobie równe,
  • w linii rozpoczynającej się od .trampolines jest wpis 0x0 linker stubs
Oznacza to, że ta sekcja jest pusta, czyli praktycznie nie istnieje. Dziwne mogłoby być dopiero, gdybyś miał jakieś dane w tej sekcji np. dla ATtiny13 lub ATmega8.

EDIT:
Dodam może jeszcze dla ścisłości, że użycie trampolines jest konieczne z powodu ograniczeń kompilatora, a nie samych mikrokontrolerów. Każdy mikrokontroler avr, o dowolnej pojemności pamięci FLASH, jeśli to konieczne, ma odpowiednie instrukcje (EICALL, EIJMP) oraz rejestr EIND (do "rozszerzenia" rejestru Z o potrzebną ilość bitów), aby wykonać pośrednie wywołanie funkcji lub pośredni skok do odpowiedniej lokalizacji w całej przestrzeni adresowej pamięci FLASH.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2017, o 11:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

ANDREWS - dzięki.
Nie podglądem nigdy pliku .map
Chyba to rozczaiłem. W pliku .lss nie raz spotykam się z, jak to napisać, nie do końca trafną "interpretacją" modułów. Plik ten często przeglądam, bo za każdym razem coś nowego się uczę (przynajmniej tak mi się wydaje). Chylę czoła przed ludźmi, którzy napisai kompilator i różnymi myczkami w optymalizacji kodu (to co pisaliście nie raz - nie zawsze krótszy kod w C oznacza kródszy kod maszynowy). A teraz do rzeczy.
Mam w pamięci FLASH trzy tablice:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w pliku .map mam sekcje "trampolin" i sekcję procent_napiecia pod tym samym adresem - 0x14
Składnia: [ Pobierz ] [ Ukryj ]
język actionscript
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i dodatkowo plik .lss:
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jak się dobrze przyjrzeć, to wartości w sekcji trampolines odpowiadają wartością z tablicy procent_napiecia (której nigdzie w .lss nie ma), a że wartości te przez przypadek są pewnym ciągiem komend asemblera, to tak zostały zinterpretowane w .lss.

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO