2017-09-08 5 views
1

Ich arbeite an einer benutzerdefinierten Platine mit dem STM32F107VCT-Prozessor. Ich verwende FreeRTOS & lwIPSTM32 FreeRTOS lwIP Heap/Stack/Speicherverwaltung

Ich benutze tinyxml2 Bibliothek und Lesen/Schreiben in ein EEPROM und läuft in seltsame Korruptionsprobleme und Abstürze. Ich vermute, dass mir die Erinnerung ausgeht. Ich bin ziemlich neu eingebettete Electornics und FreeRTOS, bin also unsicher, wo ich hinschauen sollte.

erstelle ich ein paar Themen wie so:

osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 512); 
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); 
osThreadDef(RfTask, StartRfTask, osPriorityNormal, 0, 700); 
RfTaskHandle = osThreadCreate(osThread(RfTask), NULL); 
osThreadDef(DiscoveryTask, StartDiscoveryTask, osPriorityNormal, 0, 256); 
DisoveryTaskHandle = osThreadCreate(osThread(DiscoveryTask), NULL); 

zu Haufen im Zusammenhang einige meiner definiert Hier sind/

FreeRTOS.h 
define configTOTAL_HEAP_SIZE ((size_t)1024*24) 

Flash.id 
_estack = 0x20010000; /* end of RAM */ 
_Min_Heap_Size = 0; /* required amount of heap */ 
_Min_Stack_Size = 0x200; /* required amount of stack */ 

ich in meinem Kopf folgenden genau bin nicht wirklich stapeln, was Heap/Stack Theorie ist, und wie es sich auf die Zahlen in flash.id und FreeRTOS.h bezieht

Könnte mir jemand bitte eine Erklärung anbieten, wie das alles funktioniert, und alle Methoden, um die Menge zu überprüfen RAM verfügbar für die Aufgaben usw.?

Ich kann meinen Code auf Gitlab teilen, wenn

erforderlich

Vielen Dank

Antwort

0

nicht kommentieren, wie Sie Ihre lwIP Konfigurationsspeicher verwendet, aber soweit FreeRTOS betrifft:

Der von Ihrem Linker-Skript definierte Heap wird nur von FreeRTOS verwendet, wenn Sie heap_3.c in Ihren Build einschließen. Alle anderen Heap-Implementierungen, die mit FreeRTOS ausgeliefert werden, belegen Speicher aus einem statisch zugewiesenen Array. Wenn die gesamte Speicherzuweisung mithilfe der FreeRTOS-Speicherzuordner erfolgt, wird beim Definieren eines Heapspeichers im Linker-Skript RAM verschwendet, da dieser nicht verwendet wird. Weitere Informationen finden Sie unter http://www.freertos.org/a00111.html.

[auf einem STM32] Der Stapel, der von Ihrem Linker-Skript definiert wird, wird von main() vor dem Start des Schedulers verwendet und wird nach dem Start des Schedulers unterbrochen. FreeRTOS-Aufgaben verwenden diesen Stapel nicht, da jeder Aufgabe beim Erstellen ein eigener Stapel zugewiesen wird. Informationen zu den API-Funktionen xTaskCreate() und xTaskCreateStatic() finden Sie in der API-Dokumentation. http://www.freertos.org/a00019.html

Bei der Entwicklung wird empfohlen, sicherzustellen, dass die Konfiguration vonASSERT() definiert ist und dass die Stapelüberlauferkennung aktiviert ist. Googeln für diese Begriffe zusammen mit "FreeRTOS" wird Links für diese auch finden.