This is file "free.asm", it is an optional substitution for the file "free.c". It is much more optimized, but works only for PIC18 in extended mode with Microchip MPLAB-C18.
;=============================================================================== ; This file is part of "Heap Management For Small Microcontrollers". ; v1.05 (2009-06-29) ; isaacbavaresco@yahoo.com.br ;=============================================================================== ; Copyright (c) 2007-2009, Isaac Marino Bavaresco ; All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions are met: ; * Redistributions of source code must retain the above copyright ; notice, this list of conditions and the following disclaimer. ; * Neither the name of the author nor the ; names of its contributors may be used to endorse or promote products ; derived from this software without specific prior written permission. ; ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ; DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;=============================================================================== #include <P18CXXX.INC> ;=============================================================================== radix decimal ;=============================================================================== #include <heap_config.h> ;=============================================================================== #if USING_FREE_RTOS == 1 ;------------------------------------------------------------------------------- extern vTaskSuspendAll extern xTaskResumeAll #define LOCALS_SIZE 6 DISABLE_INTERRUPTS macro call vTaskSuspendAll endm RESTORE_INTERRUPTS macro call xTaskResumeAll endm ;------------------------------------------------------------------------------- #else ; USING_FREE_RTOS == 1 ;------------------------------------------------------------------------------- #define LOCALS_SIZE 7 DISABLE_INTERRUPTS macro ; Aux = INTCON & 0xc0; movlw 0xc0 andwf INTCON,w,ACCESS movwf [Aux+0] ; INTCON &= 0x3f; movlw 0x3f andwf INTCON,f,ACCESS endm RESTORE_INTERRUPTS macro ; INTCON |= Aux; movf [Aux+0],w iorwf INTCON,f,ACCESS endm ;------------------------------------------------------------------------------- #endif ; USING_FREE_RTOS == 1 ;=============================================================================== ALLOC code ;=============================================================================== #define r 0 #define p 4 #define q 6 #define Aux2 8 #define Aux 10 extern __freelist ;=============================================================================== global free ;15: void free( void ram *r ) free: movff FSR2L, POSTINC1 movff FSR2H, POSTINC1 movff FSR1L,FSR2L movff FSR1H,FSR2H subfsr 2,4 ;16: { ;17: struct _AllocBlock ram *p, *q; ; unsigned short Aux2; ; unsigned char Aux; addfsr 1,LOCALS_SIZE ;18: ;19: if( r == NULL ) movf [r+0],w iorwf [r+1],w ;20: return; bnz NotNULL bra Finish ;21: ;22: r = (unsigned char *)r - 2; NotNULL: movlw 0x02 subwf [r+0],f movlw 0 subwfb [r+1],f DISABLE_INTERRUPTS ;23: ;24: ;25: for( p = __freelist.Next, q = &__freelist; p != NULL && p < (struct _AllocBlock ram *)r; q = p, p = p->Next ) movlw low __freelist movwf [q+0] movlw high __freelist movwf [q+1] movff __freelist+2,FSR0L ; p = __freelist.Next; movff __freelist+3,FSR0H Loop: movf FSR0L,w,ACCESS ; p != NULL iorwf FSR0H,w,ACCESS bz xa630 movf [r+0],w ; && p < (struct _AllocBlock ram *)r; subwf FSR0L,w,ACCESS movf [r+1],w subwfb FSR0H,w,ACCESS bc xa630 movf FSR0L,w,ACCESS ; q = p; movwf [q+0] movf FSR0H,w,ACCESS movwf [q+1] addfsr 0,2 ; p = p->Next ); movf POSTINC0,w,ACCESS movff INDF0,FSR0H movwf FSR0L,ACCESS bra Loop ;26: ; /* Empty statement */ xa630: movf FSR0L,w movwf [p+0] movf FSR0H,w movwf [p+1] ;29: q->Next = r; movsf [q+0],FSR0L movsf [q+1],FSR0H addfsr 0,2 movsf [r+0],POSTINC0 movsf [r+1],POSTDEC0 ;28: ((struct _AllocBlock ram *)r)->Next = p; movsf [r+0],FSR0L movsf [r+1],FSR0H addfsr 0,2 movsf [p+0],POSTINC0 movsf [p+1],POSTDEC0 ;31: if( (unsigned short)r + ((struct _AllocBlock ram *)r)->Length + 2 == (unsigned short)p ) ;movsf [r+0],FSR0L ;movsf [r+1],FSR0H subfsr 0,2 movf POSTINC0,w,ACCESS addwf [r+0],w movwf PRODL,ACCESS movf POSTDEC0,w,ACCESS addwfc [r+1],w movwf PRODH,ACCESS movlw 0x02 addwf PRODL,w,ACCESS xorwf [p+0],w bnz xa68e movlw 0x00 addwfc PRODH,w,ACCESS xorwf [p+1],w bnz xa68e ;32: { ;34: ((struct _AllocBlock ram *)r)->Length += p->Length + 2; ;33: ((struct _AllocBlock ram *)r)->Next = p->Next; movsf [p+0],FSR0L ; FSR0 = p; movsf [p+1],FSR0H movlw 0x02 ; Aux2 = p->Length + 2; addwf POSTINC0,w,ACCESS movwf [Aux2+0] movlw 0x00 addwfc POSTINC0,w,ACCESS movwf [Aux2+1] movff POSTINC0,PRODL ; PROD = p->Next; movff POSTINC0,PRODH movsf [r+0],FSR0L ; FSR = r; movsf [r+1],FSR0H movf [Aux2+0],w ; r->Length += Aux2; addwf POSTINC0,f,ACCESS movf [Aux2+1],w addwfc POSTINC0,f,ACCESS movff PRODL,POSTINC0 ; r->Next = PROD; movff PRODH,POSTINC0 ;35: } ;36: ;37: if( (unsigned short)q + ((struct _AllocBlock ram *)q)->Length + 2 == (unsigned short)r ) xa68e: movsf [q+0],FSR0L ; FSR0 = q; movsf [q+1],FSR0H movf POSTINC0,w,ACCESS ; PROD = q->Length; addwf [q+0],w movwf PRODL,ACCESS movf POSTDEC0,w,ACCESS addwfc [q+1],w movwf PRODH,ACCESS movlw 0x02 ; if( PROD + 2 == r ) addwf PRODL,w,ACCESS ; { xorwf [r+0],w bnz Epilog movlw 0x00 addwfc PRODH,w,ACCESS xorwf [r+1],w bnz Epilog ;38: { ;40: ((struct _AllocBlock ram *)q)->Length += ((struct _AllocBlock ram *)r)->Length + 2; ;39: ((struct _AllocBlock ram *)q)->Next = ((struct _AllocBlock ram *)r)->Next; movsf [r+0],FSR0L ; FSR0 = r; movsf [r+1],FSR0H movlw 0x02 ; Aux2 = r->Length + 2; addwf POSTINC0,w,ACCESS movwf [Aux2+0] movlw 0x00 addwfc POSTINC0,w,ACCESS movwf [Aux2+1] movff POSTINC0,PRODL ; PROD = r->Next; movff POSTINC0,PRODH movsf [q+0],FSR0L ; FSR0 = q; movsf [q+1],FSR0H movf [Aux2+0],w ; q->Length += Aux2; addwf POSTINC0,f,ACCESS movf [Aux2+1],w addwfc POSTINC0,f,ACCESS movff PRODL,POSTINC0 ; q->Next = PROD; movff PRODH,POSTINC0 ;41: } ;42: } Epilog: RESTORE_INTERRUPTS Finish: subfsr 1,LOCALS_SIZE + 1 movff POSTDEC1,FSR2H movff INDF1,FSR2L return 0 ;=============================================================================== end ;===============================================================================
file: /Techref/member/IMB-yahoo-J86/free.asm.htm, 8KB, , updated: 2010/4/14 13:59, local time: 2024/12/28 00:43,
owner: IMB-yahoo-J86,
3.139.86.58:LOG IN
|
©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://ecomorder.com/Techref/member/IMB-yahoo-J86/free.asm.htm"> Heap Management For Small Microcontrollers - free.asm</A> |
Did you find what you needed? |