⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 heap_2.lst

📁 本代码已经经过修改
💻 LST
📖 第 1 页 / 共 2 页
字号:
    153          		if( xWantedSize > 0 )
   \                     ??pvPortMalloc_1:
   \   0000002E   002D               CMP         R5,#+0
   \   00000030   07D0               BEQ         ??pvPortMalloc_2
    154          		{
    155          			xWantedSize += heapSTRUCT_SIZE;
   \   00000032   0835               ADD         R5,#+0x8
    156          
    157          			/* Ensure that blocks are always aligned to the required number of bytes. */
    158          			if( xWantedSize & heapBYTE_ALIGNMENT_MASK )
   \   00000034   2B1C               MOV         R3,R5
   \   00000036   AB07               LSL         R3,R5,#+0x1E
   \   00000038   03D0               BEQ         ??pvPortMalloc_2
    159          			{
    160          				/* Byte alignment required. */
    161          				xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & heapBYTE_ALIGNMENT_MASK ) );
   \   0000003A   2B1D               ADD         R3,R5,#+0x4
   \   0000003C   AD07               LSL         R5,R5,#+0x1E
   \   0000003E   AD0F               LSR         R5,R5,#+0x1E
   \   00000040   5D1B               SUB         R5,R3,R5
    162          			}
    163          		}
    164          
    165          		if( ( xWantedSize > 0 ) && ( xWantedSize < configTOTAL_HEAP_SIZE ) )
   \                     ??pvPortMalloc_2:
   \   00000042   002D               CMP         R5,#+0
   \   00000044   27D0               BEQ         ??pvPortMalloc_3
   \   00000046   9542               CMP         R5,R2
   \   00000048   25D2               BCS         ??pvPortMalloc_3
    166          		{
    167          			/* Blocks are stored in byte order - traverse the list from the start
    168          			(smallest) block until one of adequate size is found. */
    169          			pxPreviousBlock = &xStart;
   \   0000004A   031C               MOV         R3,R0
    170          			pxBlock = xStart.pxNextFreeBlock;
   \   0000004C   0268               LDR         R2,[R0, #+0]
   \   0000004E   01E0               B           ??pvPortMalloc_4
    171          			while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock ) )
    172          			{
    173          				pxPreviousBlock = pxBlock;
   \                     ??pvPortMalloc_5:
   \   00000050   131C               MOV         R3,R2
    174          				pxBlock = pxBlock->pxNextFreeBlock;
   \   00000052   321C               MOV         R2,R6
    175          			}
   \                     ??pvPortMalloc_4:
   \   00000054   5668               LDR         R6,[R2, #+0x4]
   \   00000056   AE42               CMP         R6,R5
   \   00000058   02D2               BCS         ??pvPortMalloc_6
   \   0000005A   1668               LDR         R6,[R2, #+0]
   \   0000005C   002E               CMP         R6,#+0
   \   0000005E   F7D1               BNE         ??pvPortMalloc_5
    176          
    177          			/* If we found the end marker then a block of adequate size was not found. */
    178          			if( pxBlock != &xEnd )
   \                     ??pvPortMalloc_6:
   \   00000060   8A42               CMP         R2,R1
   \   00000062   18D0               BEQ         ??pvPortMalloc_3
    179          			{
    180          				/* Return the memory space - jumping over the xBlockLink structure
    181          				at its start. */
    182          				pvReturn = ( void * ) ( ( ( unsigned portCHAR * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE );
   \   00000064   1C68               LDR         R4,[R3, #+0]
   \   00000066   0834               ADD         R4,#+0x8
    183          
    184          				/* This block is being returned for use so must be taken our of the
    185          				list of free blocks. */
    186          				pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
   \   00000068   1168               LDR         R1,[R2, #+0]
   \   0000006A   1960               STR         R1,[R3, #+0]
    187          
    188          				/* If the block is larger than required it can be split into two. */
    189          				if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )
   \   0000006C   5168               LDR         R1,[R2, #+0x4]
   \   0000006E   4B1B               SUB         R3,R1,R5
   \   00000070   112B               CMP         R3,#+0x11
   \   00000072   10D3               BCC         ??pvPortMalloc_3
    190          				{
    191          					/* This block is to be split into two.  Create a new block
    192          					following the number of bytes requested. The void cast is
    193          					used to prevent byte alignment warnings from the compiler. */
    194          					pxNewBlockLink = ( void * ) ( ( ( unsigned portCHAR * ) pxBlock ) + xWantedSize );
   \   00000074   5119               ADD         R1,R2,R5
    195          					
    196          					/* Calculate the sizes of two blocks split from the single 
    197          					block. */
    198          					pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;	
   \   00000076   4B60               STR         R3,[R1, #+0x4]
    199          					pxBlock->xBlockSize = xWantedSize;			
   \   00000078   5560               STR         R5,[R2, #+0x4]
    200          					
    201          					/* Insert the new block into the list of free blocks. */
    202          					prvInsertBlockIntoFreeList( ( pxNewBlockLink ) );
   \   0000007A   4A68               LDR         R2,[R1, #+0x4]
   \   0000007C   0368               LDR         R3,[R0, #+0]
   \   0000007E   5B68               LDR         R3,[R3, #+0x4]
   \   00000080   9342               CMP         R3,R2
   \   00000082   01D3               BCC         ??pvPortMalloc_7
   \   00000084   04E0               B           ??pvPortMalloc_8
   \                     ??pvPortMalloc_9:
   \   00000086   181C               MOV         R0,R3
   \                     ??pvPortMalloc_7:
   \   00000088   0368               LDR         R3,[R0, #+0]
   \   0000008A   5D68               LDR         R5,[R3, #+0x4]
   \   0000008C   9542               CMP         R5,R2
   \   0000008E   FAD3               BCC         ??pvPortMalloc_9
   \                     ??pvPortMalloc_8:
   \   00000090   0268               LDR         R2,[R0, #+0]
   \   00000092   0A60               STR         R2,[R1, #+0]
   \   00000094   0160               STR         R1,[R0, #+0]
    203          				}
    204          			}
    205          		}
    206          	}
    207          	xTaskResumeAll();
   \                     ??pvPortMalloc_3:
   \   00000096   ........           _BLF        xTaskResumeAll,xTaskResumeAll??rT
    208          
    209          	return pvReturn;
   \   0000009A   201C               MOV         R0,R4
   \   0000009C   F0BC               POP         {R4-R7}
   \   0000009E   02BC               POP         {R1}
   \   000000A0   0847               BX          R1                 ;; return
   \   000000A2   C046               NOP         
   \                     ??pvPortMalloc_0:
   \   000000A4   ........           DC32        ??xEnd
   \   000000A8   ........           DC32        ??xHeapHasBeenInitialised
   \   000000AC   ........           DC32        ??xHeap
    210          }

   \                                 In segment DATA_Z, align 4, align-sorted
   \                     ??xHeapHasBeenInitialised:
   \   00000000                      DS8 4
    211          /*-----------------------------------------------------------*/
    212          

   \                                 In segment CODE, align 4, keep-with-next
    213          void vPortFree( void *pv )
    214          {
   \                     vPortFree:
   \   00000000   10B5               PUSH        {R4,LR}
   \   00000002   041C               MOV         R4,R0
    215          unsigned portCHAR *puc = ( unsigned portCHAR * ) pv;
    216          xBlockLink *pxLink;
    217          
    218          	if( pv )
   \   00000004   13D0               BEQ         ??vPortFree_0
    219          	{
    220          		/* The memory being freed will have an xBlockLink structure immediately
    221          		before it. */
    222          		puc -= heapSTRUCT_SIZE;
    223          
    224          		/* This casting is to keep the compiler from issuing warnings. */
    225          		pxLink = ( void * ) puc;
   \   00000006   083C               SUB         R4,#+0x8
    226          
    227          		vTaskSuspendAll();
   \   00000008   ........           _BLF        vTaskSuspendAll,vTaskSuspendAll??rT
    228          		{				
    229          			/* Add this block to the list of free blocks. */
    230          			prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) );
   \   0000000C   6068               LDR         R0,[R4, #+0x4]
   \   0000000E   ....               LDR         R1,??DataTable1    ;; ??xStart
   \   00000010   0A68               LDR         R2,[R1, #+0]
   \   00000012   5268               LDR         R2,[R2, #+0x4]
   \   00000014   8242               CMP         R2,R0
   \   00000016   01D3               BCC         ??vPortFree_1
   \   00000018   04E0               B           ??vPortFree_2
   \                     ??vPortFree_3:
   \   0000001A   111C               MOV         R1,R2
   \                     ??vPortFree_1:
   \   0000001C   0A68               LDR         R2,[R1, #+0]
   \   0000001E   5368               LDR         R3,[R2, #+0x4]
   \   00000020   8342               CMP         R3,R0
   \   00000022   FAD3               BCC         ??vPortFree_3
   \                     ??vPortFree_2:
   \   00000024   0868               LDR         R0,[R1, #+0]
   \   00000026   2060               STR         R0,[R4, #+0]
   \   00000028   0C60               STR         R4,[R1, #+0]
    231          		}
    232          		xTaskResumeAll();
   \   0000002A   ........           _BLF        xTaskResumeAll,xTaskResumeAll??rT
    233          	}
    234          }
   \                     ??vPortFree_0:
   \   0000002E   10BC               POP         {R4}
   \   00000030   01BC               POP         {R0}
   \   00000032   0047               BX          R0                 ;; return

   \                                 In segment CODE, align 4, keep-with-next
   \                     ??DataTable1:
   \   00000000   ........           DC32        ??xStart
    235          /*-----------------------------------------------------------*/
    236          

   Maximum stack usage in bytes:

     Function     CSTACK
     --------     ------
     pvPortMalloc    20
     vPortFree        8


   Segment part sizes:

     Function/Label          Bytes
     --------------          -----
     xHeap                   20484
     xStart                      8
     xEnd                        8
     pvPortMalloc              176
     xHeapHasBeenInitialised     4
     vPortFree                  52
     ??DataTable1                4
      Others                    44

 
    264 bytes in segment CODE
 20 504 bytes in segment DATA_Z
     12 bytes in segment INITTAB
 
    232 bytes of CODE memory (+ 44 bytes shared)
 20 504 bytes of DATA memory

Errors: none
Warnings: none

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -