Published 03 Dec 2010, by
Eric Ebert
CoOS,
rtos
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <coocox.h>
00019
00020
00021 #if CFG_MM_EN > 0
00022
00023 MM MemoryTbl[CFG_MAX_MM] = {{0}};
00024 U32 MemoryIDVessel = 0;
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 OS_MMID CoCreateMemPartition(U8* memBuf,U32 blockSize,U32 blockNum)
00041 {
00042 U8 i,j;
00043 U8 *memory;
00044 P_MemBlk memBlk;
00045 memory = memBuf;
00046
00047 #if CFG_PAR_CHECKOUT_EN >0
00048 if(memBuf == 0)
00049 {
00050 return E_CREATE_FAIL;
00051 }
00052 if(blockSize == 0)
00053 {
00054 return E_CREATE_FAIL;
00055 }
00056 if((blockSize&0x3) != 0)
00057 {
00058 return E_CREATE_FAIL;
00059 }
00060 if(blockNum<=1)
00061 {
00062 return E_CREATE_FAIL;
00063 }
00064 #endif
00065
00066 OsSchedLock ();
00067 for(i = 0; i < CFG_MAX_MM; i++)
00068 {
00069 if((MemoryIDVessel & (1 << i)) == 0)
00070 {
00071 MemoryIDVessel |= (1<<i);
00072 OsSchedUnlock();
00073 MemoryTbl[i].memAddr = memory;
00074 MemoryTbl[i].freeBlock = memory;
00075 MemoryTbl[i].blockSize = blockSize;
00076 MemoryTbl[i].blockNum = blockNum;
00077 memBlk = (P_MemBlk)memory;
00078 for(j=0;j<blockNum-1;j++)
00079 {
00080 memory = memory+blockSize;
00081 memBlk->nextBlock = (P_MemBlk)memory;
00082 memBlk = memBlk->nextBlock;
00083 }
00084 memBlk->nextBlock = 0;
00085 return i;
00086 }
00087 }
00088 OsSchedUnlock();
00089 return E_CREATE_FAIL;
00090 }
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 StatusType CoDelMemoryPartition(OS_MMID mmID)
00106 {
00107 P_MM memCtl;
00108 #if CFG_PAR_CHECKOUT_EN >0
00109 if(mmID >= CFG_MAX_MM)
00110 {
00111 return E_INVALID_ID;
00112 }
00113 if( ((1<<mmID)&MemoryIDVessel) == 0)
00114 {
00115 return E_INVALID_ID;
00116 }
00117 #endif
00118 OsSchedLock ();
00119 memCtl = &MemoryTbl[mmID];
00120 MemoryIDVessel &= ~(1<<mmID);
00121 OsSchedUnlock();
00122
00123 memCtl->memAddr = 0;
00124 memCtl->freeBlock = 0;
00125 memCtl->blockSize = 0;
00126 memCtl->blockNum = 0;
00127 return E_OK;
00128 }
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 U32 CoGetFreeBlockNum(OS_MMID mmID,StatusType* perr)
00146 {
00147 U32 fbNum;
00148 P_MM memCtl;
00149 P_MemBlk memBlk;
00150 #if CFG_PAR_CHECKOUT_EN >0
00151 if(mmID >= CFG_MAX_MM)
00152 {
00153 *perr = E_INVALID_ID;
00154 return 0;
00155 }
00156 if( ((1<<mmID)&MemoryIDVessel) == 0)
00157 {
00158 *perr = E_INVALID_ID;
00159 return 0;
00160 }
00161 #endif
00162 memCtl = &MemoryTbl[mmID];
00163 OsSchedLock ();
00164 memBlk = (P_MemBlk)(memCtl->freeBlock);
00165 fbNum = 0;
00166 while(memBlk != 0)
00167 {
00168 fbNum++;
00169 memBlk = memBlk->nextBlock;
00170 }
00171 OsSchedUnlock();
00172 *perr = E_OK;
00173 return fbNum;
00174 }
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189 void* CoGetMemoryBuffer(OS_MMID mmID)
00190 {
00191 P_MM memCtl;
00192 P_MemBlk memBlk;
00193 #if CFG_PAR_CHECKOUT_EN >0
00194 if(mmID >= CFG_MAX_MM)
00195 {
00196 return 0;
00197 }
00198 if( ((1<<mmID)&MemoryIDVessel) == 0)
00199 {
00200 return 0;
00201 }
00202 #endif
00203 memCtl = &MemoryTbl[mmID];
00204 OsSchedLock ();
00205 if(memCtl->freeBlock == 0 )
00206 {
00207 OsSchedUnlock();
00208 return 0;
00209 }
00210 memBlk = (P_MemBlk)memCtl->freeBlock;
00211 memCtl->freeBlock = (U8*)memBlk->nextBlock;
00212 OsSchedUnlock();
00213 return memBlk;
00214 }
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 StatusType CoFreeMemoryBuffer(OS_MMID mmID,void* buf)
00233 {
00234 P_MM memCtl;
00235 P_MemBlk memBlk;
00236 #if CFG_PAR_CHECKOUT_EN >0
00237 if(mmID >= CFG_MAX_MM)
00238 {
00239 return E_INVALID_ID;
00240 }
00241 if( ((1<<mmID)&MemoryIDVessel) == 0)
00242 {
00243 return E_INVALID_ID;
00244 }
00245 if(buf == 0)
00246 {
00247 return E_INVALID_PARAMETER;
00248 }
00249 #endif
00250
00251 memCtl = &MemoryTbl[mmID];
00252 #if CFG_PAR_CHECKOUT_EN >0
00253 if((U32)buf < (U32)(memCtl->memAddr))
00254 {
00255 return E_INVALID_PARAMETER;
00256 }
00257 if((U32)buf > (U32)(memCtl->memAddr + memCtl->blockSize*memCtl->blockNum))
00258 {
00259 return E_INVALID_PARAMETER;
00260 }
00261 if(((U32)buf - (U32)(memCtl->memAddr))%(memCtl->blockSize) != 0)
00262 {
00263 return E_INVALID_PARAMETER;
00264 }
00265 #endif
00266 memBlk = (P_MemBlk)buf;
00267 OsSchedLock ();
00268 memBlk->nextBlock = (P_MemBlk)memCtl->freeBlock;
00269 memCtl->freeBlock = (U8 *) buf;
00270 OsSchedUnlock();
00271 return E_OK;
00272 }
00273
00274 #endif
00275