📄 os_mem.lst
字号:
148 /*
149 *********************************************************************************************************
150 * RELEASE A MEMORY BLOCK
151 *
152 * Description : Returns a memory block to a partition
153 *
154 * Arguments : pmem is a pointer to the memory partition control block
155 *
156 * pblk is a pointer to the memory block being released.
157 *
158 * Returns : OS_NO_ERR if the memory block was inserted into the partition
159 * OS_MEM_FULL if you are returning a memory block to an already FULL memory
160 * partition (You freed more blocks than you allocated!)
161 * OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
162 * OS_MEM_INVALID_PBLK if you passed a NULL pointer for the block to release.
163 *********************************************************************************************************
164 */
165
166 INT8U OSMemPut (OS_MEM *pmem, void *pblk) KCREENTRANT
167 {
168 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
171 1
172 1
173 1 #if OS_ARG_CHK_EN > 0
174 1 if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
175 2 return (OS_MEM_INVALID_PMEM);
176 2 }
177 1 if (pblk == (void *)0) { /* Must release a valid block */
178 2 return (OS_MEM_INVALID_PBLK);
179 2 }
C51 COMPILER V6.23a OS_MEM 12/09/2004 16:50:25 PAGE 4
180 1 #endif
181 1 OS_ENTER_CRITICAL();
182 1 if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned */
183 2 OS_EXIT_CRITICAL();
184 2 return (OS_MEM_FULL);
185 2 }
186 1 *(void **)pblk = pmem->OSMemFreeList; /* Insert released block into free block list */
187 1 pmem->OSMemFreeList = pblk;
188 1 pmem->OSMemNFree++; /* One more memory block in this partition */
189 1 OS_EXIT_CRITICAL();
190 1 return (OS_NO_ERR); /* Notify caller that memory block was released */
191 1 }
192 /*$PAGE*/
193 /*
194 *********************************************************************************************************
195 * QUERY MEMORY PARTITION
196 *
197 * Description : This function is used to determine the number of free memory blocks and the number of
198 * used memory blocks from a memory partition.
199 *
200 * Arguments : pmem is a pointer to the memory partition control block
201 *
202 * pdata is a pointer to a structure that will contain information about the memory
203 * partition.
204 *
205 * Returns : OS_NO_ERR If no errors were found.
206 * OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
207 * OS_MEM_INVALID_PDATA if you passed a NULL pointer for the block to release.
208 *********************************************************************************************************
209 */
210
211 #if OS_MEM_QUERY_EN > 0
212 INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *pdata) KCREENTRANT
213 {
214 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
217 1
218 1
219 1 #if OS_ARG_CHK_EN > 0
220 1 if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
221 2 return (OS_MEM_INVALID_PMEM);
222 2 }
223 1 if (pdata == (OS_MEM_DATA *)0) { /* Must release a valid storage area for the data */
224 2 return (OS_MEM_INVALID_PDATA);
225 2 }
226 1 #endif
227 1 OS_ENTER_CRITICAL();
228 1 pdata->OSAddr = pmem->OSMemAddr;
229 1 pdata->OSFreeList = pmem->OSMemFreeList;
230 1 pdata->OSBlkSize = pmem->OSMemBlkSize;
231 1 pdata->OSNBlks = pmem->OSMemNBlks;
232 1 pdata->OSNFree = pmem->OSMemNFree;
233 1 OS_EXIT_CRITICAL();
234 1 pdata->OSNUsed = pdata->OSNBlks - pdata->OSNFree;
235 1 return (OS_NO_ERR);
236 1 }
237 #endif /* OS_MEM_QUERY_EN */
238 /*$PAGE*/
239 /*
240 *********************************************************************************************************
241 * INITIALIZE MEMORY PARTITION MANAGER
C51 COMPILER V6.23a OS_MEM 12/09/2004 16:50:25 PAGE 5
242 *
243 * Description : This function is called by uC/OS-II to initialize the memory partition manager. Your
244 * application MUST NOT call this function.
245 *
246 * Arguments : none
247 *
248 * Returns : none
249 *
250 * Note(s) : This function is INTERNAL to uC/OS-II and your application should not call it.
251 *********************************************************************************************************
252 */
253
254 void OS_MemInit (void) KCREENTRANT
255 {
256 1 #if OS_MAX_MEM_PART == 1
OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
OSMemFreeList->OSMemFreeList = (void *)0; /* Initialize last node */
OSMemFreeList->OSMemAddr = (void *)0; /* Store start address of memory partition */
OSMemFreeList->OSMemNFree = 0; /* No free blocks */
OSMemFreeList->OSMemNBlks = 0; /* No blocks */
OSMemFreeList->OSMemBlkSize = 0; /* Zero size */
#endif
264 1
265 1 #if OS_MAX_MEM_PART >= 2
266 1 OS_MEM *pmem;
267 1 INT16U i;
268 1
269 1
270 1 pmem = (OS_MEM *)&OSMemTbl[0]; /* Point to memory control block (MCB) */
271 1 for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions */
272 2 pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
273 2 pmem->OSMemAddr = (void *)0; /* Store start address of memory partition */
274 2 pmem->OSMemNFree = 0; /* No free blocks */
275 2 pmem->OSMemNBlks = 0; /* No blocks */
276 2 pmem->OSMemBlkSize = 0; /* Zero size */
277 2 pmem++;
278 2 }
279 1 pmem->OSMemFreeList = (void *)0; /* Initialize last node */
280 1 pmem->OSMemAddr = (void *)0; /* Store start address of memory partition */
281 1 pmem->OSMemNFree = 0; /* No free blocks */
282 1 pmem->OSMemNBlks = 0; /* No blocks */
283 1 pmem->OSMemBlkSize = 0; /* Zero size */
284 1
285 1 OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
286 1 #endif
287 1 }
288 #endif /* OS_MEM_EN */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1942 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -