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.
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...
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...
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...
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...
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.
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...
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!!
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...
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...
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)...
Błędy są tylko przy linkowaniu to log. Z tego co kojarzę to -flto ma być czymś lepszym niż -fwhole-program. arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -Os -flto -Tstm32f4_flash.ld -static -Wl,-Map=out/Rejestrator.map,--cref,-u,R... -Wl,--start-group...
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...
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...
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...
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...
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...
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!!
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...
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...
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...
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...
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;...
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...
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...
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ęć.
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...
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...
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...
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....
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...
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...
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ł...
malloc stm32 malloc przerwaniu malloc winavr
wzmacniacz ul1111 sterownik fanuc versamax gniazdo smart
prądniczka obrotów taśmy prądniczka obrotów taśmy
Usuwanie utwardzonej żywicy epoksydowej, poliuretanowej, silikonowej z PCB, metalu, drewna Obudowa pilota Boxer TX351E-P80 – zamiennik Boxer WRC 3P, wymiary, kompatybilność