heap.c File Reference

VM Heap. More...

#include "pm.h"

Classes

struct  PmHeapDesc_s
struct  PmHeap_s

Defines

#define __FILE_ID__   0x06
#define HEAP_MAX_LIVE_CHUNK_SIZE   2044
#define HEAP_MAX_FREE_CHUNK_SIZE   65532
#define HEAP_MIN_CHUNK_SIZE   ((sizeof(PmHeapDesc_t) + 3) & ~3)
#define OBJ_GET_GCVAL(pobj)   ((((pPmObj_t)pobj)->od >> OD_MARK_SHIFT) & 1)
#define OBJ_SET_GCVAL(pobj, gcval)

Typedefs

typedef struct PmHeapDesc_s PmHeapDesc_t
typedef struct PmHeapDesc_spPmHeapDesc_t
typedef struct PmHeap_s PmHeap_t
typedef struct PmHeap_s * pPmHeap_t

Functions

PmReturn_t heap_init (void)
PmReturn_t heap_getChunk (uint16_t requestedsize, uint8_t **r_pchunk)
PmReturn_t heap_freeChunk (pPmObj_t ptr)
uint16_t heap_getAvail (void)


Detailed Description

VM Heap.

VM heap operations. All of PyMite's dynamic memory is obtained from this heap. The heap provides dynamic memory on demand.


Define Documentation

#define HEAP_MAX_FREE_CHUNK_SIZE   65532

The maximum size a free chunk can be (a free chunk is one that is not in use). The free chunk size is limited by the size field in the *heap* descriptor. That field is fourteen bits with two assumed least significant bits (zeros): (0x3FFF << 2) == 65532

#define HEAP_MAX_LIVE_CHUNK_SIZE   2044

Checks for heap size definition. The maximum size a live chunk can be (a live chunk is one that is in use). The live chunk size is limited by the size field in the *object* descriptor. That field is nine bits with two assumed least significant bits (zeros): (0x1FF << 2) == 2044

#define HEAP_MIN_CHUNK_SIZE   ((sizeof(PmHeapDesc_t) + 3) & ~3)

The minimum size a chunk can be (rounded up to a multiple of 4)

#define OBJ_GET_GCVAL ( pobj   )     ((((pPmObj_t)pobj)->od >> OD_MARK_SHIFT) & 1)

Gets the GC's mark bit for the object. This MUST NOT be called on objects that are free.

#define OBJ_SET_GCVAL ( pobj,
gcval   ) 

Sets the GC's mark bit for the object This MUST NOT be called on objects that are free.


Typedef Documentation

typedef struct PmHeapDesc_s PmHeapDesc_t

The following is a diagram of the heap descriptor at the head of the chunk:

MSb LSb 7 6 5 4 3 2 1 0 pchunk-> +-+-+-+-+-+-+-+-+ | S[9:2] | S := Size of the chunk (2 LSbs dropped) +-+-+-----------+ F := Chunk free bit (not in use) |F|R| S[15:10] | R := Bit reserved for future use +-+-+-----------+ | P(L) | P := hd_prev: Pointer to previous node | P(H) | N := hd_next: Pointer to next node | N(L) | | N(H) | Theoretical min size == 6 +---------------+ Effective min size == 8 | unused space | (12 on 32-bit MCUs) ... ... | end chunk | +---------------+


Function Documentation

PmReturn_t heap_freeChunk ( pPmObj_t  ptr  ) 

Places the chunk back in the heap.

Parameters:
ptr Pointer to object to free.

uint16_t heap_getAvail ( void   ) 

Returns:
Return number of bytes available in the heap

PmReturn_t heap_getChunk ( uint16_t  requestedsize,
uint8_t **  r_pchunk 
)

Returns a free chunk from the heap.

The chunk will be at least the requested size. The actual size can be found in the return chunk's od.od_size.

Parameters:
requestedsize Requested size of the chunk in bytes.
r_pchunk Addr of ptr to chunk (return).
Returns:
Return code

PmReturn_t heap_init ( void   ) 

Initializes the heap for use.

Returns:
nothing.


Generated on Wed Feb 24 13:37:02 2010 for Python-on-a-chip by  doxygen 1.5.9