📄 lib_mem.lst
字号:
\ 00000022 1400 MOVS R4,R2
493 /* Start @ end of mem bufs (see Note #2). */
494 p1_mem_08 = (const CPU_INT08U *)p1_mem + size;
\ 00000024 D018 ADDS R0,R2,R3
\ 00000026 0700 MOVS R7,R0
495 p2_mem_08 = (const CPU_INT08U *)p2_mem + size;
\ 00000028 5018 ADDS R0,R2,R1
\ 0000002A 8646 MOV LR,R0
496 /* See Note #4. */
497 mem_align_modulo_1 = (CPU_INT08U)((CPU_ADDR)p1_mem_08 % sizeof(CPU_ALIGN));
\ 0000002C 0420 MOVS R0,#+4
\ 0000002E B7FBF0FC UDIV R12,R7,R0
\ 00000032 0CFB107C MLS R12,R12,R0,R7
\ 00000036 E146 MOV R9,R12
498 mem_align_modulo_2 = (CPU_INT08U)((CPU_ADDR)p2_mem_08 % sizeof(CPU_ALIGN));
\ 00000038 5FF0040C MOVS R12,#+4
\ 0000003C BEFBFCF0 UDIV R0,LR,R12
\ 00000040 00FB1CE0 MLS R0,R0,R12,LR
\ 00000044 8DF80000 STRB R0,[SP, #+0]
499
500 mem_aligned = (mem_align_modulo_1 == mem_align_modulo_2) ? DEF_YES : DEF_NO;
\ 00000048 9DF80000 LDRB R0,[SP, #+0]
\ 0000004C 5FFA89F9 UXTB R9,R9 ;; ZeroExt R9,R9,#+24,#+24
\ 00000050 8145 CMP R9,R0
\ 00000052 02D1 BNE.N ??Mem_Cmp_4
\ 00000054 5FF0010A MOVS R10,#+1
\ 00000058 01E0 B.N ??Mem_Cmp_5
\ ??Mem_Cmp_4:
\ 0000005A 5FF0000A MOVS R10,#+0
501
502 if (mem_aligned == DEF_YES) { /* If mem bufs' alignment offset equal, ... */
\ ??Mem_Cmp_5:
\ 0000005E 5FFA8AFA UXTB R10,R10 ;; ZeroExt R10,R10,#+24,#+24
\ 00000062 BAF1010F CMP R10,#+1
\ 00000066 3AD1 BNE.N ??Mem_Cmp_6
503 /* ... optimize cmp for mem buf alignment. */
504 if (mem_align_modulo_1 != 0u) { /* If trailing octets avail, ... */
\ 00000068 5FFA89F9 UXTB R9,R9 ;; ZeroExt R9,R9,#+24,#+24
\ 0000006C B9F1000F CMP R9,#+0
\ 00000070 1AD0 BEQ.N ??Mem_Cmp_7
505 i = mem_align_modulo_1;
\ 00000072 C846 MOV R8,R9
506 while ((mem_cmp == DEF_YES) && /* ... cmp mem bufs while identical & ... */
507 (size_rem > 0) && /* ... start mem buf cmp with trailing octets ... */
508 (i > 0)) { /* ... until next CPU_ALIGN word boundary. */
\ ??Mem_Cmp_8:
\ 00000074 5FFA8BFB UXTB R11,R11 ;; ZeroExt R11,R11,#+24,#+24
\ 00000078 BBF1010F CMP R11,#+1
\ 0000007C 14D1 BNE.N ??Mem_Cmp_7
\ 0000007E 002C CMP R4,#+0
\ 00000080 12D0 BEQ.N ??Mem_Cmp_7
\ 00000082 5FFA88F8 UXTB R8,R8 ;; ZeroExt R8,R8,#+24,#+24
\ 00000086 B8F1010F CMP R8,#+1
\ 0000008A 0DD3 BCC.N ??Mem_Cmp_7
509 p1_mem_08--;
\ 0000008C 7F1E SUBS R7,R7,#+1
510 p2_mem_08--;
\ 0000008E BEF1010E SUBS LR,LR,#+1
511 if (*p1_mem_08 != *p2_mem_08) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 00000092 3878 LDRB R0,[R7, #+0]
\ 00000094 9EF800C0 LDRB R12,[LR, #+0]
\ 00000098 6045 CMP R0,R12
\ 0000009A 01D0 BEQ.N ??Mem_Cmp_9
512 mem_cmp = DEF_NO;
\ 0000009C 0020 MOVS R0,#+0
\ 0000009E 8346 MOV R11,R0
513 }
514 size_rem -= sizeof(CPU_INT08U);
\ ??Mem_Cmp_9:
\ 000000A0 641E SUBS R4,R4,#+1
515 i--;
\ 000000A2 B8F10108 SUBS R8,R8,#+1
\ 000000A6 E5E7 B.N ??Mem_Cmp_8
516 }
517 }
518
519 if (mem_cmp == DEF_YES) { /* If cmp still identical, cmp aligned mem bufs. */
\ ??Mem_Cmp_7:
\ 000000A8 5FFA8BFB UXTB R11,R11 ;; ZeroExt R11,R11,#+24,#+24
\ 000000AC BBF1010F CMP R11,#+1
\ 000000B0 15D1 BNE.N ??Mem_Cmp_6
520 p1_mem_align = (CPU_ALIGN *)p1_mem_08; /* See Note #3a. */
\ 000000B2 3D00 MOVS R5,R7
521 p2_mem_align = (CPU_ALIGN *)p2_mem_08;
\ 000000B4 7646 MOV R6,LR
522
523 while ((mem_cmp == DEF_YES) && /* Cmp mem bufs while identical & ... */
524 (size_rem >= sizeof(CPU_ALIGN))) { /* ... mem bufs aligned on CPU_ALIGN word boundaries. */
\ ??Mem_Cmp_10:
\ 000000B6 5FFA8BFB UXTB R11,R11 ;; ZeroExt R11,R11,#+24,#+24
\ 000000BA BBF1010F CMP R11,#+1
\ 000000BE 0CD1 BNE.N ??Mem_Cmp_11
\ 000000C0 042C CMP R4,#+4
\ 000000C2 0AD3 BCC.N ??Mem_Cmp_11
525 p1_mem_align--;
\ 000000C4 2D1F SUBS R5,R5,#+4
526 p2_mem_align--;
\ 000000C6 361F SUBS R6,R6,#+4
527 if (*p1_mem_align != *p2_mem_align) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 000000C8 2868 LDR R0,[R5, #+0]
\ 000000CA D6F800C0 LDR R12,[R6, #+0]
\ 000000CE 6045 CMP R0,R12
\ 000000D0 01D0 BEQ.N ??Mem_Cmp_12
528 mem_cmp = DEF_NO;
\ 000000D2 0020 MOVS R0,#+0
\ 000000D4 8346 MOV R11,R0
529 }
530 size_rem -= sizeof(CPU_ALIGN);
\ ??Mem_Cmp_12:
\ 000000D6 241F SUBS R4,R4,#+4
\ 000000D8 EDE7 B.N ??Mem_Cmp_10
531 }
532
533 p1_mem_08 = (CPU_INT08U *)p1_mem_align;
\ ??Mem_Cmp_11:
\ 000000DA 2F00 MOVS R7,R5
534 p2_mem_08 = (CPU_INT08U *)p2_mem_align;
\ 000000DC B646 MOV LR,R6
535 }
536 }
537
538 while ((mem_cmp == DEF_YES) && /* Cmp mem bufs while identical ... */
539 (size_rem > 0)) { /* ... for unaligned mem bufs or trailing octets. */
\ ??Mem_Cmp_6:
\ 000000DE 5FFA8BFB UXTB R11,R11 ;; ZeroExt R11,R11,#+24,#+24
\ 000000E2 BBF1010F CMP R11,#+1
\ 000000E6 0DD1 BNE.N ??Mem_Cmp_13
\ 000000E8 002C CMP R4,#+0
\ 000000EA 0BD0 BEQ.N ??Mem_Cmp_13
540 p1_mem_08--;
\ 000000EC 7F1E SUBS R7,R7,#+1
541 p2_mem_08--;
\ 000000EE BEF1010E SUBS LR,LR,#+1
542 if (*p1_mem_08 != *p2_mem_08) { /* If ANY data octet(s) NOT identical, cmp fails. */
\ 000000F2 3878 LDRB R0,[R7, #+0]
\ 000000F4 9EF800C0 LDRB R12,[LR, #+0]
\ 000000F8 6045 CMP R0,R12
\ 000000FA 01D0 BEQ.N ??Mem_Cmp_14
543 mem_cmp = DEF_NO;
\ 000000FC 0020 MOVS R0,#+0
\ 000000FE 8346 MOV R11,R0
544 }
545 size_rem -= sizeof(CPU_INT08U);
\ ??Mem_Cmp_14:
\ 00000100 641E SUBS R4,R4,#+1
\ 00000102 ECE7 B.N ??Mem_Cmp_6
546 }
547
548 return (mem_cmp);
\ ??Mem_Cmp_13:
\ 00000104 5846 MOV R0,R11
\ 00000106 C0B2 UXTB R0,R0 ;; ZeroExt R0,R0,#+24,#+24
\ ??Mem_Cmp_1:
\ 00000108 BDE8F28F POP {R1,R4-R11,PC} ;; return
549 }
550
551
552 /*$PAGE*/
553 /*
554 *********************************************************************************************************
555 * Mem_HeapAlloc()
556 *
557 * Description : Allocate a memory block from the heap memory pool.
558 *
559 * Argument(s) : size Size of memory block to allocate (in octets).
560 *
561 * align Alignment of memory block to specific word boundary (in octets).
562 *
563 * poctets_reqd Optional pointer to a variable to ... :
564 *
565 * (a) Return the number of octets required to successfully
566 * allocate the memory block, if any error(s);
567 * (b) Return 0, otherwise.
568 *
569 * perr Pointer to variable that will receive the return error code from this function :
570 *
571 * LIB_MEM_ERR_NONE Memory block successfully returned.
572 * LIB_MEM_ERR_INVALID_MEM_SIZE Invalid memory size.
573 * LIB_MEM_ERR_INVALID_MEM_ALIGN Invalid memory alignment.
574 * LIB_MEM_ERR_HEAP_EMPTY Heap segment empty; NOT enough available
575 * memory from heap.
576 * LIB_MEM_ERR_HEAP_OVF Requested memory overflows heap memory.
577 *
578 * Return(s) : Pointer to memory block, if NO error(s).
579 *
580 * Pointer to NULL, otherwise.
581 *
582 * Caller(s) : Application.
583 *
584 * Note(s) : (1) Pointers to variables that return values MUST be initialized PRIOR to all other
585 * validation or function handling in case of any error(s).
586 *
587 * (2) 'pmem_pool' variables MUST ALWAYS be accessed exclusively in critical sections.
588 *********************************************************************************************************
589 */
590 /*$PAGE*/
591 #if (LIB_MEM_CFG_ALLOC_EN == DEF_ENABLED)
592 void *Mem_HeapAlloc (CPU_SIZE_T size,
593 CPU_SIZE_T align,
594 CPU_SIZE_T *poctets_reqd,
595 LIB_ERR *perr)
596 {
597 MEM_POOL *pmem_pool_heap;
598 void *pmem_addr;
599 void *pmem_blk;
600 CPU_SIZE_T octets_reqd_unused;
601 CPU_SIZE_T size_rem;
602 CPU_SIZE_T size_req;
603 CPU_SR_ALLOC();
604
605
606 #if (LIB_MEM_CFG_ARG_CHK_EXT_EN == DEF_ENABLED) /* ------------- VALIDATE RTN ERR PTR ------------- */
607 if (perr == (LIB_ERR *)0) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -