Ok, samo _sbrk() nie alokuje pamięci. Nie mniej jednak _sbrk() może mieć mechanizm sprawdzający ilość pamięci dostępnej dla sterty. W związku z tym dlaczego ten rozmiar musi być w moim przypadku (a może nie tylko w moim) większy od 0x20+0x9E4 i gdzie jest to napisane, że rozmiar pamięci dostępnej dla utworzenia sterty musi być większy od jakiejś wartości?
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!!
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
malloc rezerwuje bloki pamięci na stercie poprzez _sbrk_r() z syscalls.c. Sprawdź czy sbrk zgrywa się ze skryptem linkera.
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...
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...
Koniec świata :D Freddie i FWLib :D 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). Bo nie po to w końcu producent procka...
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.
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...
stanleysts chodzi Tobie o samo malloc czy InitParser i createChild , samą alokacje czytalem sobie Tutaj http://home.agh.edu.pl/~gjn/dydaktyka/Te... a InitParser i createChild to sobie sam tak wymyśliłem że chciałbym mieć tak reprezentowane to w kodzie jak widać błędnie.
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...
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...
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...
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() "...
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.
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,...
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...
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)...
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!!
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...
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ś ). W wielu przypadkach jest to tak rozwiązane, ale w tych "wielu przypadkach" (czyli na PC) programy korzystają z dynamicznej alokacji znacznie częściej...
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...
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...
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...
Już sobie poradziłem, ale jest to problem. C:\MK\Projekty\distortos-master>dos2unix distortosConfiguration.mk dos2unix: converting file distortosConfiguration.mk to Unix format... C:\MK\Projekty\distortos-master>make clean rm -f -r output/ C:\MK\Projekty\distortos-master>make AWK scripts/makeDistortosConfiguration.awk CXX source/architecture/Stack.cpp...
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:...
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...
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...
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)...
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.
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...
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.
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...
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...
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...
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...
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()....
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...
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...
Czyli tak jak myslalem na począku heap to cała pamięć minus stos. Stosy (process i main) mam ustawione na 1024. Nie tworzę w programie żadnych dużych zmiennych mam tylko jedną globalna strukturę i jakieś pojedyncze zmienne Postawiłem natomiast breakpointa w tej funkcji sbrk i co ciekawe jako parametr size przekazywana jest do niej liczba 536870916 :O...
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)...
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....
[syntax=c]double* xcorr_table = malloc(Na*Ma*sizeof(double));[/syntax]
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...
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ąć...
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;...
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...
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...
Właśnie że powie, wystarczy leciutka modyfikacja którą opisałem (chodzi o dodatkową funkcję/zmienną która zawiera różnicę __heap_end i aktualnego "początku"), a do tego funkcja mallinfo(). Mam to zaimplementowane w jednym projekcie i wygląda to mniej więcej tak: struct mallinfo info = mallinfo(); const size_t sbrk_unallocated_size = sbrkMemoryLeft();...
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...
malloc stm32 malloc winavr malloc freertos
poszukiwać miernik blokada sieci zmiana czasu posnet
silnik andoria 1hc102 kamera cofania schemat podłączeń
Optymalne ustawienia Termet Ecocondens Crystal dla oszczędności Maszyna nieruchoma, silnik działa - przyczyny i rozwiązania