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...
im chodziło o "stos" :) Ależ nie, im chodziło o stertę. Stos i sterta to dwie różne rzeczy https://pl.m.wikipedia.org/wiki/Stos_(in... https://pl.m.wikipedia.org/wiki/Sterta_(...
Domniemam, że ujarzmiasz jakiegoś Cortexa bo wspominałeś o stosie w startupie. W taki wypadku musisz trochę więcej doczytać o samej architekturze ( o ile jeszcze tego nie zrobiłeś) tego rdzenia. Chodzi o to, że Cortexy mają dwa wskaźniki stosu, jeden jest tak jakby dla przerwań( to ten który jest ustawiany w startupie) i drugi jest tak jakby na procesów...
(at)chudybyk zgadzam się z Tobą. Tylko wrzucę jedno pytanie, związane z t wypowiedzią: - mnóstwo innych niuansów, jak zero-cost abstraction, po co box-ować się stertą - wszystko zrobię na stosie, ja wiem lepiej - czyli tryb unsafe. A dokładnie o stertę i stos. Czy stos i sterta jest elementem standardu języka? ;)
Czyli tak: aby wypełnić jakimiś ustalonymi wartościami całą pamięć RAM muszę to zrobić przed sekcją .init Ściągnij sobie darmowe przykłady do książki "Język C dla mikrokontrolerów AVR..." - II wydanie. Tam masz katalog AlokacjaPamieci, a w nim projekt StackChecker, który robi dokładnie to co potrzebujesz - czyli sprawdza ile pamięci zjada stos i sterta....
Abstrahując - uważasz że wołanie funkcji lcd_coś tam nie odkłada nic na stosie? nie woła innych funkcji? Tak że stos jest już "brudny" dużo bardziej niż myślisz.
Ogólnie to wystarczy program skompilować, i otworzyć sobie plik *.map, w którym jest kompletna lista wszystkich zlinkowanych źródeł, wszystkich zmiennych, stosów, stert - ich dokładnej pozycji (adresu), i wielkości (w bajtach)
Na początku załaduje wartości a potem ... ... a potem się wywali. Możemy się tak spierać długo.
Witam, pominąłeś najważniejszą informację - jakiego mikrokontrolera używasz? Ad.1. LPC2138 w trybie IDLE pobiera przy zegarze 60MHz około 12mA trzeba do tego jeszcze doliczyć pobór mocy przez peryferia, które nie zostały wyłączone (timery, I2C, Uarty etc.), więc jeżeli taktujesz swój procesor i peryferia dużym zegarem, to wartość ta jeszcze podskoczy(oczywiście...
Dokładnie tak jak pisze kolega - tutaj juz masz przeciez najlepsza dynamiczna modyfikacje rozmiaru stos/sterta, a jak się zderzą to i tak jest problem z rozmiarerm pamięci i trzeba szukac wiekszej, czesto i tak trzeba sie z tym pogodzić, że zawsze trochę pamięci się bedzie marnowalo.
Po jego zachowaniu, tak podejrzewam... Ale czy istnieje jakis inny niezawodny sposób pomiaru stosu? Te symbole to nie są zmienne, tylko obiekty statyczne zawierające położenie poszczególnych elementów (stos, sterta) w RAM wykorzystywane do inicjalizacji tych struktur. Nie zmieniają się w czasie działania programu. Jeśli chcesz znać aktualną wartość...
Mega32 ma 2k SRAM, mega16 1kB i wszystko jasne. Stos wchodzi na stertę albo sterta na stos. Takie przypadki można w pewnym zakresie kontrolować i warto to robić.
Z mojej strony to pierwsze kroki z arduino, w związku z tym doświadcznie jest jeszcze zbyt małe, zeby dać sobie radę z takim problemem. Więc dziękuję bardzo za pomoc, podmieniłem i kompilacja zakończyła się poprawnie Bardzo proszę, ale musisz uważać z używaniem standardowych kontenerów STL na AVR (vector, list, map etc.). To są mocno pamięciożerne...
Nie ma rzeczy nieograniczonych w informatyce. Rozmiar sterty jest ograniczony miejscem w pamięci fizycznej i pliku wymiany. No więc też argument mało wartościowy, skoro i stos i sterta mają swoją granicę
(at)rubens, wybacz ale to co wskazał (at)tplewa jest bardzo sensowne. Nie ma co porównywać zaostrzonej sondy do tej ze szpilą "na sprężynie". Kolego (at)rubens widze ze na sile szukasz aby sie dowalic :) Mozna nawet zwyklym kablem bez koncowki mierzyc na upartego - na YT jest sterta przykladow co ludzie robia - pytanie czy tak sie powinno ;). Jest...
Aby uzywać malloca bez dziwnych errorów, musisz zadeklarować odpowiednią ilość miejsca na stertę . I to jest baaardzo przydatna informacja :) Do tej pory używałem startupa z CMSIS-a, a tam rzeczywiście: heap = 0x200. Już wcześniej miałem napisany cały mechanizm do posługiwania się wskaźnikami, ale nie mogłem zadeklarować więcej niż ileś, no i teraz...
Dokument ten proponuje następującą kolejność procedury startowej: To o czym piszesz nie ma przecież nic wspólnego ze startupem... Poniekąd ma związek, bo startup.s dostarczany z Keilem, zawiera podobną sekwencję do tej co opisałem w poście wyżej. Nie jestem zbyt biegły w ASM, a konfigurację podstawowych bloków SCB i tak przeprowadzam w C, zatem postanowiłem...
Gdzie trafi zmienna lokalna w main zainicjowana i nie niezainicjowana ? Zależy co rozumiesz przez "lokalna". Generalnie do celu tej dyskusji proponuję się ograniczyć do podziału na "statyczne" (m.in. globalne) i "automatyczne" (czyli zmienne "w" funkcjach, oczywiście bez "static"). Te pierwsze lądują w .data lub .bss (zależnie od tego czy są zainicjalizowane...
Temat do ogarnięcia na większości ARM. Na AVR dużo roboty. W RPi para idzie w gwizdek, trzeba dobrze kumać w temacie Linuxa. Dla kumatych ARM z min 32kB RAM, dla "niekumatych" ESP, w miarę łatwo da się zrobić ale... długa lista tych ale. Na "Ardunino" czyli w domyśle AVR nie polecam, mało RAM i przez to komplikuje się życie (prację). Poparcie moich...
Ten przykład akurat da się wyjaśnić. Sterta układana jest od dołu w górę a stos odwrotnie (przynajmniej w większości). Jak zaczną zachodzić na siebie to tak może być. Ale regularność tej 46 komórki raczej wykazuje na błąd typu indeksowanie tablicy poza jej rozmiarem. Sporo by można scenariuszy snuć. Czasami takie kłopoty dobrze że wychodzą bo świadczą...
Część zmiennych może trafić do rejestrów, o nich nie ma sensu mówić. Zmienne lokalne przydzielane są na stosie, tak więc nie ma mowy o pozostawaniu zmiennych - wychodząc z funkcji wskaźnik stosu jest przywracany do wartości z przed wywołania. Przy kolejnym wywołaniu funkcji zwolniona pamięć zostanie przydzielona innej funkcji. Patrząc w debugerze wydawać...
Takie liczenie jak piszesz jest tyle warte co wróżenie z fusów. Niestety nie da się prosto policzyć ile program zajmuje RAM - ani nie przewidzisz ile miejsca zajmą zmienne lokalne, ani ile zajmie sterta, ani stos. Znając program można to z grubsza próbować oszacować, ale żeby dobrze trafić to trzeba być niezłym magikiem. Albo jak pisze Freddie - napisać...
Witam, mam pytanie odnośnie obsługi sterty w arm'ach, używam gnuarm. Problem polega na tym, że funkcja malloc zwraca wartość 0. Słyszałem, że trzeba napisać własną funkcję caddr_t sbrk(int incr), jednak gdy to zrobię to jest ona dołączano do kodu wynikowego, jednak nigdy nie jest wywoływana, wywoływana jest tylko standardowa _sbrk. Moja mapa pamięci...
Nowa kompilacja sdk: https://github.com/NonPIayerCharacter/Op... Zwiększony rozmiar stosu do 100k, wolna sterta to około 88k. To pozostawia około 40-50k dla sterty libc. Wersja Freertos to teraz V10.4.1 zamiast V7.0.2 (dostarczona z nowym sdk) i używa heap_5. LFS jest teraz dostępny, długość 0x1B000, zastępuje sekcję...
Hm, fajne - sprawdzę. W programie pilnowałem żeby robić tablice o odpowiednich rozmiarach - raczej nie powinno być tu problemu. Wnosząc po dalszej części posta (pytanie o ilość wolnej SRAM) - chyba nie rozumiesz na czym polega przepełnienie stosu. Zerknij na ilustracje: http://nongnu.org/avr-libc/user-manual/m... Część składników zużycia pamięcia...
Dokłądnie, a z kolei przeniesienie stosu na AVR w obszar ExRAM jest marnym pomysłem - dostęp do tej pamięci jest wolniejszy i cały program będzie się wolniej wykonywał ze względu na wolniejsze działanie PUSH/POP i odkładanie/zdejmowanie adresów powrotów. Dodatkowo coś mi się kołacze (trzeba to sprawdzić), że ATMega128 ma jakiś problem kiedy stos leży...
Domyślny startup może np. źle konfigurować stos/stertę albo nie definiować nazw procedur obsługi przerwań, więc Twoje obsługi mogą się nie wywoływać.
Witaj, Z tego co widzę to jakaś komercyjna wersja ide do LPC-ków bazująca na eclipse. Nie napisałeś jakiego kompilatora używasz. Informacje o wykorzystaniu ramu znajdziesz w *.map pliku lub po wykorzystaj plik kompilatora size do określenia zajętości obszaru pliku wynikowego. Naturalnie ja mam na myśli kompilator gnu gcc. Co do stosu to w gcc jest tak...
Z dynamiczną alokacją pamięci na mikrokontrolerach trzeba uważać, często powoduje problemy. Ponieważ zwykle w takich sytuacja sterta nachodzi na stos z powody niewystarczającej ilości pamięci (S)RAM. Nie tylko powinno się unikać dynamicznej alokacji, ale jak się piszę w C++ to raczej należy zapomnieć o poliformiźmie i wirtualnych metodach, na rzecz...
Wiesz co, generalnie kombinuję z różnymi konfigami. Stos na dole i sterta u góry faktycznie ma sens, sprawdzę to też. A to sprawdzanie czy _sbrk() wjechał w stos też mi nie leży. Ale zwróć uwagę, jak to jest rozwiązane domyślnie w wielu standardowych bibliotekach (co nie znaczy że jest to dobra metoda. Na pewno jakaś :P). Mogę oczywiście syscallsy sobie...
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...
Podaj kod w Avr gcc jak odczytać wolną pamięć w czasie pracy programu Odczytywanie dostępnej (wolnej) pamięci RAM w czasie pracy programu na mikrokontrolerach AVR może być przydatne do monitorowania wykorzystania zasobów, szczególnie w aplikacjach, które dynamicznie alokują pamięć lub wykonują zadania mogące intensywnie wykorzystywać pamięć. Jednak...
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...
Powiem tak, Codegenów mam caly stos popalonych, w piwnicy cała sterta lezy, niewiem czy sa prawdziwe czy tez imitacje, ale 1 na 10 udaje sie naprawić! Reszta to szrot na części! One moze i ladnie wygladaja bo przyznam, ze w srodku sa wykonane super, ale niestety jak padnie to juz koniec... Pozdrawiam IjeSJot.
1. Wiemy podczas pisania programów na architekturę ARM programista decycyduje za pomocą skryptu linkera gdzie w pamięci leżą sekcje programu generowane przez kompilator. Najczęściej wygląda to w ten sposób: Nie do końca tak to wygląda dla ARM, choćby dlatego, że zwykle między flash a RAM jest spora "dziura", a więc między .rodata a .data na obrazku...
Hej, dzięki za pomoc, faktycznie zapomniałem o tej literce 'v':) Tworzenie bufora na wynikowy napis na stosie to nie jest najlepszy pomysł, zdajesz sobie z tego sprawę? Możesz rozwinąć temat? O stos dbam(w sensie mam miejsce). Jaka inna alternatywa? Sterta czy global?
Twoich plików nie używałem. Szczerze mówiąc jestem raczej początkujący jeśli chodzi o mikrokontrolery. Do tej pory wystarczało mi: -konfiguracja mC i peryferiów i napisanie jakiegoś algorytmu obliczeniowego. Zarządzanie pamięcią nawet się nie tykałem (stosy, sterty itp). Jeśli chodzi o problem to zwiększyłem rozmiar stosu dwa razy i wygląda na to, że...
(at)korteksik A widzisz ile zarezerwowałeś na stos i stertę? Właśnie 1.5kB 48 bajtów to stawiam, że jest z pliku startup. Jeżeli chcesz zmienić rozmiar stosu i sterty, to w skrypcie linkera znajdź: [syntax=c] _Min_Heap_Size = 0x200; /* required amount of heap */ _Min_Stack_Size = 0x400; /* required amount of stack */[/syntax] i zmień wartości na takie,...
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....
W pierwszej kolejności sprawdź, jaką masz zajętość pamięci na stosie oraz stercie po inicjacji konstruktora SerialBT. Podałeś tak mało informacji, że więcej nie da się "wywróżyć".
OK. Czyli stos i stertę muszę samemu dodać żeby obliczyć zajętą część pamięci ? Dlaczego ".elf file" podaje inną wartość ?
Mnie zastanawia na co idzie tyle RAM? Strzelam - rezerwacja stosu i sterty ;)
OK, działa :-) Dzięki serdeczne. Inicjalizację FSMC dałem na samym początku, gdyż pierwotnie "chciałem" tam też mieć zmienne globalne (a w wewnętrznej pamięci sam stos) i inaczej by się nie inicjalizowały, ale obecnie jest to mało istotne.
Dobrze rozumiem, że ta funkcja bazuje na alokowaniu pamięci na stosie? _sbrk_r(), a więc i malloc(), pamięć biorą ze specjalnego obszaru o nazwie heap (sterta), który w moich skryptach linkera znajduje się "za" danymi i stosami - jest to cały obszar RAM, który jest "wolny". Może po prostu masz zbyt mały stos dla głównego wątku, i malloc() się wysypuje...
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.
Samo to nie jest może powodem błędu, który obserwujesz, Pewnie jest. Przerwanie -> skasowanie flagi -> prinf po uarcie W trakcie tego kolejne przerwanie -> skasowanie flagi -> prinf po uarcie ..... stos się przeełnia i sterta kończy (o ile ta implementacja go używa) natychmiast. i do tego dodatkowo - printf - nie reentrant Cała filozofia. Sory, jeżeli...
Jawne określenie rozmiaru stosu (stosów) zajmuje jakieś 3 sekundy, a dzięki temu zyskujesz świadomość jego rozmiaru i tego że kiedyś może się skończyć. Rozwiązanie typu "stos na końcu zajmuje sobie tyle miejsca ile jest" to taka wycieczka w ciemnościach. Przecież program skompiluje się bezproblemowo nawet jeśli nie będzie ani pół wolnego bajtu na stos...
Tak, w międzyczasie: wygląda to na problem przepełnienia sterty. Czy sprawdzałeś ile masz wolnego miejsca na stercie (ESP.getFreeHeap())? Z tych dwóch fragmentów kodu, które przedstawiłeś wynika, że dość rozrzutnie korzystasz ze sterty :) Dla przykładu poniższy kod też powinien zadziałać (dla małych rozmiarów danych): [syntax=c]int numSSID = WiFi.scanNetworks(false,...
Owszem, ale nie są one proste. Pamięć zajętą statycznie można podglądnąć korzystając z narzędzi dostępnych w toolchainie gcc. POamięć zajętą przez stos i stertę tylko programowo, chyba, że masz debugger, wtedy można sobie zastawić pułapki na dostęp do pamięci.
Generalnie wstawiłem to do innego projektu w dowolne miejsce i nic takiego jak u Ciebie nie widzę. Co do braku sensu, to odczyt SP w jakimś tam momencie nie daje gwarancji, że stos nie urośnie bardziej za kilka funkcji, więc to jest takie zabezpieczenie, które czasem zadziała, a czasem nie. Czy jest sens się nim bawić to każdy już musi sam zdecydować....
Może nie ma miejsca na stercie i nadpisujesz stos, albo coś? Albo wskaźniki stosu i sterty są tak blisko siebie? Ogólnie działa Tobie dynamiczna alokacja pamięci (malloc)? Nigdy nie programowałem procesorów, nie znam tez architektury, ale spojrzałem szybko w kod i takie rzeczy mi się nasunęły.
Wg mnie nie jest to możliwe inaczej niż pokazałeś. Można sobie jednak w jednej pamięci zrobić zmienne, a w drugiej stos i stertę (lub inną kombinację). Można też - przy wykorzystaniu odpowiednich parametrów - w różnych miejscach umieszczać zmienne z różnych plików, ale musi być to podane wprost... 4\/3!!
Tak też próbowałem, tylko nie rozumiem jaki teraz będzie rozmiar przeznaczony dla tego bufora? Bo nie jest to chyba określone jawnie, tak jak np dla stosu, czy sterty. Dla drugiego bufora stworzyć identyczną sekcję w sdramie? Gdy zapiszę ją pod sekcją frame, to umieszczona ona zostanie zaraz za sekcją frame w pamięci?
Uściślijmy. W przykładach z których zapewne korzysta (częściowo) autor tematu stos nie jest stricte na początku RAM jako pierwsza rzecz. Jest jednak generalnie zaraz za .data i .bss, a więc zwykle "na początku", tym bardziej w gołym przykładzie gdzie prawie niczego nie ma w tych sekcjach. Za to w aktualnej wersji distortos stos przerwań jest jako pierwszy...
Zgodnie z nazwą ten problem da się rozwiązać jedynie poprzez dynamiczną alokację pamięci (; Niemniej jednak nie musi to być koniecznie malloc() czy new, wystarczy np. jeden wielki bufor, z którego w swoim programie "odcinasz" potrzebne Ci kawałki - to po prostu byłaby Twoja sterta. Niemniej jednak zbyt wiele nie zyskasz tak czy siak... Może prościej...
W drugi przypadku stos i dane zostały przeniesione do pamięci zewnętrznej. Nie, tylko sterta. Czyli to co alokujesz używając malloc(); I dlaczego nie mogę użyć pierwszej metody tak by program działał poprawnie. Co robię nie tak? Bo włączasz/udostępniasz programowi pamięć w funkcji main(), czyli *po* tym jak chcesz w niej umieścić sekcję .data (co się...
Sterty? Raczej stosu. Pozdrawiam
Powiem wam tylko, że kiedyś zajmowałem się statystycznym (mniej lub bardziej trafnym) obliczaniem zużycia stosu i sterty przez pewien kod (lub jego fragment) i jest to naprawdę ogromne zagadnienie (jest do tego odpowiednie oprogramowanie i teorie matematyczne). Generalnie na sam koniec i tak trzeba do oszacowanych wartości dodać 10-20% i to "powinno"...
Powiększ stertę i stos do 2KiB, tak na początek. Transmit musi być wołana z przerwania USB lub innego o tym samym priorytecie.
Auto napisał: satanistik napisał: Program w przerwaniu od timera mierzy wartość z ADC Rozwiązanie dość kiepskie. Wchodzi w przerwanie, wyzwala pomiar, czeka na wynik W PRZERWANIU!, Nie twierdze że to jest rewelacja, ale samo w sobie nie powinno prowadzić do błędu w stylu "brak kolejnych pomiarów ADC". "Oczywista oczywistość". Tyle, że bez kodów źródłowych...
Tylko tego nie mogę umieścić w Flash Ale można i trzeba :) https://www.arduino.cc/reference/tr/lang... Używam PlattformIO podaje 50% wolnego RAM Problem polega na tym, że nie wliczona jest w to zajętość sterty w trakcie działania programu. Miałem wielokrotnie przygody z Atmega328P, kiedy stos "najeżdżał" na stertę i działy...
Bardzo fajny procesor - w tej chwili z grupy niewielkich mój ulubiony :). Sam teraz siedzę nad dwoma projektami właśnie na F303. Przy okazji zauważyłem że mało kto wykorzystuje CCM RAM a to dodatkowe 8kilo szybkiej pamięci. Szczerze powiedziawszy ja sobie "odwróciłem" pamięci w stosunku do "standardu". .bss, .data, stos i stertę w CCM (żeby już żadnych...
W momencie, gdy je złożę i załaduję do arduino zostaje przydzielony mac, ip, odnalezione ip serwera, na którym stoi mysql i wykryty czujnik BME280. W tym momencie wyświetla się Connecting... i koniec. Czy sprawdzałeś, jak wygląda zajętość SRAM w trakcie działania programu? Obie biblioteki korzystają również ze sterty, oprócz stosu, więc tu może być...
(at)kolgreen Wynik kompilacji w Arduino IDE to ma sens jedynie w odniesieniu do zajętości pamięci flash. Jeżeli chodzi o zużycie pamięci RAM, to taki test trzeba przeprowadzić w trakcie działania programu i monitorować przede wszystkim zajętość sterty (heap) oraz jej stopień fragmentacji. Zajętość pamięci przez zmienne globalne to jest problem drugorzędny...
Poza stosem w SRAMie masz jeszcze przynajmniej: - stertę - dynamiczna alokacja (malloc, new) - sekcję data - wszelkie globalne i statyczne zmienne inicjowane jakąś wartością - sekcję bss - jw. ale zerowane przy starcie programu poza tym możesz sobie tworzyć własne sekcje, latać wskaźnikiem po pamięci i cokolwiek Ci przyjdzie do głowy. Alokowanie dużej...
FreeRTOS jest dla mnie na razie zagadką - nie rozpracowałem go na tyle, żeby powiedzieć "znam". Uwierz mi, że FreeRTOS jest prosty jak przysłowiowa budowa cepa. Jednak z poziomu mojej niewiedzy wysuwa się postulat - że FreeRTOS "żre" pamięć RAM jak najęty. Bzdura. FreeRTOS "żre" dokładnie tyle pamięci ile mu każesz. Z tego co wiem w FreeRTOS są funkcje...
A masz wyrównane stosy do 8-miu bajtów? Kiedyś o tym pisałem - bez tego właśnie CZASEM dzieją się problemy - np z funkcjami variadic, czyli m.in. z printfem... 4\/3!! Sekcję .data mam wyrównaną do 8, ale to wszystko co mogę zrobić. Ze stosami jest problem ponieważ korzystam z FreeRTOSa i każdy task ma dynamicznie przydzielany swój stos ze sterty, wiec...
Wyjaśnię może, o co dokładnie mi chodzi. Jeżeli w trakcie długiego działania ESP występują regularne operacje tworzenia nowych zadań, a następnie ich kasowania to powoduje to zwiększoną fragmentację sterty pamięci (heap). Domyślnie zadania we FreeRTOS korzystają z pamięci dynamicznej, czyli sterty. Może się okazać, że przy ponownej próbie utworzenia...
Jeżeli mówiąc "po staremu" masz na myśli statyczne alokowanie, to jest spora różnica. To jest alokowanie statyczne, czyli po wyjściu z zakresu funkcji obiekt jest automatycznie usuwany: [syntax=cpp] void f() { Obiekt a; } [/syntax] Lecz jeżeli masz funkcję która ma przetworzyć nieokreśloną z góry (w czasie pisania programu) ilość danych, to używasz...
Oj, ale te rozwiązania to nie żadne gotowce, tylko profesjonalne narzędzia, które wspomagają tworzenie programów przetwarzających języki. Ot choćby PHP, Ruby czy Perl korzystają z parserów generowanych przez yacc/bison. Jeśli ktoś lubi oglądać takie wnętrzności, to plik Bisona generujący parser PHP mamy tutaj: https://github.com/php/php-src/blob/mast...
Dzięki za odpowiedzi, sugestie i zwrócenie uwagi na kilka kwestii. Oba urządzenia nie są moje i nie mam możliwości ingerencji w sprzęt. Zasilanie jest wystarczające. dev1 steruje dwoma elektrozaworami (wyjścia push-pull, nie zaobserwowałem przepięć), a dev2 to modem gsm. Nadpisanie pamięci jest wykluczone. Program jest na to odporny. Zapas dla stosu...
Jak mam 90%, to pojawiają się artefakty na wyświetlaczu, pomimo, że nie dodałem kodu go dotyczącego, a trochę jeszcze więcej zająć, to procesor wpada w bootloop i uruchamia się tylko setup. To raczej wynika z zachodzenia sterty na stos w pamięci RAM. Miałem kiedyś podobne przypadki. Niestety w atmega328 ciężko jest to zdiagnozować. Jaką zajętość RAM...
Wskaźnik zawierający adres 0 - bez wątpienia pojawią się dziwne rzeczy: w przestrzeni pamięci pod adresami 0-31 dostępne są rejestry procesora, więc komórka eq przekazywać do funkcji wskaźnik na tablicę, przez co tablica może zostać utworzona na stosie przez funkcję nadrzędną i wypełniona przez aktualną funkcję. Nie trzeba żadnej globalnej tablicy,...
Debug -> Use ST-Link (Deprecated) mam prawidłowy tryb - SWD. Jako driver mogę wybrać wersję nie-deprecated, algorytm odpowiedni i dalej to samo. Tak samo mam wrzucając hexa przez ST-Link Utility. Jakby wsad tworzony przez Keila nie był ok. Jeszcze konfiguracja targetu: http://obrazki.elektroda.pl/8816767600_1... Opymalizacja c/c++ na...
Witam! Zastanawiam się nad tym jaka jest dokładnie funkcja bitów SRAM1LPEN, SRAM2LPEN i SRAM3LPEN w rejestrze RCC_AHB1LPENR. Opis ("SRAMx interface clock enable during Sleep mode") nie jest specjalnie dogłębny i w sumie to nie wiem o co chodzi... Czy może chodzi o to, że po wyzerowaniu tych bitów po wejściu do trybu sleep zawartość odpowiedniego bloku...
Dysku z systemem nie skasujesz z poziomu tego samego systemu. Za dużo filmów się naoglądałeś :lol: Takie rzeczy są możliwe tylko pod DOSem. Komputer to procesor (CPU), pamięć operacyjna (RAM) oraz liczne urządzenia wejścia/wyjścia (I/O) w tym między innymi pamięci masowe (np. dyski twarde). Program, który jest uruchomiony, znajduje się w pamięci operacyjnej...
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...
Witam. Czy ktoś wie jak badać w runtime zajętość pamięci ?? Używam C++ i operatorów new/delete. Zakładam że obszar sterty i stosu jest przydzielany w taki sposób aby zminimalizować jego nałożenie się, czyli najprawdopodobniej na dwóch końcach pamięci RAM. Czy jest jakiś sprzętowy mechanizm ochrony tego obszaru ? Jak zbadać zajętość pamięci ?
Witam. Mam problem z poprawnym działaniu CAN. Używam STM32F103CBT6 oraz MCP2551. Piny CAN to remap B8 oraz B9. Problem jest taki że jak wysyłam jakąkolwiek ramkę z odpowiedniej przystawki USB<>CAN, mikrokontroler się zawiesza, zamiast wskoczyć do przerwania. Tak się dzieje jeśli tryb ustawię na CAN_InitStructure.CAN_Mode = CAN_Mode_Normal. Kiedy...
tablica "koza" jest tablicą lokalną, więc jest alokowana na stosie, nie śmiesz wywołać funkcji "free" która jest związana z alokatorem pamieci na stercie (jeśli użyjesz tej funkcji, to zostanie wkompilowany alokator domyślny). Po wyjściu z funkcji i tak ta tablica zostanie zwolniona.
Wielokrotnie rozpatrywane były tematy odnośnie jakiego języka programowania wybrać, jakie narzędzia wykorzystywać,z jakich bibliotek korzystać. ogólnie rzecz biorąc w co inwestować by połączyć pasję z możliwością pracy zarobkowej. Jako laik tego "rzemiosła" mam pytanie, czy w tej dziedzinie istnieje zapotrzebowanie na specjalistę, od którego wymagało...
Ewidentnie wygląda to na problemy z pamięcią. Nie masz za małego stosu? Jakie masz wielkości sterty po kolei dla freertos oraz lwip ? To czesc lwIP - to przychodzi chyba nawet z dystrybucja Free RTOS-a. Bawilem sie z jakis czas temu - zero problemów Tu akurat są problemy. Jakoś dziwnie się składa, że po tych wywołaniach. Mimo wszystko sprawdziłbym czy...
Biblioteka alokuje spore ilości sterty, najwięcej kiedy jpeg jest zapisany w trybie progresywnym, wtedy musi zaalokować pamięć na cały obraz od razu. W trybach nieprogresywnych dekoduje w mniejszych kawałkach (zdaje się że po linii, ale nie dam głowy). Spróbuj dla testu podać mu małą grafikę np 5x5 pikseli i sprobować puścić. Ile masz zadeklarowanej...
Pamięć wewnętrzna 2KB - 1514B na ramkę, reszta na stos. Sekcję data, bss oraz opcjonalną stertę wyrzucić do zewnętrznego ramu, chociaż nie wiem na czym niby polega trudność w rzutowaniu wskaźnika - pamięć i wewnętrzna i zewnętrzna są dostępne w dokładnie ten sam sposób. Co do odczytywania przy odbiorze i składania przy nadawaniu można wykorzystać dwie...
Postaram się dołączyć wtc do kodu. Myślałem jeszcze o pamięci. Może potestować za pomocą MemoryFree ? https://github.com/sudar/MemoryFree?file... Aby naprawdę dowiedzieć się ile max jest zajmowane pamięci, należy wypełnić ją jakąś wartością od wierzchołka sterty do końca stosu a później sprawdzać. Wynika to z tego, ze tak jak zajętość ram na zmienne...
W sumie to nie wiem czy to właściwie problem z MCU, GCC czy zrobiłem gdzieś jakiś banalny błąd, który mnie teraz prześladuje, ale wnioskując z tego, że na F103, F107 i x86 działa poprawnie, chwilowo obstawię jakiś związek z MCU. Bo ten wyjątek istnieje tylko na STM32F030. [syntax=C]static void fnSensRead(uint8_t cbData, uint8_t *ptr) { uint32_t *pSmp...
Cześć! Oto kolejny (i prawdopodobnie ostatni) raport z wykonania projektu. W tej chwili urządzenie jest wykonane i zainstalowane w miejscu pracy. Co do problemu z nadmiernym zużyciem energii, o którym pisałem poprzednio, żeby nie przedłużać realizacji (i tak już nadmiernie rozciągniętej :-() zdecydowałem się na pozostawienie sprzętu tak jak jest, jedynie...
Właściwie nie zaczynam, optymalizacją wyłączona, dlatego jestem zaskoczony. Czy powinienem może zmienić rozmiar sterty lub stosu, bądź ustawić jakąś opcję dodatkowo? Program Size: Code=24376 RO-data=396 RW-data=768 ZI-data=11176 STM32F103 (20KB RAM, 128FLASH), Keil 5.10.0.2 Stack_Size EQU 0x00001000 Heap_Size EQU 0x00000800 Przyznam jedynie że nie mam...
Oczywiście ze zapisuje w pamieci ale w RAM peceta a jak znie to wydobyc jak od razu po kompilacji nastepuje przejscie do programowania procka. Popracuje nad tym. Kompilator jest z czasów gdy jeszcze królowały Z80 a dysków twardych nie było ,potem została dorobiona wkładka na 51 i AVR nie za bardzo che ruszac po tylu latach bo wiadomo ze moge tylko...
Po "wgraniu sieci" wyświetlam nazwy poszczególnych pól na wyświetlaczu i w tym momencie wyświetla już mi jakieś śmieci. Tak jakby miał jakieś problemy z pamięcią i czytał z innego miejsca niż powinien. Wyświetlasz w którym miejscu w programie? W main przed pętla while? Zwróć uwagę, że obiekt wez zadeklarowany w CProbabilisticNetwork::Load() jest lokalny!...
to skoro padła odpowiedz jak poradzić sobie z problemem to powiem co poszło nie tak. w językach kompilowanych, na przykład C oprócz zwykłej tablicy istnieje także statyczna czysta tablica. [syntax=c]const char tablica[liczba][/syntax] gdzie liczba to naprzykład [syntax=c]#define liczba 100[/syntax] podczas przejścia preprocesora jak kompilator widzi...
Witam Próbuję teraz zaimplementować funkcję sprintf(..). Dołączyłem pliki nagłówkowe bibliotek stdio.h , errno.h oraz implementację funkcji : caddr_t _sbrk (int size) podaną przez Pana na forum. Program kompiluje się lecz niestety przy wywołaniu sprintf(..) jest wywoływane przerwanie z tablicy vectors.c: static void __Default_Handler(void) {...
Co do stosu to nie jestem pewien. Wziąłem ten skrypt linkera: https://github.com/PaxInstruments/STM32C... Widzę tam tylko: _Min_Stack_Size = 0x400;; /* required amount of stack */ Czy rozmiar stosu jest jeszcze gdzieś indziej? Bo...
Wygenerowałem sobie prosty projekt na układ STM32F070CBTx w CubeMX i odpaliłem w Keilu. Jedyne co włączyłem w CubeMX-ie to w RCC zegar - zewnętrzny kwarc 12 MHz i USB_FS skonfigurowane jako VCP (CDC). Po załadowaniu do Keila i skompilowaniu programu wgrywam go (J-Linkiem po SWD) do mojego układu na płytce. I nic się nie dzieje, a komputer (do którego...
Sterta jest jedna i z niej pobierane są stosy dla tasków. Przeczytaj sobie ten wątek http://www.elektroda.pl/rtvforum/topic16...
W ramach wspomnień o zabytkach: TN1+1 .. To dopiero było cudo... Na pojedynczej parze analogowej w systemie nośnym dokładano dodatkowego abonenta w pasmie nadakustycznym, 24/36 kHz, normalny AM (telefonia nośna stosowała przekaz jednowstęgowy bez nośnych w podstawowej grupie pierwotnej, później w grupach wtórnych dokładano piloty dla automatyki wzmocnienia...
Ok, wszystko trzyma sie kupy, aczkolwiek wylazł mi jeden, wcześniej nie objawiony, zupełnie niespotykany i atakujący z zaskoczenia błąd. Problem polega na tym, że gdy zatrzymam rdzen na breakpointcie w wątku (lub przerwaniu), a potem puszczę go dalej (po prostu, nie step), to całość się natychmiast hardfault'ci. To samo dotyczy zwykłego stop'a rdzenia....
Bardzo serdecznie dziękuję wszystkim Kolegom za zaangażowanie i okazaną pomoc. Szczególnie mocno zaś chcę podziękować Koledze IS, który poświęcił mnóstwo czasu żeby pomóc mi na PW. Stos udało mi się odpalić. Zasadniczo wszystko ruszyło. Jednak pojawił się niepokojący objaw. Zrobiłem sobie stronę, w której umieszczona jest ramka iframe dynamicznie odświeżana...
No jak kod i biblioteki mamy taki sam to powodu szukaj w sprzęcie, kondensator na module NRF (ja mam), wzajemne położenie anten, zakłócenia, odległość (u mnie to leży w stosie kabli pod monitorem, nadajnik na stercie RTV zasilany z ładowarki USB->NANO->3.3V, około 1m jedno od drugiego, obie płytki na stykówach połączone kabelkami - nie są to też jakieś...
http://obrazki.elektroda.pl/9733504600_1... DIY stacja meteo, a właściwie stacje, bo naprodukowałem już ich kilka, chyba 10 wersji. Dlaczego stacje? Bo lubię statystyki, poza tym to jedna z tych rzeczy, która może nie jest niezbędna do życia, ale fajnie mieć. Tym bardziej jeśli samemu się skonstruowało. Dlaczego ethernet? Bo wygoda...
zapieczony hamulec wharfedale titan cieknie pralki
ws301s schemat schemat bezpieczników jumper
Viking VH 540 – regulacja napięcia łańcucha przekładni, napinacz, luz, wymiana łańcucha Dodge Caliber – brak napięcia na wyświetlaczu licznika przebiegu, bezpiecznik F14, TIPM, CCN