160 likes | 627 Views
Typical Memory Layout. sysPhysMemTop() sysMemTop() FREE_RAM_ADRS RAM_LOW_ADRS LOCAL_MEM_LOCAL_ADRS. Target Server Memory Pool. A pool of memory on the target reserved for use by the Tornado tools: Dynamic loading of object modules. Passing string arguments to tasks spawned on target.
E N D
Typical Memory Layout sysPhysMemTop() sysMemTop() FREE_RAM_ADRS RAM_LOW_ADRS LOCAL_MEM_LOCAL_ADRS
Target Server Memory Pool • A pool of memory on the target reserved for use by the Tornado tools: • Dynamic loading of object modules. • Passing string arguments to tasks spawned on target. • Creation of variables from WindSh. • The target server manages the pool, keeping overhead such as block lists on the host. • The initial size of the target server memory pool is configured by WDB_POOL_SIZE. The default is 1/16 of sysMemTop( ) - FREE_RAM_ADRS. • Additional memory is silently allocated from the system memory pool if needed.
System Memory Pool • Used for dynamic memory allocation in programs: • malloc( ). • Creating tasks (stack and TCB). • VxWorks memory requests. • Initialized at system start-up. • Can modify USER_RESERVED_MEM to reserve memory for application-specific use. • May need to modify sysPhysMemTop( ) (or just LOCAL_MEM_SIZE) when adding memory to your board. Check your BSP documentation. • To add off-board memory: void memAddToPool (pPool, poolSize) pPool must be the local address of the memory.
Allocating/Releasing Memory • To dynamically allocate memory: void *malloc (nBytes) Returns a pointer to the newly allocated memory or NULL on error. • Uses first-fit algorithm. • Free memory is stored in a linked list. • Some (small) overhead for each malloc( ). • To release allocated memory: void free (ptr) Adjacent blocks are coalesced.
Debugging Options • Default malloc( ) debugging: If request too large, log an error message. • Default free( ) debugging: • Check block for consistency. • If corrupted: suspend task, log error message. • Can change default debugging options with: void memOptionsSet (options) • Options can be: + MEM_ALLOC_ERROR_LOG_FLAG - MEM_ALLOC_ERROR_SUSPEND_FLAG + MEM_BLOCK_CHECK + MEM_BLOCK_ERROR_LOG_FLAG + MEM_BLOCK_ERROR_SUSPEND_FLAG
Examining Memory • Use the Browser. • Enter the memory partition ID in the Show box. System Memory Pool Size Currently Allocated Free Blocks Total Allocated Free List
Additional System Memory Management Routines void * calloc (nElems, size) Allocate zeroed memory for an array. void * realloc (ptr, newSize) Resize an allocated block. The block may be moved. int memFindMax( ) Returns the size of the largest free block in system memory.
Fine Tuning • For fast, deterministic allocation of fixed size buffers, use message queues instead of malloc( ).
Generic Partition Manager • VxWorks provides low-level routines to create and manipulate alternate memory pools. • High-level routines like malloc( ) and free( ) call these lower level routines, specifying the system memory pool. • Application may use alternate memory partitions to reduce fragmentation. • Application may use alternate memory partitions to manage memory with different properties.
Creating a Memory Partition PART_ID memPartCreate (pPool, size) pPool Pointer to memory for this partition. size Size of memory partition in bytes. • Returns a partition id (PART_ID), or NULL on error. • The memory for this partition (pPool) may be taken from: • A separate memory board. • A block allocated from the system memory partition. • The top of the CPU board’s RAM.
Managing Memory Partitions • System partition management routines call routines listed below, specifying the PART_ID as memSysPartId. GenericSystem Memory Pool memPartAlloc( ) malloc( ) memPartFree( ) free( ) memPartShow( ) memShow( ) memPartAddToPool( ) memAddToPool( ) memPartOptionsSet( ) memOptionsSet( ) memPartRealloc( ) realloc( ) memPartFindMax( ) memFindMax( )
Example Creating a Memory Partition ->partId =memPartCreate(pMemory,100000) new symbol “partId” added to symbol table. partId = 0x23ff318: value = 37745448 = 0x23ff328 = partId + 0x10 ->ptr=memPartAlloc(partId,200) new symbol “ptr” added to symbol table. ptr = 0x23ff2ec: value = 37652632 = 0x23e8898 ->show partId status bytes blocks ave block max block ------ ------ ------- --------- ----------- current free 99776 1 99776 99776 alloc 208 1 208 - cumulative alloc 208 1 208 -
Summary • Standard C routines are used for dynamic memory allocation. • To configure the system memory pool: • Modify sysPhysMemTop( ). • Specify USER_RESERVED_MEM. • Call memAddToPool( ). • For fast, deterministic allocation of fixed size buffers, use message queues instead of malloc( ). • Create separate memory partition for off-board memory, or to help reduce fragmentation.