Ja bym dodał dodatkową sekcję i przy pomocy attribute w gcc jawnie umieścił zmienne i funkcje w tej sekcji. Potem tylko wywołując linker należy określić gdzie ta dodatkowa sekcja ma wylądować. Inne rozwiązanie wskazał już kol. (at)Freddie Chopin .
Obetnij program do minimum, w przy którym błąd dalej występuje. Podeślij program, skrypt linkera i plik map. Kłopot jak piszą kol. Freddie i kol. linker jest gdzie indziej. W ramie nie mieszczą się nie stałe, lecz zmienne niezainicjowane (sekcja .bss) Albert
Freddie używa niestandardowych nazw zmiennych. Dopisz do linii LINKER_FLAGS = ... lub LIBS = Albert
To zależy, jak jest napisana ta biblioteka. Jeżeli każda z funkcji (stanowiąca samodzielna całość) jest w oddzielnym pliku źródłowym, a te po skompilowaniu zostaną połączone w jedną bibliotekę statyczną (.a), to podczas konsolidacji programu linker będzie mógł wybrać z biblioteki tylko to, co potrzebne (z dokładnością do pliku źródłowego biblioteki)....
Skoro hex się generuje to czas powalczyć ze skryptem linkera. Czy jesteś Freddie w stanie pokrótce wymienić elementy jakie musi zawierać skrypt linkera aby poprawnie działał z kodem źródłowym napisanym w C++ ? popatrz na skrypt przykładowy kompilatora (w którym znów jest trochę za dużo bajerów a znów brak podziału na flash/RAM) - arm-none-eabi-gcc-8.3.0-190223/arm-none-...
Ustawiasz w skrypcie linkera tak aby wszystko trafiło do RAM, a nie do flasha i to wszystkie zmiany jakie musisz wykonać, jednak ja wciąż sugeruję nie przejmowanie się żywotnością pamięci Flash - więcej z tym problemów niż "korzyści". 4\/3!! Jeszcze musi przestawić zworkę ! :P
Piotrus_999 chyba miał na myśli, że w wysłanym do Ciebie skrypcie linkera, pomyliłem się i pozostawiłem 112k z F4. Nie - uważam że definiowanie zachodzących na siebie bloków pamięci jest złe - prowadzi do ciężko debugowalnych błędów - chyba, że ktoś to robi z pełną świadomością potencjalnych problemów - co raczej nie ma miejsca w przypadku automatycznie...
Adresy pamięci Flash i RAM są takie same. Kontroler GPIO i RCC są troszkę inne niż w STM32F1, więc trzeba zmienić. Szczególnie chodziło mi oto czy Pana linker i startup będą pasować do STM32F2.
Freddie Chopin : uaktualniłem startup oraz linker (od Ciebie) ustawiłem : __main_stack_size = 1024; __process_stack_size = 1024; i dalej ten sam problem, przy uruchamianiu oraz przy debugowaniu. gaskoin : zaraz zabiorę się za wrzucenie projektu do Eclipse i wtedy pokombinuję ze stosami
...zależy co masz w skrypcie linkera, więc ewentualnie to też wrzuć. wybacz, ale jaki/który to ma być plik ów linker?
Zerknij co kiedyś napisałem: 1. Wszystko co jest związane z tym drugim obszarem RAMu przenieś na sam koniec skryptu linkera (za stackarea). Do tego napisałem też kiedyś: bazowanie na końcu sekcji .text jako adresie inicjalizacji .data nie jest specjalnie wygodne, skoro jest fantastyczna funkcja LOADADDR() To jest źródło Twojego problemu. Przeniesienie...
Fajnie by było jakbyś podał też więcej konkretów, może sam program nie działa ? Może układ elektroniczny jest zły? Generalnie jak freddie napisał wystarczy skrypt linkera
Spróbuj jeszcze -fno-rtti Najwyraźniej wygląda to jak jakaś zależność od libgcc: https://gcc.gnu.org/ml/gcc-help/2009-10/... Możesz zdefiniować gdzieś te symbole jako wydmuszki, ale to już jest hackowanie systemu. (at)Freddie Chopin jest większym ekspertem od C++ to może coś dopowie w tej sprawie.
Startup i skrypt linkera możesz z powodzeniem wziąć z mojego przykładu - będzie trzeba zmienić jedynie adresy i rozmiary pamięci w skrypcie linkera. 4\/3!!
faktycznie jest tak jak napisał kolega Freddie Chopin, odnalazłem odpowiedni komentarz w pliku konfiguracyjnym dotyczący tego.
Właśnie o to mi chodzi - jedna z tych metod korzysta po prostu ze standardowego malloc() i wtedy trzeba zadbać o jego poprawne działanie m.in. właśnie poprzez poprawną implementację sbrk() i stosowne definicje w skrypcie linkera. okej, dużo mi się wyjaśniło Jeśli korzystasz z moich przykładów, to ściągnij ze stronki po prostu paczkę z syscalls i wszystko...
co kompilator i linker w dobrze skonfigurowanym projekcie robią w 3 sekundy. Akurat to sądzę że nie zajmuje im aż tyle czasu :) Wielu tu pisało to samo - po co (at)_jta_ odkrywa koło na nowo. Cały ten projekt (czyli czytanie z ADC i wysyłanie do PC-ta już byś dawno zrobił, przetestował i zapomniał. Aż się boję pomyśleć jak zamierzasz pracować nad stosem...
1. Czy powyższy przykład z atrybutem dla konkretnej zmiennej da się rozciągnąć na szerszy zakres na zasadzie "od tego miejsca do odwołania"? Raczej nie, ale jeśli nie chce Ci się dużo pisać, to po prostu możesz sobie zdefiniować stosowne makro #define. Myślałem, że jest jakiś odpowiednik "#pragma GCC optimize ("")" dla zmiennych. No trudno, jakoś sobie...
Freddie. Chodziło mi o to by nie musieć ręcznie wybierać co tam ma być umieszczone. Linker sam zapełnił by jeden region a jeśli by nie wystarczył skorzystałby z drugiego.
poczytac instrukcje do gcc i linkera. 0x41 0x56 0x45!! poczytałem, poszperałem w google... i dalej nic :( W opcjach linkera nie widzę, by taka komenda była dostępna.
Teraz śmiga jak trzeba :D Tak jak napisał Freddie , trzeba użyć pliku linkera + pliku startowego , które są domyślnie w projekcie. Czyli im mniej plików od STM-a, tym lepiej :)
W odpowiednim źródle wiedzy nie ma podanego wariantu, który by wrzucał data tylko do romu, am I right? E: directx11: Sposób w jaki Freddie pomaga odpycha wielu początkujących, ale jego rady zazwyczaj są trafne.
Freddie znów feler. BET vs Linaro. 11kB ramu vs 3kB ramu. W mojej lekko zmodyfikowanej wersji skryptu linkera BET czepia się sekcji exidx
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...
No ja wiem o tym, tylko zastanawiam się czemu linker nie może jeszcze jej pomnozyć przez 32 i dodać do niej 16 To może zrobić bez problemu, ale nie może zmienić kodu wygenerowanego wcześniej przez kompilator. PS zerknij post wyżej, bo dopisałem w tym samym czasie co Ty wysłałeś Albert
tadzik85 napisał: Jednak istotnym mankamentem w przypadku ST jest fakt, że wartość kopiowana nijak ma się do ustawień w linkerze. ? Chodzi o to, że do vectora przerwań trafia wartość SP wynikająca z linkera, a w startupie wprost ustawiany jest RAM_END,
ldr r0, =0xE01FC040 mov r1, #2 str r1, A to w którym miejscu linkiera wstawic to mam? Może być na samym końcu?
Freddie Chopin korzystam z twojego startup'a oraz skryptu linkera W przykładach jest chyba więcej plików - np. Makefile, którego można albo użyć bezpośrednio, albo choć zobaczyć jakie tam są opcje i założyć że są do czegoś potrzebne. 4\/3!!
Podaj jeszcze jaką wersję pliku portmacro.h używasz. Ja nie widzę w źródłach FreeRTOS'a wersji dla MCU: STR91x dla kompilatora:GCC (jedynie dla IAR). Musiałeś coś pominąć, bo #define wybierające wersję portmacro.h nie jest "zdefiniowane" w tym, co wysłałeś. Skrypt linkera wygląda na standardowy, ale patrząc na STR91x_FLASH.icf w katalogu wersji IAR...
(at)Freddie Chopin Być może się mylę - ale nie zauważyłem żadnej różnicy w tym co wypluwa linker. Być może wynika to z tego że używam dość starego toolchaina (6.3.1) ale istnienie lub brak root symbolu nie ma wpływu na to co jest discard-owane (poza wpisem w elf-ie oczywiście).
Akurat jest inaczej (; Ten błąd linkera można "zgasić" jednym "define" znajdującym się np w pliku nagłówkowym. 4\/3!! Zapewne ten jeden "define" muszę sam zgadnąć? To tak żeby życie nie było zbyt łatwe dla tych co to 'idą na łatwiznę'? ;)
Witam, Czy modyfikowałeś jakieś pliki projektu związane z pamięcią (skrypt linkera, implementację _sbrk_(), syscalls, ...)? Modyfikowałem skrypt linkera zmieniłem "tylko"w czterach miejscach rom na ram. Jak startuje z Ram to w main daję jeszcze:[syntax=c]SCB->VTOR = SRAM_BASE;[/syntax] I rzeczywiście jak zmieniłem żeby program był w Flash to new działa,...
Zakładając, że nigdzie w skrypcie linkera nie masz dyrektyw ALIGN(), to zapewne jest to narzucone przez model pamięci i/lub algorytm programowania w OpenOCD. Ale to juz GCC po kompilacji i linkowaniu tak robi, w pliku map to widać. Dodanie ALIGN(x), 1 lub 2 nic nie zmienia
A w skrypcie linkera zmieniłeś rozmiar stosu dla przerwań na inny od zera? jasne że przerobiłem rozmiar pamięci: /* Handler mode (core exceptions / interrupts) can use only main stack */ __main_stack_size = 0; 4\/3!!
tak będzie dużo prościej, bo nie trzeba modyfikować NIC w skryptach linkera. Zgadza się, tyle, że w momencie przyrostu programu ponad ów adres, cała tablica idzie w drzazgi, prawda?
Łatwość z jaką osiągniesz swój cel jest uzależniona od tego jak bardzo LM4 są podobne do LM3 (; Przecież LM4 = LM3 + FPU Czyli linker i startup będzie podobny do tego z stm32f4 ?
....spróbujcie wyrównania stosów do 8... Czyli mniej więcej coś takiego w srypcie linkera? .stackarea (NOLOAD) : { . = ALIGN(8); *(.stackarea .stackarea.*) . = ALIGN(8); } > SRAM &buf - ampersand raczej zbędny, jeśli "buf" to tablica. No kiedyś się na tym przejechałem (pomyłka) i teraz zawsze daję ten...
Nie bardzo rozumiem Freddie. Projekt zostaj jak rozumiem przetestowany na takim samym Chipie jak moj czyli lpc2368 wiec opcje linkera czy sam plik lpc2368.ld zostaly dobrane wlasnie dla tego chipa.
Jedyne "pewne" podejście do tej kwestii, to zmniejszenie rozmiaru flash w skrypcie linkera o rozmiar przynajmniej dwóch ostatnich stron i użycie właśnie tych dwóch ostatnich stron. Każda inna opcja to proszenie się o kłopoty. Cenna informacja. Tego pewnie nie napisali w tamtym PDF? :P Dziękuję za podpowiedź. Nigdy nie grzebałem w linkerze, ale na pewno...
Freddie natomiast przeznacza na nią wszystko to co zostało niewykorzystane. Co oznacza możliwość wykorzystania w pełni ramu. Nie do końca (; Wszystko co zostało po zlinkowaniu sekcji .data, .bss i po uwzględnieniu zadeklarowanego rozmiaru stos ów .
Dzięki opcjom, które podał Freddie nie trzeba nawet żonglować. Każda funkcja znajdzie się wtedy w swojej sekcji i linker to potraktuje tak jakby każda była w swoim własnym pliku o. Do tego można dodać jeszcze optymalizację całości (wymagającą wywołania wszystkich jednostek kompilacji jednocześnie) i wszystko co nieużywane zostanie wyrzucone. No ale...
Niestety obecnie mam bardzo słabe łącze (bluconnect) więc swoich plików nie "przepchnę". Zresztą nigdy nie napisałem żadnego programu do migania diodą na LPC'ka.:D a obecnie mój projekt kompiluje się do ponad 100kB. Jedynie co mogę poradzić na już to poszukaj gotowych przykładów dla Keila. W tych przykładach startup jest pisany w C , jedynie co to podstaw...
Dodaj w linkerze biblioteki m i c i to jest niby rozwiązanie? Niestety to przypadłość ludzi, którzy używają graficznego IDE i mają tendencję do nabijania postów na forum. A wystarczy po prostu podlinkować rozwiązanie: http://www.openstm32.org/forumthread1291 https://community.st.com/thread/11205
Ale to widziałeś? http://www.freddiechopin.info/pl/artykul... Nie. Jestem ostatnio regularnym bywalcem twojej strony, ale to przegapiłem. Mea culpa.. W skrypcie linkera należy ustawić rozmiar stosu dla przerwań - domyślnie jest zero, co zwykle źle się kończy. Ustawiłeś jakąś sensowną...
1. Musisz zmienić plik linkera dodając sekcje analogicznie do .bss z odpowiednimi symbolami aby móc zidentyfikować gdzie one są 2. od "label"a CopyDataInit do LoopFillZeroes masz wypełnianie .data - analogicznie zrób dla innych swoich segmentów. Jeśli tych zmiennych nie masz setek, to prościej niż przerabiać startup i skrypt linkera będzie Ci je zainicjalizować...
Dzięki Freddie. Twój syscalls oczywiście poprawnie się kompiluje. Próbowałem go już wcześniej. Ale chciałem mieć możliwość sprawdzenia zakresu stosu. Naprawdę nie ma sensu tego sprawdzać? Próbowałem tą deklarację wstawić do twojego kodu i nie działa. W którym miejscu ją umieściłeś w kodzie? Dodano po 1 Może te dwie etykiety ze skryptu linkera nie są...
Program bootloadera i program użytkownika, kompilowany jest osobno. A może zrobić inaczej, skompilować program wynikowy, sprawdzić adres vectora IRQ (w którym pliku go znajdę ten adres, w pliku map czy lss, czy tez innym?), oraz w programu bootloadera w startupie na stałe wpisać vektor IRQ z programu użytkownika. Czy ma to sens? Dodano po 1 Temat rozwiązany,...
Cześć Freddie. Wyrównanie stosujesz domyślnie dla każdej sekcji ? Czy tylko .text ? Natrafiłes na podobny problem czy dałeś wyrównanie profilaktycznie ? Skrypt linkera z którego korzystam jest dostosowanym samplem z toolchaina, jeżeli chodzi o alignment to nic nie zmieniałem wiec to może byc trop. A za rysunki dziękuje. Miałem nadzieje ze pochwalisz...
Witam Może używasz innego skryptu linkera lub StarUp dla Keil i Ecpilse. W main.c masz dwa vTickTask1 i vTickTask2. Zobacz czy to ci działa (cały Setup procesora dałem od kolegi Freddie Chopin) + Rtos611 (ostatni ze strony).
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...
To samo - za mały stos. Czy tylko to może kierować program akurat w te maliny ( default handler)? (wystarczy w nim zakomentować/usunąć ze 3 linijki). Po takiej zmianie w skrypcie linkera nieużywany stos może mieć rozmiar 0. Czyżby te poniżej niniejszego opisu: "Thread mode uses process stack (PSP) and is privileged" ?
Tablica k jest pierwszym argumentem funkcji Storage_RC4_init. Zapewne oryginalny problem rozwiązałeś w zły sposób i teraz będziesz rozwiązywał problemy które sam sobie stworzyłeś. Albo masz rację, jak widzę nieliczne fragmenty kodu, tak radykalnie spada moje zaufanie do reszty. Ale ja mam jakiś dzień, że nie pojmuję tego co przerasta moje siły (Mądrość...
A czy ja coś mówię? co update multum nadmiarowych pluginów pozostaje... rozmiar rośnie niebagatelnie. Pliki rożne przy generacji z AC6 a CubeMx. ponad pól roku zajęło im naprawienie błędu linkera dla L4... itp itd. a skoro mam robić na makefile wole rozwiązanie własne a'la Freddie. AC6 jest wystarczająco dobre by używać nie przeczę, ale mi nie podchodzi.
No tak, wiedziałem, że to musi być coś prostego... Sorry za zawracanie głowy takimi sprawami, tak to jest, jak się człowiek bierze po całym dniu pracy za "relaks" :-) Dodano po 36 OK, zmieniłem ilość ramu i romu w skrypcie linkera i poszło na LPC2148 :-) Dzięki Freddie. Aha, czy powienenem pozmieniać coś jeszcze w ustawieniach (obowiązkowego)? Dodano...
Odkryłem kolejną ciekawą rzecz - bez opcji --gc-sections dla linkera też nie działają floaty w printf() i podobnych... Tak ... brak solucji od dłuższego czasu. Co potwierdza moją tezę, że prawdziwi mężczyźni "embedded float" nie używają ;-) Tak więc nie z własnych doświadczeń, ale zasłyszanych gdzieś, wyrównanie do 8 to jest hint. Albert
Krok po kroku: 1. zmienić rozmiary i adresy pamięci w skrypcie linkera 2. Jak chcesz pomocy, a nie wyręczenia, to musisz napisać z czym niby masz problem, wkleić to co masz itp. Bo wg mnie przerobienie tych podstawowych plików z LPC2103 na inny układ z tym samym rdzeniem to są właśnie te 2 zmiany powyżej i nic więcej. 4\/3!!
zastosowania (jak np. kopiowanie kodu do RAM) niż żebym miał sam to robić. Modyfikacja skryptów linkera powinna mieć miejsce wtedy, gdy jest to konieczne. No właśnie to jest taka potrzeba. Trudno znaleźć lepszy przykład na pytanie: po mi te tajemnicze skrypty linkera? Zgadzam się w 100% z kol (at)Freddie Chopin że jest to jedyne poprawne rozwiązanie...
Jaki komplilator? Jeśli gcc to skąd wziąłeś implementację sbrk() i czy na pewno pasuje ona do pozostałych plików (szczególnie skryptu linkera)? 4\/3!! Keil uVision4, bazuje na przykładowym kodzie.
Freddie Chopin Ci po prostu delikatnie sugeruje być przesiadł się z przestarzałego WinARM na kombo gcc(code sourcery) + eclipse + openocd. A przykłady Freddiego (szczególnie ten dla LPC21xx) łatwo przerobić na AT91SAM7xxx (chodzi o makefile, i skrypty linkera) bo to ten sam rdzeń.
Ehh... pisałem przecież, że musisz użyć skryptu linkera _I_ startupa assemblerowego. Jedno jest bardzo związane z drugim. Wiem, wiem, straszny ze mnie newbie, sorki :( Przeraża mnie ilość rzeczy która musi być by można było napisać a = b + 1; W każdym razie odpaliłem Twój skrypt, i efekt jest taki, że zapętla się na: while(!(PLLSTAT&PLLSTAT_PLOCK...
(at)GrzegorzKostka - przy linkowaniu - opcja defsym. Linkuję z defsym=cokolwiek, liczę CRC, linkuję drugi raz z defsym=CRC a potem leci cała reszta objcopy'iów i objdump'ów. I bardzo ładnie to sobie działa, tylko nie wiem czy nie strzelam sobie w kolano z tą sekcją. (at)Freddie Chopin - co to znaczy prawidłowa? Aktualnie __text_end wskazuje na koniec...
Sorki, powinno być [syntax=bash]objcopy -I binary -O elf32-littlearm -B arm plik.bin plik.o[/syntax] a najlepiej to jak wyżej napisał Freddie Chopin [syntax=bash]objcopy -I binary -O elf32-littlearm -B arm --rename-section .data=.rodata,alloc,load,readonly,data,c... plik.bin plik.o[/syntax] wtedy linker nie będzie krzyczał.
Nic nie trzeba specjalnie ustawiać, za to trzeba "ręcznie" ustawić stos, bo w przeciwnym wypadku będziesz miał stos skonfigurowany tak jak w bootloaderze. 4\/3!! Rozumiem że chodzi Ci o zrównoważenie stosu które realizowane jest w funkcji skoku do aplikacji? /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application...
zainteresuj się tą flagą linkera -print-memory-usage Fajna ta flaga, nie znałem wcześniej (; Gdzie wstawić/znaleźć tą flagę ?
Druga opcja to "przeszczep" tego zerowania z przykładu dla LPC4330 - chodzi o przekopiowanie kawałków skryptu linkera i kawałków startupa. Ta opcja by mnie bardziej interesowała. Ściągnąłem sobie ten przykład co mówiłeś i jedyna sekcja o zerowaniu to sekcj: // Zero-init sections from bss_array (including .bss) I w sumie ja też ja mam w swoim startup-ie....
Witam! Od kilku dni próbuje skompilować cokolwiek na mikrokontroler PIC32 z rdzeniem MIPS 32 m4k przy użyciu kompilatora z codesourcery. Powodem tego jest fakt iż C32 od microchipa nie wspiera mojego układu a nowy XC32 nie chce współpracować ani z MPLAB8 ani MPLAB X. Więc wybrałem lubiane przeze mnie Eclipse i codesourcery. Oczywiście znaleźć cokolwiek...
A dlaczego miałby zgłaszać błędy? Co ty robisz jeśli nie masz wystarczająco informacji, aby podjąć decyzję? Zawieszasz się, czy podejmujesz decyzję w oparciu o swoje przeczucia, co może okazać się nieoptymalne? Tak samo robi kompilator, podejmuje potencjalnie nieoptymalne decyzje z jednym celem - aby mieć 100% pewność, że kod będzie dało się potem zlinkować...
A plik linkera przeglądałeś? _user_stack_size = 512; _fiq_stack_size = 0; _irq_stack_size = 0; _supervisor_stack_size = 0; _abort_stack_size = 0; _undefined_stack_size = 0; _system_stack_size = 0; Sam pare razy pisałem, że aby uruchomić przerwania, trzeba zmienić rozmiary stosów w pliku linkera... Co do stosu to faktycznie nie zauważyłem. Poprawiłem....
Poniżej przedstawiam korespondencję oraz dalsze kroki mające na celu wykorzystanie implementacji funkcji printf pochodzącej z strony freddiego chopina. Ja: Witaj, Chcialem wykorzystac twoja funkcje printf, jednak w paczce z nia zabraklo pliku usart.h . Brakowolo jedynie referencji do funkcji usart_put_char więc ją dopisalem. Niestety nie ma również...
No ale jak zmusić kompilator, do wywołania funkcji "ukrytych" spod jakiegoś konkretnego adresu? ukryta=0xXXXXXXXX w pliku linkera i odpowiedni nagłówek? Aplikację można przecież zlinkować z własnymi bibliotekami, w szczególności z wersją libc użytą ... W szczególności podoba mi się tyle printf -ów ile tasków ;-) Albert
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...
dodaj opcję -Map=$blabla.map,--cref do linkowania jeśli jej nie masz Nie bardzo rozumiem. Gdzie mam to dodać? W ogóle to zapomniałem napisać. ARM7-TDMI, Eclipse, CodeSourcery, extremalnie zmodyfikowane przykłady Freddiego Chopina. PS. masz strasznie dużo warningów. Łatwo w tym gąszczu przegapić ważne rzeczy. Dużo to ich było wcześniej ;) Ze 100. Teraz...
Dziękuję za szybką odpowiedź Freddie. Powiem szczerze, że ten STM32 w tytule napisałem z rozpędu. Dokładnie to stworzyłem prosty projekt bazując na Twoich (np. stm32f4_blink_led) ale dla procesora NRF51822 firmy Nordic (z wbudowanym BLE i Corex M0) Startup i skrypt linkera mam od Nordica z małymi poprawkami. Makefile jest Twój, ale także z drobnymi...
Tak w ogóle to w startupie wykorzystujesz stałą __idata_start, której nigdzie w tych skryptach linkera nie widzę. Skrypt likera linia 127: __idata_start = __text_end; Dodano po 5 Zgadza się. Zwiększenie stosu powoduje, że błąd nie występuje. Jednak jak uchronić się od tego w przyszłości? W tym przypadku wyświetlały się bzdury na LCD ale w innym może...
o że do AVR i ARM jest GCC, nie oznacza jeszcze, że jedna i druga firma się do tego nie przykłada. Freddie, niech się przykłada. Dalej ponawiam pytanie, Jeśli Microchip przyłoży się i wykupi sdcc, to komukolwiek będzie lepiej z tego powodu? Nawet fanom? Więc jaki sens ma argument o braku darmowego środowiska? A czy na pewno nie istnieje darmowy gcc...
Jak najbardziej tak zrobiłem i wszystko działa jak trzeba. Mój upór wynikał stad, że skoro jest wtyczka AC6 z opcją uruchamiania Openocd, to korzystałem z niej sądząc, że dlatego nie działa, bo coś zrobiłem źle. Finał sprawy taki: Zrobiłem nowy config korzystając z C/C++ GDB Hardware Debugging, tam ustawiłem ścieżkę do arm-none-eabi-gdb, ustawiłem też...
.ctors i .dtors - rozumiem, że tu chodzi konstruktory i destruktory C++, gdzie to jest u Ciebie Freddie? Bo widziałem jedynie ich wywołanie w startupie. Zbędne - to jest stara metoda, obecnie wszystko jest robione przez init_array. .stack - rozumiem, że to jest stos typu "narastający w dół" (descending), u Ciebie Freddie są dwa+ich rozmiar jest ustalony....
Clang normalnie jest cross-kompilatorem, do samej kompilacji wystarczy normalna paczka i switch -target. Problem zaczyna się z biblioteką i linkerem. Nie wiem jaki jest status libc++ i linkera LLVM na ARM, ale na pewno nie gotowy ;) Niby można wykorzystać libstdc++ z GCC i linkować g++, ale dla cross-kompilacji chyba "samo" nie zadziała. Jeszcze tego...
Dokładnie tak. Niestety nie jest to takie proste. Po pierwsze zużycie flash to co najmniej "text + data", a zużycie RAM to co najmniej "data + bss". Liczby te mogą (ale nie muszą) uwzględniać stosu i sterty. Całkiem często realnie zużycie statyczne jest nieco większe niż powyższe sumy. Dlatego osobiście polecam dodać sobie do linkera opcję `-Wl,--print-memory-usage`...
1 Tak ja powiedział Freddie zwieranie kondensatorów nie jest dobre (po jakimś czasie swich do wymiany). 2 Eliminuj drgania programowo. 3 Opornik równolegle do kondensatora raczej nie (pull-up wewnętrzny może mieć 50k). 4 Sprawdź debugerem czy nie jest tak że zawsze się resetuje. Na pewno były błędy w kompilatorach/linkerach dla mega88 i mega168. W mega168...
F4 poszło mi spokojnie i twój przykład (Freddie) odpaliłem. Dziękuję Ci bardzo za cały wkład jaki dałeś od siebie dla nas. ;) Ale problem miałem robiąc frankensteina dla F0, następnym razem postaram się przebić i pytać w razie czego. imarszi - zauważ, że pliki z przykładów od ST (skrypty linkera) mają przezabawne obostrzenia licencyjne. ;)
Koniec świata :D Freddie i FWLib :D A tak na serio, to mnie najbardziej interesowałaby opcja opisana na ostatniej stronie jako "najbardziej interesująca", a więc wykorzystanie startupa i skryptów linkera (i tylko tych plików) dostarczanych razem z biblioteką (w połączeniu z "pierdołami" typu sbrk, malloc itp itp). Bo nie po to w końcu producent procka...
Witam Rozumiem, że chcesz aby cały kod wynikowy został umieszczony w pamięci RAM. Żeby tego dokonać należy zmienić adres sekcji ROM w skrypcie linkera: "rom (rx): org = 0x08000000, len = 128k" na pamięć RAM(zaczyna się od adresu 0x20000000 dla stm32). Pamięć RAM również należy przesunąć o odpowiedni adres. Jeżeli masz w kodzie przerwania to nie zapomnij...
Witam, Korzystając z makefile of projektu FreddiegoChoppina z STM32 blink... po drobnych modyfikacja flagi kompilacji na m4 oraz ścieżki dostępu do pliku linkera konsola wyrzuca mi taką informację: [syntax=actionscript] **** Build of configuration Default for project bob **** cs-make all Linking target: out/bob.elf arm-none-eabi-g++ -mcpu=cortex-m4...
printf() używa okrutnych ilości RAM, więc zacząłbym od tego. Jeśli nie wyświetlasz liczb z przecinkiem, to użyj iprintf() - wersja ta nie obsługuje zmiennego przecinka W projekcie potrzebuje liczb z przecinkami, niekoniecznie muszą być float'y bo to tylko temperatura, więc w ostateczności mógłbym customizować jakiegoś printf'a żeby w integery wstrzeliwał...
Da się jeszcze jakoś zoptymalizować, pod względem kodu, przy zachowaniu szybkości, opcję statyczną? Poza opcją `-ffunction-sections` jest jeszcze `-fdata-sections` Spróbowałem zaznaczyć to w propertisach projektu, ale beż różnicy: text data bss dec hexfilename 98384 124 4772 103280 19370 z tym, że mam wątpliwość czemu ta opcja kompilatora, miałaby...
Problem jest w użytkowaniu biblioteki CMSIS dostępnej na stronie ST. Nie mogę przeprowadzić poprawnego linkowania przy użyciu Sourcery G++ Lite for ARM EABI. Kompilacja przebiega raczej poprawnie. Freddie Chopin ma przykład dokładnie z tym uC ale nie działa z biblioteką, min. z powodu niedopasowanego startup i właśnie makefile o skryptach linkera nie...
ale tam gdzie miał wprowadzić on jakieś zmiany nic sie nie zmieniło... Zrób nowy projekt, w C Project powinien się pojawić ARM Cross Target Application , i wybierz Swój Toolchain, w tym wypadku Sourcery G++ Lite. Dodaj na nowo pliki: startup, skrypt linkera, pliki źródłowe bez makefile'a, ponieważ plugin Ci go wygeneruje. zresztą elfy są mało ważne......
pliki LD to skrypty linkera - wbrew pozorom ich składnia jest bardzo prosta, gorzej z dojściem do tego, co gdzie umieścić. Opis budowy plików LD znajdziesz w instrukcji do linkera, który nazywa się... ld (; Dla standardowych opcji instalacji znajdziesz ją pod adresem c:\Program Files\CodeSourcery\Sourcery G++ Lite\share\doc\arm-arm-none-eabi\pdf\ld....
Ostatnio przechodziłem "tą ciernistą drogę" kompilacja i poprawne wgranie pierwszego programu zajęło mi chyba 3 dni. Ale dałem radę sam (choć już miałem pytać na forum). Generalnie to dzięki szczywronek za poradnik! jesteś miszcz! A co do środowiska. Zaczynałem z pluginem i tam całe środowisko chodziło z tym że zaciągane są biblioteki a nie o to mi...
Na swoją stronkę wrzuciłem najnowszą kompilację OpenOCD dla Windows, problem na który się natknąłeś powinien tam być rozwiązany. 4\/3!! Programuje poprawnie (daje się zaprogramować STM32F429IDiscovery programem demonstracyjnym który działa poprawnie). Jednak nie daje się debugować, po załadowaniu programu i próbie uruchomienia błąd Eclipsa (java.lang.NullPointerException)....
Taki kod jest po prostu bezsensowny i tyle. Kod z inicjalizacji _jest_ sensowny i _działa_. Jak napiszesz: #define STALA 12345 char* ptr=&STALA; to wydaje Ci się, że to jest poprawne? To nie jest poprawne i nie skompiluje się z prostego powodu - twoja stała jest dyrektywą preprocesora, czyli zostanie rozwinięta jeszcze przed kompilacją programu. Kompilator...
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? Są to pliki, które wygenerowały się podczas tworzenia projektu AC6. Nie ustawiłem żadnego brakepoint debugowałem krok po kroku (f5) w momencie kiedy wchodzę do pętli while() konsola...
Bo masz źle skonfigurowany projekt - ma być wszystko w trybie thumb. 4\/3!! Dziekuje za odpowiedz, moglbys jeszcze podpowiedziec jak ustawic ten tryb ? To chyba w opcjach kompilatora tak ? Obecnie mam takie opcje: dla kompilatora C: arm-atollic-eabi-gcc -c dla linkera: arm-atollic-eabi-gcc
Po zmianie ścieżek w zmiennej środowiskowej generują się wszystkie binarki itd. (at)Freddie: WIELKIE DZIĘKI Jeszcze mam parę pytań: Czy wiesz jaki format mają pliki *.o ? Pewnie to OMF, tylko czy to jakiś szczególny format coś jak OMF-51? (prawdę mówiąc nie wiem czym ten OMF-51 różni się od intelowskiego). Co zawiera plik bin? BTW. Projekt generuje...
A kto czyści flagę przerwania? Bo tutaj nie widać... W zasadzie we wszystkich przykładach wykorzystania przerwania z UARTA nie było nigdzie czyszczenia flagi, więc założyłem, że jej nie potrzeba... gdzieś czytałem, że flaga jest automatycznie czyszczona, ale jestem laikiem więc mogę się mylić. Wdzięczny byłbym za wszelkie wskazówki jak do tego podejść....
Ale po uploadzie core blokował się, komunikat: the core is locked up! Skoro używałeś przerwań, to pewnie problemem był rozmiar stosu dla przerwań (konfigurowany w skrypcie linkera, domyślnie zero), więc układ się wieszał. Faktycznie to mógł być powód, bo tego nie zmieniałem, a przykład był skrojony na miganie diodami bez użycia przerwań. W moim przykładzie...
Wskazuje na funkcje które dostępne są w bibliotekach (nie mylić z "bibliotekami" czyli modułami kodu). W sumie to nawet tam jest to chyba zbędne. 4\/3!! Jest zbędne, linker połączy symbole. extern jest niezbędne dla funkcji chyba tylko w przypadku kiedy korzystamy z tego samego pliku nagłówkowego w C i C++ - jako extern "C" - zapewnia właściwe manglowanie...
Tyle że właśnie nie wiem jak prosto rozwiązać sprawę linkowania tego w pozostałych sekcjach... ); Bez wyłączenia linkowania w innej sekcji niestety linker melduje że :D ...multiple definition of... Czytałem trochę na temat EXCLUDE_FILE ..ale jakoś nie potrafię tego zastosować :cry: . EDIT: Dzięki Twojej podpowiedzi udało się skompilować projekt. Wszystkie...
Teraz "delikwent" dowiaduje się o tym gdzie ustawić rozmiar stosu dosyć szybko, jeśli ustawię tam jakiś rozmiar, to dowie się późno (po tym jak już inne potencjalne powody błędów zawiodą) lub wcale... A może (nie znam składni skryptu linkera, nie wiem, czy to możliwe) dać coś w stylu #error "Ustaw rozmiar stosu!" Pozdrowienia, m.ki
linker error stm32 linker stm32f0 linker
podpiąć lampe światło pilota wzbudza alarm
moduł poziomowania openbk timer
ALUP SOLO7 – kody błędów, kasowanie alarmów, procedury resetu Air Control Schemat elektryczny lodówki Bosch KGV39VL31/05 – gdzie znaleźć dokumentację?