📄 os_mem.lst
字号:
118 *********************************************************************************************************
119 */
120
121 void DT_XDATA *OSMemGet (OS_MEM DT_XDATA *pmem, INT8U DT_XDATA *err) REENTRANT
122 {
123 1 void DT_XDATA *pblk;
124 1
125 1
126 1 OS_ENTER_CRITICAL();
127 1 if (pmem->OSMemNFree > 0) { /* See if there are any free memory blocks */
128 2 pblk = pmem->OSMemFreeList; /* Yes, point to next free memory block */
129 2 pmem->OSMemFreeList = *(void DT_XDATA * DT_XDATA *)pblk; /* Adjust pointer to new fre
-e list */
130 2 pmem->OSMemNFree--; /* One less memory block in this partition */
131 2 OS_EXIT_CRITICAL();
132 2 *err = OS_NO_ERR; /* No error */
133 2 return (pblk); /* Return memory block to caller */
134 2 } else {
135 2 OS_EXIT_CRITICAL();
136 2 *err = OS_MEM_NO_FREE_BLKS; /* No, Notify caller of empty memory partition */
137 2 return ((void DT_XDATA *)0); /* Return NULL pointer to caller
- */
138 2 }
139 1 }
140 /*$PAGE*/
141 /*
142 *********************************************************************************************************
143 * INITIALIZE MEMORY PARTITION MANAGER
144 *
145 * Description : This function is called by uC/OS-II to initialize the memory partition manager. Your
146 * application MUST NOT call this function.
147 *
148 * Arguments : none
149 *
150 * Returns : none
151 *********************************************************************************************************
152 */
153
154 void OSMemInit (void) REENTRANT
155 {
156 1 OS_MEM DT_XDATA *pmem;
157 1 INT16U i;
158 1
159 1
160 1 pmem = (OS_MEM DT_XDATA *)&OSMemTbl[0]; /* Point to memory control block (MCB)
- */
161 1 for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions */
162 2 pmem->OSMemFreeList = (void DT_XDATA *)&OSMemTbl[i+1]; /* Chain list of free partitions
- */
163 2 pmem->OSMemAddr = (void DT_XDATA *)0; /* Store start address of memory partition
- */
164 2 pmem->OSMemNFree = 0; /* No free blocks */
165 2 pmem->OSMemNBlks = 0; /* No blocks */
C51 COMPILER V8.02 OS_MEM 02/06/2009 09:22:29 PAGE 4
166 2 pmem->OSMemBlkSize = 0; /* Zero size */
167 2 pmem++;
168 2 }
169 1 OSMemTbl[OS_MAX_MEM_PART - 1].OSMemFreeList = (void DT_XDATA *)0;
170 1 OSMemFreeList = (OS_MEM DT_XDATA *)&OSMemTbl[0];
171 1 }
172 /*$PAGE*/
173 /*
174 *********************************************************************************************************
175 * RELEASE A MEMORY BLOCK
176 *
177 * Description : Returns a memory block to a partition
178 *
179 * Arguments : pmem is a pointer to the memory partition control block
180 *
181 * pblk is a pointer to the memory block being released.
182 *
183 * Returns : OS_NO_ERR if the memory block was inserted into the partition
184 * OS_MEM_FULL if you are returning a memory block to an already FULL memory partition
185 * (You freed more blocks than you allocated!)
186 *********************************************************************************************************
187 */
188
189 INT8U OSMemPut (OS_MEM DT_XDATA *pmem, void DT_XDATA *pblk) REENTRANT
190 {
191 1 OS_ENTER_CRITICAL();
192 1 if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned */
193 2 OS_EXIT_CRITICAL();
194 2 return (OS_MEM_FULL);
195 2 }
196 1 *(void DT_XDATA * DT_XDATA *)pblk = pmem->OSMemFreeList; /* Insert released block into free blo
-ck list */
197 1 pmem->OSMemFreeList = pblk;
198 1 pmem->OSMemNFree++; /* One more memory block in this partition */
199 1 OS_EXIT_CRITICAL();
200 1 return (OS_NO_ERR); /* Notify caller that memory block was released */
201 1 }
202 /*$PAGE*/
203 /*
204 *********************************************************************************************************
205 * QUERY MEMORY PARTITION
206 *
207 * Description : This function is used to determine the number of free memory blocks and the number of
208 * used memory blocks from a memory partition.
209 *
210 * Arguments : pmem is a pointer to the memory partition control block
211 *
212 * ppdata is a pointer to a structure that will contain information about the memory
213 * partition.
214 *
215 * Returns : OS_NO_ERR Always returns no error.
216 *********************************************************************************************************
217 */
218
219 INT8U OSMemQuery (OS_MEM DT_XDATA *pmem, OS_MEM_DATA DT_XDATA *ppdata) REENTRANT
220 {
221 1 OS_ENTER_CRITICAL();
222 1 ppdata->OSAddr = pmem->OSMemAddr;
223 1 ppdata->OSFreeList = pmem->OSMemFreeList;
224 1 ppdata->OSBlkSize = pmem->OSMemBlkSize;
225 1 ppdata->OSNBlks = pmem->OSMemNBlks;
226 1 ppdata->OSNFree = pmem->OSMemNFree;
C51 COMPILER V8.02 OS_MEM 02/06/2009 09:22:29 PAGE 5
227 1 OS_EXIT_CRITICAL();
228 1 ppdata->OSNUsed = ppdata->OSNBlks - ppdata->OSNFree;
229 1 return (OS_NO_ERR);
230 1 }
231 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1490 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 34 ----
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 + -