Ok. Przeszukaj pliki w swoim projekcie po nazwie "SysTick_Handler". Znajdziesz tą nazwę w pliku asemblerowym (lub w pliku *.c) w tablicy wektorów przerwań. Ta tablica zawiera między innymi adres funkcji o nazwie SysTick_Handler. Linker umieszcza tablicę pod odpowiednim adresie w pamięci (zgodnie z datasheet procesora).
Startup bez zmian. Skrypt linkera - zmienić rozmiar pamieci. Tablica wektorów - poniżej. 4\/3!!
Zgaduję, że pierwszy problem polega na tym, że Kolega deklaruje stałą tablicę jako zmienną. Proponuję poprzedzić deklarację tablicy słowami static const, a potem marudzić dalej.
Zdaje się, że pominąłeś deklarację typu elementu tablicy jako char, czyli są inty. Więc ten napis chyba tam jest, tylko litery będą oddzielone zerami. Spróbuj dodać tam char, np. static const char test[] = {...} Nie było żadnych ostrzeżeń kompilatora w tej linijce? Druga opcja jest taka, że linker wyrzuca tą tablicę ze względu na brak odwołań, ale wtedy...
Weź wszystkie podstawowe pliki (startup, skrypt linkera, tablicę wektorów, Makefile) z jednego źródła, bo jak je mieszasz to nigdy nie wiadomo co nie zadziała. 4\/3!!
Tylko w tablicy wektorów musisz poprawki wprowadzić. Skrypt linkera nie ma tu znaczenia. 4\/3!!
Nie ma żadnej poważnej różnicy między startupem, Makefile'm, skryptem linkera i tablicą wektórów dla procesorów LPC2xxx a SAM7, więc można się posłużyć przykładami - http://www.elektroda.pl/rtvforum/topic13... Różnice "niepoważne" są dwie: 1. tablica wektórów - w SAM7 adres rejestru AIC który "podaje" adres skoku dla IRQ jest inny niż w LPC2xxx...
te 2 pliki musze zmienić oraz dane w makefile i linkerze tak ?? W Makefile to za dużo zmian nie będzie (może jakieś nazwy plików), więc głównie linker i tablica wektorów. O to jaki kompilator będzie użyty chodziło mi że w includes są scieżki do g++ i jeśli będzie kompilować się w edge to nie będzie żadnych komplikacji ?? Te ścieżki są wykrywane automatycznie...
Twoja tablica jest alokowana na stosie, ktorego jest ograniczona ilosc (w skrypcie linkera mozesz ja zwiekszyc). Tworzenie duzych obiektow na stosie nie jest zbyt dobrym rozwiazaniem. Powinienes w takim przypadku uzyc tablicy globalnej lub zaalokowac ja dynamicznie (za pomoca malloc).
PROGMEM tu nic nie da, bo dla linkera ten atrybut już nie istnieje, dla niego jest adres z odpowiednim prefixem określającym lokalizację. Po określeniu sekcji należy jej adres początkowy przekazać poprzez parametr -Wl,--section-start=, lub po prostu zdefiniować nową sekcję w AVR Studio. Napisz co się pluje, że adres wykracza poza SRAM i jak dokładnie...
Trzeba stworzyć w skrypcie linkera sekcję pod konkretnym adresem i w tej sekcji umieścić tablicę. 4\/3!!
Skrypt linkera zawiera sekcje ladujaca consty do flashu /* .rodata section which is used for read-only data (constants) */ .rodata : { *(.rodata .rodata.*) *(.gnu.linkonce.r.*) } >flash . = ALIGN(4); _etext = .; PROVIDE (etext = .); Inicjalizuje tablice jako: static const unsigned short sintable Includuje header do pliku zawierajacego tablice. Linker...
Zbyt dużo Ci nie pomogę chyba - niestety składnia poleceń kompilacji której oczekuje Twoja wersja kompilatora jest zupełnie inna niż moja, dlatego też nie mogę skompilować Twojego przykładu u mnie. Po podstawieniu mojego Makefile'a do Twojego projektu wszystko kompiluje się bez większych problemów (konieczne są drobne zmiany w skrypcie linkera - ustawienie...
Jak dla mnie bez jakichkolwiek zmian będzie... W sumie to sam nie wiem czym się te układy między sobą różnią, ale w plikach na pewno nie będzie żadnych zmian (linker, startup, tablica wektorów, Makefile, gpio, RCC, ...) 4\/3!!
W LPCXpresso możesz bardzo łatwo tablicę ulokować, żeby rozpoczynała się od konkretnego adresu pamięci Flash. Klikasz w ustawienia projektu, pojawi się okno http://obrazki.elektroda.pl/3748232500_1... 1. Wybierasz MCU settings . 2. Klikasz Edit po czym pojawi się okienko konfiguracyjne pamięci. 3. Upewniasz się, że jest zaznaczona pamięć...
Dzieki za podpowiedz. Ostateczenie zdeklarowalem obszar pamieci pod ktorym ma byc zapisywana tablica struktur w ustawieniach linkera.
pierwszym (lub drugim nieparzystym) bajcie konkretnej sekcji? Funnkca jest pod adresem parzystym ale w tablicy adres do skoku będzie nieparzysty. A odpowiadając zależy co tam w tej sekcji w pliku linkera napiszesz. Jak będzie wyrównana i nie będzie w niej żadnych operacji przesuwających aktualny wskaźnik to tak.
Nic z nim nie musisz robić, jeśli zmienne w SDRAM są w osobnej sekcji. Sprawdź najpierw czy ci działa bez ruszania stosu, potek kombinuj. Tu niestety trzeba przeglądać pliki map i pliki lss, żeby zobaczyć co generuje kompilator i linker.
Skąd masz bazowe pliki (startup, tablicę wektorów, skrypt linkera)? Z tego pakietu AC6 czy może nie masz ich wcale? Nie postawiłeś po prostu za dużo tych breakpointów?
Z innej beczki - problem kresek można również rozwiązać stosując RAM grafiki w wersji dual-port. https://obrazki.elektroda.pl/2008294700_... IDT7132SA/LA Ten byłby idealny do COBRA1. Jedna strona adresowana z liczników i tylko do odczytu - druga podłączona do szyny Z80. Oczywiście przełączniki adresów można pominąć wówczas. To samo...
Naprawdę kopiowane są wszystkie funkcje a nie tylko to, które są wykorzystywane? Może to kwestia włączenia optymalizacji? Trochę OT, ale wyjaśnię. W uproszczeniu, w standardowym kompilatorze (np. gcc :wink:), wytworzenie programu wykonywalnego składa sie z dwóch faz: 1. fazy kompilacji .c --> .o (albo np. .s ->> .o) 2. fazy łączenia .o (razy N) -->...
W skrypcie linkera muszą być zadeklarowane symbole o nazwach jak wyżej wyznaczające obszar pamięci przeznaczony dla sterty (heap). Proponuję ściągnąć projekt dla lpc2103 i przystosować postawowe pliki (startup, Makefile, skrypt linkera, tablica wektorów: lpc2103_rom.ld, Makefile, startup.S, vectors.S, hdr\hdr_cpsr.h) do swojego projektu, a większość...
Czy mógłbym kogoś z was przejrzeć o sprawdzenie mojej tablicy i skryptu linkera i obsługi przerwania.. bo patrzę na to już któryś dzień z rzędu i nie wiem gdzie jest błąd. Pliki są w załączniku. Będę wdzięczny
Teraz dalej. Przeprowadzałem już testy kompilacji dla tego starego pliku jpeglib.a i niestety nie dają dobrych rezultatów. Ten nowy niczego nie zmienia. Problemem jest pewnie syscalls.c Znalazłem kilka w internecie a nawet kilka u siebie na kompie ;p No ale jeden nie działa bo jest do AT91SAMxxx, drugi do CPP, a na trzecim mam errory „multiple...
Witajcie. Avrgcc i plik nagłówkowy eeprom.h. Nie znalazłem prostego sposobu. Czy da się umieścić zmienne w pamięci EEPROM pod konkretnym adresem nie zostawiając pola dla linkera? Potrzebuję tablicę uint16_t Tablica[16] EEMEM umieścić (a potem odczytywać) od pierwszej komórki pamięci EEPROM (czy jakiejkolwiek innej). Da się to zrobić prosto bez pisania...
Słuszna uwaga z tym startupem. Mam go w katalogu projektu, który jest wskazany w ścieżkach eclipsa, ale nie wiem dlaczego nie jest linkowany. Może ma nieprawidłowe rozszerzenie? Teoretycznie istotna jest wielkość liter. Freddie, czy masz może jakiś ładny przykładowy projekt dla CM0? Dla STM32F0 nie, ale możesz spokojnie zrobić małego frankensteina...
Nie wiem czy problem leży w inicjalizacji timera czy w obsłudze przerwania... My nawet nie wiemy jaki jest problem, bo nie napisałeś... Nie mówiąc już o tak nieistotnych szczegółach jak kompilator, startup, tablica wektorów, skrypt linkera itd. 4\/3!!
Pytasz mnie po co jest tablica wektorów czy dlaczego jest w osobnym pliku? 4\/3!!
Tak naprawdę jak dla mnie jedyna trudność jaką miałem to ogarnięcie środowiska i plików początkowych (startup ,linker, makefile, tablica vektrów) i nadal lekkie problemy mi one czasami nastręczają. No i wiadomo zrozumienie organizacji mikrokontrolera. Jak to się już zrozumie to obsługa konkretnego peryferia to żadem problem większość peryferii (timery...
No jak możesz to coś wyślij na L1 super by było Dodano po 8 Albo chociaż startup, skrypt linkera i tablice
Pierwszy zapis o który pytasz, to tablica wskaźników na funkcję, która to funkcja nie zwraca wartości i nie przyjmuje wartości. Zapis const oznacza, że tablicy nie będziemy modyfikować. Zapis, moim zdaniem bardziej czytelny, który sam stosuję w takim przypadku (z głowy): typedef void (*pVector_t)(void); __attribute__ ((used,...
Co trzeba w nim zmienić poza wpisaniem rozmiaru ram i flash ( flash - 512K; ram - 64K ) w skrypcie linkera aby uruchomić go na STM32F103ZE. Prawdopodobnie nic. Sprawdź jedynie czy tablica wektorów przerwań jest taka sama w obu modelach.
Pudło. Przy uruchomieniu aplikacji z Flash, pamięć Flash jest mapowana na adres 0, a domyślnie VTOR zawiera 0 (a przynajmniej powinien), nie ma więc potrzeby ruszania go w aplikacji. Jeśli, jak nakazuje zdrowy rozsądek, tablica jest na początku programu, to skrypt linkera załatwia wszystko.
Nie robisz kompletnie nic oprócz wskazania linkerowi pod jakim adresem ma być zlokalizowany kod wynikowy. Tablica wektorów przerwań która pierwotnie była pod adresem 0 znajdzie się pod adresem przekazanym linkerowi - -Wl,-Ttext,0x1e00 spowoduje, że cała sekcja .text (razem z tablicą wektorów) zostanie przeniesiona pod adres bootloadera - właśnie z tego...
Praktycznie wszystkie te pliki są konieczne, a właśnie to co jest w /inc już nie, bo to jest potrzebne Twojej aplikacji... Pliki konieczne: Makefile startup skrypt linkera tablica wektorów + chyba wymagany jest jeden z plików hdr_..., bo jest zainclude'owany w startupie. Jeśli bawi Cię tworzenie od zera czegoś co już jest gotowe, to proszę bardzo -...
A jak wymusic uruchomienie procesora z RAM bez manipulowania pinami BOOTx ? (bo upgrade bedzie głownie zdalny). I co powinienem zainicjowac aby poprawnie dzialaly procedury C bez uzywania zadnych bibliotek (np. stos itp) A co do trzeciej opcji (nie uzywanie pierwszych stron flasha): jak to zrobic aby linker umiescil tablice wektora przerwan pod innym...
Ja mam odpowiedź, ale ona może Ci się nie do końca spodobać... Na mojej stronie znajdziesz przykładowy projekt dla STM32F107, wraz ze startupem, skryptem linkera, tablicą wektorów i plikiem Makefile. Całość na pewno działa, tyle że nie korzysta z w tyczki której Ty używasz w Eclipse.
Przykład: a)Utwórz własną sekcję. unsigned int value[128] __attribute__ ((section("moja_sekcja&... = {1,2,3,4,5,6,7,8,9}; b)Dodaj opcję linkerowi. -Wl,-section-start=moja_sekcja=0x0800 0x800 to przykładowy adres pamięci ;)
To zależy od środowiska, którego używasz - w dialogu ustawień projektu, załadka linker, albo w pliku definicji pamięci dla linkera.
A co nie działa Ci z plikami przeszczepionymi z przykładu dla LPC2103? Pamiętaj, że pliki bazowe niestety stanowią całość i zwykle trzeba użyć wszystkich - startupu, skryptu linkera, Makefile'a, tablicy wektorów, ... 4\/3!!
Kompilator nie protestuje, bo automatyczne zmienne są umieszczane na stosie, a rozmiar tego jest kompilatorowi i linkerowi "nieznany" zasadniczo. 4\/3!!
Teraz pozostało mi przenieść projekt z stm32 na lm3s, ponieważ zajmuję się tym w wolnym czasie od pracy, to efektem podzielę się pewnie za kilka dni. To naprawdę nie jest dużo roboty, generalnie (pomijając detale typu zmiana nazw plików czy nazwy projektu) trzeba zrobić mniej więcej "aż" tyle: 1. poprawić tablicę wektorów (to i tak byś miał kiedyś...
Program się tam nie zaczyna. Tam programator ładuje Twoją binarke i tam zaczyna się tablica wektorów. Ale zdecydowanie nie program :) Taki trochę skrót myślowy ;) Jeżeli chcesz tablica wektorów była zgodna z wpisami w elf-ie to musisz (przykład ze startupu STM-a gdzie tablica jest w pliku asemblerowym) Skrypt linkera: /* ENTRY(Reset_Handler)...
Skoro linker się nie zajmuje ustawieniem LSB tablicy wektorów, to chciałbym zapytać się jak to się dzieje? Zasugerowałem się informacjami na tej stronie http://pygmy.utoh.org/riscy/cortex/led-s... wprawdzie autor, tylko podejrzewa ;) pzdr.
Może po prostu w szale experymentów pomieszałeś trochę zbyt bardzo, bo startup MUSI być "do pary" z linkerem i tablicą wektorów. Ten pliki które zamieściłeś robią to samo co moje i tyle. Ja nie wierzę aby to było jakimkolwiek problemem tutaj... 4\/3!!
Przykłady często pokazują "jak" używać API, ale nie "kiedy"; w dodatku są tak proste (jak to przykłady) że użycie danego API nie jest potrzebne. Pule to zwyczajne alokatory pamięci. Używa się ich gdy planuje się alokację oraz zwalnianie pamięci. Dwa trochę sztuczne przykłady: - aplikacja z wątkami tworzonymi przy starcie i nie kończącymi się - pamięć...
Dodano po 7 tablica (bufor) Ponieważ tylko ją deklarujesz, ale nie używasz została ona z programu wywalona. Albert nie prawda, popatrz tutaj void main (void) { BITY0 = 0x55; BITY1 = 0xaa; dlatego tablicę zainicjowałem abym ją widział. A to przypisanie nadpisuje mi dane w tablicy. Faktycznie albertb ma rację, co z tego że deklarujesz tablicę...
Jestem w błędzie ? Tak, bo do samej kompilacji to Ci jeszcze potrzebne kilka plików - startup, skrypt linkera, tablica przerwań - zakładam tutaj, że sprawę Makefile załatwia Netbeans. Standardowo więc poradzę to co zawsze - ściągnij z mojej strony przykład dla stm32f4 i zobacz jak to jest tam zrobione pod "lepszym" IDE (; http://www.elektroda.pl/rtvforum/topic13...
Wystarczy że zadeklarujesz sobie oddzielny segment pamięci na tablicę w której w znanej dla Ciebie kolejności umieścisz adresy poszczególnych funkcji. W segmencie tym będzie tylko ta tablica więc będzie wiadomo w którym jest miejscu.
Myślałem żeby załaczyć Ci mój projekt ale - 1. jest komercyjny 2. jest zbyt myślę złożony Tak że na szybko sama idea - jest to zrobione w 5 minut i skrypt linkera powinno sie przerobic lepiej. Funkcje też są do kitu - bo parametry trzeba przekazywać wskaznikiem do nich) wtedy nie jesteś ograniczony ich ilościa itd itd. Nie jest to reentrant i bezpieczne....
Witam Zdefiniowałem sobie następującą tablicę wskaźników na teksty: [syntax=c] const uint8_t *Tab[3] = { (uint8_t*)("Menu1"), (uint8_t*)("Menu2"), (uint8_t*)("Menu3") }; [/syntax] Mój problem polega na tym, że nie potrafię spowodować aby zarówno tablica Tab jak i napisy: Menu1, Menu2 i Menu3 umieszczone zostały przez linker w pamięci FLASH (sekcji .rodata)....
Najprościej będzie chyba wziąć pliki z projektu dla LPC1114 i poprawić w nich stosowne rzeczy (rozmiary pamięci, ich adresy i rozmiary stosów w skrypcie linkera, przerwania w tablicy wektorów). Nie jest to dużo roboty, choć jest dosyć nudna.
Dzięki! Z pamięcią to rzecz oczywista, ale przeglądając skrypt linkera nie wpadłem na to by patrzeć na te stosy :) Przerwania dostosuję podglądając startup od ST dedykowany dla rodziny HD (ma tablicę wektorów w kodzie assemblerowym)
Dramat to wklejanie czyjejś roboty bez zrozumienia co się robi :D, więc na razie wziąłem ten twój skrypt linkera od F4 i walcze z nim. Zmieniłem ram, dodałem sdram i nie wiem jak zrobić stertę w sdramie. Bo - jak ja to rozumiem - malloc z dużymi tablicami potrzebuje, bym stertę miał w zewnętrznym ramie. Wrzucam Ci mój skrypt linkera. Jeśli masz chwilę...
Bo ten program jest zły! Cortex-M3 pod konkretnymi adresami oczekuje konkretnych rzeczy - na samym początku flasha - wartości dla SP, potem adresu (adresu! nie instrukcji!) wektora obsługi wyjątku reset itd. Zapomnij o takim prostym programiku - to tak po prostu nie zadziała. Potrzebna Ci jest tablica wektorów, potrzebny Ci jest "normalny" skrypt linkera...
Nie da się tego zrobić wygodnie. Najprostsza opcja, jak akurat nie zależy Ci (choćby chwilowo) na idealnym wykorzystaniu tej pierwszej strony flasha, to po prostu wrzucić tam tylko tablicę wektorów (która i tak jest w osobnej sekcji) i mieć to z głowy. Jeśli chcesz lepiej wykorzystać pierwszą stronę flasha, to jedyną opcją jest selektywne wrzucenie...
Witaj, _Edycja(at)4 I dokładnie taki sam symbol jest wyeksportowany z dll. Taki ciąg znaków powinieneś podać do funkcji GetProcAddress. Zmian nazw, bzw. usunięcia dekoracji, dokonuje się zazwyczaj za pomocą tekstowego pliku .def, dołączanym do etapu linkowania.
-nostartfiles powoduje usunięcie kodu odpowiedzialnego (w skrócie) za statyczną inicjalizację, czyli np. konstruktory obiektów globalnych C++, ale również kilku innych rzeczy. Cały ten kod wywoływany jest z funkcji __libc_init_array(), która zaś operuje na tablicach preinit_array oraz init_array, pochodzących ze skryptu linkera. 4\/3!!
Użyj sekcji .progmem.gcc - położona jest ona tuż za tablicą wektorów przerwań i standardowo nic w niej nie ma, a więc ma stały dla danego procesora adres początku. Na tym zupełnie nie można polegać. Nie chodzi o jakieś biblioteki, tylko o prostą właściwość linkera(...) ale to nie jest objęte standardem i ktoś dla fantazji może to zmienić) Czy Kolega...
(at)BlueDraco A jak byś chciał to fizycznie zaimplementować w kompilatorze / linkerze Przykład jak zewnętrzna funkcja miałaby operować na takiej zmiennej w rejestrze? Rozumiem że trzeba byłoby przerabiać kod bibliotek np. Tak jak pisałem w poście 7 można sobie taką protezę wyobrazić. problemem jest C/C++ - zmienna typu rejestr nie ma adresu. To jak...
Jeżeli dobrze zrozumiałem, chodzi o stworzenie początkowej zawartości pamięci EEPROM? Wprawdzie nie robiłem tego, ale nie widzę problemu. Tzn. programatorowi jest obojetne jak powstał plik hex do wpalenia do pamięci, więc można go wygenerować z asemblera. Można też bezpośrednio z C. Ale to wymaga trochę sztuczek z linkerem.
Zakładając 0 stosu i heapu w skrypcie linkera (po to aby nie zmącać Ci obrazu bo on się doda do BSS). Ty oczywiście ustaw je na wartości takie jak powinny być w programie. [syntax=c]make --no-print-directory post-build Generating binary and Printing size information: arm-none-eabi-objcopy -O binary "101n.elf" "101n.bin" arm-none-eabi-size "101n.elf"...
Wiem ale chciałem się dobrać do części bibliotek które dostarcza ST razem z ich definicjami. Na razie nie robię nic poważnego na tym procku więc nie chcę marnować czasu na ponowne odkrywanie ameryki. Chce też zobaczyć na ile CMSIS sprawdzi się dla mnie przy portowaniu aplikacji na inne cortexy. A jak zwykle szacun dla Twojego makefile - trzeci projekt,...
A jakiś link do tego, który mas na myśli? Chociażby blink led Freddiego: https://freddiechopin.info/en/download/c... Osobna sprawa, że plik startowy musi być specyficzny dla procesora. I tak i nie. W sumie to od Ciebie zależy co umieścisz w startupie a co w funkcji main(). Najczęściej w startupie są dwie ważne...
Oczywiście, że można, trzeba tylko poinstruować linker, że masz więcej pamięci. W helpie do AVR-libC jest napisane jak to zrobić.
Nie dziw się, printf i malloc właśnie tyle zajmują [; Z tego właśnie powodu mam swojego printfa, który obsługuje tylko kilka najpotrzebniejszych specyfikatorów. Nie wiem czy zajmuje choć 500B <: ______________ Zauważyłem właśnie to: char buffer[1000]; Uwierz - to nie jest dobry pomysł, chyba że w ustawieniach w skrypcie linkera dałeś na stos główny...
Taki program nie ma prawa działać poprawnie, ponieważ przesuwasz tym sposobem również tablicę wektorów, która akurat musi być w jednym i konkretnym miejscu. No chyba że masz już ten bootloader, który uruchamia Twój kod, skacząc pod odpowiedni adres. Pozatym widze, że korzystasz z dosyć starego skryptu, proponowałbym taki trochę nowszy, bo w tym jest...
Przyznam się, że jeszcze nie do końca się orientuję w tablicach wektorów i skryptach linkera. Zwyczajnie nigdy nie miałem potrzeby do tego zaglądać wcześniej. Wszystko co mam praktycznie bez zmian pochodzi z dema FreeRTOS dla płytki Premier. Ktoś to demo wpakował pod Eclipse. Miało być szybciej ale jak na razie tylko problemy z nim mam. W jakimś innym...
Dziękuje za odpowiedzi, pracuje z kompilatorem IAR możesz napisać jak mam zrobić, żeby linker wykorzystywał te dodatkowe przestrzenie adresowe ?
M0 nie obsługuje pełnej relokacji tablicy wyjątków, VTOR nie zadziała. Nie wiem co prawda, po co Kolega usiłuje na siłę zrobić własny bootloader w M0 (można użyć firmowego wywołanego z aplikacji), ale skoro już się uparł, to niestety zostają mu sztuczki z kopiowaniem do RAM. Powinno się dać to zrobić samym skryptem linkera - mi się nigdy nie chciało;...
Deklaracja poprawna, ale tablica ogromiasta :) Zajmuje chyba 8000 bajtów a RAM, jeszcze zależy jaki mikrokontroler - właśnie, jaki ? Osobiście nie pracuję na uVision i nie spotkałem się z takim błędem, bardziej tak sobie spekuluję, niż udzielam konkretnej porady. Dziwi mnie, że linker pisze o kodzie (pamięci programu?), gdy tablica taka powinna pochłonąć...
a może jeszcze inaczej a. plik asemblera budujący tablice wektorów przerwań b. kompilacja z opcją -nostartfiles lub tez zmiana skryptu linkera ??? Rozwiązanie o tyle nieelastyczne, że trzeba będzie ręcznie edytować każdy element tablicy wektorów podczas gdy potrzebuję zmodyfikować jedynie wektor INT0, a w stosunku do pozostałych wektorów chciałbym aby...
Ten komunikat nie ma nic wspólnego z samym programem; mówi on, że system odmówił linkerowi prawa do zapisania pliku exe. Wejdź do katalogu, gdzie linker chce tego exeka zapisać, i zrób coś, żeby się dało.
Obszar .bss podzieliłem na symbole i zmienne globalne (działa w 100% ok): .bss1 (NOLOAD) : { . = ALIGN(4); _sbss = . ; *(.bss .bss.*) . = ALIGN(4); _ebss = . ; } >IRAM0 AT>IRAM0 .bss2 (NOLOAD) : { . = ALIGN(4); *(COMMON) *(.gnu.linkonce.b*) . = ALIGN(4); } >IRAM1 AT>IRAM1 Problemem okazało się przepełnianie się pamięci w obszarze stosu przy zmianie...
Generalnie pytanie jest trochę źle zfromułowane bo to nie C ani zaden inny język programowania odpowiedzialny jest za rozmieszczenie segmentów kodu w pamięci uP, tym zajmuje sie linker. Trzeba poszukać w opcjach linkera i utworzyć sobie nowy segment w żądanym obszarze pamięci.
mam zaufanie że zadziała od ręki na tamtym procesorze, na moim mam wątpliwości. Zadziała tak samo (; Musisz tylko wywalić uruchamianie PLL i konfigurację GPIO, bo to się może różnić. Startup będzie identyczny. Makefile będzie identyczny. Tablica wektorów będzie identyczna. Skrypt linkera będzie w zasadzie identyczny, tylko musisz zmienić ilość pamięci...
Witam nie rozumiem do końca takiego fragmentu kodu. Co jest tworzone w pamięci, jakiej wielkości tablica pixels będzie? Co robi "& _main_ram_start;"? W kodzie linkera jest linijka: _main_ram_start = 0x20000000; [syntax=c] extern char _main_ram_start; static struct framebuffer { int w; int h; int bpp; uint8_t pixels[]; }*fb = (struct framebuffer *) &...
W jaki sposób skonfigurować kompilator, linkera oraz skrypt linkera tak abym mógł własne tablice zdefiniowane w plikach .cpp wstawić w wybrane prze zemnie miejsce w pamięci? Napisz w jakim celu, wtedy mozna podac metodę. Dodano po 3 jesteś pewien, że kompilujesz tym czym myślisz, że kompilujesz? Pokaż cały command line przy kompilowaniu tego main.cpp
Próbuję pożenić template Freddiego (stm32_blink_led) z StdPeriph Ale to widziałeś? http://www.freddiechopin.info/pl/artykul... Ma ktoś pomysł co może być nie tak ? W skrypcie linkera należy ustawić rozmiar stosu dla przerwań - domyślnie jest zero, co zwykle źle się kończy. Ustawiłeś...
Czy ktoś może mi powiedzieć czy poniższy algorytm ma szanse na realizację? co o nim myślicie? http://obrazki.elektroda.pl/9694939500_1... Po tym jak nowe oprogramowanie znajdzie się w buforze (new soft ) zostanie wywołany bootloader który skopiuje starą tablicę wektorów przerwać pod nowy adres (isr tab 1) i ustawi offset na tą tablicę....
Ustawiłem wszystko zgodnie z tym co pisałeś powyżej i niestety nic się nadal nie dzieje :/ To może napisz dokładniej, jak sprawdzasz, czy ta tablica faktycznie jest wypełniona odpowiednimi wartościami. Wysyłasz tablicę przez port szeregowy? W programie sprawdzasz niektóre wartości z tablicy? Używasz JTAG-a i w podglądzie tablica jest wypełniona zerami/innymi...
No to chyba najprosciej zamienic te dane binarne na plik obiektowy .o i dodac do linkera. Wtedy wszystko sie zlinkuje samo, a ty nie bedziesz musial sie martwic o adresy - zobaw w faq do avr-libc sekcje How to add a raw binary image to linker output? Druga mozliwosc to zamiana twojego pliku na tablice, ktora umiescisz jako np. plik naglowkowy. Inne...
Skrypt linkera niedopasowany do startupa. http://www.elektroda.pl/rtvforum/topic13... http://www.elektroda.pl/rtvforum/topic13... Zaadaptuj dla Twojego układu (wystarczy zmienić rozmiary i adresy pamięci w skrypcie linkera oraz sposób wywołania przerwania IRQ w tablicy wektorów) i po problemach. 4\/3!!
Właśnie próbuję uruchomić program z pamięci RAM. Usunąłem linijkę rom (rx) : org = 0x8000000 oraz zastąpiłem wszystkie "> rom AT > rom" na "> ram AT > ram" w pliku linkera. Program działa do momentu wywołania przerwania (w moim programie przerwania SysTick). Wtedy licznik rozkazów skacze z adresu 0x2.... pod adres 0x08000864.Czyli do pamięci flash i...
Ale te wszystkie magiczne opcje typu -lgcc -lc -lm i - szczególnie - -lrdimon to skąd wziąłeś? Masz totalnie zły projekt - nie ma w nim startupu, nie ma w nim tablicy wektorów, skrypt linkera nie wiadomo skąd wziąłeś i co w nim jest... To że używasz wtyczki do Eclipse zamiast Makefile jak widzisz nic nie zmienia - bo ta wtyczka to tylko fikuśny generator...
startup podejrzewam, że możesz wziąć od freddiego. Skrypt linkera również, tylko będziesz musiał zmienić rozmiar i umieszczenie pamięci + tablicę wektorów.
Cześć! Poszukuję wsparci gdyż powstał mętlik w głowie. Mam program, który komunikuję się z modułem GSM, używa wielu globalnych tablic, funkcji operujących na strumieniach typu strcpy, str n cpy, strstr, strtok, poniżej wklejam większość deklaracji dużych zmiennych: Dodano po 1 Przeniosłem deklarację StackPoint z .int1 do .int3 i program zaczął wyświetlać...
Ponieważ w całym poście jedyną wartą uwagi informacją jest to: nie chce przyjmować klas to obstawiam że używasz C++. W takim razie gotów jestem się założyć, że nie masz nigdzie przy przerwaniach: extern "C" void nazwa_IRQHandler() {...} Bez owego >extern "C"< przerwania definiowane w plikach C++ nie zadziałają (jeśli...
Ale kompilator i linker jest inny, w innej wersji. To już wystarczy, żeby się niekoniecznie lubił z kodem "starego typu", którego jest pełno w necie. W tych chwilach zwykle polecam swój przykład, który akurat nie cierpi na tą przypadłość [; Startup, tablicę wektorów i skrypt linkera możeś śmiało wziąć z przykładu dla LPC2103 - zobacz tylko w pliku z...
Używam właśnie gplinka. Kompilator (chyba) jest ok. To raczej problem z linkerem. Po zlinkowaniu mam w 0x82A kod programu, w 0x800 tablice przerwań i pod 0x000 instrukcje skoku (chodzi chyba o przeskoczenie tablicy przerwań) pod pierwszą instrukcje programu!
Jeśli zadeklarujesz, że tablica będzie się znajdować w sekcji o nazwie sekcja_o_skomplikowanej_nazwie_1 i w skrypcie linkera umieścisz ją jako pierwszą - przed tą która jest tam "normalnie" to zawsze będzie ona na początku. Jeśli tych zmiennych masz więcej, to prościej będzie Ci umieścić je w wielkiej strukturze, a całą strukturę w owej dziwnie nazwanej...
http://www.elektroda.pl/rtvforum/topic13... http://www.elektroda.pl/rtvforum/topic13... Projekt dla LPC2103 do przerobienia na inny LPC w 0.5 sekundy (rozmiar pamięci w skryptach linkera oraz sposób wywołania IRQ - komentarze w tablicy wektorów mówią wszystko). 4\/3!!
To nie jest moim zdaniem problem z OpenOCD, tylko masz źle skompilowany program. Po tym co mi podesłałeś widzę, że cały kod znajduje się pod jakimiś abstrakcyjnymi adresami, brakuje tablicy wektorów itd. Wrzuć cały projekt (kod, startup, skrypt linkera, makefile). 4\/3!!
do tego najlepszym rozwiązaniem będzie dyrektywa include dołączająca do głównego pliku, Raczej jest to najgorsze rozwiązanie bo include w zasadzie nie do tego służy. Jest dyrektywą wstępnej analizy tekstowej programu i efektywnie działa tak samo jakbyś w edytorze w miejsce include wkopiował zawartość wstawianego pliku. Include nie definiuje modułu...
Niczym - jest nowszy, szybszy itd. Proponuję rozpocząć przygodę od przykładowego projektu dla stm32f4 z mojej strony, a następnie przenieść podstawowe pliki (tablica wektorów, startup, Makefile, skryt linkera i pewnie coś tam jeszcze) do projektu który chcesz rozwijać. Generalnie Twój problem wynika z tego, że nie dodałeś do projektu syscalls, w których...
2 pierwsze symbole nie są nawet użyte (albo ja tego nie widzę) a linker ich nie wywalił. Funkcje te są częścią inicjalizacji/deinicjalizacji biblioteki języka C. Są użyte pośrednio, przez wskaźniki. na moje niewprawne oko to przynajmniej te 4 pierwsze symbole są zupełnie zbędne. Trzecia funkcja jest wrapperem na main, a czwarta odpowiada za globalną...
ednak przy kompilacji znowu (co ma sens bo uzywam tablicy zawierajacej wszystkie wskazniki) wszystkie tablice ze czcionkami sa dodawane do flash. Jak to rozwiazac, zeby do flash byly dolaczane czcionki tylko te , ktore sa uzyte w programie a nie ograniczac jednoczesnie calego zestawu czcionek? Już sobie odpowiedziałeś na to pytanie - nie odwoływać...
Skrypt linkera z Cube'a "działa" tak, że na początku pamięci ram ląduje sekcja data (zmienne inicjalizowane przy starcie programu - lokalne statyczne i globalne), potem jest bss (zmienne zerowane przy starcie programu - nie inicjalizowane statyczne i globalne). Następny kawałek to _user_heap_stack - czyli sterta i stos "w jednym". Rozmiar data i bss...
Program się NIE ładuje w ogóle, bo w ogóle go nie ma! Jak dobrze popatrzysz na początek sekcji .text to sam przekonasz się dlaczego. Hint - zastanów się czy zostanie załadowana tablica wektorów oraz startup (zawartość pliku boot.o) i dlaczego nie. Skrypt linkera jest lewy, proponuję znaleźć coś dobrego, choćby to co udostępniłem http://www.elektroda.pl/rtvforum/topic13...
Czy można to zrobić? - Oczywiście. Pytanie, czy trzeba? W miarę łatwo uzasadnić to, że np. jakieś dane konfiguracyjne są zapamiętywane w stałym miejscu pamięci Flash albo dane nie mają mocnego związku z kodem i są ładowane niezależnie od kodu dla każdego egzemplarza urządzenia, ale Twój przypadek jest zupełnie inny. Zamiast uczciwie wstawić dane do...
linker error stm32 linker stm32f0 linker
telefon impuls elektryczny cienki aluminium instrukcja alarm silicon
Jaka bateria do odkurzacza Bosch Type VXAS012V14? Schemat mechanizmu magnetofonu Unitra Wilga