Wstęp Poradniki pomagające w tworzeniu oprogramowania na mikrokontrolery skupiają się głównie na wykorzystaniu peryferiów samego mikrokontrolera, co jest zrozumiałe, ale niestety rzadko skncentrują się na części programu, która wykonuje się przed funkcją main. Poniższy poradnik ma na celu przybliżenie tej części programu na podstawie GNU ARM toolchain...
A gdzie jest kod, startup i skrypt linkera no i jeszcze makefile?
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...
A jak przerobić skrypt od Freddiego aby właśnie w taki sposób przydzielał pamięć? Korzystam z jego przykładów sama podmiana nic nie da bo jest on powiązany np. ze startup.s Tak ja tu. wystarczy umieścić najpierw wszystko w CCRAM. Dodać symbol _main_ram_start i powinno śmigać. Miedzy startupem a linkerem chodzi o jedno. Zgodność symboli definiujących...
Najprościej wygenerować przez jakieś darmowe środowisko, np.: Atollic TrueSTUDIO. [syntax=asm] /* ****************************************... ** ** File : stm32_flash.ld ** ** Abstract : Linker script for STM32F373C8 Device with ** 64KByte FLASH, 32KByte RAM ** ** Set heap size, stack size and stack location according...
OK, chodziło o ten folder. Poszło ładnie:) [syntax=actionscript]**** Build of configuration Default for project mch **** make all System nie moľe odnale«† okre?lonej ?cieľki. ECHO jest wy?Ączone. -------- begin -------- xc32-gcc (Microchip Technology) 4.5.1 MPLAB XC32 v1.00 Build date: Jan 19 2012 Copyright (C) 2010 Free Software Foundation,...
Cześć, Projekt zaraz będę konfigurował od początku. Fakt, podałem za mało danych, wybaczcie, skrajna nerwica mnie na to wzięła. Od początku: Używam SW4STM32, ale chciałbym od tego odejść mocno, bo za dużo automatów i za mało szczegółów, może dlatego, że nie potrafię tego wszystkiego ogarnąć. Kompilatora używałem poprzez naciśnięcie "build". W ustawieniach...
GPIOA->BSRR |= GPIO_BSRR_BS5; To nie źródło problemu ale tak się tego rejestru nie używa. To jest write only rejestr czyli tylko samo przypisanie Zgadza się, dzięki :) Co do głównego problemu, punkt 1. Użyj debugera okazał się bardzo pomocny :) Założyłem, że skopałem coś w Makefile (np. brakuje jakiejś flagi) i podczas debugowania nic ciekawego...
A czy uważasz że wszystko jest linkowane? Twoje pytanie sporo sugeruje. Jakoś bylem zafiksowany na to, że w ten sposób dołączany kod musi być "wrzucony" w całości, ale cóż błądzenie to rzecz ludzka, sporo wody jeszcze upłynie zanim takie mechanizmy będą dla mnie zrozumiałe :) Cały czas mam przed oczami ten goły kod, który do STM32F103VCTx się nie mieścił,...
W celu uruchomienia kodu z pamięci RAM (aby pamięci FLASH nie nadwyrężać zbytnio..) użyłem skryptu linkera przeznaczonego dla Attolic TrueStudio, ze standardowej paczki firmware dla stm32 discovery. Jednakże po wgraniu programu, nie uruchamia się, w związku z tym pytanie, co trzeba jeszcze ustawić aby uruchomić kod z RAM'u ? poniżej wspomniany skrypt...
Skrypt linkera wygląda tak INCLUDE "UART_Utility_Debug_lib.ld" INCLUDE "UART_Utility_Debug_mem.ld" ENTRY(ResetISR) SECTIONS { /* MAIN TEXT SECTION */ .text : ALIGN(4) { FILL(0xff) __vectors_start__ = ABSOLUTE(.) ; KEEP(*(.isr_vector)) /* Global Section Table */ . = ALIGN(4)...
Jakbym cos takiego robil to wydaje mi sie ze mozna cos takiego osiagnac bez dodatkowej sekcji w skrypcie linkera. Adress crc wyliczylbym na podstawie symboli zdefiniowanych ze skrypcie linkera. A crc dokleilbym do pliku *.bin po skonczonej kompilacji za pomoca komendy: [syntax=bash] echo $(crc32 out.bin) | xxd -r -p >> out.bin [/syntax] Edit: poprawilem...
(już czuje jaki zaraz podniesie się larum...) A ja polecam to co już zainstalowałeś czyli open stm. Generuj sobie projekty w cubeMx. po zaimportowaniu projektu po prostu wywal to co Cie nie interesuje (czyli np HAL - a jest to jeden katalog i jeden symbol z konfiguracji. A masz automatycznie utworzony makefile, skrypt linkera, wszystkie zależności,...
Linker nie tylko może żonglować zmiennymi, ale wręcz musi to robić. Dopiero na etapie linkowania zmienna uzyskuje konkretny adres, wcześniej to tylko symbol. Twoje rozwiązane jest ryzykowne, ryzyko to jest zależne od tego jak jest skonstruowany makefile. tadzik85 słusznie pisze, żeby przeusnąć data. Nie trrzeba w tym celu ingerować w skrypty linkera,...
Musisz w istocie powielić ten fragment kodu który pokazałeś wyżej i zmienić w nim symbole na takie jak użyłeś dla tego drugiego obszaru. Jak ładujesz program przez debugger, to on ładuje też sekcję zmiennych, więc w istocie może się czasem wydawać, że są zainicjalizowane <: Ten startup i skrypt linkera nie jest przygotowany na takie automatyczne...
Bootloader przestawia wektory przed skokiem do softu użytkownika więc wydaje mi się że nic dodatkowo nie trzeba robić poza kompilacją pod 0x08001000. Niestety. CubeMX robi to tak że ustawia na początku rejestr VTOR (funkcja SystemInit): [syntax=c] SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ [/syntax]...
Może ktoś ma pomysł z czym jest problem i jak go naprawić? Dodam jeszcze że problem ten występuje nawet w najprostszym programie (inkrementacja zmiennej). A czy jesteś pewien, że szablon z którego skorzystasz odpowiada dokładnie mikrokontrolerowi: STM32F103VD ? Ważna jest każda literka symbolu procka. Z tego co sprawdziłem, to zestaw Kamami ma mikrokontroler...
(at)ucy74 Brakuje Ci symboli, które powinny być w skrypcie linkera. Powinieneś je zdefiniować w swoim skrypcie linkera. Za przykład weź sobie skrypt linkera z przykładów FCh. . = ALIGN(4); __heap_start = .; PROVIDE(__heap_start = __heap_start); . = ALIGN(4); __heap_end = __ram_end; PROVIDE(__heap_end = __heap_end); (at)ucy74...
(at)miszcz310 A masz jakiś specjalny powód aby używać "na żywca" gdb zamiast po prostu użyć jakiegoś IDE gdzie po prostu to się wyświetli w dużo wygodniejszej formie. -g3 zawiera wszystkie niezbędne informacje. Dlaczego nie możesz wyświetlić to już jest inna sprawa. Jest to bardzo ciężko "debugowalne" bez dostępu do Twojego komputera. Myślisz, że debugger...
Kompilator widzi tyle ile ma określone w skrypcie linkera. Symbole __heap_start i _end definiują położenie sterty, nie ma to nic wspólnego z wielkością pamięci SRAM. Przykłady konfiguracji SRAM masz w przykładach z mojej książki (do pobrania za darmo z Helionu). Może ci wystarczą do rozgryzienia jak to działa.
Mógłby ktoś podać link do jakiegoś projektu w Microchip Studio Trzy lata temu pisałem ci, że to nie jest kwestia IDE, lecz konfiguracji linkera. Jeśli chcesz, aby dodatkowa pamięć była alokowalna dla zmiennych globalnych, musisz zmienić skrypt linkera. Jeśli ma byc widoczna dla zmiennych alokowanych na stercie lub stosie to należy tylko zmienić wartości...
Dzięki. Czyli będę musiał od nowa napisać skrypt linkera na podstawie Twojego. U mnie nie ma nigdzie tych symboli. Do tej pory wzorowałem się na skrypcie z Coocoxa. Jednak biorąc pod uwagę jakość ich innych rozwiązań można się było spodziewać problemów.
Nie rozumiem oporu (at)tmf aby korzystając z gcc nie wykorzystać narzędzia, które właśnie po to zostało wymyślone - i jest w końcu wykorzystywane przez używany przez niego toolchain Niech sobie korzysta jak chce, tyle, że przy takich drobnych modyfikacjach IMHO prościej zmodyfikować te symbole bezpośrednio, przekazując odpowiednie wywołania do linkera,...
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ść...
Chodzi o to, że do vectora przerwań trafia wartość SP wynikająca z linkera, a w startupie wprost ustawiany jest RAM_END, Ja tam nie widzę w ResetHandler operacji z adresem stosu. Symbol _estack jest ustawiany w skrypcie linkera ale faktycznie na sztywno na koniec RAM. (CubeMx firmware dla F1). Ja za to mam pytanie do Freddiego: Mam tu taki przykładowy...
Open On-Chip Debugger 0.10.0 Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'. Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD...
Domyślam się że jest to kod startowy - stos, wektory przerwań. Ale nie potrafię go zlokalizować. Nie wiem jak się nazywa. Jest to kod domyślnie tworzony przez kompilator w sekcjach startowych: .init0-9, .vectors, .fini9-0 Jego zawartość możesz podejrzeć w plikach .lss oraz .map. Ich edycja niczego jednak nie zmieni. Chcąc coś umieścić w tych sekcjach...
kod nie chce isę kompilować podajac komunikat undifinied reference itd... Wklej komunikaty i pokaż skrypt linkera (pewnie brak symboli dla _sbrk). w konsoli pokazywało sie ze semihosting enabled Włączony, ale na PC. Może tzreba jeszcze jakąś zworkę połączyć na płytce Nie, jak debug działa to i semihosting powinien.
Po pierwsze - jak zapewne łatwo się domyślić - nazwa ta bierze się od nazwy pliku (_binary_<nazwa_pliku>_start), więc po pierwsze wystarczy dobrze nazwać plik i już masz lepszą nazwę. Całość zapewne można zmienić przez skrypt linkera, ale przecież w programie możesz sobie te symbole przypisać do dowolnej zmiennej... Opcja pierwsza w skrypcie linkera:...
Tylko po co komu te wektory przerwań w RAM? Przecież mogą być spokojnie we flash... Do wykonywania skoków pod adres z rejestru służy instrukcja "bx ...", a nie "mov pc, ...". Przy okazji zawsze ciekawił mnie ten styl pisania 100x "asm volatile(...)" - pomiędzy tymi wywołaniami kompilator może sobie wstawić co mu się podoba, np. wpisać do rejestru r0...
Symbole "początek X" i "koniec X" w moim skrypcie nazywają się inaczej niż tego oczekuje "ich" startup. Zmień "ich" _ebss na "moje" __bss_end itd. w startupie albo "moje" na "ich" w skrypcie linkera. Możesz nawet do skryptu linkera dopisac na końcu kilka linijek typu PROVIDE(_sidata = __data_init_start); ("remapując" moje symbole na ich nazwy) i wtedy...
Jeśli debuggerem, to po prostu podejrzyj sobie plik .dmp - tam masz te adresy i możesz sobie je analizować debuggerem. Tyle że zerowanie stosów jest tylko w nowych przykładowych projektach. Chyba tylko w przykładzie dla LPC4330 - wystarczy jak weźmiesz stamtąd startup i skrypt linkera, a następnie zastąpisz te pliki które masz teraz to powinno być dobrze...
Z Makefile'a (czy tam opcji kompilacji) wywalić parametr -march - jest zbędny, skoro podajesz -mcpu. Kolejne dwa błędy to niedopasowanie skryptu linkera do kodu (powinny tam być symbole oznaczające koniec i początek różnych typów obszarów pamięci - w tym przypadku .bss. Ostatni to brak definicji funkcji _exit() - jednego z syscalls. Przykład takowej...
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...
Czyj plik linkera...? TAK! To plik linkera na koniec usuwał symbole! Dzięki wielkie! To są skutki stosowania "KWIATKÓW" Takie były krótkodystansowe skutki. :) Długodystansowe skutki to wysoko ceniona w branży wiedza, zrozumienie i umiejętność pisana takich skryptów z palca. :)
Co za dużo to nie zdrowo. Znowu wywal te 2 definicje, które dodałeś na końcu. W tym momencie prawdopodobnie programy C powinny Ci chodzić, pozostaje C++. Teraz na tapetę idzie skrypt linkera. Porównaj swój z str912_rom.ld z przykładów z openocd z uwzględnieniem tych niezdefiniowanych symboli. Jutro zajrzę, jak Ci poszło. Albert
Jest to możliwe, ale jak dokładnie będzie wyglądać, to zależy od Twojego skryptu linkera. Poniżej przykład umieszczenia sekcji stosu pod bardzo konkretnym adresem (__process_stack_start): .process_stack __process_stack_start : AT(__process_stack_start) { . += __process_stack_size; } U Ciebie zamiast powiększać ją o znany rozmiar...
Użyj takiej komendy w skrypcie linkera: .data : { . = ALIGN(4); _data = .; *(.data) *(.data*) . = ALIGN(4); _edata = .; } >ram AT >rom _load_data = LOADADDR(.data); W ten sposób informujesz linkera, że sekcja .data ma być umieszczona w pamięci RAM, a dane do inicjalizacji zmiennych tej sekcji są w pamięci ROM. Do tego musisz mieć w startupie komendy,...
Witam W nowym linaro odblokowana jest opcja -flto (link time optimization), chciałem wypróbować jak to działa, no i właśnie projekt się nie kompiluje :( bez lto oczywiście działa. Błędy to NMI_Handler' referenced in section `.isr_vector' of out/startup_stm32f40xx.o: defined in discarded section `.text' of out/stm32f4xx_it.o (symbol from plugin) dla...
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ć...
Patrzę na skrypty linkera udostępnione np. przez Freddiego i widzę tam takie cuś: [syntax=c] .stab 0 (NOLOAD) : { *(.stab) } .stabstr 0 (NOLOAD) : { *(.stabstr) } /* DWARF debug sections. * Symbols in the DWARF debugging sections are relative to the beginning * of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 :...
Teraz mam takie pytania: jak/gdzie ustawić wskaźnik stosu na właściwa aplikację? jak/gdzie przed skokiem do aplikacji użytkownika przestawić offset tablicy wektórów tak aby był właściwy dla aplikacji? Co jeszcze powinienem zrobić? Ja to robiłem np. tak [syntax=C]/// beginning of flash block for firmware extern const uint32_t __firmware_start[]; ......
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...
Kompilator zgłasza ci warning: "warning: cannot find entry symbol Reset_Handler; defaulting to 08000000 " Błąd może wynikać z kilku rzeczy: - nie kompilujesz rozbiegówki i wektorów przerwań (opcja linkera --gc-sections wyrzuca wszystkie nieużywane funkcje) - nie masz w skrypcie linkera słowa kluczowego KEEP dla sekcji wektorow przerwan /* for Cortex...
ENTRY(Reset_handler), czy przez start = Reset_handler, według cytowanego opisu to wyjdzie na to samo :-/ No nie do końca :) Używając ENTRY(Reset_Handler) w praktyce nie ustawiasz niczego - jedynie informacje w pliku ELF, która to informacja jest w naszym przypadku ignorowana, bo ani binutils-y, ani programatory/debugerry które znam (np oprogramowanie...
.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....
1. Po pierwsze nie rozumiem po co Ci position independent code w typ projekcie. 2. Proponuję używać typów o ściśle określonej długości w tym przypadku 32 bity. 3. Nie za bardzo rozumiem po co takie dziwne wygibasy z jakimiś funkcjami. Te symbole które masz w skrypcie linkera nie mają "ciała" są tylko adresami i symbolami. [syntax=c]extern uint32_t __bss_start__,...
Zakładam wówczas, że Cube albo jakiś inny "kreator templatek" będzie dostępny zawsze, uaktualniony, z najnowszymi procesorami etc etc.. Skrypty z Cube i tak nie obsługują połowy rzeczy które są dostępne w STM32F7 (ot choćby wykonywania kodu z flash przez magistralę ITCM, dodatkowych pamięci takich ITCM czy BKPSRAM), więc naprawdę mała to strata jak...
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ą...
Tak że kompilując gcc lub gcc podobnym kompilatorem jest tak jak opisałem. Nope. Dane const i dane do inicjalizacji zmiennych o typie static gcc standardowo dodaje do secji .rodata. Pierwsze tak, drugie nie. Inicjalizatory zmiennych - czyli tego co jest w sekcji .data - znajdują się w dokładnie tej samej sekcji co te zmienne - czyli w sekcji .data....
skrypt linkera skrypt linkera zewnętrzny stm32 skrypt linkera
zmiana regiony samsung volvo silnika wzmacniacz zwarcie samochodowy
diagbox peugeot bateria macallister
Pompa ciepła – ochrona przed wysoką temperaturą spalin: przyczyny, marki, naprawa LG TV – sporadyczne włączanie, przyczyny, kondensatory, zasilacz, LED, pilot