malloc.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "malloc.h"
  2. #include <stdio.h>
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //������ֻ��ѧϰʹ�ã�δ��������ɣ��������������κ���;
  5. //ALIENTEK MiniSTM32������
  6. //�ڴ���� ��������
  7. //����ԭ��@ALIENTEK
  8. //������̳:www.openedv.com
  9. //�޸�����:2014/3/12
  10. //�汾��V1.0
  11. //��Ȩ���У�����ؾ���
  12. //Copyright(C) ������������ӿƼ����޹�˾ 2009-2019
  13. //All rights reserved
  14. //////////////////////////////////////////////////////////////////////////////////
  15. //�ڴ��(4�ֽڶ���)
  16. __align(4) u8 membase[MEM_MAX_SIZE]; //SRAM�ڴ��
  17. //�ڴ�����
  18. u16 memmapbase[MEM_ALLOC_TABLE_SIZE]; //SRAM�ڴ��MAP
  19. //�ڴ�������
  20. const u32 memtblsize=MEM_ALLOC_TABLE_SIZE; //�ڴ���С
  21. const u32 memblksize=MEM_BLOCK_SIZE; //�ڴ�ֿ��С
  22. const u32 memsize=MEM_MAX_SIZE; //�ڴ��ܴ�С
  23. //�ڴ���������
  24. struct _m_mallco_dev mallco_dev=
  25. {
  26. mem_init, //�ڴ��ʼ��
  27. mem_perused, //�ڴ�ʹ����
  28. membase, //�ڴ��
  29. memmapbase, //�ڴ����״̬��
  30. 0, //�ڴ����δ����
  31. };
  32. //�����ڴ�
  33. //*des:Ŀ�ĵ�ַ
  34. //*src:Դ��ַ
  35. //n:��Ҫ���Ƶ��ڴ泤��(�ֽ�Ϊ��λ)
  36. void mymemcpy(void *des,void *src,u32 n)
  37. {
  38. u8 *xdes=des;
  39. u8 *xsrc=src;
  40. while(n--)*xdes++=*xsrc++;
  41. }
  42. //�����ڴ�
  43. //*s:�ڴ��׵�ַ
  44. //c :Ҫ���õ�ֵ
  45. //count:��Ҫ���õ��ڴ��С(�ֽ�Ϊ��λ)
  46. void mymemset(void *s,u8 c,u32 count)
  47. {
  48. u8 *xs = s;
  49. while(count--)*xs++=c;
  50. }
  51. //�ڴ�����ʼ��
  52. void mem_init(void)
  53. {
  54. mymemset(mallco_dev.memmap, 0,memtblsize*2);//�ڴ�״̬����������
  55. mymemset(mallco_dev.membase, 0, memsize); //�ڴ��������������
  56. mallco_dev.memrdy=1; //�ڴ�����ʼ��OK
  57. }
  58. //��ȡ�ڴ�ʹ����
  59. //����ֵ:ʹ����(0~100)
  60. u8 mem_perused(void)
  61. {
  62. u32 used=0;
  63. u32 i;
  64. for(i=0;i<memtblsize;i++)
  65. {
  66. if(mallco_dev.memmap[i])used++;
  67. }
  68. return (used*100)/(memtblsize);
  69. }
  70. //�ڴ����(�ڲ�����)
  71. //memx:�����ڴ��
  72. //size:Ҫ������ڴ��С(�ֽ�)
  73. //����ֵ:0XFFFFFFFF,�������;����,�ڴ�ƫ�Ƶ�ַ
  74. u32 mem_malloc(u32 size)
  75. {
  76. uint8_t mem_used = mem_perused();
  77. printf("%s the used heap is %d %\n", __func__, mem_used);
  78. signed long offset=0;
  79. u16 nmemb; //��Ҫ���ڴ����
  80. u16 cmemb=0;//�������ڴ����
  81. u32 i;
  82. if(!mallco_dev.memrdy)mallco_dev.init(); //δ��ʼ��,��ִ�г�ʼ��
  83. if(size==0)return 0XFFFFFFFF; //����Ҫ����
  84. nmemb=size/memblksize; //��ȡ��Ҫ����������ڴ����
  85. if(size%memblksize)nmemb++;
  86. for(offset=memtblsize-1;offset>=0;offset--) //���������ڴ������
  87. {
  88. if(!mallco_dev.memmap[offset])cmemb++; //�������ڴ��������
  89. else cmemb=0; //�����ڴ������
  90. if(cmemb==nmemb) //�ҵ�������nmemb�����ڴ��
  91. {
  92. for(i=0;i<nmemb;i++) //��ע�ڴ��ǿ�
  93. {
  94. mallco_dev.memmap[offset+i]=nmemb;
  95. }
  96. return (offset*memblksize); //����ƫ�Ƶ�ַ
  97. }
  98. }
  99. return 0XFFFFFFFF;//δ�ҵ����Ϸ����������ڴ��
  100. }
  101. //�ͷ��ڴ�(�ڲ�����)
  102. //offset:�ڴ��ַƫ��
  103. //����ֵ:0,�ͷųɹ�;1,�ͷ�ʧ��;
  104. u8 mem_free(u32 offset)
  105. {
  106. int i;
  107. if(!mallco_dev.memrdy)//δ��ʼ��,��ִ�г�ʼ��
  108. {
  109. mallco_dev.init();
  110. return 1;//δ��ʼ��
  111. }
  112. if(offset<memsize)//ƫ�����ڴ����.
  113. {
  114. int index=offset/memblksize; //ƫ�������ڴ�����
  115. int nmemb=mallco_dev.memmap[index]; //�ڴ������
  116. for(i=0;i<nmemb;i++) //�ڴ������
  117. {
  118. mallco_dev.memmap[index+i]=0;
  119. }
  120. return 0;
  121. }else return 2;//ƫ�Ƴ�����.
  122. }
  123. //�ͷ��ڴ�(�ⲿ����)
  124. //ptr:�ڴ��׵�ַ
  125. void myfree(void *ptr)
  126. {
  127. u32 offset;
  128. if(ptr==NULL)return;//��ַΪ0.
  129. offset=(u32)ptr-(u32)mallco_dev.membase;
  130. mem_free(offset); //�ͷ��ڴ�
  131. }
  132. //�����ڴ�(�ⲿ����)
  133. //size:�ڴ��С(�ֽ�)
  134. //����ֵ:���䵽���ڴ��׵�ַ.
  135. void *mymalloc(u32 size)
  136. {
  137. u32 offset;
  138. offset=mem_malloc(size);
  139. if(offset==0XFFFFFFFF)return NULL;
  140. else return (void*)((u32)mallco_dev.membase+offset);
  141. }
  142. //���·����ڴ�(�ⲿ����)
  143. //*ptr:���ڴ��׵�ַ
  144. //size:Ҫ������ڴ��С(�ֽ�)
  145. //����ֵ:�·��䵽���ڴ��׵�ַ.
  146. void *myrealloc(void *ptr,u32 size)
  147. {
  148. u32 offset;
  149. offset=mem_malloc(size);
  150. if(offset==0XFFFFFFFF)return NULL;
  151. else
  152. {
  153. mymemcpy((void*)((u32)mallco_dev.membase+offset),ptr,size); //�������ڴ����ݵ����ڴ�
  154. myfree(ptr); //�ͷž��ڴ�
  155. return (void*)((u32)mallco_dev.membase+offset); //�������ڴ��׵�ַ
  156. }
  157. }