📄 guialloc.txt
字号:
; generated by ARM C/C++ Compiler with , RVCT4.0 [Build 524] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o.\Obj\guialloc.o --depend=.\Obj\guialloc.d --device=DARMSTM --apcs=interwork -O3 -I..\..\include -I..\..\..\FWLib\library\inc -I..\..\..\USBLib\library\inc -I..\..\Config -I..\..\GUI\Core -I..\..\GUI\Font -I..\..\GUI\ConvertColor -I..\..\GUI\AntiAlias -I..\..\GUI\ConvertMono -I..\..\GUI\JPEG -I..\..\GUI\MemDev -I..\..\GUI\MultiLayer -I..\..\GUI\Widget -I..\..\GUI\WM -IC:\Keil\ARM\INC\ST\STM32F10x ..\..\GUI\Core\GUIAlloc.c]
THUMB
AREA ||i.GUI_ALLOC_AllocNoInit||, CODE, READONLY, ALIGN=1
GUI_ALLOC_AllocNoInit PROC
;;;339 */
;;;340 GUI_HMEM GUI_ALLOC_AllocNoInit(GUI_ALLOC_DATATYPE Size) {
000000 2800 CMP r0,#0
;;;341 GUI_HMEM hMem;
;;;342 if (Size == 0) {
000002 d001 BEQ |L1.8|
;;;343 return (GUI_HMEM)0;
;;;344 }
;;;345 GUI_LOCK();
;;;346 GUI_DEBUG_LOG2("\nGUI_ALLOC_AllocNoInit... requesting %d, %d avail", Size, GUI_ALLOC.NumFreeBytes);
;;;347 hMem = _Alloc(Size);
000004 f7ffbffe B.W _Alloc
|L1.8|
;;;348 GUI_DEBUG_LOG1("\nGUI_ALLOC_AllocNoInit : Handle", hMem);
;;;349 GUI_UNLOCK();
;;;350 return hMem;
;;;351 }
000008 4770 BX lr
;;;352
ENDP
AREA ||i.GUI_ALLOC_Free||, CODE, READONLY, ALIGN=1
GUI_ALLOC_Free PROC
;;;524 */
;;;525 void GUI_ALLOC_Free(GUI_HMEM hMem) {
000000 2800 CMP r0,#0
;;;526 if (hMem == GUI_HMEM_NULL) { /* Note: This is not an error, it is permitted */
000002 d001 BEQ |L2.8|
;;;527 return;
;;;528 }
;;;529 GUI_LOCK();
;;;530 GUI_DEBUG_LOG1("\nGUI_ALLOC_Free(%d)", hMem);
;;;531 _Free(hMem);
000004 f7ffbffe B.W _Free
|L2.8|
;;;532 GUI_UNLOCK();
;;;533 }
000008 4770 BX lr
;;;534
ENDP
AREA ||i.GUI_ALLOC_FreePtr||, CODE, READONLY, ALIGN=1
GUI_ALLOC_FreePtr PROC
;;;539 */
;;;540 void GUI_ALLOC_FreePtr(GUI_HMEM *ph) {
000000 b510 PUSH {r4,lr}
000002 4604 MOV r4,r0
;;;541 GUI_LOCK();
;;;542 GUI_ALLOC_Free(*ph);
000004 f9b00000 LDRSH r0,[r0,#0]
000008 f7fffffe BL GUI_ALLOC_Free
;;;543 *ph =0;
00000c 2000 MOVS r0,#0
00000e 8020 STRH r0,[r4,#0]
;;;544 GUI_UNLOCK();
;;;545 }
000010 bd10 POP {r4,pc}
;;;546
ENDP
AREA ||i.GUI_ALLOC_GetMaxSize||, CODE, READONLY, ALIGN=2
GUI_ALLOC_GetMaxSize PROC
;;;387 */
;;;388 GUI_ALLOC_DATATYPE GUI_ALLOC_GetMaxSize(void) {
000000 b570 PUSH {r4-r6,lr}
;;;389 GUI_ALLOC_DATATYPE r = 0;
000002 2400 MOVS r4,#0
;;;390 GUI_ALLOC_DATATYPE NumFreeBytes;
;;;391 int i, iNext;
;;;392
;;;393 GUI_LOCK();
;;;394 _CheckInit();
000004 f7fffffe BL _CheckInit
;;;395 for (i=0; (iNext =aBlock[i].Next) !=0; i= iNext) {
000008 2000 MOVS r0,#0
;;;396 NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size);
00000a 4b11 LDR r3,|L4.80|
00000c e00c B |L4.40|
00000e bf00 NOP
|L4.16|
000010 f8330030 LDRH r0,[r3,r0,LSL #3]
000014 8852 LDRH r2,[r2,#2]
000016 f8335031 LDRH r5,[r3,r1,LSL #3]
00001a 4410 ADD r0,r0,r2
00001c 1a28 SUBS r0,r5,r0
00001e b200 SXTH r0,r0
;;;397 if (NumFreeBytes > r) {
000020 42a0 CMP r0,r4
000022 dd00 BLE |L4.38|
;;;398 r = NumFreeBytes;
000024 4604 MOV r4,r0
|L4.38|
000026 4608 MOV r0,r1 ;395
|L4.40|
000028 eb0302c0 ADD r2,r3,r0,LSL #3 ;395
00002c 8891 LDRH r1,[r2,#4] ;395
00002e 2900 CMP r1,#0 ;395
000030 d1ee BNE |L4.16|
;;;399 }
;;;400 }
;;;401 /* Check last block */
;;;402 NumFreeBytes = (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size));
000032 f9331030 LDRSH r1,[r3,r0,LSL #3]
000036 eb0300c0 ADD r0,r3,r0,LSL #3
00003a f9b00002 LDRSH r0,[r0,#2]
00003e 4408 ADD r0,r0,r1
000040 f5c05020 RSB r0,r0,#0x2800
000044 b200 SXTH r0,r0
;;;403 if (NumFreeBytes > r) {
000046 42a0 CMP r0,r4
000048 dd00 BLE |L4.76|
;;;404 r = NumFreeBytes;
00004a 4604 MOV r4,r0
|L4.76|
;;;405 }
;;;406 GUI_UNLOCK();
;;;407 return r;
00004c 4620 MOV r0,r4
;;;408 }
00004e bd70 POP {r4-r6,pc}
;;;409
ENDP
|L4.80|
DCD ||.bss||+0x2800
AREA ||i.GUI_ALLOC_GetNumFreeBytes||, CODE, READONLY, ALIGN=2
GUI_ALLOC_GetNumFreeBytes PROC
;;;375 */
;;;376 GUI_ALLOC_DATATYPE GUI_ALLOC_GetNumFreeBytes(void) {
000000 b510 PUSH {r4,lr}
;;;377 _CheckInit();
000002 f7fffffe BL _CheckInit
;;;378 return GUI_ALLOC.NumFreeBytes;
000006 4802 LDR r0,|L5.16|
000008 f9b0000e LDRSH r0,[r0,#0xe] ; GUI_ALLOC
;;;379 }
00000c bd10 POP {r4,pc}
;;;380
ENDP
00000e 0000 DCW 0x0000
|L5.16|
DCD ||.bss||+0x3210
AREA ||i.GUI_ALLOC_GetSize||, CODE, READONLY, ALIGN=2
GUI_ALLOC_GetSize PROC
;;;509 */
;;;510 GUI_ALLOC_DATATYPE GUI_ALLOC_GetSize(GUI_HMEM hMem) {
000000 2800 CMP r0,#0
;;;511 /* Do the error checking first */
;;;512 #if GUI_DEBUG_LEVEL>0
;;;513 if (!hMem) {
000002 d004 BEQ |L6.14|
000004 4902 LDR r1,|L6.16|
000006 eb0100c0 ADD r0,r1,r0,LSL #3
00000a f9b00002 LDRSH r0,[r0,#2]
|L6.14|
;;;514 GUI_DEBUG_ERROROUT("\n"__FILE__ " GUI_ALLOC_h2p: illegal argument (0 handle)");
;;;515 return 0;
;;;516 }
;;;517 #endif
;;;518 return _GetSize(hMem);
;;;519 }
00000e 4770 BX lr
;;;520
ENDP
|L6.16|
DCD ||.bss||+0x2800
AREA ||i.GUI_ALLOC_Init||, CODE, READONLY, ALIGN=2
GUI_ALLOC_Init PROC
;;;323 */
;;;324 void GUI_ALLOC_Init(void) {
000000 480a LDR r0,|L7.44|
;;;325 GUI_DEBUG_LOG("\nGUI_ALLOC_Init...");
;;;326 GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks = GUI_MAXBLOCKS-1;
000002 f2401141 MOV r1,#0x141
000006 6041 STR r1,[r0,#4] ; GUI_ALLOC
;;;327 GUI_ALLOC.NumFreeBytesMin = GUI_ALLOC.NumFreeBytes = GUI_ALLOC_SIZE;
000008 6081 STR r1,[r0,#8] ; GUI_ALLOC
00000a f44f5120 MOV r1,#0x2800
00000e 81c1 STRH r1,[r0,#0xe]
000010 8201 STRH r1,[r0,#0x10]
;;;328 GUI_ALLOC.NumUsedBlocks = 0;
000012 2100 MOVS r1,#0
;;;329 GUI_ALLOC.NumUsedBytes = 0;
000014 6001 STR r1,[r0,#0] ; GUI_ALLOC
000016 8181 STRH r1,[r0,#0xc]
;;;330 aBlock[0].Size = (1<<GUI_BLOCK_ALIGN); /* occupy minimum for a block */
000018 2204 MOVS r2,#4
00001a f5a06021 SUB r0,r0,#0xa10
00001e 8042 STRH r2,[r0,#2]
;;;331 aBlock[0].Off = 0;
000020 8001 STRH r1,[r0,#0]
;;;332 aBlock[0].Next = 0;
000022 8081 STRH r1,[r0,#4]
;;;333 IsInitialized =1;
000024 4902 LDR r1,|L7.48|
000026 2001 MOVS r0,#1
000028 7008 STRB r0,[r1,#0]
;;;334 }
00002a 4770 BX lr
;;;335
ENDP
|L7.44|
DCD ||.bss||+0x3210
|L7.48|
DCD ||.data||
AREA ||i.GUI_ALLOC_h2p||, CODE, READONLY, ALIGN=2
GUI_ALLOC_h2p PROC
;;;356 */
;;;357 void* GUI_ALLOC_h2p(GUI_HMEM hMem) {
000000 2800 CMP r0,#0
;;;358 GUI_ASSERT_LOCK();
;;;359 #if GUI_DEBUG_LEVEL > 0
;;;360 if (!hMem) {
000002 d005 BEQ |L8.16|
;;;361 GUI_DEBUG_ERROROUT("\n"__FILE__ " GUI_ALLOC_h2p: illegal argument (0 handle)");
;;;362 return 0;
;;;363 }
;;;364 if (aBlock[hMem].Size == 0) {
;;;365 GUI_DEBUG_ERROROUT("Dereferencing free block");
;;;366 }
;;;367
;;;368 #endif
;;;369 return HMEM2PTR(hMem);
000004 4903 LDR r1,|L8.20|
000006 f9310030 LDRSH r0,[r1,r0,LSL #3]
00000a f5a15120 SUB r1,r1,#0x2800
00000e 4408 ADD r0,r0,r1
|L8.16|
;;;370 }
000010 4770 BX lr
;;;371
ENDP
000012 0000 DCW 0x0000
|L8.20|
DCD ||.bss||+0x2800
AREA ||i._Alloc||, CODE, READONLY, ALIGN=2
_Alloc PROC
;;;264 */
;;;265 static GUI_HMEM _Alloc(GUI_ALLOC_DATATYPE size) {
000000 e92d41f0 PUSH {r4-r8,lr}
000004 4604 MOV r4,r0
;;;266 GUI_HMEM hMemNew, hMemIns;
;;;267 _CheckInit();
000006 f7fffffe BL _CheckInit
;;;268 size = _Size2LegalSize(size);
00000a 1ce4 ADDS r4,r4,#3
00000c f0240003 BIC r0,r4,#3
;;;269 /* Check if memory is available at all ...*/
;;;270 if (size > GUI_ALLOC.NumFreeBytes) {
000010 f8df80e4 LDR r8,|L9.248|
000014 b204 SXTH r4,r0 ;268
000016 f9b8000e LDRSH r0,[r8,#0xe] ; GUI_ALLOC
00001a 42a0 CMP r0,r4
00001c db38 BLT |L9.144|
00001e 2001 MOVS r0,#1
000020 f44f71a1 MOV r1,#0x142
000024 f5a86621 SUB r6,r8,#0xa10
|L9.40|
000028 eb0602c0 ADD r2,r6,r0,LSL #3
00002c 8852 LDRH r2,[r2,#2]
00002e b90a CBNZ r2,|L9.52|
000030 b205 SXTH r5,r0
000032 e003 B |L9.60|
|L9.52|
000034 1c40 ADDS r0,r0,#1
000036 4288 CMP r0,r1
000038 dbf6 BLT |L9.40|
00003a 2500 MOVS r5,#0
|L9.60|
;;;271 GUI_DEBUG_WARN1("GUI_ALLOC_Alloc: Insufficient memory configured (Trying to alloc % bytes)", size);
;;;272 return 0;
;;;273 }
;;;274 /* Locate free handle */
;;;275 if ((hMemNew = _FindFreeHandle()) == 0)
00003c b345 CBZ r5,|L9.144|
00003e 2000 MOVS r0,#0
000040 e00b B |L9.90|
000042 bf00 NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -