wm_mem.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*****************************************************************************
  2. *
  3. * File Name : wm_mem.c
  4. *
  5. * Description: memory manager Module
  6. *
  7. * Copyright (c) 2014 Winner Micro Electronic Design Co., Ltd.
  8. * All rights reserved.
  9. *
  10. * Author : dave
  11. *
  12. * Date : 2014-6-12
  13. *****************************************************************************/
  14. #include "wm_osal.h"
  15. #include "wm_mem.h"
  16. #include "list.h"
  17. #include <string.h>
  18. #include "FreeRTOS.h"
  19. #if configUSE_HEAP3
  20. void *pvPortMalloc( u32 xWantedSize );
  21. void vPortFree( void *pv );
  22. void *vPortRealloc(void *pv, u32 size);
  23. void *vPortCalloc(u32 length, u32 size);
  24. void * mem_alloc_debug(u32 size) {
  25. return pvPortMalloc(size);
  26. }
  27. void mem_free_debug(void *p) {
  28. vPortFree(p);
  29. }
  30. void * mem_realloc_debug(void *mem_address, u32 size) {
  31. return vPortRealloc(mem_address, size);
  32. }
  33. void *mem_calloc_debug(u32 length, u32 size) {
  34. return vPortCalloc(length, size);
  35. }
  36. #else
  37. extern u8 tls_get_isr_count(void);
  38. bool memory_manager_initialized = false;
  39. /**
  40. * This mutex is used to synchronize the list of allocated
  41. * memory blocks. This is a debug version only feature
  42. */
  43. tls_os_sem_t *mem_sem;
  44. extern u32 total_mem_size;
  45. void * mem_alloc_debug(u32 size) {
  46. u32 cpu_sr = 0;
  47. u32 *buffer = NULL;
  48. u32 length = size;
  49. //printf("size:%d\n", size);
  50. if (!memory_manager_initialized) {
  51. tls_os_status_t os_status;
  52. memory_manager_initialized = true;
  53. //
  54. // NOTE: If two thread allocate the very first allocation simultaneously
  55. // it could cause double initialization of the memory manager. This is a
  56. // highly unlikely scenario and will occur in debug versions only.
  57. //
  58. os_status = tls_os_sem_create(&mem_sem, 1);
  59. if(os_status != TLS_OS_SUCCESS)
  60. printf("mem_alloc_debug: tls_os_sem_create mem_sem error\r\n");
  61. }
  62. tls_os_sem_acquire(mem_sem, 0);
  63. cpu_sr = tls_os_set_critical();
  64. buffer = (u32*)malloc(length);
  65. tls_os_release_critical(cpu_sr);
  66. tls_os_sem_release(mem_sem);
  67. return buffer;
  68. }
  69. void mem_free_debug(void *p) {
  70. u32 cpu_sr = 0;
  71. tls_os_sem_acquire(mem_sem, 0);
  72. cpu_sr = tls_os_set_critical();
  73. free(p);
  74. tls_os_release_critical(cpu_sr);
  75. tls_os_sem_release(mem_sem);
  76. }
  77. void * mem_realloc_debug(void *mem_address, u32 size) {
  78. u32 * mem_re_addr = NULL;
  79. u32 cpu_sr = 0;
  80. u32 length = size;
  81. tls_os_sem_acquire(mem_sem, 0);
  82. cpu_sr = tls_os_set_critical();
  83. mem_re_addr = realloc(mem_address, length);
  84. tls_os_release_critical(cpu_sr);
  85. tls_os_sem_release(mem_sem);
  86. return mem_re_addr;
  87. }
  88. void *mem_calloc_debug(u32 length, u32 size) {
  89. u32 cpu_sr = 0;
  90. u32 *buffer = NULL;
  91. //u32 length = 0;
  92. tls_os_sem_acquire(mem_sem, 0);
  93. cpu_sr = tls_os_set_critical();
  94. buffer = (u32*)calloc(length, size);
  95. tls_os_release_critical(cpu_sr);
  96. tls_os_sem_release(mem_sem);
  97. return buffer;
  98. }
  99. #endif