Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
pool.cpp
00001 #include <stdio.h> 00002 #include "pool.h" 00003 00004 00005 int pl_buf[pool_size]; 00006 pool_all poal; 00007 00008 00009 int *pool_memmove(int size){ 00010 int *pointr; 00011 pool_each poeh; 00012 size = (size + (sizeof(int) - 1)) / sizeof(int); //round int type alignment 00013 poal.first_pointer = &pl_buf[0]; 00014 00015 //seek pool_each header 00016 pointr = poal.first_pointer + (int)((sizeof(pool_all) + (sizeof(int) - 1)) / sizeof(int)); 00017 00018 //todo: add magic number 00019 while(1){ 00020 memcpy(&poeh, pointr, sizeof(pool_each)); 00021 if((poeh.my_size == 0)||(pointr >= poal.next_pointer)){return NULL;} 00022 00023 if(poeh.available == memory_invalid){ 00024 if(size <= poeh.my_size){ 00025 // seek data_header 00026 poeh.available = memory_available; 00027 memcpy(pointr, &poeh, sizeof(pool_each)); 00028 00029 pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); 00030 return pointr; 00031 } 00032 } 00033 pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)) + poeh.my_size; 00034 } 00035 00036 00037 } 00038 void pool_init(void){ 00039 poal.first_pointer = &pl_buf[0]; 00040 poal.pool_size_all = pool_size; 00041 00042 poal.available = memory_available; 00043 poal.next_pointer = &pl_buf[(int)((sizeof(pool_all) + (sizeof(int) - 1)) / sizeof(int))]; 00044 memcpy(poal.first_pointer, &poal, sizeof(pool_all)); //todo: change 'pl_buf' pointer 00045 00046 } 00047 00048 int *pool_alloc(int size){ 00049 pool_each poeh; 00050 int *pointr; 00051 00052 if(NULL != (pointr = pool_memmove(size)))return pointr; 00053 size = (size + (sizeof(int) - 1)) / sizeof(int); //round int type alignment 00054 00055 poal.pool_size_all = poal.pool_size_all - ((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)) - size; // int alignment 00056 00057 if(poal.pool_size_all <= 0){ 00058 uart_print("malloc error!\r\n"); 00059 return NULL; 00060 } 00061 00062 poeh.my_size = size; 00063 #if defined(USE_MAGIC) 00064 poeh.magic_num = magic_value; 00065 #endif 00066 poeh.available = memory_available; 00067 pointr = poal.next_pointer + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); 00068 00069 poeh.this_pointer = &pointr; 00070 00071 memcpy(poal.next_pointer, &poeh, sizeof(pool_each)); //todo: change 'pl_buf' pointer 00072 poal.next_pointer = pointr + size; 00073 00074 return pointr; 00075 } 00076 00077 void pool_free(int *pointr){ 00078 if (pointr == NULL)return; 00079 pool_each poeh; 00080 00081 pointr = pointr - (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align header 00082 memcpy(&poeh,pointr,sizeof(pool_each)); 00083 #if defined(USE_MAGIC) 00084 if (poeh.magic_num != magic_value){ 00085 uart_print("pointer error\r\n"); 00086 return; 00087 } 00088 #endif 00089 poeh.available = memory_invalid; 00090 memcpy(pointr, &poeh, sizeof(pool_each)); 00091 return; 00092 00093 } 00094 00095 int *pool_realloc(int *pointr, int size){ 00096 00097 int *new_pointr; 00098 00099 if(pointr == NULL)return NULL; 00100 pool_each poeh; 00101 size = (size + (sizeof(int) - 1)) / sizeof(int); //round int type alignment 00102 00103 pointr = pointr - (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align header 00104 00105 memcpy(&poeh,pointr,sizeof(pool_each)); 00106 #if defined(USE_MAGIC) 00107 if (poeh.magic_num != magic_value){ 00108 uart_print("pointer error\r\n"); 00109 return NULL; 00110 } 00111 #endif 00112 if (poeh.my_size >= size){ 00113 00114 poeh.my_size = size; 00115 memcpy(pointr, &poeh, sizeof(pool_each)); 00116 pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align pointer 00117 return pointr; 00118 00119 } 00120 poeh.available = memory_invalid; 00121 memcpy(pointr, &poeh, sizeof(pool_each)); 00122 00123 new_pointr = (int *)pool_alloc(sizeof(int) * size); 00124 pointr = pointr + (int)((sizeof(pool_each) + (sizeof(int) - 1)) / sizeof(int)); // align pointer 00125 00126 memcpy(new_pointr, pointr, sizeof(int) * poeh.my_size); 00127 00128 return new_pointr; 00129 } 00130 00131
Generated on Tue Jul 12 2022 21:16:03 by
1.7.2