From abe0bef99ac3ad7bd5f9dadc90235ecc8a13260b Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Fri, 8 May 2026 22:08:47 +0200 Subject: [PATCH] gui, heap: modified how the heap works. not well enough tested, yet. --- avr/modules/heap/main.asm | 272 ++++++++++++++++----------- avr/modules/lcd2/gui/base/layout.asm | 4 +- 2 files changed, 160 insertions(+), 116 deletions(-) diff --git a/avr/modules/heap/main.asm b/avr/modules/heap/main.asm index a3938ac..9f05225 100644 --- a/avr/modules/heap/main.asm +++ b/avr/modules/heap/main.asm @@ -48,24 +48,31 @@ heapDblFree: .byte 1 Heap_Init: ldi xl, LOW(HEAP_START) ldi xh, HIGH(HEAP_START) - ldi r24, LOW((HEAP_SIZE-6) & 0xfffc) ; size minus chunk header, chunk footer, start, end - ldi r25, HIGH((HEAP_SIZE-6) & 0xfffc) ; we allocate multiples of 4 bytes + ldi r24, LOW((HEAP_SIZE-8) & 0xfffc) ; size minus chunk header, chunk footer, start, end + ldi r25, HIGH((HEAP_SIZE-8) & 0xfffc) ; we allocate multiples of 4 bytes clr r16 sts heapUsed, r16 sts heapUsed+1, r16 - st X+, r16 ; write start header + ; write start header (two zero bytes) st X+, r16 + st X+, r16 + ; X now points to first chunk sts heapPtr, xl ; store global vars sts heapPtr+1, xh sts heapFree, r24 sts heapFree+1, r25 - st X+, r24 ; store header of first chunk + ; store header of first chunk (bit0=0, meaning: free chunk) + st X+, r24 st X+, r25 add xl, r24 adc xh, r25 - st X+, r24 ; store footer of first chunk + ; store footer of first chunk + st X+, r24 st X+, r25 - st X+, r16 ; write end footer + ; write end header (two zero bytes) + st X+, r16 + st X+, r16 + ; okay sec ret ; @end @@ -124,7 +131,7 @@ Heap_AllocAndZero_ret: ; @routine heapAllocFirstFit ; ; @param r25:r24 number of bytes to alloc -; @return CFLAG set of okay, cleared otherwise +; @return CFLAG set if okay, cleared otherwise ; @return X start of allocated memory ; @clobbers r16, r17, r18, r19, r24, r25, X @@ -136,20 +143,24 @@ heapAllocFirstFit: lds xh, heapPtr+1 heapAllocFirstFit_loop: - ld r18, X+ ; read chunk header - ld r19, X+ - mov r16, r18 ; heap end reached? + ; read chunk header + ld r18, X+ + ld r19, X+ ; X now points to first data byte of chunk + ; zero-header found? + mov r16, r18 or r16, r19 - breq heapAllocFirstFit_memFull + breq heapAllocFirstFit_memFull ; yes, memory full + ; chunk in use? sbrc r18, HEAP_HEADER_BIT_USED rjmp heapAllocFirstFit_next ; jump if used ; current chunk free, check size - andi r18, 0xfc + andi r18, 0xfc ; clear lower two bits mov r16, r18 mov r17, r19 sub r16, r24 sbc r17, r25 ; r17:r16=remainder brcs heapAllocFirstFit_next ; too small + ; chunk size is okay, use it rcall heapUseChunk sec ret @@ -161,12 +172,82 @@ heapAllocFirstFit_next: rjmp heapAllocFirstFit_loop heapAllocFirstFit_memFull: + bigcall Led1_SetFastTiming clc ret ; @end +; --------------------------------------------------------------------------- +; @routine heapUseChunk +; +; @param r25:r24 wanted size +; @param r17:r16 size of current chunk minus wanted size (remainder) +; @param X points to data of current chunk +; @clobbers + +heapUseChunk: + push xl + push xh + tst r17 + brne heapUseChunk_split + cpi r16, 8 ; at least 8 bytes left? + brcs heapUseChunk_directAlloc ; nope, use full chunk +heapUseChunk_split: + sbiw xh:xl, 2 ; go back to chunk header + ; X points to start of chunk header + mov r18, r24 + sbr r18, (1<