Hallo,
malloc und free fragmentieren dir den Speicher. Aber soweit ich das gelesen habe sollte das nicht zu einem "memoryleak" führen, da freigegebene Speicherfragmente beim nächsten malloc wieder verwendet werden (sofern Sie passen). Siehe: "avr-libc-user-manual --> "Memory Areas and Using malloc()"
Deinen Speicherverbrauch kannst du mit https://www.roboternetz.de/wissen/in...en_mit_avr-gcc bestimmen - allerdings nicht die Fragmentierung. Du kannst ja den jeweils aktuellen Wert auf das LCD ausgeben...
Ich habe mir für solche Probleme eine C "Testumgebung" auf meinem Rechner aufgebaut, um den Code auch im graphischen Debugger anschauen zu können. Man muss halt die hardwarespzifischen Funktionen durch "dummys" ersetzen.
Zu deinem Code:
Wenn du mit einer festen Syntax (4 werte pro commando) und Zahlen arbeitest würde an deiner Stelle "parameters" mit einem Array aus festen char-arrays ober gleich mit integern arbeiten. Das ist handlicher.
Z.b.:
Code:
#include <stdlib.h>
/*
** Funktion zum "parsen" eines command strings.
** Wenn ein fehler auftritt, gibt die funktion (-1) zurück.
** Ansonsten gibt sie die anzahl der ermittelten Parameter zurück.
**
** ACHTUNG: Funktion arbeitet nur korrekt, wenn
** a) nur EIN zeichen den kommandostring einleitet
** b) der Trenner kein zeichen ist, das atoi konvertiert.
** c) nur EIN Zeichen die Endesequenz darstellt (ACHTUNG: seperator + Endezeichen geht auch nicht!)
*/
#define MAX_PARAMS 4
int params[MAX_PARAMS];
int cmdsplit(char*cmd_string)
{
int cursor = 0;
int param_nr = 0;
// Parameterarray initialisieren
for (int i=0;i<MAX_PARAMS;i++)
params[i] = 0;
/* Prüfen ob der command-string gültig beginnt */
if ((cmd_string == NULL) ||cmd_string[cursor] != '#')
return -1;
while (cmd_string[cursor] != '\0' && cmd_string[cursor] != '*') // prüfen ob das ende erreicht wurde
{
char *tmp;
cursor++;
tmp = (cmd_string + cursor); // tmp wird auf den anfang des für atoi auszulesenden werts "gesetzt"
params[param_nr] = atoi(tmp); // wert auslesen
if (param_nr >= MAX_PARAMS) // sind mehr parameter verfügbar als erwartet? Stimmt was mit dem Commando nicht...
return -1;
param_nr++;
// Überspingen der ausgelesen Zeichen und ermitteln des nächsten "interessanten" Teils im string.
while((cmd_string[cursor] != ':') && (cmd_string[cursor] != '*') && (cmd_string[cursor] != '\0'))
cursor++;
}
return param_nr;
}
Lesezeichen