malloc()
dalam mikrokontroler umumnya dianggap sebagai "hal buruk". Tetapi, jika Anda benar-benar membutuhkannya maka Anda akan ingin menemukan versi pihak ketiga.
Jika Anda beruntung, kode yang Anda porting mungkin tidak bergantung pada penggunaan kembali blok memori. Jika demikian, Anda dapat menulis pengalokasi sederhana yang mengembalikan pointer ke buffer RAM, lalu memajukan pointer dengan ukuran blok yang diminta.
Saya telah berhasil menggunakan pendekatan ini sebelumnya dalam porting pustaka PC ke mikrokontroler.
Di bawah, Anda akan menyiapkan pengalokasi dengan my_malloc_init()
dan mengalokasikan memori dengan my_malloc()
. my_free()
ada untuk memenuhi ketergantungan tetapi tidak akan benar-benar melakukan apa pun. Akhirnya Anda akan kehabisan ruang, tentu saja.
Agar ini berfungsi, Anda harus mengukur kebutuhan memori terburuk dari kode Anda (lakukan ini pada PC jika memungkinkan) kemudian atur HEAP_SIZE
sesuai kebutuhan. Sebelum memasuki bagian perpustakaan Anda yang membutuhkan memori dinamis, hubungi my_malloc_init()
. Sebelum digunakan kembali, pastikan tidak ada yang menunjuk 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
}
(catatan: di dunia nyata, Anda mungkin perlu mempertimbangkan penyelarasan pointer, mis. pembulatan heap_ptr
sebesar 2 atau 4 byte)
Pilihan lain adalah menggunakan struktur alokasi yang lebih sederhana daripada malloc()
biasanya, seperti FreeList , meskipun ini mungkin tidak memungkinkan Anda untuk mengalokasikan blok berukuran variabel.