malloc()
trong vi điều khiển thường được coi là một "điều xấu". Nhưng, nếu bạn thực sự cần nó thì bạn sẽ muốn tìm phiên bản của bên thứ ba.
Nếu bạn may mắn, mã bạn đang chuyển có thể không dựa vào việc sử dụng lại các khối bộ nhớ. Nếu đây là trường hợp, bạn có thể viết một bộ cấp phát đơn giản trả về một con trỏ vào bộ đệm RAM, sau đó tiến bộ con trỏ theo kích thước khối được yêu cầu.
Tôi đã sử dụng thành công phương pháp này trước khi chuyển thư viện PC sang vi điều khiển.
Dưới đây, bạn sẽ thiết lập bộ cấp phát my_malloc_init()
và phân bổ bộ nhớ với my_malloc()
. my_free()
ở đó để thỏa mãn sự phụ thuộc nhưng thực sự sẽ không làm gì cả. Cuối cùng, bạn sẽ hết dung lượng.
Để thực hiện công việc này, bạn sẽ cần đo yêu cầu bộ nhớ trong trường hợp xấu nhất của mã của bạn (thực hiện điều này trên PC nếu có thể) sau đó thiết lập HEAP_SIZE
tương ứng. Trước khi vào một phần của thư viện yêu cầu bộ nhớ động, hãy gọi my_malloc_init()
. Trước khi sử dụng lại, đảm bảo không có gì vẫn còn điểm 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
}
(lưu ý: trong thế giới thực, bạn có thể cần xem xét căn chỉnh con trỏ, nghĩa là làm tròn lên heap_ptr
2 hoặc 4 byte)
Một tùy chọn khác là sử dụng cấu trúc phân bổ đơn giản hơn malloc()
thường cung cấp, như FreeList , mặc dù điều này có thể không cho phép bạn phân bổ các khối có kích thước thay đổi.