(...) ustawiłem wektor przerwań i początku pamięci flash w linkerze z odpowiednim offsetem (0x3800) Co to za magiczny offset? :D
(at)BlueDraco No i niby jak miałoby to pomóc? Przecież adres tej tablicy i tak nie będzie miał stałej wartości. Wystarczy lekko zmienić projekt albo dodać jakiś plik ze stałymi do kompilacji i całość się sypie. Może umieścić tablicę w swojej sekcji umieszczonej pod koniec pamięci FLASH.
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.
Przy okazji sprawdź, czy w ustawieniach debuggera nie masz włączonego czyszczenia całej pamięci Flash przy programowaniu. Jeśli używasz jawnej wartości wskaźnika - nie musisz w ogóle definiować nowej sekcji dla linkera, wystarczy, że skrócisz główną sekcję Flash. Elegancko byłoby zadeklaropwać nową sekcję,a nestępnie zdefiniować zmienne z atrybutami...
Możesz też stworzyć odrębny blok, tutaj masz przykład jak wykonać http://www.lpcware.com/content/faq/lpcxp... ustawiasz w GUI i z automatu generowane zmiany dla linkera.
Dziwne te niektóre pliki, ale z grubsza wszystko wygląda jak należy... Wiele rzeczy mogłoby spokojnie być we flash, ale w skrypcie linkera są umieszczone w RAM. Niemniej jednak zacznij od dodania "__STARTUP_CLEAR_BSS" do AS_DEFS w Makefile i zobacz czy może dzięki temu problem zniknie. Masz debugger?
Wszystko robisz jak dla każdej innej aplikacji tylko w ustawieniach projektu ->Toolchain->AVR/GNU Linker ->Memory Settings->FLASH segment dodajesz: Boot size == 128 words[syntax=c].text=0x1F00[/syntax] Boot size == 256 words[syntax=c].text=0x1E00[/syntax] Boot size == 512 words[syntax=c].text=0x1C00[/syntax] Boot size == 1024 words[syntax=c].text=0x1800[/syntax]
(at)Jakub17 Musisz użyć tych zmiennych w swoim programie bo inaczej kompilator (linker) uzna, że są niepotrzebne i usunie je z pliku wynikowego.
Nie mozna tak zrobic, bo nie masz gwarancji gdzie linker umiesci zmienna - zwykle robi to w kolejnosci deklaracji, ale wcale nie musi. Zreszta to moze sie popsuc nawet i bez ingerencji linkera - wystarczy, ze ktorys naglowek stworzy zmienna w EEPROM. Sekcje pamieci EEPROM mozna przesunac przekazujac linkerowi polecenie --section-start (pamietaj o tym,...
Błąd jest gdzieś tu: .data : { _data_begin_ = .; *(.data) _data_end_ = .; } > FLASH Myślę, że w tym małym kawałku widać go od razu [; 4\/3!!
Przydałoby się jeszcze 2 rzeczy: 1. zmniejszyć FLASH o odpowiednią wartość, tak aby na siebie nie najeżdżały - możesz od LENGTH odjąć ile tam potrzeba ... LENGTH = 128k - XXX 2. Dodać profilaktycznie } > VAR AT > VAR Tym sposobem skrypt linkera będzie w 100% poprawny. Jeśli nadal będą jakieś błędy, to już nie po stronie linkera. Jeśli dalej coś nie...
Możesz w skrypcie linkera dodać przy tej sekcji `(NOLOAD)`, w ten sposób: SECTIONS { ... .noinit (NOLOAD) : { ...
Ja mam tak: __attribute__ ((section(".bootloader&... int program_page(unsigned short *data, unsigned int adr) {... } i linker: .bootloader 0x08000000+128K-1K : { *(.bootloader) } i działa
Witam! Chcę wgrać parę danych do pamięci mikrokontrolera STM32F107 (ustawienia domyślne). Nie wiem za bardzo jak powinien wyglądać kod linkera do takiego zapisu? Korzystam z CodeSourcery ze strony Freddiego. Nie posiadam debuggera, więc kod mogę wgrywać tylko poprzez bootloader na USART. Pamięć chciałbym zapisać paroma danymi 32bit, a następnie mieć...
To trochę dziwne odpowiadać samemu. Ale odpowiedź nie pochodzi ode mnie. Napisał do mnie na PW kolega (nick na razie pominę) nieco sfrustrowany tym, że dyskusja pewnie by się skończyła głupimi uwagami niektórych kolegów, którzy uważają - że już zjedli wszystkie rozumy i nikt nie może ich nic już nauczyć . Kolega ów podpowiedział mniej więcej to, że...
Używam kompilatora MikroC i nie wiem jak zmienić skrypt linkera. Wystarczy się dowiedzieć jak w tym płatnym kompilatorze ograniczyć zakres używanej przez linker pamieci flash. Masz instrukcję, masz support, masz stronę producenta - myślę że przez czas jaki trwa ten wątek już byś się dowiedział...
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 ;)
W przypadku avr-gcc nie liczyłbym na optymalizację pod kątem zmieszczenia się w zadanej ilości pamięci flash. Pamiętajmy, że kompilacja każdej jednostki translacji wykonywana jest osobno, a następnie linker łączy wszystkie pliki obiektowe do pliku wynikowego - w takim scenariuszu w jaki niby sposób kompilator miałby skorzystać z informacji o globalnym...
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.
Jestem w trakcie poznawania środowiska programistycznego LpcXpresso, umiem utworzyć projekt i skompilować program ale po skończeniu kompilacji w katalogu Debug projektu powstaje plik z roszerzeniem axf . Google podpowiedziało, że axf to "The AXF file extension is related to the ARM Executable files produced by ARM Linker.". Flash Magic nie chcę wczytać...
Jesli korzystasz z AVR Studio to w opcjach projektu mozesz dodawac swoje sekcje podajac ich adres startu i ew. dlugosc. Oczywiscie musisz je nazwac inaczej niz PROGMEM, bo ta nazwa jest juz zajeta. Jesli nie to przekazujesz parametry dla linkera przy wywolaniu gcc, tu jest howto: http://www.nongnu.org/avr-libc/user-manu...
A jaki adres pamięci flash masz ustawiony w skrypcie linkera? Tutaj masz konkrety opis http://sourceware.org/binutils/docs-2.20... Dodatkowo jest też dokumentacja do samego kompilatrora. Prawdopodobnie linker wpakował program pod zły adres więc podczas ładowania programu OpenOCD informuje że pod tym adresem flash'a nie ma.
Nie ma takiego makra, ale można je stworzyć. Z tym, że zapis do FLASH możliwy jest tylko z poziomu bootsectora, stąd też stworzona funkcja zapisująca musiałaby w nim się znajdować, a to oznacza zabawę z sekcjami pamięci i linkerem. Dodatkowo FLASH programowany jest stronami - nie da się bezpośrednio przeprogramować jednej komórki, zawsze zapisywana...
Kompilujes z opcją -ffunction-sections (czy jakoś tak), a więc każda funkcja ląduje w sekcji .text.nazwa_funkcji. main() jest więc w sekcji .text.main Powinieneś w skrypcie linkera dodać przy specyfikacji sekcji coś na styl: prog : { *(.text .text.*) *(.rodata .rodata.*) *(.glue_7) *(.glue_7t) } >flash To samo powinieneś zrobić dla sekcji .bss i .data...
... ale gdy dodawałem to samo linijkę --section-start=.bootloader=0x1F000 w AVR Studio Project -> Custom Options i tam do All dodawałem to linijkę... Wszystko ładnie i pięknie , tylko że ... to linker ma wiedzieć gdzie "wepchać" daną sekcję. W AVRStudio , masz conajmniej 2 możliwości: 1)Project -> Custom Options i tam do [Linker Options] -Wl,-section-start=.bootloader=0x1F000.....
Wektory można przemapować (rejestr VTOR). Ja robię bootloader w sektorze 0 a reszta dla aplikacji. Właśnie znalazłem przykładowy bootloader ze strony ST i faktycznie to lepsze rozwiązanie. Pierwsze sektory na bootloader'a, a dalej isr_vector aplikacji + aplikacja. Bootloader w linkerze ma start FLASH na 0x0800 0000 Applikacja w linkerze ma start FLASH...
Nadal pytam, jaki jest pożytek z nieużywanego stringa z version? Copyrights? A dlaczego to musi być akurat version? Przyczepiłeś się wirtualnego przykładu. Do tego nie musi być to dostępne z zewnątrz. Moga to być np informacje dla bootloadera już po wgraniu do flash. I tysiące innych możliwości.
Jak używałeś pierwszej wersji, do kodu wykonywalnego nie były dołączne biblioteki standardowe. W drugiej wersji są. Jakaś część tego kodu umieszczona jest w sekcji .init . Jak różne sekcje kodu umieścić w pamięci procesora mówi linkerowi jego skrypt. W Twoim wypadku LCD_nokia_olimex.cmd. W nim należy dodać w sekcji SECTIONS analogicznie do wpisów już...
tylko że zwróć uwagę na to, że autor wątku NIE CHCE jej wgrywać za każdym razem (tylko jeden raz), więc wychodzi naprawdę na to samo. Wystarczy zmniejszyć rozmiar FLASH w skrypcie linkera, a następnie umieścić tablicę binarnie w zwolnionej przestrzeni. W ten sposób linker sam nas poinformuje, że przekroczyliśmy "granicę". Prawda?
Oczywiście że się da. Zmuszać należy linker. 4\/3!!
Na szybko obstawiam, że problemem może być zupełnie gdzie indziej. Otóż REALNY adres pamięci flash w mikrokontrolerze AT91SAM7S64 to nie 0, a 0x00100000 (http://www.keil.com/dd/docs/datashts/at... - strona 14). OpenOCD zapewne właśnie dlatego zgłasza następującą uwagę: Warn : no flash bank found for address 0 Warn : no flash bank...
To raczej nie skrypt linkera, a zewnętrzny program, który przetworzy obraz binarny, który masz zapisywać - w każdym środowisku istnieje możliwość wywołania takiego programu, zwykle pod nazwą "post build step".
Czy można się jakoś przed tym zabezpieczyć ? W skrypcie linkera należy włączać sekcję poprzez zapis:[syntax=c]KEEP (*(.nazwa_sekcji))[/syntax] albo użyć atrybutu 'used':[syntax=c]static const int dummy __attribute__((__used__)) = 1234;[/syntax]
Proponuję poczytać o skryptach linkera. Jest wiele stron łatwo znaleźć przez google. A co w tej sytuacji poprawiłaby ta zmiana skryptu linkera?
Witam, już widzę błąd... Podany przeze mnie przykład był zrobiony dla procesora LPC2148, który ma więcej pamięci RAM oraz FLASH. Niby nic takiego, ponieważ program i tak nie wykorzysta więcej pamięci niż ma Twój LPC2144. Jednak w skrypcie linkera - LPC2148-ROM.ld zdefiniowano na stałe adres stosu, stąd te błędy i pisanie po komórkach pamięci, których...
Cóż, dopóki dana funkcja nie jest przywoływana, czy linker nie powinien usunąć jej z kompilacji? A może WPA3 i BT są w binarnym blobie, którego nie możemy kontrolować?
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...
Ad1. OK. Ad 2 : Error: No flash at address 0x00000000 Skrypty linkera wzięte z Ride, z resztą programy działają, problemem był tylko ten dziwny breakpoint.
Jedna rzecz mnie ciekawi. Czy udało Ci się program z pamięci Flash uruchomić bez debugowania? Jeśli tak, to znaczy, że skrypt linkera powinien być ok.
Przykładowy linker dodany do cubef4 dla mikrokontrolera np. stm32f439NI ma tak podzielone obszary pamięci: We fragmencie kodu który pokazałeś widać "jak na dłoni", że pamięć flash _NIE_ jest podzielona, więc nie wiem w czym problem... Czy używając pamięci 2MB z dual bankiem mogę zapisać program na obydwu obszarach pamięci bez żadnych dodatkowych kroków...
Nie wiem o co chodzi Koledze "Marek_Skalski", bo przecież interpretacja Kolegi "NowyARM" jest jak najbardziej poprawna. O tym samym pisał również Kolega "Tmf". Osobiście nie wiem, co jest umieszczane w tej sekcji, ale gdy zostaną tam kiedykolwiek dołączone jakieś dane, to stała w pamięci programu zostanie przesunięta względem początku sekcji ".progmem.gcc"....
Popatrz na początek swojego pliku makefile, masz tam "include'y" które działają podobnie jak w języku C. Makefile jest rozbity na kilka plików. The include directive tells make to suspend reading the current makefile and read one or more other makefiles before continuing. ([url=https://www.gnu.org/software/make/...
Przy uruchamianiu funkcji pomiędzy FLASH i RAM w procku STM32F103 linker dodaje procedury skoku pomiędzy pamięciami swoje w trakcie linkowania. Procek chodzi tylko w trybie trumb ale procedury dodawane są z wykorzystywaniem rozkazów arm. W tym momencie przy wywołaniu takiego skoku dostajemy HardFault-a. dla przykładu fragment z pliku *.list 20004420...
Olej "oszczędzanie" pamięci Flash - nigdy jej nie zajedziesz, a programy jednak działają trochę inaczej z RAM niż z Flasha. Post powyżej w ogóle nie odpowiada na Twoje pytanie... 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ą...
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...
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)....
Po pierwsze upewnij się, że w tych adresach nie siedzi firmowy bootloader, bo mnie się właśnie coś wydaje, że znajduje się on powyżej 500kB. Co do skryptu linkera, to jak mniemam poniżej masz jeszcze stworzoną sekcję o nazwie .eeprom_mem podobną do .data, .text itp. ? Co do kolejności - tak jak proponujesz sam - taką samą uzyskasz tworząc gigantyczną...
Jak uruchomić STM32 z FLASH by działał później w pamięci RAM. Dedykowane dla Keil: - plik startup_stm32f10x_xx.s Ułatwię niektórym czasu i szukania w necie rozwiązań flashowania z poziomu własnego bootloadera pamięci programu. Ja przyznam szczerze nie znalazłem żadnego opisu w necie, wobec czego napisałem własne rozwiązanie. Jako że asembler ARMów to...
Co do umieszczania kodu w odpowiednich przestrzeniach to trzeba zmodyfikować skrypt linkera oraz użyć atrybutów do danych i kodu aby kompilator odpowiednio stworzył obiekty. Ale to nie jest wystarczające. Trzeba dopisać trochę kodu w startupie jeżeli mają być zainicjalizowane (zerowanie też uznamy dla uproszczenia za inicjalizację aby nie tworzyć dodatkowych...
PS. co to jest RISC-V toolchain A co RISC-V ma wspólnego z STM32 i mikrokontrolerami ARM (a jest to dział, w którym zadajesz pytanie. Pytanie zatagowałeś STM32. STM32 nie sa RISC-V) Poważnie? Aż tak bardzo trudno napisać że toolchain do RISC-V to zestaw narzędzi potrzebnych do zbudowania na danej platformie kodu dla procesorów RISC-V? Pamiętaj że jesteś...
Witam można to zrobić tak? Dwa projekty w jednym boot w drugim program wykonywalny. 1. projekt z bootem rom (rx) : org = 0x08000000, len = 16k // akurat 16k ma sektor// linker w tym projekcie mam tylko dwie opcje : - konfiguracja zegara+ czytanie programu np przez spi + zapis do flash - lub skok do adresu 0x08004000 2 projekt z programem. rom (rx) :...
Witam, Zasiadłem do STM32 i zaczynam implementować coraz kolejne funkcjonalności do mojego projektu. Napotkałem jednak problem. Chodzi tu o używanie funkcji malloc() lub printf(). Chodzi o to, że program się nie kompiluje ponieważ brak jest referencji do _sbrk. Przeszukałem Google i znalazłem przykładową funkcję. Funkcja ta potrzebuje dodatkowych informacji...
Czytałem wczoraj o zapisie danych do FLASH i to wydawało się trudne. A robisz coś takiego jak wgrywasz program do FLASH używając programatora? To nie Ty programujesz FLASH ze swojego programu. To co poczytałeś dotyczy tego - a to jest coś zupełnie innego. Tutaj linker genetuje binarkę programu na Twoim PC-cie (abstrahuję od formatu), który to programator...
Procki zamawiałem w Łodzi... Na trzech procesorach stm32f103cbt6 z jednego zamówienia miałem ten problem, przelutowywałem je po między nową płytką a starą sprawdzoną i na nich programy StdLib za nic nie chciały wystartować (tworzyłem nawet nowe czyste projekty). Zakupiłem wczoraj (również w Łodzi) stm32f103c8t6 (ma mniej flash`u to może inna partia,...
Efekt dokładnie taki sam jak w przypadku moich wypocin. Zawiesza się i ląduje gdzie? Próbowałeś zmniejszyć w skrypcie linkera rozmiar dostępnej pamięci flash i RAM, np. każdą o połowę? Pokaż te pliki które zmieniłeś.
Jak procesor wykonuje kod już nie ma tam linkera, jak przekopujesz do tablicy kod działającej funkcji i ją wywołasz to ona się wykona, jak będzie w niej jakiś błąd to procesor to wyłapie Tak, tylko linker łączy pliki i tak powstaje kod maszynowy. Więc według Ciebie mogę wziąć funkcję z innego projektu (innej kompilacji) i też ma się poprawnie wykonać?...
Czyli nie ma żadnej przeszkody, żeby w tablicach globalnych oznaczonych jako const przechowywać duże zawartości danych ? chciałbym w takich tablicach trzymać rysunki do wyświetlacza LCD. Skoro zostaną one umieszczone w flashu to nic nie stoi na przeszkodzie, żeby zajmowały nawet z 200 kB? (o ile nie przekroczę wolnej pamięci flash oraz pewnie zadeklarowanej...
Tak, zależy mi na stałym umieszczeniu we flash, a wgrywane programy nie przekraczałyby 64kB. Wymyśliłem jeszcze taką wersję ;) żeby program kompilować do pliku binarnego i potem składać całość w "ręcznie". Choć wolałbym nauczyć się pracować na linkerze i poznać więcej informacji o nim. Jak dokładnie (krok po kroku) np.umieścić dane w oddzielnej sekcji...
Uruchom mikrokontroler w trybie bootowania (coś tam zwarte do masy) - pewnei odzyskasz komunikację z programatorem. Napisz dokładnie, co zrobiłeś i pokaż kawałki kodu. Typowo relokacji tablicy adresów wyjątków używa się przy własnym bootloaderze. Nie rusza się wtedy mapy sekcji, a tylko zmienia bazę pamięci FLASH w skrypcie linkera. No i wyjaśnij, jak...
Kompilator ładuje tam inicjalizatory dla zmiennych w pamięci zewnętrznej. Aby tego uniknąć, musiałbyć zmienić lekko skrypt linkera i do startupa dopisać kopiowanie danych z flasha do tej pamięci, tylko że najpierw trzeba by ją włączyć <: Dane z sekcji .data mają ustawione adresy w RAM, ale ładowane są do FLASH (> ram AT > rom), dlatego tam...
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....
Nie odpowiem, dlaczego to działa w C, a nie działa w C++, ale pamiętaj, że to wyrażenie musi obliczyć linker, nie kompilator. To wyrażenie oblicza w każdym wypadku kompilator - nawet jeśli generuje zły kod. Wygląda na to, że jeśli w wyrażeniu inicjującym występuje operator "->" kompilator ignoruje const. Sprawdzone do wersji 4.5.0 20090816 (experimental)....
Nie. Bootloader jest oddzielną aplikacją, z własnymi segmentami danych. Skacząc do niej niszczysz wszystkie struktury danych aplikacji z której skaczesz. Powrót jest więc niemożliwy - chyba, że uruchomisz aplikację od nowa. Z tego też powodu przerwania uruchomione w aplikacji nie mogą być wykorzystane przez bootloader - konkretnie mogą, ale będą one...
Środowisko? Bez linkera/scatter file się nie obejdzie. Tylko po co to robić?
A w skrypcie linkera sekcja z atrybutem KEEP? Wtedy nie powinien tego odśmiecacz wywalić, i potem po prostu sekcja #pragma? :/ Nwm tak sobie pomyslałem. Może zadziałać :D Zawsze też możesz zapisać coś do flasha pod odp oadresem jeden raz a potem to będzie. Jeśli zapiszesz to we fragmencie pamięci którego programator nie wyczyści :/ Edit: Pozwolę sobie...
Eee... No ale bez sbrk() malloc() nie ma prawa działać... Chyba że jest to gdzieś w reszcie plików zaimplementowane. Pooglądaj wynikowy plik .map - tam zobaczysz co wylądowało w RAM a co we flash. Pliki które masz w tym przykładzie nie są zbyt dobre - szczególnie skrypt linkera... Składnia która jest tam zastosowana wg mnie w ogóle jest niejasna i dziwna...
pomyslales o uzyciu scatter file? ;] W tam: target->options->linker odkliknij opcje "use memory layout from target dialog". Klik w przycisk "edit" z prawej strony. LR_IROM1 0x08000000 0x3C000 { ; load region size_region, zalozmy ze flash ma 256KiB ER_IROM1 0x08000000 0x3C000 { ; load address = execution address *.o (RESET, +First)...
Hm... jak pisałem bootloader do swojej centralki to nie używałem __attribute do przesunięcia przestrzeni adresowej tylko zmieniłem w ustawieniach AVR Studio zakres dostępnej przestrzeni pamięci programu na zakres przewidziany dla bootloadera(różnie dla różnych procków). Było o tym pisane na forum, o ile dobrze pamiętam(proszę mnie poprawić jeżeli bredzę)...
Tak oczywiście. Linker skrypt trzeba odpowiednio zmodyfikować, dbając o to by nie nałożyć na siebie sekcji, choć i tak kompilator tego nie zaakceptuje. np taka sekcja. [syntax=c]mojalokalizacja 0x70000: { *(.miejsce1); } >FLASH [/syntax] i deklaracja funkcji: [syntax=c]void foo(void) __attribute__((section(".miejsce1")));[/... Spowoduje umieszczenie...
A jeśli chciałbym mój program wgrać do RAM to musiałbym w tym Twoim skrypcie linkera dla sekcji np .text zamiast > rom AT > rom wpisać > ram AT > ram czy wewnątrz {} tez trzeba coś zmieniać? Jeśli wystarczy Ci, że program będzie działał jedynie przez debugger, to wystarczy ta pierwsza opcja. Jeśli byś chciał, żeby program normalnie działał z RAM, to...
Witam Panowie ręce mi opadają... przelutowałem jeszcze jednego procka. Jest tak jak na początku. tzn to co opisywałem za pierwszym razem. Spróbowałem uruchomić program w ramie i o dziwo działa, ale tylko w ramie, jak debaguje jest ok. W SAMBA jest opcja "Enable Flash access" - ale nic to nie daje. Opcja Boot from Flash lub Rom też. Moje problemy zaczęły...
Udało mi się zadeklarować tablice [144][20] maksymalnie... uVision3 wersja chyba 3.53 z ograniczeniem kodu do 16k ... ale było napisane, że do 16k programu. A zmienne chyba się nie zaliczają do programu nie? Program ładuje się do flash, a nie w RAM ... Chyba, że ... linker i kompilator ma do 16k programu i danych :/ To będę miał problem ... pomoże ktoś...
(at)michalko:"Dokładnie, wystarczy zmieniać tylko adres bazowy głównego programu w skrypcie linkera. " No właśnie nie. Zmienna FLASH_BASE w tym wyrażeniu, to nie adres bazowy programu, ale adres bazowy całej pamięci FLASH 0x80000... (sprawdziłem). Najmniej inwazyjna zmiana, to właśnie podmiana w tym wyrażeniu FLASH_BASE na jakiś PROGRAM_BASE (celniej...
Witam po dłuższej nieobecności. Po należytym skonfigurowaniu skryptu linkera, flagi mcpu Build mi wywalił: 17:42:41 **** Build of configuration Debug for project ARM_Proj_Tst_02 **** make all Building file: ../src/main.c Invoking: Cross ARM C Compiler arm-none-eabi-gcc -mcpu=arm7tdmi -march=armv4t -marm -O0 -fmessage-length=0 -fsigned-char...
Witaj, No podpowiedź daje Ci samo openocd Error: No flash at address 0x00000000 Masz źle skonfigurowany adres obszaru pamięci flash mikrokontrolera Sprawdź w pliku gdzie definiowane są adresy i obszary pamięci. Próbujesz załadować pod adres 0x0 Twojego hexa a tam nie ma pod tym adresem obszaru pamięci flash. Sprawdź również w Twoim projekcie w pliku...
cont zmienia linkage zmiennej globalnej z external na internal. Klasycznie jest to RO, więc leci do sekcji .ro, która jest w flash (albo inaczej, pozostaje w flashu), chyba że stworzysz osobną sekcję i ją przeniesiesz w linker script lub zmusisz by cała sekcja RO była w RAM.
Witam VanThor czy poradziłeś sobie z tym problem. U mnie niby to samo ale... We flashu wszystko ładnie działa. W ramie: 1. Modyfikacja skryptu linkera z flash na ram 2. BOOT0 =1 i BOOT1= 1; 3. W main daje NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x00); Hmm niby wszystko ok ale jak wkładam USB do PC (pojawia się przerwanie ) czasem mam wyjątek BusFault,...
Twój skrypt linkera jest prosty. Zbyt prosty. W nim naprawdę musi być dużo więcej rzeczy, dla projektów w C++ nawet jeszcze wiecej niż dla projektów w C. Znajdź sobie jakiś przykładowy, użyj skryptu z paczek CubeF1 albo 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-...
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"...
/*--------------------------------------... * Linker script for running in internal Flash on the AT91SAM7X512. *---------------------------------------... OUTPUT_FORMAT("elf32-littlearm&... "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm)...
aby kompilator/linker był na tyle niedopracowany, aby stałe z pamięci typu FLASH, przepisywać do pamięci typu RAM w tej samej przestrzeni adresowej. Wszystko zależy od skryptu linkera i jak ktoś bardzo potrzebuje, to nie ma problemu w tym, żeby const były kopiowane do RAMu i tam używane. BTW, z tym progmem prawidłowy zapis wygląda tak: __attribute__...
Ponadto gdyby ktoś miał hexa jakiegokolwiek programu który startuje z 0x08000000 to mógłby sobie wrzucić bez problemu. Ten "ktoś" najwidoczniej nie ma pojęcia jak działa bootloader, bo taki który nie uruchamia się po starcie układu jest generalnie bezsensowny. A bootloader uruchomić się po starcie układu może tylko dlatego, że właśnie jest pierwszy...
W gcc nie, bo to nie rola kompilatora. Musisz stworzyć własną sekcję w której umieścisz dane, a następnie przekazać info do linkera gdzie ta sekcja ma się znaleźć.
Ja bym zrobił wersję nr1 (; Po przeflashowaniu softu i tak (raczej) musisz zrobić reset, więc nie musisz odtwarzać zawartości pamięci RAM, możesz więc sobie generalnie pokasować wszystkie inne zmienne [; Tak naprawdę na karcie możesz mieć dwa obrazy - nowy wsad i "bootloader". Kopiujesz sobie do RAMu "wprost" ten bootloader (kompletny działający z RAMu...
Teraz sobie wyobraź że masz bootloader mniejszy niż ustawiłeś bitami BOTSZ0 i BOTSZ1 .. tam będą FFFF i procesor skoczy pod ten adres przy stacie i nic znaczącego się nie stanie bo on będzie czytał po kolei kolejne komórki pamieci flash aż w końcu napotka Twój Bootloader :D i zacznie działać. Dokładnie tak to sobie wyobraziłem ale teraz popatrz: ustawiam...
Twoje pytanie jest dość ogólne ponieważ wszystko o czym mówisz jest definiowane w skrypcie linkera. Ale zazwyczaj jest tak, że: - sekcja .text jest umieszczana w pamięci flash - sekcja .data jest umieszczana w pamięci RAM (kopiowana z pamięci flash w rozbiegówce) - sekcja .bss jest umieszczana w pamięci RAM (ustawiana na wartość zero w rozbiegówce)...
Wszystko jest dokładnie tak samo - podajesz adres sekcji w ten sposób, aby został on przekazany do linkera. Zapewne w Eclipse są jakieś opcje podobne do tych w AS. Jeśli nie, to zawsze można je dodać w makefile.
Mam taki kod linkera: MEMORY { CODE (xr) : ORIGIN = 0x0000, LENGTH = 128K DATA (rw) : ORIGIN = 0x0100, LENGTH = 4K } I dopuki kod zajmowal mniej niz 256 bajtow to wszystko sie linkowalo. Po przekroczeniu 256 bajtow kodu wykonywalnego pojawia sie blad linkowania: avr-ld: section .bss [0000000000000100 ->...
Jeśli nie jest używane to normalne, że linker to usuwa, po co ci info którego nie odczytujesz? Możesz to zostawić wykorzystując atrybut kompilatora "used" przypisany do zmiennej.
Ten problem raczej wynika z biblioteki AVR-libc i libgcc. W ramach "usprawnień" zmieniono biblioteki z którymi domyślnie są linkowane aplikacje. Pewne funkcje przerzucono do libgcc (m.in. funkcje arytmetyczne, żeby pokryć funkcje oferowane przez gcc i dostosować je do specyfiki AVR), najwyraźniej o czymś zapominając. Efekt jest taki, że kompilator widząc...
Datasheet podaje, że wytrzymałość pamięci flash to minimum 10000 cykli. Przemyśl, czy naprawdę warto kombinować, bo - uwierz - niepoprawne uruchomienie programu z RAM potrafi czasem sporo namieszać (szukasz błędu który nie istnieje). Co do komend, to po pierwsze musisz mieć inny skrypt linkera (bo nie używasz już flash), musisz wiec inaczej linkować...
Jak zatrzymywałem pętlę i ją odłączałem w 2 oddzielnych krokach i po każdym dawałem feed'a to też nie chodziło. Zaczyna mi się wydawać, że coś nie tak jest albo z ustawieniami kompilatora albo linkera. Walczę dalej. Wszelkie pomysły mile widziane. Pozostają: 1 Programowo: - złe definicje rejestrów ;-) - masz wczesną wersję MCU i dotyka cię PLL.1 +...
Na mojej stronce znajdziesz gotowy projekt który można zaimportować do Eclipse'a - użyj tego o nazwie "stm32_blink_led". W projekcie masz wszystko co trzeba, włącznie z poprawnym skryptem linkera. Aby dostosować go do Twojej płytki po prostu zerknij do pliku config.h i zmień częstotliwość docelową oraz port na którym jest diodka. W pliku z rozszerzeniem...
tmf o i pamiętałeś o dołączeniu libm.a i libprintf_flt.a? Do linkera przekazujesz -Wl,-u,vfprintf? Bez tych bibliotek sprintf nie działa. Do programowania pamięci flash mojego uC używam avr studio. Nigdy nie stosowałem żadnego przekazywania "czegokolwiek" do linkera. Myślałem, że samo #include <stdlib.h> załatwia sprawę. Mógłbyś nieco przybliżyć...
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ć...
ak do memory settings dodam typ Sram z nazwą .xram adres 0x08110 Bo to nie jest poprawny adres RAM i dlatego linker myśli, że to kolejny segment wewnętrznej pamięci FLASH mikrokontrolera. AVR ma architekturę Harvardzką i trzeba odróżniać różne typy pamięci. Dlatego w toolchainie dla AVR przyjęto, że RAM musi zaczynać się powyżej określonego adresu...
Debuggowanie we flashu polega po prostu na tym, że kod który chcesz debuggować znajduje się w pamięci RAM. Zasadniczo - jeśli dobrze pamiętam - aby mieć kod w RAM zamiast we flash do debuggowania, wystarczy zrobić dwie rzeczy: 1. Zmodyfikować skrypt linkera, tak aby program był skompilowany do pracy jedynie w RAM 2. Dla LPC2000 ustawić wektory przerwań...
Witam Miałem też taki problem że sam7x działał ale po kolejnym wgraniu programu przestał działać. Przelutowałem procka 2 razy. W końcu kupiłem nową płytkę, a starego odstawiłem. Kiedyś przez przypadek do niego wróciłem i spróbowałem uruchomić program w ramie i o dziwo poszło, ale z flasha nie chciał iść. Może to jest coś dziwnego ale jak w skrypcie...
Ok winowajca znaleziony. Tadzik dzięki naprowadziłeś mnie na dobry tor. Sprawdziłem rejestry flasha. Okazało się że domyslnie jet ustawiony 32bit access mode. I w trybie 32 bitowym flash latency nie może byc ustawione. Najpierw trzeba zmienić tryb na 64 bitowy dopiero wtedy można ustawić wait states
Hej, 1) Flash LPC w dolnych rejonach ma bloki po 4kB, więc bootloader zajmie wielokrotność 4kB. Od nas zależy ile chcemy zmarnować. 2) Bootloader to w zasadzie normalny soft, którego zadaniem jest zaprogramowanie obszaru powyżej bootloadera, i jego wykonanie. 3) Bootloader, w przypadku braku sygnału do programowania po prostu uruchamia właściwy kod....
linker error stm32 linker tablica linker
migający klucz kalkulator wiatrowy piasta łożyska
satel powiadamianie radiowe komunikacja radiowa satel
Jak wykonać backup danych centrali Integra Satel Jak działa układ mute w odtwarzaczu CD?