Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[STM32] Funkcja malloc powoduje/wywołuje przerwanie HardFault

rbrus 02 Dec 2011 13:13 2873 7
Computer Controls
  • #1
    rbrus
    Level 14  
    Witam,
    próbuję funkcją malloc() za alokować około 2kB danych, jednak procesor zamiast za alokować wybrany obszar pamięci, wpada w przerwanie Hard Fault, występuje jakiś problem. Pamięci mam wolnej tyle ile potrzeba gdyż program jeszcze nie jest bardzo rozbudowany oraz mogę statycznie za alokować 2kB danych albo więcej tzn. np. stworzyć zmienna globalna (tablicę) o rozmiarze 5kB i nie będzie problemu, wszystko działa jak trzeba.
    Jednak chcę to zrobić dynamicznie, dla wygody innego kodera żeby nie musiał poznawać całego protokołu jednego i drugiego, tylko będzie miał funkcję sendData(char *data) i tyle. w sendData oczywiście zostaną dodane różne potrzebne dane jak nagłówek - suma kontrolna itp.
    Processor to STM32F101CB czy orientuje się ktoś co może być przyczyną?
    Pozdrawiam
  • Computer Controls
  • Computer Controls
  • #3
    rbrus
    Level 14  
    Freddie Chopin wrote:
    Jaki komplilator? Jeśli gcc to skąd wziąłeś implementację sbrk() i czy na pewno pasuje ona do pozostałych plików (szczególnie skryptu linkera)?

    4\/3!!
    Keil uVision4, bazuje na przykładowym kodzie.
  • #5
    rbrus
    Level 14  
    Keil jako kompilator i IDE.

    Wszystko do tej pory działało, program rozwijam od co najmniej miesiąca i dopiero teraz jest problem. Malloc dla 20 elementów działa bez zarzutów. Jednak teraz mam potrzebę przesyłać paczki większe 0,5k - 2k i gdy alokuje taką ilość bajtów, wywoływane jest przerwanie HardFault.
  • #6
    genzi
    Level 10  
    Moim zdaniem nie jest to wina kompilatora. Powinieneś sprawdzić rozmiar sterty, ponieważ funkcja malloc właśnie w tym obszarze rezerwuje pamięć.
  • #7
    krru
    Level 33  
    Prawdopodobnie zepsuta jest lista wolnych bloków, na skutek jakiegoś zamazania pamięci. Jeśli masz jakieś dynamicznie allokowane tablice, to sprawdź dokładnie, czy nie wychodzisz poza zaalokowaną wielkość. Taka jest najczęściej przyczyna podobnych problemów, jednak nie wyklucza to innych.
  • #8
    LukasSandyra
    Level 11  
    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