jmemmgr.txt
来自「STM32F103ZET6+UCOSII+UCGUI源码」· 文本 代码 · 共 1,415 行 · 第 1/5 页
TXT
1,415 行
;;;348 if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) {
000026 f1b80f02 CMP r8,#2
00002a d309 BCC |L4.64|
;;;349 ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
00002c 6831 LDR r1,[r6,#0]
00002e 200e MOVS r0,#0xe
000030 6148 STR r0,[r1,#0x14]
000032 6831 LDR r1,[r6,#0]
000034 f8c18018 STR r8,[r1,#0x18]
000038 6830 LDR r0,[r6,#0]
00003a 6801 LDR r1,[r0,#0]
00003c 4630 MOV r0,r6
00003e 4788 BLX r1
|L4.64|
;;;350 }
;;;351
;;;352 hdr_ptr = (large_pool_ptr) jpeg_get_small/*RS: Changed from jpeg_get_large*/ (cinfo, sizeofobject + SIZEOF(large_pool_hdr));
000040 f1050110 ADD r1,r5,#0x10
000044 4689 MOV r9,r1
000046 4630 MOV r0,r6
000048 f7fffffe BL jpeg_get_small
00004c 0004 MOVS r4,r0
;;;353 if (hdr_ptr == NULL) {
00004e d103 BNE |L4.88|
;;;354 out_of_memory(cinfo, 4); /* jpeg_get_large failed */
000050 2104 MOVS r1,#4
000052 4630 MOV r0,r6
000054 f7fffffe BL out_of_memory
|L4.88|
;;;355 }
;;;356 mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr);
000058 6cf9 LDR r1,[r7,#0x4c]
00005a eb010009 ADD r0,r1,r9
;;;357 /* Success, initialize the new pool header and add to list */
;;;358 hdr_ptr->hdr.next = mem->large_list[pool_id];
00005e 64f8 STR r0,[r7,#0x4c]
000060 eb070088 ADD r0,r7,r8,LSL #2
000064 6bc1 LDR r1,[r0,#0x3c]
;;;359 /* We maintain space counts in each pool header for statistical purposes,
;;;360 * even though they are not needed for allocation.
;;;361 */
;;;362 hdr_ptr->hdr.bytes_used = sizeofobject;
;;;363 hdr_ptr->hdr.bytes_left = 0;
000066 e9c41500 STRD r1,r5,[r4,#0]
00006a 2100 MOVS r1,#0
;;;364 mem->large_list[pool_id] = hdr_ptr;
00006c 60a1 STR r1,[r4,#8]
;;;365
;;;366 return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */
00006e 63c4 STR r4,[r0,#0x3c]
000070 f1040010 ADD r0,r4,#0x10
;;;367 }
000074 e8bd87f0 POP {r4-r10,pc}
;;;368
ENDP
|L4.120|
DCD 0x3b9ac9f0
AREA ||i.alloc_sarray||, CODE, READONLY, ALIGN=2
alloc_sarray PROC
;;;382
;;;383 METHODDEF(JSAMPARRAY) alloc_sarray (j_common_ptr cinfo, int pool_id, JDIMENSION samplesperrow, JDIMENSION numrows) {
000000 e92d47f0 PUSH {r4-r10,lr}
000004 4681 MOV r9,r0
;;;384 /* Allocate a 2-D sample array */
;;;385 my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
;;;386 JSAMPARRAY result;
;;;387 JSAMPROW workspace;
;;;388 JDIMENSION rowsperchunk, currow, i;
;;;389 long ltemp;
;;;390
;;;391 /* Calculate max # of rows allowed in one allocation chunk */
;;;392 ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) /
000006 6844 LDR r4,[r0,#4]
000008 481b LDR r0,|L5.120|
00000a 468a MOV r10,r1 ;383
00000c fbb0f5f2 UDIV r5,r0,r2
000010 4617 MOV r7,r2 ;383
000012 461e MOV r6,r3 ;383
;;;393 ((long) samplesperrow * SIZEOF(JSAMPLE));
;;;394 if (ltemp <= 0)
000014 2d00 CMP r5,#0
000016 dc08 BGT |L5.42|
;;;395 ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
000018 f8d90000 LDR r0,[r9,#0]
00001c 2146 MOVS r1,#0x46
00001e 6141 STR r1,[r0,#0x14]
000020 f8d90000 LDR r0,[r9,#0]
000024 6801 LDR r1,[r0,#0]
000026 4648 MOV r0,r9
000028 4788 BLX r1
|L5.42|
;;;396 if (ltemp < (long) numrows)
00002a 42b5 CMP r5,r6
00002c db00 BLT |L5.48|
;;;397 rowsperchunk = (JDIMENSION) ltemp;
;;;398 else
;;;399 rowsperchunk = numrows;
00002e 4635 MOV r5,r6
|L5.48|
;;;400 mem->last_rowsperchunk = rowsperchunk;
000030 00b2 LSLS r2,r6,#2
;;;401
;;;402 /* Get space for row pointers (small object) */
;;;403 result = (JSAMPARRAY) alloc_small(cinfo, pool_id, (size_t) (numrows * SIZEOF(JSAMPROW)));
000032 4651 MOV r1,r10
000034 4648 MOV r0,r9
000036 6525 STR r5,[r4,#0x50]
000038 f7fffffe BL alloc_small
00003c 4680 MOV r8,r0
;;;404 /* Get the rows themselves (large objects) */
;;;405 currow = 0;
00003e 2400 MOVS r4,#0
;;;406 while (currow < numrows) {
000040 e014 B |L5.108|
|L5.66|
;;;407 rowsperchunk = MIN(rowsperchunk, numrows - currow);
000042 1b30 SUBS r0,r6,r4
000044 4629 MOV r1,r5
000046 42a8 CMP r0,r5
000048 d800 BHI |L5.76|
00004a 4601 MOV r1,r0
|L5.76|
00004c 460d MOV r5,r1
;;;408 workspace = (JSAMPROW) alloc_large(cinfo, pool_id,
00004e fb01f207 MUL r2,r1,r7
000052 4651 MOV r1,r10
000054 4648 MOV r0,r9
000056 f7fffffe BL alloc_large
;;;409 (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow
;;;410 * SIZEOF(JSAMPLE)));
;;;411 for (i = rowsperchunk; i > 0; i--) {
00005a 0029 MOVS r1,r5
00005c d006 BEQ |L5.108|
;;;412 result[currow++] = workspace;
00005e bf00 NOP
|L5.96|
000060 f8480024 STR r0,[r8,r4,LSL #2]
000064 1c64 ADDS r4,r4,#1
;;;413 workspace += samplesperrow;
000066 4438 ADD r0,r0,r7
000068 1e49 SUBS r1,r1,#1 ;411
00006a d1f9 BNE |L5.96|
|L5.108|
00006c 42b4 CMP r4,r6 ;406
00006e d3e8 BCC |L5.66|
;;;414 }
;;;415 }
;;;416
;;;417 return result;
000070 4640 MOV r0,r8
;;;418 }
000072 e8bd87f0 POP {r4-r10,pc}
;;;419
ENDP
000076 0000 DCW 0x0000
|L5.120|
DCD 0x3b9ac9f0
AREA ||i.alloc_small||, CODE, READONLY, ALIGN=2
alloc_small PROC
;;;248
;;;249 METHODDEF(void *) alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject)
000000 e92d47f0 PUSH {r4-r10,lr}
;;;250 /* Allocate a "small" object */
;;;251 {
000004 460c MOV r4,r1
;;;252 my_mem_ptr mem = (my_mem_ptr) cinfo->mem;
;;;253 small_pool_ptr hdr_ptr, prev_hdr_ptr;
;;;254 char * data_ptr;
;;;255 size_t odd_bytes, min_request, slop;
;;;256
;;;257 /* Check for unsatisfiable request (do now to ensure no overflow below) */
;;;258 if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr)))
000006 4933 LDR r1,|L6.212|
000008 f8d09004 LDR r9,[r0,#4]
00000c 4680 MOV r8,r0 ;251
00000e 4615 MOV r5,r2 ;251
000010 428a CMP r2,r1
000012 d903 BLS |L6.28|
;;;259 out_of_memory(cinfo, 1); /* request exceeds malloc's ability */
000014 2101 MOVS r1,#1
000016 4640 MOV r0,r8
000018 f7fffffe BL out_of_memory
|L6.28|
;;;260
;;;261 /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */
;;;262 odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE);
00001c f0150007 ANDS r0,r5,#7
;;;263 if (odd_bytes > 0)
000020 d002 BEQ |L6.40|
;;;264 sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes;
000022 f1c00008 RSB r0,r0,#8
000026 4405 ADD r5,r5,r0
|L6.40|
;;;265
;;;266 /* See if space is available in any existing pool */
;;;267 if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS)
000028 2c02 CMP r4,#2
00002a d30b BCC |L6.68|
;;;268 ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */
00002c f8d80000 LDR r0,[r8,#0]
000030 210e MOVS r1,#0xe
000032 6141 STR r1,[r0,#0x14]
000034 f8d80000 LDR r0,[r8,#0]
000038 6184 STR r4,[r0,#0x18]
00003a f8d80000 LDR r0,[r8,#0]
00003e 6801 LDR r1,[r0,#0]
000040 4640 MOV r0,r8
000042 4788 BLX r1
|L6.68|
;;;269 prev_hdr_ptr = NULL;
;;;270 hdr_ptr = mem->small_list[pool_id];
000044 eb090084 ADD r0,r9,r4,LSL #2
000048 4682 MOV r10,r0
00004a 2600 MOVS r6,#0 ;269
00004c 6b40 LDR r0,[r0,#0x34]
;;;271 while (hdr_ptr != NULL) {
00004e e004 B |L6.90|
|L6.80|
;;;272 if (hdr_ptr->hdr.bytes_left >= sizeofobject)
000050 6881 LDR r1,[r0,#8]
000052 42a9 CMP r1,r5
000054 d204 BCS |L6.96|
;;;273 break; /* found pool with enough space */
;;;274 prev_hdr_ptr = hdr_ptr;
000056 4606 MOV r6,r0
;;;275 hdr_ptr = hdr_ptr->hdr.next;
000058 6800 LDR r0,[r0,#0]
|L6.90|
00005a 2800 CMP r0,#0 ;271
00005c d1f8 BNE |L6.80|
00005e e000 B |L6.98|
|L6.96|
;;;276 }
;;;277
;;;278 /* Time to make a new pool? */
;;;279 if (hdr_ptr == NULL) {
000060 bb48 CBNZ r0,|L6.182|
|L6.98|
;;;280 /* min_request is what we need now, slop is what will be leftover */
;;;281 min_request = sizeofobject + SIZEOF(small_pool_hdr);
000062 f1050710 ADD r7,r5,#0x10
;;;282 if (prev_hdr_ptr == NULL) /* first pool in class? */
000066 b90e CBNZ r6,|L6.108|
;;;283 slop = first_pool_slop[pool_id];
000068 481b LDR r0,|L6.216|
00006a e001 B |L6.112|
|L6.108|
;;;284 else
;;;285 slop = extra_pool_slop[pool_id];
00006c 481a LDR r0,|L6.216|
00006e 3008 ADDS r0,r0,#8
|L6.112|
000070 f8504024 LDR r4,[r0,r4,LSL #2]
;;;286 /* Don't ask for more than MAX_ALLOC_CHUNK */
;;;287 if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request))
000074 4817 LDR r0,|L6.212|
000076 3010 ADDS r0,r0,#0x10
000078 1bc0 SUBS r0,r0,r7
00007a 42a0 CMP r0,r4
00007c d200 BCS |L6.128|
;;;288 slop = (size_t) (MAX_ALLOC_CHUNK-min_request);
00007e 4604 MOV r4,r0
|L6.128|
;;;289 /* Try to get space, if fail reduce slop and try again */
;;;290 while(1) {
;;;291 hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop);
000080 1939 ADDS r1,r7,r4
000082 4640 MOV r0,r8
000084 f7fffffe BL jpeg_get_small
;;;292 if (hdr_ptr != NULL)
000088 b938 CBNZ r0,|L6.154|
;;;293 break;
;;;294 slop /= 2;
00008a 0864 LSRS r4,r4,#1
;;;295 if (slop < MIN_SLOP) /* give up when it gets real small */
00008c 2c32 CMP r4,#0x32
00008e d2f7 BCS |L6.128|
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?