lib_mem.lst
来自「stm32+ucos-ii」· LST 代码 · 共 1,061 行 · 第 1/5 页
LST
1,061 行
168 pmem_pool->SegNextPtr = (MEM_POOL *) 0;
169 pmem_pool->PoolPrevPtr = (MEM_POOL *) 0;
170 pmem_pool->PoolNextPtr = (MEM_POOL *) 0;
171 pmem_pool->PoolAddrStart = (void *) 0;
172 pmem_pool->PoolAddrEnd = (void *) 0;
173 pmem_pool->PoolPtrs = (void **) 0;
174 pmem_pool->BlkSize = (CPU_SIZE_T ) 0u;
175 pmem_pool->BlkNbr = (CPU_SIZE_T ) 0u;
176 pmem_pool->BlkIx = (MEM_POOL_IX ) 0u;
177
178 #ifdef LIB_MEM_CFG_HEAP_BASE_ADDR
179 pmem_pool->SegAddr = (void *) LIB_MEM_CFG_HEAP_BASE_ADDR;
180 pmem_pool->SegAddrNextAvail = (void *) LIB_MEM_CFG_HEAP_BASE_ADDR;
181 #else
182 pmem_pool->SegAddr = (void *)&Mem_Heap[0];
183 pmem_pool->SegAddrNextAvail = (void *)&Mem_Heap[0];
184 #endif
185
186 pmem_pool->SegSizeTot = (CPU_SIZE_T ) LIB_MEM_CFG_HEAP_SIZE;
187 pmem_pool->SegSizeRem = (CPU_SIZE_T ) LIB_MEM_CFG_HEAP_SIZE;
188
189 /* ------------ INIT MEM POOL TBL ------------- */
190 Mem_PoolTbl = &Mem_PoolHeap;
191 #endif
192 }
\ Mem_Init:
\ 00000000 7047 BX LR ;; return
193
194
195 /*$PAGE*/
196 /*
197 *********************************************************************************************************
198 * Mem_Clr()
199 *
200 * Description : Clear data buffer (see Note #2).
201 *
202 * Argument(s) : pmem Pointer to memory buffer to clear.
203 *
204 * size Number of data buffer octets to clear (see Note #1).
205 *
206 * Return(s) : none.
207 *
208 * Caller(s) : Application.
209 *
210 * Note(s) : (1) Null clears allowed (i.e. zero-length clears).
211 *
212 * See also 'Mem_Set() Note #1'.
213 *
214 * (2) Clear data by setting each data octet to 0.
215 *********************************************************************************************************
216 */
217
\ In section .text, align 2, keep-with-next
218 void Mem_Clr (void *pmem,
219 CPU_SIZE_T size)
220 {
\ Mem_Clr:
\ 00000000 38B5 PUSH {R3-R5,LR}
\ 00000002 0400 MOVS R4,R0
\ 00000004 0D00 MOVS R5,R1
221 Mem_Set(pmem,
222 0u, /* See Note #2. */
223 size);
\ 00000006 2A00 MOVS R2,R5
\ 00000008 0021 MOVS R1,#+0
\ 0000000A 2000 MOVS R0,R4
\ 0000000C ........ BL Mem_Set
224 }
\ 00000010 31BD POP {R0,R4,R5,PC} ;; return
225
226
227 /*$PAGE*/
228 /*
229 *********************************************************************************************************
230 * Mem_Set()
231 *
232 * Description : Fill data buffer with specified data octet.
233 *
234 * Argument(s) : pmem Pointer to memory buffer to fill with specified data octet.
235 *
236 * data_val Data fill octet value.
237 *
238 * size Number of data buffer octets to fill (see Note #1).
239 *
240 * Return(s) : none.
241 *
242 * Caller(s) : Application.
243 *
244 * Note(s) : (1) Null sets allowed (i.e. zero-length sets).
245 *
246 * (2) For best CPU performance, optimized to fill data buffer using 'CPU_ALIGN'-sized data
247 * words.
248 *
249 * (a) Since many word-aligned processors REQUIRE that multi-octet words be accessed on
250 * word-aligned addresses, 'CPU_ALIGN'-sized words MUST be accessed on 'CPU_ALIGN'd
251 * addresses.
252 *
253 * (3) Modulo arithmetic is used to determine whether a memory buffer starts on a 'CPU_ALIGN'
254 * address boundary.
255 *
256 * Modulo arithmetic in ANSI-C REQUIREs operations performed on integer values. Thus,
257 * address values MUST be cast to an appropriately-sized integer value PRIOR to any
258 * mem_align_modulo arithmetic operation.
259 *********************************************************************************************************
260 */
261
\ In section .text, align 2, keep-with-next
262 void Mem_Set (void *pmem,
263 CPU_INT08U data_val,
264 CPU_SIZE_T size)
265 {
\ Mem_Set:
\ 00000000 2DE9F041 PUSH {R4-R8,LR}
266 CPU_SIZE_T size_rem;
267 CPU_ALIGN data_align;
268 CPU_ALIGN *pmem_align;
269 CPU_INT08U *pmem_08;
270 CPU_INT08U mem_align_modulo;
271 CPU_INT08U i;
272
273
274 if (size < 1) { /* See Note #1. */
\ 00000004 002A CMP R2,#+0
\ 00000006 3AD0 BEQ.N ??Mem_Set_0
275 return;
276 }
277 if (pmem == (void *)0) {
\ ??Mem_Set_1:
\ 00000008 0028 CMP R0,#+0
\ 0000000A 38D0 BEQ.N ??Mem_Set_0
278 return;
279 }
280
281
282 data_align = 0u;
\ ??Mem_Set_2:
\ 0000000C 5FF0000E MOVS LR,#+0
\ 00000010 7446 MOV R4,LR
283 for (i = 0u; i < sizeof(CPU_ALIGN); i++) { /* Fill each data_align octet with data val. */
\ 00000012 5FF0000E MOVS LR,#+0
\ 00000016 F446 MOV R12,LR
\ ??Mem_Set_3:
\ 00000018 5FFA8CFC UXTB R12,R12 ;; ZeroExt R12,R12,#+24,#+24
\ 0000001C BCF1040F CMP R12,#+4
\ 00000020 05D2 BCS.N ??Mem_Set_4
284 data_align <<= DEF_OCTET_NBR_BITS;
\ 00000022 2402 LSLS R4,R4,#+8
285 data_align |= (CPU_ALIGN)data_val;
\ 00000024 C9B2 UXTB R1,R1 ;; ZeroExt R1,R1,#+24,#+24
\ 00000026 0C43 ORRS R4,R1,R4
286 }
\ 00000028 1CF1010C ADDS R12,R12,#+1
\ 0000002C F4E7 B.N ??Mem_Set_3
287
288 size_rem = size;
\ ??Mem_Set_4:
\ 0000002E 1300 MOVS R3,R2
289 mem_align_modulo = (CPU_INT08U)((CPU_ADDR)pmem % sizeof(CPU_ALIGN)); /* See Note #3. */
\ 00000030 5FF0040E MOVS LR,#+4
\ 00000034 B0FBFEF8 UDIV R8,R0,LR
\ 00000038 08FB1E08 MLS R8,R8,LR,R0
\ 0000003C 4746 MOV R7,R8
290
291 pmem_08 = (CPU_INT08U *)pmem;
\ 0000003E 0600 MOVS R6,R0
292 if (mem_align_modulo != 0u) { /* If leading octets avail, ... */
\ 00000040 FFB2 UXTB R7,R7 ;; ZeroExt R7,R7,#+24,#+24
\ 00000042 002F CMP R7,#+0
\ 00000044 0DD0 BEQ.N ??Mem_Set_5
293 i = mem_align_modulo;
\ 00000046 BC46 MOV R12,R7
294 while ((size_rem > 0) && /* ... start mem buf fill with leading octets ... */
295 (i < sizeof(CPU_ALIGN ))) { /* ... until next CPU_ALIGN word boundary. */
\ ??Mem_Set_6:
\ 00000048 002B CMP R3,#+0
\ 0000004A 0AD0 BEQ.N ??Mem_Set_5
\ 0000004C 5FFA8CFC UXTB R12,R12 ;; ZeroExt R12,R12,#+24,#+24
\ 00000050 BCF1040F CMP R12,#+4
\ 00000054 05D2 BCS.N ??Mem_Set_5
296 *pmem_08++ = data_val;
\ 00000056 3170 STRB R1,[R6, #+0]
\ 00000058 761C ADDS R6,R6,#+1
297 size_rem -= sizeof(CPU_INT08U);
\ 0000005A 5B1E SUBS R3,R3,#+1
298 i++;
\ 0000005C 1CF1010C ADDS R12,R12,#+1
\ 00000060 F2E7 B.N ??Mem_Set_6
299 }
300 }
301
302 pmem_align = (CPU_ALIGN *)pmem_08; /* See Note #2a. */
\ ??Mem_Set_5:
\ 00000062 3500 MOVS R5,R6
303 while (size_rem >= sizeof(CPU_ALIGN)) { /* While mem buf aligned on CPU_ALIGN word boundaries, */
\ ??Mem_Set_7:
\ 00000064 042B CMP R3,#+4
\ 00000066 03D3 BCC.N ??Mem_Set_8
304 *pmem_align++ = data_align; /* ... fill mem buf with CPU_ALIGN-sized data. */
\ 00000068 2C60 STR R4,[R5, #+0]
\ 0000006A 2D1D ADDS R5,R5,#+4
305 size_rem -= sizeof(CPU_ALIGN);
\ 0000006C 1B1F SUBS R3,R3,#+4
\ 0000006E F9E7 B.N ??Mem_Set_7
306 }
307
308 pmem_08 = (CPU_INT08U *)pmem_align;
\ ??Mem_Set_8:
\ 00000070 2E00 MOVS R6,R5
309 while (size_rem > 0) { /* Finish mem buf fill with trailing octets. */
\ ??Mem_Set_9:
\ 00000072 002B CMP R3,#+0
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?