mem_pool.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*
  2. * Copyright (c) 2019 Actions Semi Co., Inc.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * @file
  8. * @brief mem pool manager.
  9. */
  10. #include <os_common_api.h>
  11. #include <mem_manager.h>
  12. #include <string.h>
  13. #include "mem_inner.h"
  14. #include <sys/sys_heap.h>
  15. #define SYS_MEM_POOL_SIZE (CONFIG_RAM_POOL_PAGE_NUM * 2048)
  16. #ifdef CONFIG_SOC_NO_PSRAM
  17. __in_section_unique(sys.noinit.heap)
  18. #endif
  19. __aligned(4) static char sys_pool_buffer[SYS_MEM_POOL_SIZE];
  20. #ifdef CONFIG_SIMULATOR
  21. #include <kheap.h>
  22. struct k_heap sys_mem_pool = {
  23. .heap = {
  24. .init_mem = sys_pool_buffer,
  25. .init_bytes = SYS_MEM_POOL_SIZE,
  26. },
  27. };
  28. void* mem_pool_malloc(unsigned int num_bytes)
  29. {
  30. void* ptr = k_heap_aligned_alloc(&sys_mem_pool, sizeof(void*), num_bytes, OS_FOREVER);
  31. if (ptr == NULL) {
  32. sys_heap_dump(&sys_mem_pool.heap);
  33. }
  34. else {
  35. memset(ptr, 0, num_bytes);
  36. }
  37. return ptr;
  38. }
  39. #else
  40. STRUCT_SECTION_ITERABLE(k_heap, sys_mem_pool) = {
  41. .heap = {
  42. .init_mem = sys_pool_buffer,
  43. .init_bytes = SYS_MEM_POOL_SIZE,
  44. },
  45. };
  46. void *mem_pool_malloc(unsigned int num_bytes)
  47. {
  48. void *ptr = k_heap_aligned_alloc(&sys_mem_pool, sizeof(void *), num_bytes, K_FOREVER);
  49. if (ptr == NULL) {
  50. sys_heap_dump(&sys_mem_pool.heap);
  51. } else {
  52. memset(ptr, 0, num_bytes);
  53. }
  54. return ptr;
  55. }
  56. #endif
  57. void mem_pool_free(void *ptr)
  58. {
  59. if (ptr) {
  60. k_heap_free(&sys_mem_pool, ptr);
  61. }
  62. }
  63. void mem_pool_dump(void)
  64. {
  65. sys_heap_dump(&sys_mem_pool.heap);
  66. os_printk("total size of pool %d \n", SYS_MEM_POOL_SIZE);
  67. }
  68. void mem_pool_init(void)
  69. {
  70. #ifdef CONFIG_SIMULATOR
  71. k_heap_init(&sys_mem_pool, sys_pool_buffer, SYS_MEM_POOL_SIZE);
  72. #endif
  73. }