malloc.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:8k
源码类别:

DVD

开发平台:

Others

  1. #include "Config.h" // Global Configuration - do not remove!
  2. #include "KerneluITRONRTOS.h"
  3. #include <stdlib.h>
  4. #include <embedded.h>
  5. #include "IncludeSysDefs.h"
  6. #include "ServicesInclude_heap.h"
  7. #ifdef HEAP_STATISTIC 
  8. #define HEAP_MAX_BLOCKS 85
  9. void* heap_block_ptrs[HEAP_MAX_BLOCKS]={0};
  10. unsigned int heap_blocks_size[HEAP_MAX_BLOCKS]={0};
  11. int heap_current_block_index=0;
  12. int heap_malloc_fail_num=0;
  13. int heap_current_malloc_size=0;
  14. int heap_max_malloc_size=0;  
  15. int heap_current_malloc_count=0;
  16. int heap_max_malloc_count=0;  
  17. int  heap_extra_free_done=0;
  18. int heap_size_over=0;
  19. int heap_no_free_space=0;
  20. int max_nast_free=0;
  21. int max_nast_malloc=0;
  22. int stat_max_block_size=0;
  23. #endif
  24. #pragma codeseg _TEXT "CODE"
  25. extern void * I49malloc (size_t __size, int pool_id);
  26. extern void I49free(void near *__block, int pool_id);
  27. extern void *I49realloc(void near *__block, size_t __size, int pool_id);
  28. //#define HEAP_DEBUG 1
  29. #ifdef D_SUPPORT_MEM_POOL
  30. ///////////////////////////////////////////////////////////////////////////
  31. // Function name :  MEM_Allocate
  32. // Purpose : Allocate memory block from pool.
  33. // Input Parameters : pool_id  - The index of memory pool to allcate from.
  34. //   size - The size of requested block in size.
  35. // Return type : Pointer of allocated memory block.
  36. //   Reutrn NULL if allocation failed.
  37. ///////////////////////////////////////////////////////////////////////////
  38. void *MEM_Allocate(int pool_id, size_t size)
  39. {
  40. #ifdef HEAP_DEBUG
  41. void * pMem = I49malloc (size, pool_id);
  42. tr_printf(("nMEM_Allocate(%d, %u) %p", pool_id, size, pMem));
  43. return pMem;
  44. #else
  45. return I49malloc (size, pool_id);
  46. #endif
  47. }
  48. ///////////////////////////////////////////////////////////////////////////
  49. // Function name :  MEM_Free
  50. // Purpose : Free memory block.
  51. // Input Parameters : pool_id  - The index of memory pool that allocated from.
  52. //   __block - Pointer of memory block to be freed.
  53. // Return type : NONE
  54. ///////////////////////////////////////////////////////////////////////////
  55. void MEM_Free(int pool_id, void *__block)
  56. {
  57. I49free ((void __near *)__block, pool_id);
  58. #ifdef HEAP_DEBUG
  59. tr_printf (("MEM_Free( %d, %p)n",pool_id, __block));
  60. #endif
  61. }
  62. ///////////////////////////////////////////////////////////////////////////
  63. // Function name :  MEM_PoolConstruct
  64. // Purpose : Construct memory pool.
  65. // Input Parameters : pool_id  - The index of memory pool to be constructed.
  66. //   __ptr - Start address of memory pool.
  67. //   __size - Size of memory pool in byte.
  68. // Return type : NONE
  69. // Description : Initialized pool structure.
  70. ///////////////////////////////////////////////////////////////////////////
  71. void MEM_PoolConstruct(int pool_id, unsigned char *__ptr, int __size)
  72. {
  73. asm pushf
  74. asm cli
  75. _mempool[pool_id].head = (void __near *)__ptr;
  76. _mempool[pool_id].first = 0;
  77. _mempool[pool_id].last = 0;
  78. _mempool[pool_id].rover = 0;
  79. _mempool[pool_id].brklvl = (void __near *)__ptr;
  80. _mempool[pool_id].heaplimit = (void __near *)(__ptr + __size);
  81. asm popf
  82. #ifdef HEAP_DEBUG
  83. tr_printf (("MEM_PoolConstruct( %d, %p, %d)n",pool_id, __ptr, __size));
  84. #endif
  85. }
  86. ///////////////////////////////////////////////////////////////////////////
  87. // Function name :  MEM_PoolDestruct
  88. // Purpose : Destruct memory pool.
  89. // Input Parameters : pool_id  - The index of memory pool to be destructed.
  90. // Return type : TRUE if success, FALSE otherwise
  91. // Description : Check if all memory blocks are freed, otherwise fail.
  92. ///////////////////////////////////////////////////////////////////////////
  93. BOOL MEM_PoolDestruct(int pool_id)
  94. {
  95. asm pushf
  96. asm cli
  97. if (_mempool[pool_id].head != _mempool[pool_id].brklvl)
  98. {
  99. asm popf
  100. #ifdef HEAP_DEBUG
  101. tr_printf (("Fail - MEM_PoolDestruct( %d ), pool not empty.n",pool_id));
  102. #endif
  103. return FALSE;                           // Not all memory is freed.
  104. }
  105. _mempool[pool_id].head = 0;
  106. asm popf
  107. #ifdef HEAP_DEBUG
  108. tr_printf (("MEM_PoolDestruct( %d )n",pool_id));
  109. #endif
  110. return TRUE;
  111. }
  112. ///////////////////////////////////////////////////////////////////////////
  113. // Function name :  MEM_PoolResize
  114. // Purpose : Change the size of memory pool.
  115. // Input Parameters : pool_id  - The index of memory pool to be destructed.
  116. // : __size - The new size of memory pool
  117. // Return type : TRUE if success, FALSE otherwise
  118. // Description : If the new size is smaller than old size, check if it violates with allcated blocks
  119. ///////////////////////////////////////////////////////////////////////////
  120. BOOL MEM_PoolResize(int pool_id, int __size)
  121. {
  122. asm pushf
  123. asm cli
  124. if (_mempool[pool_id].brklvl > (_mempool[pool_id].head + __size))
  125. {
  126. asm popf
  127. #ifdef HEAP_DEBUG
  128. tr_printf (("Fail - MEM_PoolResize( %d, %d ), can't shrink.n",pool_id, __size));
  129. #endif
  130. return FALSE;                       //Can't shrink pool because some memory not freed.
  131. }
  132. _mempool[pool_id].heaplimit = _mempool[pool_id].head + __size;
  133. asm popf
  134. #ifdef HEAP_DEBUG
  135. tr_printf (("MEM_PoolResize( %d, %d )n",pool_id, __size));
  136. #endif
  137. return TRUE;
  138. }
  139. #endif //D_SUPPORT_MEM_POOL
  140. void *malloc(size_t __size)
  141. {
  142. #ifdef HEAP_DEBUG
  143. void * pMem = I49malloc (__size, DEFAULT_HEAP);
  144.    tr_printf (("malloc %p, 0x%04Xn",pMem,__size));
  145.    return pMem;
  146. #elif defined(HEAP_STATISTIC)
  147.    static int curr_nast=0;
  148. void* heap_temp_malloc=I49malloc (__size, DEFAULT_HEAP);
  149.    
  150. STATUS_REG SRkeep=InterruptDisable();
  151.        curr_nast++;
  152. if ( curr_nast > max_nast_malloc)
  153. max_nast_malloc=curr_nast;
  154. if( heap_temp_malloc != NULL) 
  155. {
  156. int malloc_iter;
  157. int flag=0;
  158.           if( __size > stat_max_block_size )
  159. stat_max_block_size=__size;
  160. heap_current_malloc_size+=__size;
  161. if(heap_current_malloc_size>heap_max_malloc_size) 
  162. heap_max_malloc_size=heap_current_malloc_size;
  163. for(malloc_iter=0;malloc_iter<HEAP_MAX_BLOCKS;malloc_iter++) 
  164. {
  165. if(heap_block_ptrs[malloc_iter]==NULL) 
  166. {
  167. flag=1;
  168. heap_blocks_size[malloc_iter]=__size;
  169. heap_block_ptrs[malloc_iter]=heap_temp_malloc;
  170. break;
  171. }
  172.   }
  173. heap_current_malloc_count++;
  174.          if( (heap_current_malloc_count %10)==0  )
  175.           heap_current_malloc_count=heap_current_malloc_count;
  176. if(heap_current_malloc_count>heap_max_malloc_count) 
  177. heap_max_malloc_count=heap_current_malloc_count; 
  178. if (flag ==0 ) 
  179. {
  180. heap_no_free_space++;
  181. tr_printf(("nmalloc fail [0].  "));
  182. asm int 3;
  183. }
  184. } else {
  185. heap_malloc_fail_num++;
  186. tr_printf(("nmalloc fail [1].  "));
  187. asm int 3;
  188. }
  189. curr_nast--; 
  190. set_SR(SRkeep);
  191. tr_printf (("malloc %p, 0x%04Xn",heap_temp_malloc,__size));
  192. return heap_temp_malloc;
  193. #else  //HEAP_STATISTIC
  194. return I49malloc (__size, DEFAULT_HEAP);
  195. #endif   
  196. }
  197. void free(void *__block)
  198. {
  199. #ifdef HEAP_DEBUG
  200. I49free ((void __near *)__block, DEFAULT_HEAP);
  201.    tr_printf (("free %pn",__block));
  202. #elif defined(HEAP_STATISTIC)
  203. STATUS_REG SRkeep=InterruptDisable();
  204.     int free_iter;
  205.          int flag=0;
  206. static int curr_nast=0;
  207.        curr_nast++;
  208. heap_current_malloc_count--;
  209. if ( curr_nast > max_nast_free)
  210. max_nast_free=curr_nast;
  211. for(free_iter=0;free_iter<HEAP_MAX_BLOCKS;free_iter++) 
  212. {
  213. if(heap_block_ptrs[free_iter]==__block) 
  214. {
  215. heap_current_malloc_size-=heap_blocks_size[free_iter];
  216. heap_block_ptrs[free_iter]=NULL;
  217. flag=1;
  218. break;
  219. }
  220. if(flag== 0) {
  221. heap_extra_free_done++;
  222. tr_printf(("nfree fail [0].  "));
  223. asm int 3;
  224. }
  225. curr_nast--;
  226. set_SR(SRkeep);
  227. I49free ((void __near *)__block, DEFAULT_HEAP);
  228. tr_printf (("free %pn",__block));
  229. return;
  230. #else  //HEAP_STATISTIC
  231. I49free ((void __near *)__block, DEFAULT_HEAP);
  232. #endif
  233. }
  234. void *realloc(void *__block, size_t __size)
  235. {
  236. #ifdef HEAP_DEBUG
  237. void * pMem = I49realloc ((void __near *)__block,__size, DEFAULT_HEAP);
  238.    tr_printf (("malloc %p, 0x%04Xn",pMem,__size));
  239.    return pMem;
  240. #else
  241.    return I49realloc ((void __near *)__block,__size, DEFAULT_HEAP);
  242. #endif   
  243. }
  244. extern void _I49InitHeapConstants(void);
  245. #pragma startup _I49InitHeapConstants 1