UCOS_TI_LM3S_Keil
 全部 结构体 文件 函数 变量 类型定义 宏定义 
os_mem.c 文件参考
#include <ucos_ii.h>
os_mem.c 的引用(Include)关系图:

浏览源代码.

函数

OS_MEMOSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *perr)
 
void * OSMemGet (OS_MEM *pmem, INT8U *perr)
 
INT8U OSMemNameGet (OS_MEM *pmem, INT8U **pname, INT8U *perr)
 
void OSMemNameSet (OS_MEM *pmem, INT8U *pname, INT8U *perr)
 
INT8U OSMemPut (OS_MEM *pmem, void *pblk)
 
INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
 
void OS_MemInit (void)
 

函数说明

OS_MEM* OSMemCreate ( void *  addr,
INT32U  nblks,
INT32U  blksize,
INT8U perr 
)

在文件 os_mem.c59 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_INVALID_ADDR, OS_ERR_MEM_INVALID_BLKS, OS_ERR_MEM_INVALID_PART, OS_ERR_MEM_INVALID_SIZE, OS_ERR_NONE, OS_EXIT_CRITICAL, OS_MEM::OSMemAddr, OS_MEM::OSMemBlkSize, OS_MEM::OSMemFreeList, OSMemFreeList, OS_MEM::OSMemNBlks , 以及 OS_MEM::OSMemNFree.

63 {
64  OS_MEM *pmem;
65  INT8U *pblk;
66  void **plink;
67  INT32U i;
68 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
69  OS_CPU_SR cpu_sr = 0u;
70 #endif
71 
72 
73 
74 #if OS_ARG_CHK_EN > 0u
75  if (perr == (INT8U *)0) { /* Validate 'perr' */
76  return ((OS_MEM *)0);
77  }
78  if (addr == (void *)0) { /* Must pass a valid address for the memory part.*/
80  return ((OS_MEM *)0);
81  }
82  if (((INT32U)addr & (sizeof(void *) - 1u)) != 0u){ /* Must be pointer size aligned */
84  return ((OS_MEM *)0);
85  }
86  if (nblks < 2u) { /* Must have at least 2 blocks per partition */
88  return ((OS_MEM *)0);
89  }
90  if (blksize < sizeof(void *)) { /* Must contain space for at least a pointer */
92  return ((OS_MEM *)0);
93  }
94 #endif
96  pmem = OSMemFreeList; /* Get next free memory partition */
97  if (OSMemFreeList != (OS_MEM *)0) { /* See if pool of free partitions was empty */
99  }
101  if (pmem == (OS_MEM *)0) { /* See if we have a memory partition */
102  *perr = OS_ERR_MEM_INVALID_PART;
103  return ((OS_MEM *)0);
104  }
105  plink = (void **)addr; /* Create linked list of free memory blocks */
106  pblk = (INT8U *)((INT32U)addr + blksize);
107  for (i = 0u; i < (nblks - 1u); i++) {
108  *plink = (void *)pblk; /* Save pointer to NEXT block in CURRENT block */
109  plink = (void **)pblk; /* Position to NEXT block */
110  pblk = (INT8U *)((INT32U)pblk + blksize); /* Point to the FOLLOWING block */
111  }
112  *plink = (void *)0; /* Last memory block points to NULL */
113  pmem->OSMemAddr = addr; /* Store start address of memory partition */
114  pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks */
115  pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB */
116  pmem->OSMemNBlks = nblks;
117  pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks */
118  *perr = OS_ERR_NONE;
119  return (pmem);
120 }
void* OSMemGet ( OS_MEM pmem,
INT8U perr 
)

在文件 os_mem.c142 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_INVALID_PMEM, OS_ERR_MEM_NO_FREE_BLKS, OS_ERR_NONE, OS_EXIT_CRITICAL, OS_MEM::OSMemFreeList , 以及 OS_MEM::OSMemNFree.

144 {
145  void *pblk;
146 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
147  OS_CPU_SR cpu_sr = 0u;
148 #endif
149 
150 
151 
152 #if OS_ARG_CHK_EN > 0u
153  if (perr == (INT8U *)0) { /* Validate 'perr' */
154  return ((void *)0);
155  }
156  if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
157  *perr = OS_ERR_MEM_INVALID_PMEM;
158  return ((void *)0);
159  }
160 #endif
162  if (pmem->OSMemNFree > 0u) { /* See if there are any free memory blocks */
163  pblk = pmem->OSMemFreeList; /* Yes, point to next free memory block */
164  pmem->OSMemFreeList = *(void **)pblk; /* Adjust pointer to new free list */
165  pmem->OSMemNFree--; /* One less memory block in this partition */
167  *perr = OS_ERR_NONE; /* No error */
168  return (pblk); /* Return memory block to caller */
169  }
171  *perr = OS_ERR_MEM_NO_FREE_BLKS; /* No, Notify caller of empty memory partition */
172  return ((void *)0); /* Return NULL pointer to caller */
173 }
INT8U OSMemNameGet ( OS_MEM pmem,
INT8U **  pname,
INT8U perr 
)

在文件 os_mem.c197 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_INVALID_PMEM, OS_ERR_NAME_GET_ISR, OS_ERR_NONE, OS_ERR_PNAME_NULL, OS_EXIT_CRITICAL, OS_StrLen(), OSIntNesting , 以及 OS_MEM::OSMemName.

200 {
201  INT8U len;
202 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
203  OS_CPU_SR cpu_sr = 0u;
204 #endif
205 
206 
207 
208 #if OS_ARG_CHK_EN > 0u
209  if (perr == (INT8U *)0) { /* Validate 'perr' */
210  return (0u);
211  }
212  if (pmem == (OS_MEM *)0) { /* Is 'pmem' a NULL pointer? */
213  *perr = OS_ERR_MEM_INVALID_PMEM;
214  return (0u);
215  }
216  if (pname == (INT8U **)0) { /* Is 'pname' a NULL pointer? */
217  *perr = OS_ERR_PNAME_NULL;
218  return (0u);
219  }
220 #endif
221  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
222  *perr = OS_ERR_NAME_GET_ISR;
223  return (0u);
224  }
226  *pname = pmem->OSMemName;
227  len = OS_StrLen(*pname);
229  *perr = OS_ERR_NONE;
230  return (len);
231 }

函数调用图:

void OSMemNameSet ( OS_MEM pmem,
INT8U pname,
INT8U perr 
)

在文件 os_mem.c258 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_INVALID_PMEM, OS_ERR_NAME_SET_ISR, OS_ERR_NONE, OS_ERR_PNAME_NULL, OS_EXIT_CRITICAL, OSIntNesting , 以及 OS_MEM::OSMemName.

261 {
262 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
263  OS_CPU_SR cpu_sr = 0u;
264 #endif
265 
266 
267 
268 #if OS_ARG_CHK_EN > 0u
269  if (perr == (INT8U *)0) { /* Validate 'perr' */
270  return;
271  }
272  if (pmem == (OS_MEM *)0) { /* Is 'pmem' a NULL pointer? */
273  *perr = OS_ERR_MEM_INVALID_PMEM;
274  return;
275  }
276  if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
277  *perr = OS_ERR_PNAME_NULL;
278  return;
279  }
280 #endif
281  if (OSIntNesting > 0u) { /* See if trying to call from an ISR */
282  *perr = OS_ERR_NAME_SET_ISR;
283  return;
284  }
286  pmem->OSMemName = pname;
288  *perr = OS_ERR_NONE;
289 }
INT8U OSMemPut ( OS_MEM pmem,
void *  pblk 
)

在文件 os_mem.c311 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_FULL, OS_ERR_MEM_INVALID_PBLK, OS_ERR_MEM_INVALID_PMEM, OS_ERR_NONE, OS_EXIT_CRITICAL, OS_MEM::OSMemFreeList, OS_MEM::OSMemNBlks , 以及 OS_MEM::OSMemNFree.

313 {
314 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
315  OS_CPU_SR cpu_sr = 0u;
316 #endif
317 
318 
319 
320 #if OS_ARG_CHK_EN > 0u
321  if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
322  return (OS_ERR_MEM_INVALID_PMEM);
323  }
324  if (pblk == (void *)0) { /* Must release a valid block */
325  return (OS_ERR_MEM_INVALID_PBLK);
326  }
327 #endif
329  if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned */
331  return (OS_ERR_MEM_FULL);
332  }
333  *(void **)pblk = pmem->OSMemFreeList; /* Insert released block into free block list */
334  pmem->OSMemFreeList = pblk;
335  pmem->OSMemNFree++; /* One more memory block in this partition */
337  return (OS_ERR_NONE); /* Notify caller that memory block was released */
338 }
INT8U OSMemQuery ( OS_MEM pmem,
OS_MEM_DATA p_mem_data 
)

在文件 os_mem.c359 行定义.

参考 OS_ENTER_CRITICAL, OS_ERR_MEM_INVALID_PDATA, OS_ERR_MEM_INVALID_PMEM, OS_ERR_NONE, OS_EXIT_CRITICAL, OS_MEM_DATA::OSAddr, OS_MEM_DATA::OSBlkSize, OS_MEM_DATA::OSFreeList, OS_MEM::OSMemAddr, OS_MEM::OSMemBlkSize, OS_MEM::OSMemFreeList, OS_MEM::OSMemNBlks, OS_MEM::OSMemNFree, OS_MEM_DATA::OSNBlks, OS_MEM_DATA::OSNFree , 以及 OS_MEM_DATA::OSNUsed.

361 {
362 #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
363  OS_CPU_SR cpu_sr = 0u;
364 #endif
365 
366 
367 
368 #if OS_ARG_CHK_EN > 0u
369  if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
370  return (OS_ERR_MEM_INVALID_PMEM);
371  }
372  if (p_mem_data == (OS_MEM_DATA *)0) { /* Must release a valid storage area for the data */
373  return (OS_ERR_MEM_INVALID_PDATA);
374  }
375 #endif
377  p_mem_data->OSAddr = pmem->OSMemAddr;
378  p_mem_data->OSFreeList = pmem->OSMemFreeList;
379  p_mem_data->OSBlkSize = pmem->OSMemBlkSize;
380  p_mem_data->OSNBlks = pmem->OSMemNBlks;
381  p_mem_data->OSNFree = pmem->OSMemNFree;
383  p_mem_data->OSNUsed = p_mem_data->OSNBlks - p_mem_data->OSNFree;
384  return (OS_ERR_NONE);
385 }
void OS_MemInit ( void  )

在文件 os_mem.c403 行定义.

参考 OS_MAX_MEM_PART, OS_MemClr(), OS_MEM::OSMemFreeList, OSMemFreeList, OS_MEM::OSMemName , 以及 OSMemTbl.

参考自 OSInit().

404 {
405 #if OS_MAX_MEM_PART == 1u
406  OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table */
407  OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
408 #if OS_MEM_NAME_EN > 0u
409  OSMemFreeList->OSMemName = (INT8U *)"?"; /* Unknown name */
410 #endif
411 #endif
412 
413 #if OS_MAX_MEM_PART >= 2u
414  OS_MEM *pmem;
415  INT16U i;
416 
417 
418  OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table */
419  pmem = &OSMemTbl[0]; /* Point to memory control block (MCB) */
420  for (i = 0u; i < (OS_MAX_MEM_PART - 1u); i++) { /* Init. list of free memory partitions */
421  pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
422 #if OS_MEM_NAME_EN > 0u
423  pmem->OSMemName = (INT8U *)"?";
424 #endif
425  pmem++;
426  }
427  pmem->OSMemFreeList = (void *)0; /* Initialize last node */
428 #if OS_MEM_NAME_EN > 0u
429  pmem->OSMemName = (INT8U *)"?";
430 #endif
431 
432  OSMemFreeList = &OSMemTbl[0]; /* Point to beginning of free list */
433 #endif
434 }

函数调用图:

这是这个函数的调用关系图: