malloc()
in Mikrocontrollern wird allgemein als "schlechte Sache" angesehen. Wenn Sie es jedoch unbedingt benötigen, sollten Sie eine Version eines Drittanbieters suchen.
Wenn Sie Glück haben, hängt der zu portierende Code möglicherweise nicht von der Wiederverwendung von Speicherblöcken ab. In diesem Fall können Sie einen einfachen Allokator schreiben, der einen Zeiger in einen RAM-Puffer zurückgibt und den Zeiger dann um die angeforderte Blockgröße vorschiebt.
Ich habe diesen Ansatz bereits erfolgreich beim Portieren von PC-Bibliotheken auf Mikrocontroller verwendet.
Im Folgenden würden Sie den Allokator mit einrichten my_malloc_init()
und Speicher mit zuweisen my_malloc()
. my_free()
ist da, um die Abhängigkeit zu befriedigen, wird aber eigentlich nichts tun. Irgendwann wird Ihnen natürlich der Platz ausgehen.
Damit dies funktioniert, müssen Sie den Speicherbedarf Ihres Codes im ungünstigsten Fall messen (dies möglichst auf einem PC tun) und dann entsprechend einrichten HEAP_SIZE
. Rufen Sie an, bevor Sie den Teil Ihrer Bibliothek betreten, der dynamischen Speicher benötigt my_malloc_init()
. Stellen Sie vor der Wiederverwendung sicher, dass noch nichts darauf zeigt heap
.
uint8_t heap[HEAP_SIZE];
uint8_t *heap_ptr;
void my_malloc_init(void)
{
heap_ptr = heap;
}
void *my_malloc(size_t len)
{
uint8_t *p = heap_ptr;
heap_ptr += len;
if (heap_ptr >= heap + HEAP_SIZE)
return NULL;
else
return p;
}
void my_free(void)
{
// do nothing
}
(Hinweis: In der realen Welt müssen Sie möglicherweise die Zeigerausrichtung berücksichtigen, dh das Aufrunden heap_ptr
um 2 oder 4 Byte.)
Eine andere Möglichkeit besteht darin, eine einfachere Zuordnungsstruktur als malloc()
gewöhnlich zu verwenden, wie z. B. eine FreeList . Auf diese Weise können Sie jedoch möglicherweise keine Blöcke mit variabler Größe zuweisen.