📄 heap_2.lst
字号:
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 + -