Chodzi mi jak na stm zaimplementowałeś/skad wziales funkcje malloc/free.
Z kodu wynika pewna ciekawa rzecz... Otóż z tego co widzę stos znajduje się... w środku sekcji .bss - nie wiem czy to normalne, ale nie sądzę... 4\/3!!
malloc rezerwuje bloki pamięci na stercie poprzez _sbrk_r() z syscalls.c. Sprawdź czy sbrk zgrywa się ze skryptem linkera.
Witam, wiem, że temat stary, ale też używam Keila i przyszła mi potrzeba za alokować 2kB pamięci, żeby wczytać dane z zewnętrznego ramu i zapisać w zewnętrznym flashu i też malloc zwracał mi wskaźnik NULL i w moim przypadku wystarczyło w pliku *.s zmienić Heap_Size EQU 0x00000200 na Heap_Size EQU 0x00000F00
Wywołanie _sbrk() nie jest alokacją pamięci. 4\/3!!
Dobra wszystko działa. Dodano po 3 Dobra. Dzięki freedi. A czy to normalne że to co zajmowało 1kB teraz zajmuje 65kB? W avr'ku w 16kB zmieściłem całkiem dużo kodu C++ i to z floatami.
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!!
Ten rdzeń ma potok, więc też nie panikuj z tymi cyklami zegara. To naprawdę jest dosyć szybki procek (roznymi rzeczami go katowałem, malloc w przerwaniu tez robil...) A w razie czego zawsze możesz podnieść zegar...
Programy w Linuksie korzystaj z bibliotek zwanych POSIX. Nie ma szans, żeby skompilować taki program na stm32 wiec to nie jest kwestia toolchain, tylko środowiska. Albo, lepsza baza, np RPI albo sportować kod na jakiś OS, jak np. FreeRTOS, tyle że malloc będzie praktycznie nie dostępny a to może być poważny problem, czasami da się gdy nie jest on mocno...
Freddie rozumiem, ze korzystasz z gcc i nieużywane sekcje wyrzuciłeś? No raczej (; Ja to rozwiązanie stosowałem jeszcze z TrueStudio i poza zwiększeniem rozmiaru o tego stringa nic mi nie "urosło" ;] Musiało Ci coś brakować do pełnego działania programu (; W końcu analiza takiego zakręconego stringa nie jest do zrobienia w 2 linijkach (chyba że obydwie...
Jeszcze posprawdzam proponowane przez Ciebie zmiany. A masz skrypt do Atmeli ? Co do _sbrk to dziwne jest, bo ten sam kod (implementacja malloc() jest w pliku heap_2.c) działa na LPC2148 i na STM32, więc nie wiem dlaczego tu nie wstaje. RTOS na pewno używa wyjątku SWI.
Coś naplątałeś... Aby uzywać malloca bez dziwnych errorów, musisz zadeklarować odpowiednią ilość miejsca na stertę . Co z tego, ze twoje zmienne zajmują niewiele ramu, skoro najpewniej ustawiles sobie parę kB sterty, i gdy przekroczysz te pare kB, program ci sie natychmiast wykrzaczy, bo oczywiście najpewniej nigdy nie sprawdzasz, czy malloc przypadkiem...
Owszem. Ale to makro jest definiowane co najmniej na dwa sposoby, np. w konkretnych aplikacjach przykładowych z STM. Czyli widać jasno że problem znany ludziom z STM i sami panują jakoś nad tym. Starasz się ich wybielić, co jest zupełnie niepotrzebnie, bo ich dokonania na przestrzeni lat pokazują, że o programowaniu zbyt wiele nie wiedzą. Przykładowo...
Zacząłbym od ZNACZNEGO uproszczenia opcji kompilacji, wiele z tych flag nie ma sensu. Wywal na początek te: -static -Wl,-Map=out/Rejestrator.map,--cref,-u,R... -Wl,--start-group -lgcc -lc -lc -lm -Wl,--end-group --specs=nano.specs -u _printf_float zostaw tylko tyle: -Wl,-Map=out/Rejestrator.map,--cref,--no...
Witam, Zasiadłem do STM32 i zaczynam implementować coraz kolejne funkcjonalności do mojego projektu. Napotkałem jednak problem. Chodzi tu o używanie funkcji malloc() lub printf(). Chodzi o to, że program się nie kompiluje ponieważ brak jest referencji do _sbrk. Przeszukałem Google i znalazłem przykładową funkcję. Funkcja ta potrzebuje dodatkowych informacji...
Funkcje malloc i free nie są reentrant. Powinieneś zadbać sam aby były thread safe. W newlib możesz przeciążyć funkcje: malloc_lock malloc_unlock http://sourceware.org/newlib/libc.html#g... EDIT: W sumie to wyłączasz przerwania ;) Niedoczytałem. W takim razie pewnie masz gdzies wyciek pamięci.
Odswieżę temat, poniewaz problem powrócił, a dotyczy zmiennych deklarowanych jako const. Zauważyłem, że nie ważne w jakim sa pliku deklarowane, w jakiej kolejności to i tak ladują na końcu flasha, jest opcja żeby wymusic na nich żeby znajdowały sie tam gdzie kod z pliku w którym sie znajduja? W skrypcie linkiera moge jedynie przestawic, żeby sekcja...
A tak na serio, to mnie najbardziej interesowałaby opcja opisana na ostatniej stronie jako "najbardziej interesująca", a więc wykorzystanie startupa i skryptów linkera (i tylko tych plików) dostarczanych razem z biblioteką (w połączeniu z "pierdołami" typu sbrk, malloc itp itp) No ale tu nie ma co opisywać, bo to będzie generalnie identycznie jak w...
Potrzebuję w projekcie użyć dynamicznej alokacji pamięci, niestety malloc() zawsze zwraca mi NULL. 1. Proponuję nie używać malloc w projektach embedded. 2. Najprawdoposobniej sbrk jest tylko "kadłubkowa" dla zapernienia linkowania się kodu. Co zrobić: 1. Jeżeli się już uparłeś na "malloc" to proponował bym freeRTOS-a z jego implementacją heap4.c albo...
Myślałem że po prostu funkcję wybiera się przez dołączenie heap_1-2-3? Właśnie o to mi chodzi - jedna z tych metod korzysta po prostu ze standardowego malloc() i wtedy trzeba zadbać o jego poprawne działanie m.in. właśnie poprzez poprawną implementację sbrk() i stosowne definicje w skrypcie linkera. Pośrednia wersja chyba jest "samowystarczalna", ale...
No i pojawił mi się następny, gorszy problem (tamten został już rozwiązany). Otóż okazuje się, że w momencie kiedy użyję gdziekolwiek w programie funkcji malloc wynikowy wsad jest kompletnie niepoprawny pomimo iż kompilator nie zgłasza żadnych błędów. Program automatycznie się zawiesza, nie zostaje wykonana nawet choćby jedna linijka z funkcji main()....
Nawet nie trzeba pisać całego menagera pamięci, wystarczy poprawić funkcje free/malloc/alloc/realloc tak, aby zmieniały wartość zmiennej globalnej określającej wielkość wolnego obszaru sterty - w c++ właściwie wystarczyłoby pokryć operatory new i delete oraz new[] i delete[]. Z drugiej strony wobec istnienia stosu na niewiele to by się zdało.
Przepraszam, że tak późno ale wcześniej nie miałem możliwości tego wstawić. Logi z kompilacji po "clean" 21:09:55 **** Rebuild of configuration Debug for project test_timera_v5 **** Info: Internal Builder is used for build arm-atollic-eabi-gcc -c ..\src\system_stm32f0xx.c -mthumb -mcpu=cortex-m0 -std=gnu11 -DSTM32F030xC -DHSI48_VALUE=((uint32_t)48000000)...
Ja nie lubię STM32, a STM32 mnie! Muszę coś zrobić na STM32 i robię to w Truestudio. Na razie proste testy na przypomnienie sobie STMów i wejście w C++ i na dzień dobry ściana! Po kompilacji w tablicy wektorów przerwań jest tylko adres na DefaultHandler. Mimo tego, że nazwa funkcji obsługi przerwania jest taka sama jak w pliku ze startupem i funkcja...
Sprytne ;) Działa, ale proszę o rzucenie okiem czy nie ma tam rażących błędów [syntax=c] T_EEPROM_Data Struktura_odczytana; //Pusta struktura memset(&Struktura_odczytana, 0, sizeof(Struktura_odczytana)); char *bytebybyte = (char*)&EEPROM_Data; char bajt; int size = sizeof(EEPROM_Data); Erase_EEPROM(); Unlock_EEPROM(); for(i = 0; i < size;...
Ja używam typedef struktur i wskaźników na nie, inicjalizowanych przez malloc. Czemu tak? Bo tak sobie wymyśliłem, że jak program urośnie to rangi wieloprocesowej (wielowątkowej) to łatwiej będzie nad tym zapanować. Bardzo łatwo zaalokować wtedy dużą ilość struktur i potem wywołać kolejne wątki przez przekazanie wskaźnika do struktury. Plus ewentualne...
Cały kod dzieli się na dwie części bootloader + główna aplikacja. MAC zainicjowany w bootloaderze działa poprawnie, pingi latają, dhcp działa, zaprogramować flash się przez niego da. Dokładnie ten sam kod w głównej aplikacji nie działa. Tj - nie ma przerwań i nie działa DMA. Wysłanie pakietu po inicjalizacji działa, tak jakby, wireshark pokazuje że...
To coś dynamicznego nazywa się sterta i korzystają z tego przecież takie funkcje jak malloc. Chyba, że chodzi Ci o to, żeby stos zmienial swój rozmiar podczas pracy programu? Dla RTOSów, to raczaj nie możliwe, każdy stack (dla oddzielnego taska) na sztywno zazwyczaj dostaje przydział miejsca dla siebie. No a bez RTOSa, to jak sobie w dobrym miejscu...
teraz nie będzie wiadomo którą wybrać, bo nie wiem które LPC są teraz "na topie" (; Nie co patrzeć na to co jest na topie bo to nie ma większego znaczenia dla projektu. Do migającej diody (bo takie projekty dla tych płytek są na topie) każda płytka się nada. Im świeższy procesor tym lepiej. Teraz skupili się na LPC541xx i to jest ciekawy przypadek...
gaskoin Dzięki za odpowiedź! Bytes dochodzi do wartości 53381, dlaczego malloc nie zwraca NULL jeżeli nie może za alokować danego obszaru pamięci? Ten "test" nie jest na stałe w programie, został dodany tylko do sprawdzenia czy nie wycieka mi pamięć.
Jeszcze jedno. :) W pliku od STM można określić minimalną wielkość dla sterty i stosu, jak wspomniał BlueDraco sterta jest potrzebna dla dynamicznej alokacji, czyli jeśli w projekcie nie korzystam z wszelkich malloc/callock itp. to nie potrzebuję ustawiać sterty? może zostać 0? Z kolei dla stosu podaję minimalną wielkość czyli stos może sobie rosnąć...
Witam, Mam zainstalowany kompilator Sourcery CodeBench Lite 2011.09-69 oraz Eclipse 7.0.2. Próbuję skompilować przykład "IOToggle" z biblioteki ST, wzorując się na ustawieniach z TrueStudio, w którym nie ma problemu z kompilacją. Zmieniłem flagi na -mfloat-abi=hard i mam następujący błąd: arm-none-eabi-gcc -static -mthumb -mcpu=cortex-m4 -mfloat-abi=hard...
Tu już zdążyłeś napisać 10 tysięcy lniii kodu? Szacun. Ja przestałem się mieścić w darmowej wersji dopiero w projekcie, który przekroczył 18 tysięcy - i ten projekt jako jeden z trzech utrzymuję w środowisku Eclipsowym (ale nie DIY). 1. Linia linii nierówna - u Ciebie 18 tysięcy linii kodu (zakładam, że "kodu", bez wliczania komentarzy i pustych linii)...
czyli od adresu 2000a670 w górę powinien być stack, no i jest(no i stos był zainicjowany zerami) Raczej odwrotnie - stosy są pomiędzy adresem z __stack_start (niższym) a adresem z __stack_end (wyższym). Stosy "rosną" w dół - zaczynają się na wyższych adresach, SP przy "zagłębianiu" się w program się ZMNIEJSZA. W ARM jest typ stosu określany jako "full...
Co to są za brednie? Watchdog reset nie powoduje wyjątku HardFault , tylko SYSRESETREQ (sygnal wewnetrzny resetujący procesor). Po raz setny napiszę, kiedy hardfault wystepuje najczęsciej: - zapis nieprawidlowego adresu (instrukcje STR,STRB,STRH,STREX,STM...) - niedozwolone kombinacje przy PSR - wykrzaczenie się stosu lub źle wyrównany stos - użycie...
Jeśli chodzi o programator, to ten już zamówiłem - JTag. Z tego co już zdążyłem zauważyć, potrzebna mi będzie duża ilość pamięci. W programie dość znacznie używam malloc-a i free, jednak już na starcie potrzebuję zająć sobie dwie macierze o wielkości 20x1, bo zjada mi dość sporo zasobów - sprawdzam je przez heapwalk() w programie CrossWorks. EDIT: A...
Kilka stert się przydaje w przypadku gdy wykorzystywane są jednocześnie: - duże bloki pamięci na konfiguracje, fifo/lifo raczej stałej lecz dynamicznej wielkości o elementach z stałym size; rzadko są malloc-owane i free-owane - średnie bloki pamięci na bufory tymczasowe; średnio często alokowane i zwalniane - małe bloki pamięci na obiekty roznego typu...
Witam Po kilku dniach z NutTx i z HY-mini STM32. sam nuttx potrzebuje około 6k ramu zostaje nam 42k (HY-mini STM32 ma 48K). Jedna wada... jedyna: uruchamiam np aplikację.... mogę max otworzyć 4-5. (potem system się wiesza). Na razie walczę z tym tak że. Jak startuje system uruchamiam wszystkie strony jakie mam, one lądują na pasku(tam gdzie zielony...
Masz coś bardzo solidnie zepsute w projekcie. malloc() żąda od _sbrk_r() zwykle segmentów typu 1kB - 4kB. Na pewno nie spodziewaj się tam liczby 2 (generalnie _sbrk_r() alokuje "strony"), ale na pewno nie więcej niż kilka kB. 4\/3!!
Od jakiegoś czasu nie importuję gotowych rozwiązań bibliotek C, tworząc własne - o dużej gęstości informacji, co przypadkiem przekłada się na wydajność i wyliczony koszt zużytej energii/funkcję. Wymaga to dużego nakładu pracy - to prawda. Przepisywanie rejestrów nie jest czasochłonne, po jakimś czasie zdefiniowanie jakiegoś procesora zajmuje pojedyncze...
Providera? Nie rozumiem. Zawsze używałem Zylin, odkąd przeczytałem o tym w tutorialu Freddiego. ;) Program na pewno wgrywa się prawidłowo. Sprawdziłem ST-LINK Utility na Windows. Chyba masz rację z tymi symbolami debugowania. Ale to jest dziwne bo mam -g przy kompilacji: /home/(...)/arm/gcc-arm-none-eab... -mcpu=cortex-m3...
Hejka, robię właśnie przesiadkę projektu z kompilatora IAR'a do GCC'a i mam problem z przeniesieniem niektórych ustawień, konkretniej chodzi o nie wycinanie przez linker konkretnych, nieużywanych zmiennych globalnych wygenerowanych przez zewnętrzne narzędzie, zawierających informacje np. o dacie buildu, checksumie itp. które są potem w przypadku reklamacji...
Korzystam z: Układ STM32 P103 (procesor STM32 F103 RBT6) Programator ARM-USB-OCD-H Środowisko CrossWorks v2.1.1 Problem: Pisząc własną obsługę USB wzorowałem się na przykładzie dla Keila (USB HID) i paczce z przykładowymi programami do USB ze strony Olimexa dla układu STM32 P103. Pierwszy (dla Keila) nie działał (operował na innych PINach itp.) ale...
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....
Chciałbym pomóc, ale... 1) Jak skonfigurowales DMA? Czy co koniec transmisji alokujesz nowy bufor i stawiasz tam wskaznik DMA? Czy może masz dwa bufory (ping-pong) i jeden przetwarzasz gdy w drugi DMA ładuje dane...? Ja na twoim miejscu wykorzystałbym właśnie ping-pong. W przerwaniu od DMA[TCIF] przelaczałbym tylko wskaznik na bufor i rekonfigurował...
Najbezpieczniej jest mieć stos "na początku RAMu kropka". Nie "za zmiennymi", tylko na fizycznym początku pamięci, PRZED tymi zmiennymi. W CrossWorks jest właśnie inaczej - adres wierzchołka stosu jest za obszarem zmiennych. Większość procesorów w których SP jest dekrementowany przy odkładaniu danych stos ustawia się na końcu pamięci. Jest takie przysłowie...
Witajcie. Zacząłem jakieś 2 miesiące temu przygodę z ARMami na przykładzie STM32. Moim celem jest przygotowanie samochodowego odtwarzacza mp3 zastępującego zmieniarkę CD. Początek zabawy przeszedł dość gładko i po paru dniach już odtwarzałem muzykę z pendrive'a. Jednak odbywało się to w pętli, więc równoczesna aktualizacja wyświetlacza czy inne czynności...
Freddie: no niezupełnie - zwykły malloc nie blokuje wątku do czasu zwolnienia pamięci przez inny wątek - na tym właśnie polega problem z dynamiczną alokacją w małym mikrokontrolerze z RTOSem.
chodzi o ALIGN ? Dokładnie, chodzi o ALIGN, ale nie tylko, bo generalnie ALIGNem wyrównujesz początek, a chodzi o wyrównanie końca... <: Wszystko zależy od konkretnej konstrukcji skryptu linkera i startupa... Zobacz jak to jest zrobione w moich przykładach (stm32). jaką flage trzeba dodać, aby kompilator ignorował przypisywanie do samego siebie?...
Kod: [syntax=c]#include <string.h> //Return copy of str string from index position and len length char *StrCpy2(char *str, unsigned short index, unsigned char len) { char *text; text = (char *)malloc(sizeof(char)*(len+1)); if (text == NULL) return text; strncpy(text, str + index, len); text[len] = '\0'; return text; }[/syntax] Odnoszący się do...
[syntax=c]double* xcorr_table = malloc(Na*Ma*sizeof(double));[/syntax]
Powinienies kompilowac tylko jeden plik z katalogu MemMang: - 1. Poll Manager - 2 Manager oparty na liscie dwukierunkowej - 3. Biblioteczny malloc - 4 Nie pamietam Dodatkowo zdefiniuj w Twojej aplikacji 2 funkcje: - void vApplicationTickHook(void) - void vApplicationStackOverflowHook(void)
Witam, Mam pytanie ogólne o to jak wygląda zawodowa praca programisty embedded. Obecnie pracuję jako inżynier elektronik, ale mikrokontrolery to moje hobby i uważam, że nadszedł czas wejścia na wyższy poziom. Na rozmowie którą niedawno miałem mój poziom został oceniony na Junior+, ale jeszcze nie Mid. Moje pytania: 1. Czy programuje się bezpośrednio...
2-3. Sterta to jest to miejsce z którego kożysta malloc itd. Czyli przestrzeń pamięci dynamicznie przydzielana. Ja osobiście robię tak, że wskaźnik stosu umieszczam na końcu ramu, a stertę zaraz po danych. Przydzielając kolejne kawałki pamięci w _sbrk sprawdzam czy sterta nie bedzie nachodziła na stos (Oczywiście z pewnym małym marginesem) i przydzielam...
Swoją drogą kiedyś wymyśliłem, że najlepiej byłoby umieścić stos na samym początku RAM, potem .data, .bss i na końcu heap - tym sposobem przekroczenie zarówno stosu jak i heap nie spowoduje kasowania zmiennych, a do tego jeśli procesor generuje jakieś przerwanie z okazji zapisu pod nieistniejący adres, to można nawet obsłużyć taką sytuację <: Niestety...
Twoja tablica jest alokowana na stosie, ktorego jest ograniczona ilosc (w skrypcie linkera mozesz ja zwiekszyc). Tworzenie duzych obiektow na stosie nie jest zbyt dobrym rozwiazaniem. Powinienes w takim przypadku uzyc tablicy globalnej lub zaalokowac ja dynamicznie (za pomoca malloc).
Jeśli chcesz to zdebuggować, to możesz się "zaopatrzyć" w bleeding-edge-toolchain ( https://github.com/FreddieChopin/bleedin... ). Jest on kompilowany praktycznie tak samo jak toolchain ARMowy, z tym że biblioteki zawierają wszystkie symbole, a więc można je spokojnie debuggować i widzisz co się dzieje. Z Twojego opisu wynika, że problem...
Zmniejszyć użycie pamięci, nie bardzo, nie mam pomysłu - być może przy konfiguracji parametrów dekompresji. Będziesz mógł użyć zewnętrznego SRAMu o ile napiszesz sobie menedżera zarządzania pamięcią. Zgaduje że w tej chwili korzystasz z domyślnego, czyli takiego który poprostu woła malloc'a (jmemnobs.c). Przeczytaj rozdział "Memory management" tutaj...
O dzięki, przeoczyłem to. Zmniejszyłem opóźnienie o 1/3 bo F0 taktuje z 48MHz a F1 z 72MHz, ale nadal nic się nie wyświetla :( Dodano po 13 Z kolei na tym kodzie wyświetla znak zapytania:/ Niezależnie od tego co bym chciał aby wyświetlił. main: [syntax=c]#include "lcd_hd44780_lib.h" int main(void) { lcd_init(); lcd_writecommand(HD44780_CLEAR); while(1)...
A co Ty piszesz o swoim RTOSie? Przecież wielokrotnie już w tym wątku napisałem, że przesadne skupianie się na prędkości jest bezcelowe (; Moja uwaga odnosiła się tylko do tego, że rzekomo taka a nie inna architektura FreeRTOSa jest podyktowana jakimiś ograniczeniami zasobów. Po prostu takie myślenie jest błędne, bo FreeRTOS po prostu _jest_ wolny,...
Da się to zrobić robiąc heapa programowego, no ale tu pozostaje kwestia tego jak tym heapem zarządzać. Można mieć heap per object (każda klasa ma z góry założoną pulę pamięci jaką można przeznaczyć na obiekty), ale w bardziej złożonych przypadkach wymaga to napisania jakiegoś chociażby prostego MemoryAllocatora, który zajmie się sprawdzaniem wolnej...
Zle mnie zrozumiałeś :), albo ja źle zapisałem :) _sbrk_r() razem z malloc działają :) Ale kolejno bo inaczej będzie chaos. printf ("Hej, ja działam!"); - wywołuje w pracy krokowej kolejno : 1. ssize_t _write_r ( struct _reent *r, int file, char *buf, size_t nbyte) 2. No source available for "_fflush_r() " 3. No source available for "_vfprintf_r() "...
Napisałem program obsługujący komunikację RS232 dla płytki STM32 P103: - dokumentacja płytki https://www.olimex.com/dev/pdf/ARM/ST/ST... - schemat https://www.olimex.com/dev/images/ARM/ST... Niestety łącząc docelowo przez konwerter RS232 -> RS485 i podłączając do serwomechanizmu RS28 dynamixel podłączyłem raz zasilanie 15V,...
Mam dziwny problem ze wskaźnikiem na funkcję. W kodzie jak poniżej pole initDriver nie jest inicjowane adresem funkcji (0x0800ecd0), tylko jakby popsutym (0x8800ecd1). Wygląda jakby coś niepotrzebnie ustawiało dwa bity w adresie, najmłodszy i najstarszy. Jakie może być wytłumaczenie? [syntax=c] drv = (struct at_ble_drv_t*) ble_memalloc(sizeof(struct...
Witam, otóż zasilam owy wyświetlacz napięciem ±3.3V, a także stany logiczne są na tym poziomie. Pin kontrastu jest podpięty bezpośrednio do masy, kontrast wizualnie wydaje się być dobrany idealnie. I problem w tym, że pixele bardzo wolno się zapalają.(wyszło mi ok. ~300ms na pełne zaświecenie pixela) Czy jest to jest maksimum wyświetlacza, czy...
Serwus, ale w tej chwili masz ( w kodzie który tu zamieściłeś) pvPortMalloc, a one alokują pamięć ze sterty, a jej po prostu nie ma... Ale nawet gdybyś dał tego standardowego malloca, to i tak masz problem, bo wielkość stosu, jaką podajesz dla taska jest liczona *8 - tyle jest alokowane ze sterty dla taska -> to jest u Ciebie 8*400 = 3200, a configTOTAL_HEAP_SIZE...
1. Dynamicznej alokacji pamięci używaj wtedy gdy potrzebujesz dużej ilości pamięci przez określony czas. Jak pamięć nie jest Ci już potrzebna to ją zwalniasz. Jeżeli masz jakieś zmienne, które używasz przez cały czas działania programu to malloc nie ma sensu. Zmienna statyczna zadeklarowana w funkcji ląduje w tym samym obszarze pamięci co zmienne globalne...
Jeśli używasz stosunkowo "starego" newliba (starszy niż max kilka miesięcy, mogę dokładnie sprawdzić), to malloc() w wersji "nano" _NIE_ nadaje się do działania wielowątkowego choćbyś nie wiem co zrobił. W nowszych newlibach trzeba sobie przedefiniować dwie funkcje i dodać tam np. blokowanie mutexów. Inna opcja to przedefiniowanie malloc() i free()...
Malloc jest ok. Jak nie chcesz malloca to na stałe zarezerwuj bufor 512 bajty (wyrównany) i zapisuj po jednym bloku. To samo tyczy się funkcji odczytującej bloki.
Witam, procesor jak w tytule, startup, skrypt linkera z Distortos, nagłowkowe od ST. Zestaw oparty na STM32F746I z SDRAM 8MB. Sterta w SDRAM, skrypt linkera przerobiony pod SDRAM. [syntax=c] MEMORY { flash : org = 0x8000000, len = 1048576 flashVma : org = 0x200000, len = 1048576 SRAM : org = 0x20000000, len = 327680 ITCM : org = 0x0, len = 16384 BKPSRAM...
Operator new używa malloc() i wyjątków, a obsługa tych dwóch wymaga dostarczenia funkcji zwanych "syscalls" - takich jak właśnie close, exit, sbrk, write, read, itd. Najlepszym rozwiązaniem jest zastąpienie domyślnego operatora new swoim własnym (takim który wywołuje tylko malloc() ). Wielu "problemów" unikniesz dodając gdzieś w kodzie coś takiego:...
Jeśli na pewno ustawiłeś ten stos co trzeba (__main_stack_size), to zapewne problem jest gdzie indziej. Niemniej jednak zagnieżdżanie przerwań w których wykorzystywany jest sprintf() nie wydaje mi się dobrym pomysłem... Funkcja ta może korzystać z malloc() i free(), a te dwie funkcje nie mogą być przerywane... Jeśli używasz normalnego toolchaina (tego...
Tak jakby Ride-7 miał własną tą bibliotekę (chociaż wątpię) No to nie wątp (; Rozwiązania masz następujące: 1. Możesz spróbować dodać do linkowania opcjię -lnosys (zakładając, że Twój kompilator ma bibliotekę libnosys.a - linaro ma, CodeSourcery nie wiem) - może zadziała, ale pewnie i tak pewne dopasowanie nazw ze skryptu linkera będzie potrzebne 2....
Witam OK, zamieszczam nowy kod źródłowy i wsad do mikrokontrolera programu radiomagnetofonu, w którym usunąłem błąd powodujący wyciek pamięci podczas grania radia oraz dodałem dwa usprawnienia poza tym. Błąd wycieku pamięci polegał na zgłoszeniu faktu braku pamięci przez dekoder AAC podczas kolejnej próby nawiązania połączenia z serwerem wybranej stacji...
Być może masz jakąś dziwną potrzebę posiadania tych sekcji "frame", ale zakładając, że nie, to wywal je z pliku linkera, przeznacz całą pamięć SDRAM na stertę i najzwyczajniej w świecie zaalokuj wszystko poprzez malloc() (lub cokolwiek używasz do zarządzania stertą).
Na pierwszy rzut oka biblioteka nie ma prawa działać, bo przebiegi czasowe przez nią generowane mają się nijak do protokołu szyny HD44780. Funkcje ReadNibble i WriteNibble nie przypominają niczego, co chciałby zrozumieć sterownik HD44780 - zła kolejność zdarzeń, trudne do zgadnięcia parametry czasowe, zależne m.in. od częstotliwości zegara procesora....
`sprintf()` używa bardzo dużo pamięci. Niewinnie wyglądające `val * 3.3 / 4095;` to w istocie mnożenie na typie `double` (standardowy błąd osób które biorą się za zmienny przecinek). Proponuję więc zacząć od: - użycia `s i printf()` (wersja bez wsparcia dla zmiennego przecinka, zużywa dużo mniej RAMu, nie robi alokacji dynamicznej) [zakładam że mowa...
Hmmmm. Obejrzałem te wszystkie sbrk _sbrk itd. ze źródeł i w zasadzie od Twoich wersji się toto nie różni za bardzo. Pokombinuję z tym jeszcze, dam znać w razie czego ;) Debuger rzuca się o próbę dostępu do pamięci której nie ma - w okolicach górnych zakresów (pełno F-ów) Pzdr. EDIT: to chyba mamy winnego: malloc zwraca zawsze 0.
Dzień dobry. Zwracam się z problemem zmiany kontekstu danych w freeRTOSie którego właściwie nie potrafię zdefiniować z nazwy, otóż : Mikrokontroler STM32F303 współpracuje z wyświetlaczem LCD ITM 400x160 - matryca 8000 bajtów (pamięć ekranu) zdefiniowana w pamięci RAM jest na bieżąco wysyłana do wyświetlacza w przerwaniu z priorytetem wyższym niż RTOS...
I kontynuuję temat. Na razie kod taki: Czyli coś jest nie tak z wykrywaniem kolizji nadal... A moze prosty algorytm wektorowy - mniej wiecej tak z kolizjami radza sobie nowsze gry... [syntax=c] #include <stdio.h> #include <assert.h> #include <math.h> #include <SDL/SDL.h> #include <SDL/SDL_gfxPrimitives.h> typedef struct...
Pozwalam sobie odgrzać temat, bo właśnie zrezygnowałem z realizacji pracy magisterskiej o podobnym temacie - tyle że z nieco innego powodu. Może komuś się przydadzą moje doświadczenia. Jeżeli chodzi o płytkę DISCOVERY, Ethernet i IP, to - owszem - są gotowe przykłady (myślę o tych udostępnianych przez ST) ale ja zabrałem się za ten temat z trochę innej...
Tworzenie aplikacji użytkownika w C++ ma wiele zalet, więc nie jest zaskakujące, że język ten staje się coraz bardziej popularny wszędzie, w tym w systemach opartych na małych mikrokontrolerach. Projekt „mbed” jest w pełni skoncentrowany na tym języku. Wiele RTOSów zapewnia warstwę kompatybilności z C++, ale w przeciwieństwie do „dużych”...
Napisałem Ci funkcję ustawiająca AF, celowo rozbitą na poszczególne kroki. [syntax=bash]FAILED: test/CMakeFiles/distortosTest.dir/main.c... /home/freddie/arm-none-eabi-gcc-8.3.0-19... -DLFS_NO_DEBUG -DLFS_NO_ERROR -DLFS_NO_MALLOC -DLFS_NO_WARN -I../test -Iinclude -I../include -I../source/board/ST_32F746GDISCOVERY/in... -I../source/chip/STM32/peripherals/GPIOv...
freertos malloc malloc tablica malloc tablica dynamiczny
chrysler odpala kompresor nieszczelny lewitacja magnetyczny
Schemat układu zapłonowego Honda CB500 Uszkodzenie akumulatora: przyczyny i diagnostyka