/* * Copyright (c) 2022 Jeppe Odgaard * * SPDX-License-Identifier: Apache-2.0 */ #include #include #define HEAP_SIZE 256 K_HEAP_DEFINE(my_kernel_heap, HEAP_SIZE); static char heap_mem[HEAP_SIZE]; static struct sys_heap heap; static void print_sys_memory_stats(struct sys_heap *); static void print_static_heaps(void); static void print_all_heaps(void); int main(void) { void *p; printk("System heap sample\n\n"); sys_heap_init(&heap, heap_mem, HEAP_SIZE); print_sys_memory_stats(&heap); p = sys_heap_alloc(&heap, 150); print_sys_memory_stats(&heap); p = sys_heap_realloc(&heap, p, 100); print_sys_memory_stats(&heap); sys_heap_free(&heap, p); print_sys_memory_stats(&heap); /* Allocate from our custom k_heap to make the output * more interesting and prevent compiler optimisations from * discarding it. */ p = k_heap_alloc(&my_kernel_heap, 10, K_FOREVER); print_static_heaps(); print_all_heaps(); /* Cleanup memory */ k_heap_free(&my_kernel_heap, p); return 0; } static void print_sys_memory_stats(struct sys_heap *hp) { struct sys_memory_stats stats; sys_heap_runtime_stats_get(hp, &stats); printk("allocated %zu, free %zu, max allocated %zu, heap size %u\n", stats.allocated_bytes, stats.free_bytes, stats.max_allocated_bytes, HEAP_SIZE); } static void print_static_heaps(void) { struct k_heap *ha; int n; n = k_heap_array_get(&ha); printk("%d static heap(s) allocated:\n", n); for (int i = 0; i < n; i++) { printk("\t%d - address %p ", i, &ha[i]); print_sys_memory_stats(&ha[i].heap); } } static void print_all_heaps(void) { struct sys_heap **ha; int n; n = sys_heap_array_get(&ha); printk("%d heap(s) allocated (including static):\n", n); for (int i = 0; i < n; i++) { printk("\t%d - address %p ", i, ha[i]); print_sys_memory_stats(ha[i]); } }