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...
Dzięki za podpowiedzi. Na razie kompiluję z opcją -O1. Wygląda że problemem był za mały rozmiar stosu (STACK) lub sterty (HEAP). Po powiększeniu rozmiaru obydwu program wystartował i nie mam żadnego HardFault (na razie sprawdziłem tylko podstawowe funkcje interfejsu). Pod debug czasami wygląda jakby w ICTM pojawiały się tymczasowe kopie zmiennych ale...
https://obrazki.elektroda.pl/9151185000_... Autor poniższego zestawienia jest inżynierem i konsultantem wsparcia dla systemów wbudowanych. W swojej karierze poznał on szereg różnych architektur mikrokontrolerów, różniących się wydajnością, wyborem peryferii, poborem zasilania etc. Wybór odpowiedniego układu stanowi zawsze o sukcesie...
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ś...
Ponieważ dopuszczalne są też pytania z dziedziny, być może tych niemądrych Bynajmniej nie jest to żadne "niemądre" pytanie. Jest bardzo dobre i pokazuje właśnie jak bardzo zmitologizowane są RTOSy. czy taki STM32G070RBT6 z 36 KB ram oraz 128 KB flash (w detalu ok. 5.5 zł) to już się nada czy nie do RTOS? Jak najbardziej. Ilość flash jest zwykle mało...
Czyżby źle dobrany procesor ? Zajrzyj do skryptu linkera i ustaw rozmiar stosu dla przerwań. Jaką masz dokładnie zainstalowaną wersję wtyczki GDB Hardware Debugging?
Jak go rozwiązałeś? W pliku startup wywaliłem 2 rozkazy i wstawiłem tam "siłowe" wpisanie adresu 0x20005000 do SP tuż przed wejściem do funkcji main. Jednocześnie testuję jednak drugi projekt w którym stos ustawiany jest z sugestiami Freediego - zwiększyłem po prostu rozmiar stosu w ustawieniach linkera i przetestuję czy stos nie wejdzie na dane.
lbo dlatego, że zwiększyłem STACK_SIZE z 64 do 128 Chodzi o rozmiar stosu dla taska, czy dla całej aplikacji? <: 4\/3!!
Dzięki za chęć pomocy mi, ale chyba nie jestem w stanie tego ogarnąć. No ale czego? Jak mają Ci działać przerwania, skoro rozmiar stosu dla nich wynosi 0 bajtów? Tu nie ma co ogarniać tylko trzeba przeczytać ze zrozumieniem komentarze. 4\/3!!
Witam W budowanym urządzeniu zapragnąłem wysyłać informacje diagnostyczne przez USART. Nie znalazłem żadnej informacji o kolejce FIFO znanej mi z AVR-ów - szkoda :cry:. Zmuszony zostałem do wykorzystania DMA. Konfigurując DMA musiałem podać rozmiar bloku pamięci do wysłania więc skorzystałem z operatora sizeof() dla struktury: [syntax=c]struct ramka_t...
Witam! Eclipse Kepler Sourcery CodeBench Lite 2011.09-69 OpenOCD 0.6.1 STM32F103ZET6 Szablon projektu - Freddie Chopin Do tej pory wszystkie projekty na STM32 działały dobrze jednak teraz buduję większa aplikację i pojawiają się problemy. Objawia się to losową zmianą wartości zmiennych np. zadeklarowanych jako const czy przerwaniem __Default_Handler....
Trzeba zmienić PROGRAM. Domyślnie w STM32 tablica wektorów znajduje się w flash, a to skąd uruchamiasz program czy jak jest skompilowany nie ma żadnego znaczenia. Manual: Boot from the embedded SRAM: SRAM is accessible only at address 0x2000 0000. Note: When booting from SRAM, in the application initialization code, you have to relocate the vector table...
A powodem przejścia do Default_Handler() może być równie dobrze dowolny inny błąd w programie, np. brak przydzielonego dla przerwań stosu (skrypt linkera). Ustawiłeś rozmiar stosu dla przerwań? Jesteś 100% pewny, że NIGDY nie wchodzi do tego przerwania, nawet jeden raz? Zobacz sobie w pliku assemblera (nazwa_projektu.lss w folderze out, jeśli korzystasz...
Elektronika praktyczna: Dzięki za linki ale wydaje mi się ze jest to prawie to samo co w książce "Mikrokontrolery STM32 w praktyce" lecz przykład który był dołączony nie kompiluje się u mnie więc jeśli masz przykład do pierwszego artukułu to proszę o linka ; ). Na ChibiOS/RT natknąłem się ale wydawało mi się że FreeRTOS jest starszy i bardziej popularny...
Zajrzyj do skryptu linkera, zobacz jaki jest rozmiar stosu. 4\/3!!
Zgaduję, że w tym przypadku w pliku startupxxx.s masz ręcznie zmienić rozmiar stosu. Lepiej jednak i prościej będzie zwyczajnie nie deklarować dużych tablic w procedurach, bo to fatalny nawyk w przypadku mikrokontrolerów, zwłaszcza, kiedy programista jest początkujący i nie wie, gdzie się zmienia rozmiar stosu... ;).
Od pewnego czasu walczę z chińską płytką (blue-pill) z STM32F103 na pokładzie Przeczytaj ten wątek i kup sobie inną płytkę. https://www.elektroda.pl/rtvforum/topic3... Jeśli koniecznie chcesz się męczyć z chińskimi podróbkami, to na mojej stronie ( http://www.freddiechopin.info/ > Download > ARM > Przykłady > stm32_blink_led) znajdziesz szablon...
Jeśli zmiana rozmiaru buforów powoduje że program przestaje działać oznacza to że prawdopodobnie kończy się pamięć na stosie. Kilka rozwiązań jest. 1. zwiększyć stos 2. zdefiniować bufory jako static albo zmienne globalne wtedy nie trafią na stos 3. jeżeli idea projektu na to pozwala podzielić odczyt na mniejsze paczki i zapisywać po trochu(używając...
Jeśli problem zaczął występować po włączeniu jakichkolwiek przerwań, to sprawdziłbym na samym początku rozmiary stosów.
Jeśli chcesz używać przerwań, to musisz zadeklarować rozmiar stosu dla przerwań... W przykładzie nie ma przerwań, więc rozmiar tego stosu wynosi 0. 4\/3!!
Po długiej przerwie wracam do tematu bootloadera. Zrobiłem nowy projekt w Eclipse z pomocą tutoriala Freddiego i na podstawie projektu bootloadera z EP. Połączyłem projekt stm32_blink_led z plikami bootloadera wykorzystując makefile, startup i .ld z projektu Freddiego. Udało się uruchomić i debugować aplikacje bootloadera. W załączniku połączone projekty...
Pierwsza opcja to oczywiście zdefiniowanie NAPRAWDĘ DUŻEGO stosu, ale to średnie rozwiązanie jak wiadomo [; Do rozbudowanej aplikacji na ARMa myślę że należy liczyć minimum 1kB, jeśli używa się jakichś potwornych funkcji standardowych (printf!) i to głęboko to lepiej zaopatrzyć się w 2kB (o apetycie tych funkcji na pamięć pisałem ostatnio http://www.elektroda.pl/rtvforum/topic13...
Mam pytanko czy, żeby przerwania poprawnie działały na podstawie tego szablonu od f4, to czy wystarczy tą tablicę przerwań skonstruować zgodnie z datasheetem od f3, czy wymagane są jeszcze jakieś inne zabiegi działania w kodzie?? Może być jeszcze wymagane dostosowanie rozmiaru odpowiedniego stosu
https://obrazki.elektroda.pl/6678526600_... https://filmy.elektroda.pl/59_1553290096... https://obrazki.elektroda.pl/6296500900_... https://obrazki.elektroda.pl/9260337200_... Zapewne nic odkrywczego ale wolnej chwili udało się połączyć parę projektów i wyszło takie coś. Jeśli chodzi o hardware to...
A ustawiłeś sobie rozmiar stosu dla przerwań (w pliku linkera)? 4\/3!!
Masz jakoś zdefiniowany rozmiar stosu dla przerwań? Jeśli korzystasz z mojego skryptu linkera, to w pliku tym musisz sobie zdefiniować jaki jest rozmiar stosu, bo bez tego przerwania się sypią. 4\/3!!
Spróbuj zwiększyć rozmiar stosu w Twoim startupie do np 1kb
Zmienia się tylko w razie potrzeby, normalne ustawienia domyślne są dobre w większości przypadków. Np. zegar jest ustawiany w tryb PLL na max. częstotliwość. Wielkość stosu też ustawiona jest w marę optymalnie.
Na razie mam ustawione: __main_stack_size = 1024; __process_stack_size = 1024; i wszystko działa poprawnie. Gdy będzie jeden stos to jaki rozmiar założyć ?
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ś...
Otwierasz plik startup_xxxxx.s, klikasz poniżej okna edytora w zakładkę Configuration Wizard i ustawiasz rozmiar stosu. Radziłbym jednyk przemyśleć deklaracje danych. To na ogół nie jest dobry pomysł, żeby mieć zmienne lokalne procdury o objętości setek bajtów lub więcej.
A rozmiar stosu ustawiłeś? To taka słynna pułapka Freddiego na początkujących. ;) Poszukaj w podobnych wątkach (wracają co tydzień), to znajdziesz rozwiązanie.
A masz dobrze ustawiony rozmiar stosu i sterty w startup.s ? Być może za mało przydzieliłeś im pamięci i stąd taki efekt.
W tym kawałku skryptu linkera masz rozmiar stosu dla przerwań ustawiony na 0, a przecież FreeRTOS je wykorzystuje. 4\/3!!
1. Ta płytka nie ma wbudowanego JTAGa. W przeciwnym wypadku po do by jej było złącze JTAG 20-pin? 2 + 3. Na stronce dostępny jest trial wersji "rozbudowanej", w darmowej musisz sam zadbać o skrypt linkera i startup. Wbrew pozorom nie jest to takie trudne - dobry przykład (polecam te z mojej stronki dla stm32 - http://www.elektroda.pl/rtvforum/topic13...
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.
Zwiększ rozmiar stosów, bo przerwania mogą po prostu przepełniać stos. No i jeśli ich nie potrzebujesz, to wyłącz możliwość przerwań zagnieżdżonych. 4\/3!!
Chcę móc dynamicznie alokować pamięć, której rozmiar jest z góry znany, a nie ograniczony stosem. A mółbyś tę myśl rozwinąć? Czy stos ma wielkosć nieznaną bo nie rozumiem.
Bardziej chodziło mi o to że, nie jest dobrym pomysłem deklarowane dużych zmiennych na stosie. A taki typedef tylko utrudnia decyzje: [syntax=c] T_Localization Lokalizacja; size_t rozmiar; [/syntax] Niby jedno i drugie typedef ale ...
Ja za to mam pytanie do Freddiego: Mam tu taki przykładowy blinky led dla F103 z Twojej strony i tam stos (stosy bo i MSP i PSP) jest ustawiony między sekcją .bss i stertą. Dlaczego tak? A dlaczego by nie? (; W swoich projektach (praktycznie wszystkich) przyjąłem, że rozmiar stosu jest określony wprost. Z tego względu nie muszę go umieszczać na końcu...
Ten fragment kodu pisałem z pamięci i mogły być błędy, dlatego nadmieniłem, żeby potraktować to jako pseudokod, gdyż chciałem pokazać , o co mi chodzi. Przedstawioną metodę stosowałem do odczytu tablic zawierających dźwięki. Sprawdzę metodę przedstawioną przez JackaCz. Dodano po jakimś czasie: Mam tylko pytanie do metody JackaCz: po co definiujemy DataSize...
Obsługa UART'a przez DMA czy (tylko) przerwania to najniższa warstwa stosu - to co zrobimy z danymi dalej zależy już od konkretnego przypadku. Przerwania i FIFO (o odpowiednim rozmiarze) znacząco odciążają CPU ale korzystając z DMA zostają tylko przerwania przy zakończeniu nadawania/odbioru. Poza przypadkiem, kiedy trzeba analizować każdy nadchodzący...
Jaki masz rozmiar stosu? BTW - to będzie najmniej wydajna biblioteka do HD44780 na planecie, a wszystko to dzięki bibliotece peryferyjnej od ST. No i formatowanie tego kodu to też tragedia. 4\/3!!
Obecne startupy w przykładach dla STM32 i LPC1114 używają dwóch stosów - jeśli chcesz to zmienić (czyli wszystko będzie używało tylko MS), to - poza ustawieniem odpowiedniego rozmiaru odpowiedniego stosu w skrypcie linkera - wystarczy zakomentować w startupie linijki odpowiedzialne za ustawienie PSP oraz przestawienie stosu, czyli ten fragment: /* +---------------------------------------...
A rozmiar stosu ustawiłeś?
Co do pierwszych dwóch, mój błąd, to oczywiście :) był plik c a nie h przy przepisywaniu mi się jakoś pomyliło. Natomiast zmieniłem rozmiar stosu __main_stack_size = 64; i śmiga dzięki freedie:), a do do reszty to jakie miałeś na myśli atrybuty funkcji ? __attribute__ ((interrupt, weak, alias("__Default_Handler"&...
Gdy dodałem jako atrybut do funkcji "weak" żeby kompilator nie dodawał na wejciu odkładania na stos Atrybut "weak" służy do zupełnie czego innego. To o co Ci chodzi to atrybut "naked" - funkcja z tym atrybutem w zasadzie powinna zawierać tylko assemblera. Co do plików których używasz, to ja mogę polecić jak zwykle to samo, czyli mój szablon dla STM32F1...
Sprawa wielokrotnie poruszana. Jak zajrzysz do skryptu linkera, to znajdziesz tam takie coś: /* +=======================================... | stacks sizes +=======================================... */ /* Handler mode (core exceptions / interrupts) can use only main stack */ /*...
Tak na przyszłość - na stosie lepiej nigdy nie tworzyć obiektów większych niż kilkaset bajtów, zwłaszcza że stos często ma ograniczony rozmiar (np do 1kB, poniżej są już inne zmienne). Do tak dużych elementów lepiej coś globalnego, albo jak koniecznie musi być zwalniane albo potrzebne jest rzadko, to malloc() / new. 4\/3!!
Nie nie nie nie... Heap nie ma ze stosem nic wspólnego, bo heap służy do alokacji DYNAMICZNEJ. Swoją drogą niezły "problem" - "Mam procka z 20kB RAMu i jak mu dam lokalną zmienną o rozmiarze 22kB to się wywala... Co z tym zrobić?????///???". No comment... 4\/3!!
lub pewnie ładniej by było: ładniej by było tak jak napisałem na początku - 3 definicje. I nic nie obchodzi Cię czy ma być naked, interrupt czy może obydwa (albo żaden). Każdy Task w FreeRtos ma swój stos, podaję go jak tworzę task, A skąd pewność, że rozmiary które podajesz nie są za małe? Sprawdzałeś? 4\/3!!
rozmiar stosu stm32 rozmiar stosu cortex rozmiar stosu
zawór ciśnienia listwie scania wymiana filtra paliwa passat zwiększenie obrotów wentylatora
reset pieca buderus hulajnoga frugal problemy
Czy kodowanie wtryskiwaczy w silniku Z16XER jest konieczne? Schemat elektryczny modemu lodówki Bosch KGN36KLEC