Nie ma takiej zależności. Rozmiar stosu jest zależny od ilości zmiennych automatycznych i "łańcucha wywołań". 4\/3!!
mozna tez recznie, w symulatorze jeśli chodzi o AVRStudio to zajętość Ramu w dowolnym punkcie programu oblicza się poprzez sumowanie (.sekcji data + .bss + .noinit) oraz wskaźnika stosu SP(liczonego w kierunku malejących adresów)?Co z obszarem "heap"?
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....
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...
Warto też zminimalizować liczbę priorytetów przerwań, najlepiej jeśli się da do 2. Wówczas część stosu wymagana do ich obsługi się zmniejszy kosztem pewnego opóźnienia. ISR handlery zwykle nie potrzebują dużo lokalnej pamięci, lwią część stanowią przechowywane rejestry, w praktyce zakładam 128 bajtów/poziom. Co do badania zapotrzebowania na stos części...
32AU4 ma 2 razy więcej pamięci RAM. Może dla mniejszego brata po prostu następuje nadpisywanie stosu lub coś podobnego. Podczas kompilacji programu, w podsumowaniu nie zawsze widać właściwą zajętość pamięci ram, szczególnie mogę wprowadzać w błąd "duże"zmienne lokalne.
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 ?
Tzn znaczenie stosu i sterty znam. Tylko ciekawi mnie ustawianie tego. Zwróciłem na to uwagę kompilując proste przykłady, gdzie zajętość RAM była na poziomie 1,5kB a używałem raptem kilku zmiennych globalnych. I tak po nitce doszedłem że to właśnie rezerwowanie pamięci w pliku linkera za to odpowiada. Doświadczenie z C i uC mam na podstawie AVR i tam...
Nie wiem czy koledze o to chodzi ale poniżej przykład jak utworzyć tablicę adresów funkcji i wywoływać funkcję na podstawie jej numeru. [syntax=armasm] #include <m32def.inc> .cseg Reset: ; zainicjowanie stosu LDIR16,high (RAMEND) OUTSPH,R16 LDIR16,low (RAMEND) OUTSPL,R16 CLRR0 // zero LDIZH,high (2*Addresses) LDIZL,low (2*Addresses) LDIR16,1 //...
No fakt, ilość linii kodu to sprawa kluczowa. Naprawdę merytoryczny argument. Raczej chodziło tu o podkreslenie prostoty kodu. A'proos linii kodu to nie dalej niz 2-3 dni temu, mój syn przyszedł do mnie z bardzo podobnym problemem. Asystent z metod numerycznych (syn studiuje civil engineering - czyli cos ala budownictwo), stwiedził ze jego program...
No skoro nie są globalne albo statyczne to jak myślisz - gdzie są tworzone ? - podpowiedź: - na stosie więc nie pokaże ci się zajętość RAM sugestia: jak masz duże tablice to albo rób je zawsze jako zmienne globalne albo co najmniej statyczne - wtedy będziesz widział ile ci to zjada RAM'u. A tak? wydaje ci się że program nie zjada RAMu a tymczasem wszystko...
A jesteś pewien, że ten bufor na 100% jest we flash'u? Pisząc bufor - sugerujesz że jest to tablica zmiennych, która na bierząco pośredniczy w wymianie danych. Jeżeli tak - bufor ten musi znajdować się w ramie. W przypadku AVR nie ma możliwości zapisywania do flasha z pozoimu programu (można to tylko zrobić z sekcji bootloadera). A co mówi kompilator...
Wciąż nie rozumiem do końca... LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length)); //LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=hu)\n"));//Moja modyfikacja - powyższa linijka powodowała hard fault Jak odkomentujesz tą drugą linijkę to się wykrzacza tak? Czy może wykrzacza się jak zakomentujesz pierwszą...
Patrz na ostatnią linię tam stos jest już dodany... zainteresuj się tą flagą linkera -print-memory-usage
całkowita zajętość pamięci RAM wynosi 0! A stos gdzie?
Problem z przepełnianiem stosów wynika z istnienia stosów zadań, które trzymają zmienne i stan zadań. Systemy zdarzeniowe wolne są od tej wady RTOSów. ;) Ogólnie RTOS jest pomysłem na to, jak zrobić kilka "pętli głównych", czyli jest to odpowiedź na problem programistów, którzy "zawiesili się" na koncepcji pętli zdarzeń. Tymczasem wystarczy "rozciąć"...
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ć".
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ć...
Trzeba też pamiętać, żeby zostawić trochę pamięci - od końca w dół rośnie stos.
stack a heap to mocno inne rzeczy. One na małych architekturach mogą gdzieś tam się zazębiać, ale generalnie są oddzielne *) A stos w językach wysokopoziomowych - pewnie wiesz - to w praktyce powołanie ramki (frame) funkcji / rezygnacja z ramki (return) (na marginesie, o ile heap jest słowem generalnie jednoznacznym, to stack w 99% oznacza prostą rosnącą/malejącą...
Nie wiem jak Tobie ale w c mi wychodzi 526 taktów - czy prędkość ta jest wystarczająca? 526 taktów to bardzo dużo jak na takie operacje. Ale nie dziwota skoro kolega np w pętli for używa dla zmiennej "i" zmieniającej swoją wartość w zakresie od 0 do 8 czyli wystarczyłby jeden BAJT. Tymczasem kolega niefrasobliwie dobiera sobie typ int (DWA BAJTY) -...
(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...
jeśli zajętość data 99% to może stos wjeżdża ci już na zmienne. pozatym buffers masz zadeklarowane w rozmiarze 55 a w ISR masz index od 0 do 255 jak nic masz konflikt między tymi trzema rzeczami: stos, ten bufor, zmienne podebuguj i włącz podgląd pamięci, zobaczysz co gdzie maże
Nie wiem, albo mi się wydaje, albo jakieś takie rozbudowane to masz ;) Spróbuj tego kodu, powinno działać (dobierz opóźnienia): .EQU LCD=PORTC .EQU LCD_EN=PORTC6 .EQU LCD_RS=PORTC4 .EQU LCD_RW=PORTC5 lcd_busy: ldi R16,0b11110000 out DDRC,R16 ;linie D7 - D4 przełączone w tryb wejściowy (0) cbi LCD,LCD_RS sbi LCD,LCD_RW nop ;opóźnienie minimum...
Sprawdz zajętość RAM. Twój program niepotrzebnie używa b. dużo miejsca na stosie, więc możesz dorzucić ze 200 bajtów do tego, co podaje kompilator. Kompilator podaje zajętość ramu około 20% procek ma 2048. Więc jest jeszcze kupa miejsca
Po pierwsze kod umieszczaj w tagach "syntax". Po drugie w jakim programie i jakiej wersji to kompilujesz, a po trzecie 75% zajętości RAM źle wróży. Moim zdaniem przepełniasz stos.
Zajętość Flash to suma text i data. Zajętość RAM - to suma data i BSS. W zależności od środowiska stos może być wliczony do BSS albo nie.
Wykonałem prosty test. Użyłem możliwie najprostszej funkcji callback dla timera: Stoi na 5µs. Czasem pik do 8 góra 10 Co najmniej pięciokrotnie dłużej się wykonuje, ale to już zostawiam Tobie do dalszej analizy. Jeżeli ten callback ma faktycznie się wykonywać co 111µs, to jego czas wykonania nie powinien przekraczać 10µs - tak, aby dać...
Zajętość RAM według kompilatora to 86%. ... czyli jakieś 220 B, a na stosie kilkudziesięciobajtowe wektory, który zapewne nie są uwzględnione w tym raporcie. Razem sporo ponad 256 B.
8 zadań? A czemu tak dużo? Założe się że można to skutecznie zoptymalizować, np przenosząc zadania o niskim priorytecie do IddleHook (np miganie diodkami). Na stronie freeRTOS jest krótki poradnik jak optymalizować aplikacje pod względem szybkości i zajętości ramu.
Najpierw opiszę objaw, domniemaną przyczynę a potem poprosze o rade: Mam program który pożera mi większość RAM, głównie za sprawą dużych buforów między innymi na dane pochodzące z 2 UART-ów (atmega 162) i innych zadeklarowanych tablic. Generalnie wszystko jest OK jednak kiedy powięszam wielkość zajętej pamieci RAM , tak gdzieś do zużycia jej w 80% program...
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...
A jak inicjalizujesz stos? Ponieważ kod startowy C inicjalizuje stos bardzo wcześnie, najpewniej jest on inicjalizowany zanim zainicjalizowany zostaje kontroler SDRAM. Kod inicjalizacji SDRAM musisz umieścić w sekcji .init0. Druga sprawa, że ox 0x800000 zaszyna się wewnętrzny SRAM mikrokontrolera, sekcja dla SDRAM powinna się zaczynać po SRAM (SRAM...
Dziękuję super podpowiedź dzięki niej udało się ustalić optymalne wartości dla ramki hw i sw. Dyrektywa $DBG faktycznie bardzo przydatna można nią wyliczyć wartości stosów dla całego programu, albo dla jakiejś jednej funkcji/procedury. Po utworzeniu pliku .log można użyć stack analizera , no i super :) Niestety nie sprawdza się dla rozbudowanych programów...
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...
Polimorfizm i metody wirtualne zajmują pamięć w sposób statyczny, więc one nie wygenerują problemu Chodziło mi o to, że tego typu mechanizmy, nie stosowane z umiarem, mogą spowodować trudną do skontrolowania zajętość SRAM (właśnie głównie z powodu VTables), a to czy nałożenie się sterty na stos nastąpi z jednej lub drugiej strony, to już naprawdę nie...
Dobrze. To może tak: Dla czego mając 16kb FLASH nie mogę przekroczyć 60% przy kompilacji zajętości w M168 ? Po przekroczeniu tej wartości program kompiluje się, ale przestaje odpowiadać lub robi błędy po wgraniu do UC. Ustawienia stosu nic nie dają.
(at)Mscichu Nie wiem jak z zajętością RAM w sowim systemie stoisz ale to: [syntax=c] FIL fil; /* File object */ TCHAR line[512]; /* Line buffer */ [/syntax] zajmuje na dzień dobry ponad 1KB stosu.
To co znalazłem w pliku *.lss nie jest dla mnie w tej chwili zrozumiałe: To sbic oraz rjmp zajmuje się testowaniem flagi zajętości EEPROM. W opisie do eeprom.h autorzy zaznaczyli, że funkcje najpierw sprawdzają zajętość podsystemu odpowiedzialnego za EEPROM. Szczegóły implementacji będą w źródłach AVR-libc, one się trochę różnią pomiędzy procesorami,...
A problemem nie jest przypadkiem nie tyle pamięć flash (bo tu BASCOM nie powinien dopuścić do nadpisania jakichś sektorów FLASH'a) co pamięć RAM? Czy przypadkiem stos i inne funkcje nie kolidują ze zmiennymi globalnymi i dlatego wszystko się sypie, bo nadpisuje się RAM?
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...
Problemów jest wiele: Podczas kolizji (w danej chwili kanał jest zajęty) Zigbee z reguły używa funkcji autrepeat - jednak problemem jest czas w którym przychodzi pakiet i to czy pakiet faktycznie nie został odebrany czy może został odebrany ale potwierdzenie odebrania nie zostało poprawnie przyjęte przez transmitter - niestety trzeba mieć time stamp'y...
Skompilowałem to po wyeliminowaniu błędów. Pochodzą tylko i wyłącznie z funkcji specyficznych dla lpc210x. Z tego co mi się udało zaobserwować z kompilacji to RAM-u potrzeba 28 KB w tym: bufor na dane wyjściowe i cała pamięć alokowana przez dekoder. Nie wiem ile będzie zajmował stos. Jak określiłeś zajętość RAM, przez analizę kodu czy są jakieś inne...
Zajętość RAM: proste - stos. Dodaj do tego narzut na przekazywanie zbędnych argumentów. Sugerujesz, że programista powinien podzielić program na procedury i polegać na tym, że mądry współczesny kompilator z LTO z powrotem scali to w jeden liniowy kod? No cóż, można i tak, ale skoro chcemy uzyskać liniowy kod w jednym kawałku, to może prościej byłoby...
witam. ja z powodzeniem stosuje podanie 1/2 zasilania poprzez dzielnik 1k/1k. sprawdzam czy jest 1/2 zasilania jeżeli tak to jest wolna. ale przy dużym ruchu są kolizje. rozwiązałem je w ten sposób: -powstał układ master nad masterami. -wysyła on kolejnym master'om zezwolenia na nadawanie i czeka aż zasygnalizują koniec działania. wtedy zezwala następnemu.....
To 80 kilka % to pamięć programu - na 99% używasz jej tylko do odczytu. Natomiast zajętość Data to pamięć RAM - te 1408 to zmienne globalne, do tego jeszcze dochodzi zajętość związana z zmiennymi tworzonymi w trakcie działania, zarówno w funkcji main, w wszystkich wywoływanych funkcjach i do tego jeszcze parametry funkcji i adresy powrotu po wywołaniu...
Witaj! Adruino i Uno i Nano z Atmegą328 na pokładzie. Mega328 czyli 2kB RAM :-) Standardowo, na jedną diodę potrzeba 8 lub 9 bajtów danych. 2048/8 = 256 diod. Przypuśćmy, że dane transkodowane sa "w locie". RGB - 3 bajty na LED. 2048/3 = 682 led ale gdzieś muszą mieścić się zmienne, stos. Pokaż log z kompilacji, pewnie zajętość ram jest 80 czy 90%...
Zajętość pamięci RAM jest oczywista - to po prostu rozmiar wszystkich zmiennych, jakie mogą zaistnieć w najgorszym przypadku przy największym poziomie zagnieżdżenia procedur plus po jakieś 20 bajtów na każdy poziom zagnieżdżenia To zależy od uC. AVR ma dużo rejestrów i stos jest w praktyce potrzeby tylko na adres powrotu. W przerwaniach, używane rejestry...
Jest kilka możliwości. Po pierwsze procesor nie powinien się grzać, jeśli się grzeje to znaczy, że przekraczasz jego parametry, gdzieś masz zwarcie, albo czymś niepoprawnie sterujesz. Druga możliwość - BASCOM kiepsko obsługuje AVRy z tak dużą ilością pamięci FLASH, ale ten problem powinien pojawić się po przekroczeniu 128kB zajętości, co ciebie chyba...
Może trochę spróbuję podsumować, bo, sądząc z pytań, odpowiedzi kolegow powyżej, aczkolwiek poprawne, moga być na nieco zbyt wysokim poziomie abstrakcji :) 1. Stałe są umieszczane w pamięci programu, a nie pamięci danych. 2. AVR gcc preferuje umieszczanie stałych wewnątrz kodu rozkazu umieszczającego ją w rejestrze. Krócej się nie da, bo załadowanie...
czujnik zajętość zajętość procesor zajętość dysku
atmega2560 bootloader schemat instalacja elektryczny bosch wsparcia toshiba
wentylatory rx6600 szpiegowanie telefonu
Instrukcja pompy ciepła Nulite 12 kW po polsku Przyczyny spalenia końcówki mocy w Denon