tôi là một chút muộn để đảng, nhưng tôi chỉ muốn chia sẻ cấp phát bộ nhớ rất hiệu quả cho các hệ thống nhúng Tôi vừa mới tìm thấy và thử nghiệm: https://github.com/dimonomid/umm_malloc
Đây là một thư viện quản lý bộ nhớ được thiết kế đặc biệt để làm việc với ARM7, cá nhân tôi sử dụng nó trên thiết bị PIC32, nhưng nó sẽ hoạt động trên bất kỳ thiết bị 16 và 8 bit nào (tôi có kế hoạch thử nghiệm trên PIC24 16 bit, nhưng tôi chưa thử nghiệm)
Tôi đã bị đánh đập nghiêm trọng bởi phân mảnh với trình phân bổ mặc định: dự án của tôi thường phân bổ các khối có kích thước khác nhau, từ vài byte đến vài trăm byte và đôi khi tôi gặp lỗi 'hết bộ nhớ'. Thiết bị PIC32 của tôi có tổng cộng 32K RAM và 8192 byte được sử dụng cho heap. Tại thời điểm cụ thể có hơn 5K bộ nhớ trống, nhưng bộ cấp phát mặc định có khối bộ nhớ không phân mảnh tối đa chỉ khoảng 700 byte, do phân mảnh. Điều này là quá xấu, vì vậy tôi quyết định tìm giải pháp hiệu quả hơn.
Tôi đã biết một số trình phân bổ, nhưng tất cả chúng có một số hạn chế (chẳng hạn như kích thước khối phải là một hoặc 2, và bắt đầu không từ 2 nhưng từ, nói, 128 byte), hoặc chỉ là lỗi. Mỗi lần trước, tôi phải chuyển về trình phân bổ mặc định.
Nhưng lần này, tôi thật may mắn: Tôi đã tìm thấy cái này: http://hempeldesigngroup.com/embedded/stories/memorymanager/
Khi tôi đã cố gắng cấp phát bộ nhớ này, chính xác tình hình tương tự với 5K bộ nhớ miễn phí, nó có hơn 3800 byte khối ! Nó không thể tin được với tôi (so với 700 byte), và tôi đã thực hiện thử nghiệm khó khăn: thiết bị hoạt động mạnh hơn 30 giờ. Không có rò rỉ bộ nhớ, mọi thứ hoạt động vì nó hoạt động. Tôi cũng tìm thấy phân bổ này trong kho lưu trữ FreeRTOS: http://svnmios.midibox.org/listing.php?repname=svn.mios32&path=%2Ftrunk%2FFreeRTOS%2FSource%2Fportable%2FMemMang%2F&rev=1041&peg=1041#, và thực tế này là một bằng chứng bổ sung về sự ổn định của umm_malloc. Vì vậy, tôi hoàn toàn chuyển sang umm_malloc, và tôi khá hài lòng với nó.
Tôi chỉ phải thay đổi một chút: cấu hình hơi lỗi khi macro UMM_TEST_MAIN không được xác định, vì vậy, tôi đã tạo kho lưu trữ github (liên kết nằm ở đầu bài đăng này). Bây giờ, cấu hình phụ thuộc người dùng được lưu trữ trong tập tin riêng biệt umm_malloc_cfg.h
Tôi chưa hiểu sâu về các thuật toán được áp dụng trong trình phân bổ này, nhưng nó có giải thích rất chi tiết về thuật toán, vì vậy bất kỳ ai quan tâm đều có thể xem ở đầu tệp umm_malloc.c. Ít nhất, cách tiếp cận "binning" sẽ mang lại lợi ích to lớn trong phân mảnh ít hơn: http://g.oswego.edu/dl/html/malloc.html
Tôi tin rằng bất cứ ai cần phân bổ bộ nhớ hiệu quả cho vi điều khiển, ít nhất nên thử cái này.
Được sử dụng Loki cho mục đích này, tất cả đã hoạt động tốt và mất rất ít thời gian –
Chris, bạn có sẵn sàng chia sẻ mã cho phiên bản sửa đổi của glibc malloc với các bộ nhớ không? –