luat_malloc_air101.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // 这个文件包含 系统heap和lua heap的默认实现
  2. #include <stdlib.h>
  3. #include <string.h>//add for memset
  4. #include "bget.h"
  5. #include "luat_malloc.h"
  6. #include "FreeRTOS.h"
  7. #define LUAT_LOG_TAG "heap"
  8. #include "luat_log.h"
  9. #include "wm_mem.h"
  10. // const uint32_t luat_rom_addr_start = 0x8010000;
  11. // #ifdef AIR103
  12. // const uint32_t luat_rom_addr_end = 0x80FFFFF;
  13. // #else
  14. // const uint32_t luat_rom_addr_end = 0x81FFFFF;
  15. // #endif
  16. //------------------------------------------------
  17. // 管理系统内存
  18. void* luat_heap_malloc(size_t len) {
  19. return tls_mem_alloc(len);
  20. }
  21. void luat_heap_free(void* ptr) {
  22. if (ptr == NULL)
  23. return;
  24. tls_mem_free(ptr);
  25. }
  26. void* luat_heap_realloc(void* ptr, size_t len) {
  27. return tls_mem_realloc(ptr, len);
  28. }
  29. void* luat_heap_calloc(size_t count, size_t _size) {
  30. return tls_mem_calloc(count, _size);
  31. }
  32. #if configUSE_HEAP3
  33. extern size_t xTotalHeapSize;
  34. extern size_t xFreeBytesRemaining;
  35. extern size_t xFreeBytesMin;
  36. #endif
  37. extern unsigned int heap_size_max;
  38. extern unsigned int total_mem_size;
  39. extern size_t __heap_start;
  40. extern size_t __heap_end;
  41. void luat_meminfo_sys(size_t* total, size_t* used, size_t* max_used)
  42. {
  43. #if configUSE_HEAP3
  44. *used = xTotalHeapSize - xFreeBytesRemaining;
  45. *max_used = xTotalHeapSize - xFreeBytesMin;
  46. *total = xTotalHeapSize;
  47. #elif configUSE_HEAP4
  48. extern void vPortGetHeapStats( HeapStats_t *pxHeapStats );
  49. HeapStats_t stat = {0};
  50. vPortGetHeapStats(&stat);
  51. *total = (size_t)(&__heap_end) - (size_t)(&__heap_start);
  52. *max_used = *total - stat.xMinimumEverFreeBytesRemaining;
  53. *used = (*total) - (stat.xAvailableHeapSpaceInBytes);
  54. #else
  55. *used = heap_size_max - total_mem_size;
  56. *max_used = *used;
  57. *total = heap_size_max;
  58. #endif
  59. }
  60. //------------------------------------------------
  61. //------------------------------------------------
  62. // ---------- 管理 LuaVM所使用的内存----------------
  63. #ifdef LUAT_USE_TLSF
  64. #include "tlsf.h"
  65. extern tlsf_t luavm_tlsf;
  66. extern pool_t luavm_tlsf_ext;
  67. void* __attribute__((section (".ram_run"))) luat_heap_alloc(void *ud, void *ptr, size_t osize, size_t nsize) {
  68. if (ptr == NULL && nsize == 0)
  69. return NULL;
  70. #ifdef LUAT_USE_MEMORY_OPTIMIZATION_CODE_MMAP
  71. if (ptr != NULL) {
  72. uint32_t ptrv = (uint32_t)ptr;
  73. if (ptrv >= 0x08000000 && ptrv < 0x08200000) {
  74. //LLOGD("??? %p %d %d", ptr, osize, nsize);
  75. if (nsize == 0)
  76. return NULL;
  77. }
  78. }
  79. #endif
  80. return tlsf_realloc(luavm_tlsf, ptr, nsize);
  81. }
  82. void luat_meminfo_luavm(size_t *total, size_t *used, size_t *max_used) {
  83. *total = 0;
  84. *used = 0;
  85. *max_used = 0;
  86. tlsf_stat(tlsf_get_pool(luavm_tlsf), total, used, max_used);
  87. if (luavm_tlsf_ext) {
  88. tlsf_stat(luavm_tlsf_ext, total, used, max_used);
  89. }
  90. }
  91. #else
  92. void* __attribute__((section (".ram_run"))) luat_heap_alloc(void *ud, void *ptr, size_t osize, size_t nsize) {
  93. if (ptr == NULL && nsize == 0)
  94. return NULL;
  95. #ifdef LUAT_USE_MEMORY_OPTIMIZATION_CODE_MMAP
  96. if (ptr != NULL) {
  97. uint32_t ptrv = (uint32_t)ptr;
  98. if (ptrv >= 0x08000000 && ptrv < 0x08200000) {
  99. // LLOGD("??? %p %d %d", ptr, osize, nsize);
  100. return NULL;
  101. }
  102. }
  103. #endif
  104. if (0) {
  105. if (ptr) {
  106. if (nsize) {
  107. // 缩放内存块
  108. LLOGD("realloc %p from %d to %d", ptr, osize, nsize);
  109. }
  110. else {
  111. // 释放内存块
  112. LLOGD("free %p ", ptr);
  113. brel(ptr);
  114. return NULL;
  115. }
  116. }
  117. else {
  118. // 申请内存块
  119. ptr = bget(nsize);
  120. LLOGD("malloc %p type=%d size=%d", ptr, osize, nsize);
  121. return ptr;
  122. }
  123. }
  124. if (nsize)
  125. {
  126. void* ptmp = bgetr(ptr, nsize);
  127. if(ptmp == NULL && osize >= nsize)
  128. {
  129. return ptr;
  130. }
  131. return ptmp;
  132. }
  133. brel(ptr);
  134. return NULL;
  135. }
  136. void luat_meminfo_luavm(size_t *total, size_t *used, size_t *max_used) {
  137. long curalloc, totfree, maxfree;
  138. unsigned long nget, nrel;
  139. bstats(&curalloc, &totfree, &maxfree, &nget, &nrel);
  140. *used = curalloc;
  141. *max_used = bstatsmaxget();
  142. *total = curalloc + totfree;
  143. }
  144. #endif
  145. //-----------------------------------------------------------------------------