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 + -
显示快捷键?