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. ...
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...
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...
1. Na stos , a czasami nawet 2 stosy trzeba poznaczyć jakiś obszar RAMU. Stos jest umieszczany zaraz za danymi czyli sekcjami data i bss. Rosnąc w dół może wejść na dane. Dlatego należy przewidzieć wystarczający rozmiar stosu(ów). Na temat zarządzania stosami i błędami można doktoraty pisać. Temat...
Trzeba też pamiętać, żeby zostawić trochę pamięci - od końca w dół rośnie stos.
nie znalazłem gotowej funkcji w gcc do odczytania wolnej / zajętej pamięci, więc próbowałem napisać własną - w tym problem jednak, że malloc(10000) radośnie działa, mimo, że proc ma 1kB ramu, sprawdzanie adresu też niewiele daje: w pętli alokuje po 100 bajtów mallokiem i za każdym razem sprawdzam, czy...
Nie ma takiej zależności. Jeśli nie korzystasz z dynamicznej alokacji pamięci to możesz to bardzo zgrubnie oszacować po ilości zmiennych automatycznych (lokalnych), a szczególnie tablic. To co czyni takie oszacowanie szczególnie trudnym to określenie stopnia zagnieżdżenia funkcji - bo to zajmuje sporo...
A jeśli chodzi o obliczenia, to dlaczego największą wartością utworzonej tablicy jest w tym przypadku =18323 (jaką można skompilować) Z obliczeń: 46+80+18323+stos(1024) jest mniej od RAM mojego procka =20kB (stm32f103c8t6). zainteresuj się tą flagą linkera -print-memory-usage Możesz coś więcej powiedzieć...
W ramie masz stos od końca jak ci przykrywa stos danymi tak będzie . Zobacz czy nie zgubiłeś gdzieś instrukcji pop . Często jest tak że programiści odkładają dane na stos a potem o nich zapominają i stos rośnie ...
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.
W jaki sposób dokładnie określić rozmiar __main_stack_size i __process_stack_size w skrypcie linkera? Nie da się - nawet jak sobie to sprawdzisz metodami o których piszesz to i tak jest to wartość "na oko". Co do wypełnienia stałymi danymi i podglądania, to samo podglądanie można wykonać przy użyciu...
Tue Feb 14 22:19:46 2012: The stack 'CSTACK' is filled to 100% (1024 bytes used out of 1024). The warning threshold is set to 90.% Na powyższy błąd natknąłem się, gdy zacząłem używać biblioteki fatfs. Nie mam pojęcia, skąd się może brać. Zwiększenie zajętości stosu nie następuje w miejscach, które...
Postaram się dołączyć wtc do kodu. Myślałem jeszcze o pamięci. Może potestować za pomocą MemoryFree ? 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...
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...
Niniejsze ćwiczenie ma na celu praktyczne zastosowanie metodologii tworzenia oprogramowania za pomocą ADT oraz zapoznanie się ze sposobem implementacj struktur wiązanych (dynamicznych, rekurencyjnych). Zadaniem jest zaimplementowanie kolejki priorytetowej w postaci ADT za pomocą jednej z wybranych...
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...
Przecież nie musisz wczytywać całego pliku na raz. Nie masz miejsca na 20kB, ale już 2kB spokojnie zmieścisz. Tekst z pliku z podstawionymi zmiennymi możesz wysłać bezpośrednio do klienta, albo zapisać do pliku. Nie masz czego analizować po zmianie zawartości pliku, jeśli napiszesz np. tak: Problem...
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...
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...
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...
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...
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.
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ż...
Podłącz według kawałka tego schematu, możesz podłączyć go np. do jakiejś '51 zamieszczam jeszcze procedury inicjujące LCD_INIT: MOV A,#0FH ; inicjacja wyswietlacza LCD LCALL CZEKAJ ;opoznienie 15 ms czas w akumulatorze CLR RW ;RW==0 zapis do LCD CLR RS ;RS==0 zapisujemy...
slawek55 ---> twoje pytanie wynika z dużej niewiedzy na temat działania języka C .... warto poczytać dokładniej na te tematy. Ale jak jeszcze raz napiszesz, że gdzieś w kompilatorze czy symulatorze jest błąd - to ja ci już więcej nie pomogę ;) .... bo zawsze uważam to za jakąś masakrę, że ludzie zamiast...
Pozwolę sobie czepnąć się tego kodu, przynajmniej estetycznie: przekroczenie zakresu zmiennych w c to zdaje się zachowanie niezefiniowane? W związku z tym może się dla cnt bezboleśnie przekręcić licznik (tak jak chcemy tutaj) a może zacząć nadpisywać sąsiedni bajt - zależnie od kompilatora. Czy się...
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
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ę...
W ramach nauki postanowiłem zrobić urządzenie na stm32f1 (512kB Flash, 64kB RAM) funkcjonalnie przypominające Palmtopa z WinCE. W miarę rozrastania się programu zacząłem zbliżać się do granic pojemność RAM. Na początku nauki pominąłem pewne aspekty dotyczące zarządzaniem pamięcią ale program zaczyna...
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...
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...
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ą...
Dokładnie tak. Niestety nie jest to takie proste. Po pierwsze zużycie flash to co najmniej "text + data", a zużycie RAM to co najmniej "data + bss". Liczby te mogą (ale nie muszą) uwzględniać stosu i sterty. Całkiem często realnie zużycie statyczne jest nieco większe niż powyższe sumy. Dlatego...
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ś...
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...
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...
Przeniosę to przerwanie i tablice do plików .c. Ale wtedy w pliku głównym .c mam includować plik przerwania .c? Myślałem, że tam inkluduje się tylko pliki .h Nie musisz include'ować pliku .c, a nawet nie powinieneś. W Makefile dopisz go tylko do plików źródłowych (SRC = $(TARGET).c przerwanie.c inny_plik.c...
Nie mogę poradzić sobie z uruchomieniem tego wyświetlacza: .EQU K_LCD_DANE = DDRF ;kierunek portu wyświetlacza .EQU I_LCD_DANE = PINF ;wejście portu wyświetlacza .EQU O_LCD_DANE = PORTF ;wyjście portu wyświetlacza .EQU DB0 = 0 .EQU K_LCD_STER = DDRB ;kierunek portu sterowania...
Witam Utworzyłem nowy temat ponieważ nie widziałem żadnego podobnego tematu na elektrodzie. Otóż potrzebuję pomocy odnośnie wyświetlania znaków na wyświetlaczu LCD. Jest on zgodny z HD44780 (jego numer to: WC1602ASFYLY...). Chodzi mi o kod programu napisany w języku Assembler tylko, że bez dołączanych...
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ą.
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, Używam tylko IRQ, wiem że są jeszcze FIQ ale tych nie używam. Z tego co wiem to one mają nawet osobne piny na uC. Mój cały program zajmuje 46kB. A zajętość pamięci to nie bardzo wiem jak to sprawdzić. W sumie ponieważ używam wszystkie USART-4 oraz SPI do obsługi podpiętych urządzeń, w kodzie...
Nad przekaźnikami też się zastanawiam, ale raczej będzie to ostateczność. Bezpieczeństwo jest tu najważniejsze a przekaźniki mają tendencje do sklejania się styków lub innych, nawet opisywanych przez ciebie uszkodzeń. Zwróć uwagę że, opisywane problemy tyczą się raczej dużych prądów. Przy małych prądach,...
całkowita zajętość pamięci RAM wynosi 0! A stos gdzie?
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
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ć...
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.
Wygląda na to, że możliwe, że jest to któreś z proponowanych rozwiązań. Co do bufora wejściowego to zwiększałem go do 4048 i nic. Bardziej wygląda to na coś z pamięcią i ze stosem, ale jak to sprawdzić? Oczywiście nie można zrobić wektora 1500 bajtów w ATmega8 - tam próbowałem różne wartości, mieszczące...
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...
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 -...
(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.
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.
Brakowało pamięci RAM. Kompilator pokazywał około 1,2k wolnego ale jak podliczyłem dynamiczne zmienne to mi wyszło, że może brakować kilka bajtów. Korzystałeś może z biblioteki Adafruit? Staram się unikać bibliotek z tej stajni - w ogóle nie są one optymalizowane pod kątem zajętości sterty w SRAM....
Robo24 napisał: Z dynamiczną alokacją pamięci na mikrokontrolerach trzeba uważać, często powoduje problemy. Niektóre kompilatory nie dopuszczają opcji dynamicznej alokacji pamięci, nawet nie umożliwiają wywołania rekurencji (model reentrant i non-reentrant). Szczególnie dla uc 8-bitowych....
No dobra. Coś mam. Nie udało się tego zrobić na STM32CubeIDE, ponieważ wejście do opcji projektu (prawym na projekt > Properties ) a następnie do istotnych C/C++ General > Preprocessor Include Paths, Macros etc. powoduje u mnie pojawienie się okienka z błędem że "The currently displayed page contains...
Myslę, że w następnej edycji trochę o skryptach linkera powinno się znaleźć. Kol (at)tmf na pewno nad tym pracuje. Dostęp przez wskaźniki jest mało wygodny, lepiej używać do tego C - niech samo sobie liczy adresy zajętości i tym podobne drobnostki. Ale to wymaga odrobinę więcej zachodu i wiedzy...
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 LDI R16,high (RAMEND) OUT SPH,R16 LDI R16,low (RAMEND) OUT SPL,R16 CLR R0 //.....
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ć".
Obejrzyj komunikaty kompilacji - zajętość pamięci RAM. Potem dodaj do tego jakieś 50 bajtów stosu, którym dość rozrzutnie gospodarujesz i policz, ile razy przekroczyłeś dostępną pamięć RAM. Weźmy chociażby to: static uint8_t displayBuffer Zajętość RAM według kompilatora to 86%. Ten fragment kodu: static...
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...