📄 osal_memory.lst
字号:
272 size += (sizeof( halDataAlign_t ) - mod);
273 }
274 }
275
276 HAL_ENTER_CRITICAL_SECTION( intState ); // Hold off interrupts.
\ 000028 A2AF MOV C,0xa8.7
\ 00002A E4 CLR A
\ 00002B 92E0 MOV 0xE0 /* A */.0,C
\ 00002D FC MOV R4,A
\ 00002E C2AF CLR 0xa8.7
277
278 // Smaller allocations are first attempted in the small-block bucket.
279 if ( size <= OSALMEM_SMALL_BLKSZ )
\ 000030 C3 CLR C
\ 000031 E5.. MOV A,?V0 + 0
\ 000033 9411 SUBB A,#0x11
\ 000035 E5.. MOV A,?V0 + 1
\ 000037 9400 SUBB A,#0x0
\ 000039 5005 JNC ??osal_mem_alloc_1
280 {
281 hdr = ff1;
\ 00003B 90.... MOV DPTR,#??ff1
\ 00003E 8003 SJMP ??osal_mem_alloc_2
282 }
283 else
284 {
285 hdr = ff2;
\ ??osal_mem_alloc_1:
\ 000040 90.... MOV DPTR,#??ff2
\ ??osal_mem_alloc_2:
\ 000043 E0 MOVX A,@DPTR
\ 000044 FA MOV R2,A
\ 000045 A3 INC DPTR
\ 000046 E0 MOVX A,@DPTR
\ 000047 12.... LCALL ?Subroutine1 & 0xFFFF
286 }
287 tmp = *hdr;
288
289 do
290 {
291 if ( tmp & OSALMEM_IN_USE )
\ ??CrossCallReturnLabel_2:
\ 00004A 7480 MOV A,#-0x80
\ 00004C 59 ANL A,R1
\ 00004D F5.. MOV ?V0 + 5,A
\ 00004F E4 CLR A
\ 000050 7002 JNZ ??osal_mem_alloc_3
\ 000052 E5.. MOV A,?V0 + 5
\ ??osal_mem_alloc_3:
\ 000054 6009 JZ ??osal_mem_alloc_4
292 {
293 tmp ^= OSALMEM_IN_USE;
\ 000056 7480 MOV A,#-0x80
\ 000058 69 XRL A,R1
\ 000059 F9 MOV R1,A
294 coal = 0;
\ 00005A 75..00 MOV ?V0 + 2,#0x0
\ 00005D 8077 SJMP ??osal_mem_alloc_5
295 }
296 else
297 {
298 if ( coal != 0 )
\ ??osal_mem_alloc_4:
\ 00005F E5.. MOV A,?V0 + 2
\ 000061 6063 JZ ??osal_mem_alloc_6
299 {
300 #if ( OSALMEM_METRICS )
301 blkCnt--;
302 blkFree--;
303 #endif
304
305 *prev += *hdr;
\ 000063 8A82 MOV DPL,R2
\ 000065 8B83 MOV DPH,R3
\ 000067 E0 MOVX A,@DPTR
\ 000068 F5.. MOV ?V0 + 4,A
\ 00006A A3 INC DPTR
\ 00006B E0 MOVX A,@DPTR
\ 00006C F5.. MOV ?V0 + 5,A
\ 00006E 8E82 MOV DPL,R6
\ 000070 8F83 MOV DPH,R7
\ 000072 E0 MOVX A,@DPTR
\ 000073 25.. ADD A,?V0 + 4
\ 000075 F0 MOVX @DPTR,A
\ 000076 A3 INC DPTR
\ 000077 E0 MOVX A,@DPTR
\ 000078 35.. ADDC A,?V0 + 5
\ 00007A F0 MOVX @DPTR,A
306
307 if ( *prev >= size )
\ 00007B 8E82 MOV DPL,R6
\ 00007D 8F83 MOV DPH,R7
\ 00007F C3 CLR C
\ 000080 E0 MOVX A,@DPTR
\ 000081 95.. SUBB A,?V0 + 0
\ 000083 A3 INC DPTR
\ 000084 E0 MOVX A,@DPTR
\ 000085 95.. SUBB A,?V0 + 1
\ 000087 404D JC ??osal_mem_alloc_5
308 {
309 hdr = prev;
\ 000089 EE MOV A,R6
\ 00008A FA MOV R2,A
\ 00008B EF MOV A,R7
\ 00008C 12.... LCALL ?Subroutine1 & 0xFFFF
310 tmp = *hdr;
311 break;
312 }
313 }
314 else
315 {
316 if ( tmp >= size )
317 {
318 break;
319 }
320
321 coal = 1;
322 prev = hdr;
323 }
324 }
325
326 hdr = (osalMemHdr_t *)((byte *)hdr + tmp);
327
328 tmp = *hdr;
329 if ( tmp == 0 )
330 {
331 hdr = NULL;
332 break;
333 }
334
335
336 } while ( 1 );
337
338 if ( hdr != NULL )
\ ??CrossCallReturnLabel_3:
\ 00008F EA MOV A,R2
\ 000090 7001 JNZ ??osal_mem_alloc_7
\ 000092 EB MOV A,R3
\ ??osal_mem_alloc_7:
\ 000093 606C JZ ??osal_mem_alloc_8
339 {
340 tmp -= size;
\ 000095 C3 CLR C
\ 000096 E8 MOV A,R0
\ 000097 95.. SUBB A,?V0 + 0
\ 000099 F8 MOV R0,A
\ 00009A E9 MOV A,R1
\ 00009B 95.. SUBB A,?V0 + 1
\ 00009D F9 MOV R1,A
341
342 // Determine whether the threshold for splitting is met.
343 if ( tmp >= OSALMEM_MIN_BLKSZ )
\ 00009E C3 CLR C
\ 00009F E8 MOV A,R0
\ 0000A0 9404 SUBB A,#0x4
\ 0000A2 E9 MOV A,R1
\ 0000A3 9400 SUBB A,#0x0
\ 0000A5 4046 JC ??osal_mem_alloc_9
344 {
345 // Split the block before allocating it.
346 osalMemHdr_t *next = (osalMemHdr_t *)((byte *)hdr + size);
347 *next = tmp;
\ 0000A7 EA MOV A,R2
\ 0000A8 25.. ADD A,?V0 + 0
\ 0000AA F582 MOV DPL,A
\ 0000AC EB MOV A,R3
\ 0000AD 35.. ADDC A,?V0 + 1
\ 0000AF F583 MOV DPH,A
\ 0000B1 E8 MOV A,R0
\ 0000B2 F0 MOVX @DPTR,A
\ 0000B3 A3 INC DPTR
\ 0000B4 E9 MOV A,R1
\ 0000B5 F0 MOVX @DPTR,A
348 *hdr = (size | OSALMEM_IN_USE);
\ 0000B6 7480 MOV A,#-0x80
\ 0000B8 45.. ORL A,?V0 + 1
\ 0000BA F9 MOV R1,A
\ 0000BB 8A82 MOV DPL,R2
\ 0000BD 8B83 MOV DPH,R3
\ 0000BF E5.. MOV A,?V0 + 0
\ 0000C1 F0 MOVX @DPTR,A
\ 0000C2 A3 INC DPTR
\ 0000C3 E9 MOV A,R1
\ 0000C4 8031 SJMP ??osal_mem_alloc_10
349
350 #if ( OSALMEM_METRICS )
351 blkCnt++;
352 if ( blkMax < blkCnt )
353 {
354 blkMax = blkCnt;
355 }
356 memAlo += size;
357 #endif
358 }
\ ??osal_mem_alloc_6:
\ 0000C6 C3 CLR C
\ 0000C7 E8 MOV A,R0
\ 0000C8 95.. SUBB A,?V0 + 0
\ 0000CA E9 MOV A,R1
\ 0000CB 95.. SUBB A,?V0 + 1
\ 0000CD 50C0 JNC ??CrossCallReturnLabel_3
\ 0000CF 75..01 MOV ?V0 + 2,#0x1
\ 0000D2 EA MOV A,R2
\ 0000D3 FE MOV R6,A
\ 0000D4 EB MOV A,R3
\ 0000D5 FF MOV R7,A
\ ??osal_mem_alloc_5:
\ 0000D6 EA MOV A,R2
\ 0000D7 28 ADD A,R0
\ 0000D8 FA MOV R2,A
\ 0000D9 EB MOV A,R3
\ 0000DA 39 ADDC A,R1
\ 0000DB 12.... LCALL ?Subroutine1 & 0xFFFF
\ ??CrossCallReturnLabel_4:
\ 0000DE E8 MOV A,R0
\ 0000DF 7001 JNZ ??osal_mem_alloc_11
\ 0000E1 E9 MOV A,R1
\ ??osal_mem_alloc_11:
\ 0000E2 6003 JZ $+5
\ 0000E4 02.... LJMP ??CrossCallReturnLabel_2 & 0xFFFF
\ 0000E7 7A00 MOV R2,#0x0
\ 0000E9 7B00 MOV R3,#0x0
\ 0000EB 8014 SJMP ??osal_mem_alloc_8
359 else
360 {
361 #if ( OSALMEM_METRICS )
362 memAlo += *hdr;
363 blkFree--;
364 #endif
365
366 *hdr |= OSALMEM_IN_USE;
\ ??osal_mem_alloc_9:
\ 0000ED 8A82 MOV DPL,R2
\ 0000EF 8B83 MOV DPH,R3
\ 0000F1 E0 MOVX A,@DPTR
\ 0000F2 F0 MOVX @DPTR,A
\ 0000F3 A3 INC DPTR
\ 0000F4 E0 MOVX A,@DPTR
\ 0000F5 4480 ORL A,#0x80
\ ??osal_mem_alloc_10:
\ 0000F7 F0 MOVX @DPTR,A
367 }
368
369 #if ( OSALMEM_METRICS )
370 if ( memMax < memAlo )
371 {
372 memMax = memAlo;
373 }
374 #endif
375
376 #if ( OSALMEM_PROFILER )
377 {
378 byte idx;
379 size = *hdr ^ OSALMEM_IN_USE;
380
381 for ( idx = 0; idx < OSALMEM_PROMAX; idx++ )
382 {
383 if ( size <= proCnt[idx] )
384 {
385 break;
386 }
387 }
388 proCur[idx]++;
389 if ( proMax[idx] < proCur[idx] )
390 {
391 proMax[idx] = proCur[idx];
392 }
393 proTot[idx]++;
394 }
395 #endif
396
397 hdr++;
\ 0000F8 EA MOV A,R2
\ 0000F9 2402 ADD A,#0x2
\ 0000FB 0A INC R2
\ 0000FC 0A INC R2
\ 0000FD EB MOV A,R3
\ 0000FE 3400 ADDC A,#0x0
\ 000100 FB MOV R3,A
398
399 #if ( OSALMEM_PROFILER )
400 osal_memset( (byte *)hdr, OSALMEM_ALOC, (size - HDRSZ) );
401
402 /* A small-block could not be allocated in the small-block bucket.
403 * When this occurs significantly frequently, increase the size of the
404 * bucket in order to restore better worst case run times. Set the first
405 * profiling bucket size in proCnt[] to the small-block bucket size and
406 * divide proSmallBlkMiss by the corresponding proTot[] size to get % miss.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -