You are on page 1of 14

Chapter

9
Memory

Tornado Training Workshop

Copyright Wind River Systems Wind River Systems

9-1

Memory management in VxWorks

Typical Memory Layout


sysPhysMemTop( )
USER_RESERVED_MEM

sysMemTop( )

System Memory Pool

WDB_POOL_SIZE

FREE_RAM_ADRS

VxWorks
RAM_LOW_ADRS
LOCAL_MEM_LOCAL_ADRS

Tornado Training Workshop

Copyright Wind River Systems Wind River Systems

9-2

Many of the above macros are parameters for the component /hardware/ memory/BSP Memory Conguration.

The macro LOCAL_MEM_LOCAL_ADRS is the address of the start of RAM on your board. It is typically equal to 0.

The macro RAM_LOW_ADRS is the address where VxWorks is loaded.


FREE_RAM_ADRS is the address of the end of the VxWorks system image.

Most BSPs dene sysPhysMemTop( ) as the top of physical RAM; sysMemTop( ) is always the top of the system memory pool. The difference is the congurable constant USER_RESERVED_MEM.

Low memory often contains the interrupt vector table, and space for the boot line and an exception message. More detailed memory maps are available in the Programmers Guide appendix for your CPU architecture.

Target Server Memory Pool


A pool of memory on the target reserved for use by the Tornado tools:
q q

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 congured 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.
Tornado Training Workshop Copyright Wind River Systems Wind River Systems

9-3

The target server memory pool helps to reduce memory fragmentation on the target.

WDB_POOL_SIZE is not a component parameter, but can be congured .../target/cong/comps/src/congAll.h.

System Memory Pool


Used for dynamic memory allocation in programs:
q q

malloc( ). Creating tasks (stack and TCB). VxWorks memory requests. Can modify USER_RESERVED_MEM to reserve memory for application-specic use. May need to modify sysPhysMemTop( ) (or just LOCAL_MEM_SIZE) when adding memory to your board. Check your BSP documentation.

Initialized at system start-up.


q

To add off-board memory: void memAddToPool (pPool, poolSize) pPool must be the local address of the memory.
Tornado Training Workshop Copyright Wind River Systems Wind River Systems

9-4

USER_RESERVED_MEM,

a parameter for the component /hardware/memory/ BSP Memory Conguration, species how many bytes below the top of physical RAM the system memory pool ends. The default value is 0.

The local address of off-board memory on a VME bus can be computed as follows:
q q

Read hardware doc to nd the VMEbus address of the memory. Use sysBusToLocalAdrs( ) to compute the local address corresponding to the VMEbus address.

Adding off-board memory to the system memory pool is usually a bad idea. A subsequent call to malloc() will give you a block of either onboard or off-board memory, leaving uncertainty about the worst-case access time to this block. Instead, consider creating a separate partition for this off-board memory.

Allocating/Releasing Memory
To dynamically allocate memory:

void *malloc (nBytes)


Returns a pointer to the newly allocated memory or NULL on error. Uses rst-t algorithm.
q q

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.

Tornado Training Workshop

Copyright Wind River Systems Wind River Systems

9-5

For 68k boards the overhead for malloc( ) is:


q q

8 byte header per malloc( ). Always rounds up to a 4 byte boundary. When block is free, 8 bytes within body may be used for free list links. Minimum block size is 8 bytes (header) + 8 bytes (free list links) = 16 bytes.

See the memPartLib man page for more information about the overhead for your architecture.

Debugging Options
Default malloc( ) debugging: If request too large, log an error message. Default free( ) debugging:
q q

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
Tornado Training Workshop Copyright Wind River Systems Wind River Systems

9-6

Bitwise OR options together to get more than one.

Setting any MEM_BLOCK_XXX option automatically causes the MEM_BLOCK_CHECK option to be set.

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

Tornado Training Workshop

Copyright Wind River Systems Wind River Systems

9-7

The VxWorks system memory partition ID is memSysPartId.

Total target memory usage within both the target server pool and the system memory pool is displayed with bar graphs in the browser.

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.

Tornado Training Workshop

Copyright Wind River Systems Wind River Systems

9-8

A possible race condition can arise between calls to memFindMax( ) and malloc( ).

Fine Tuning
For fast, deterministic allocation of xed size buffers, use message queues instead of malloc( ). message queue
bufReturn( ) ptr ptr

...

ptr

bufGet( )

... buffers

Tornado Training Workshop

Copyright Wind River Systems Wind River Systems

9-9

Create a library bufferLib of routines for managing your buffers. For example:

/* pBlock points to memory for array of buffers (NULL => malloc) */ /* Put addresses of buffers in a message queue */ /* Returned BUF_ID contains the newly created msgQId */ BUF_ID bufCreate (pBlock, numBufs, bufSize); /* Calls msgQReceive() to get next buffer */ void *bufGet (bufId); /* Calls msgQSend() to return the buffer */ void bufReturn (bufId, ptr);

Alternative: Implement your own xed-size block allocator, guarding the block free-list with a mutex, taskLock(), or intLock().

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.

Tornado Training Workshop

Copyright Wind River Systems Wind River Systems

9-10

Creating a Memory Partition


PART_ID memPartCreate (pPool, size)
pPool size Pointer to memory for this partition. 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:
q q

A separate memory board. A block allocated from the system memory partition. The top of the CPU boards RAM.

Tornado Training Workshop

Copyright Wind River Systems Wind River Systems

9-11

PART_ID,

dened in memLib.h, is a handle to the memory partition being created.

Specify nonzero USER_RESERVED_MEM to reserve memory at the top of RAM for your applications exclusive use.

Managing Memory Partitions


System partition management routines call routines listed below, specifying the PART_ID as memSysPartId. Generic System Memory Pool memPartAlloc( ) memPartFree( ) memPartShow( ) memPartAddToPool( ) memPartOptionsSet( ) memPartRealloc( ) memPartFindMax( ) malloc( ) free( ) memShow( ) memAddToPool( ) memOptionsSet( ) realloc( ) memFindMax( )

Tornado Training Workshop

Copyright Wind River Systems Wind River Systems

9-12

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 Tornado Training Workshop Copyright Wind River Systems Wind River Systems

9-13

Partition information can also be obtained using the memory-partition browser.

Summary
Standard C routines are used for dynamic memory allocation. To congure the system memory pool:
q q

Modify sysPhysMemTop ( ). Specify USER_RESERVED_MEM. Call memAddToPool( ).

For fast, deterministic allocation of xed size buffers, use message queues instead of malloc( ). Create separate memory partition for off-board memory, or to help reduce fragmentation.

Tornado Training Workshop

Copyright Wind River Systems Wind River Systems

9-14

You might also like