Memory Management¶
Here is a high-level overview of the types of memory management that are going on “behind the scenes.”
SNAP Buffers¶
The SNAP Protocol Stack uses a pool of “packet buffers”, each 123 bytes long.
When you send a packet, receive a packet, print, etc., you are temporarily using up one of these packet buffers, which will later be returned to the global pool.
As a concrete example, when your script makes a call to the rpc() function, the actual RPC packet gets encoded into a buffer and enqueued to the radio code for transmission. Once the radio has actually sent the packet (possibly after a Mesh Route Discovery has first taken place), the packet will be returned to the pool.
Buffer Budgets¶
The “buffer pool” is shared among the various data sources, but no single source is allowed to use up all of the buffers. These “budget” numbers refer to how many buffers an individual data source is allowed to request.
Note
An individual budget number represents the maximum number of buffers that could get allocated to that particular function at one time. Because the buffer pool is “over-subscribed”, there may be fewer than the “max budget” buffers available.
As a concrete example, on the RF100 there are only 2 buffers allocated to STDOUT (“print” statements). If your script printed more than 246 characters in one burst, then the excess characters would be dropped (not printed). If your device was busy processing a lot of inbound and outbound RPC calls, there might only be one buffer available to perform print statements, resulting in characters being dropped after the first 123.
Note
Use of the HOOK_STDOUT
and HOOK_RPC_SENT
events can help you make more efficient use of
your packet buffers.
Dynamic Strings and Byte Lists¶
Four pools of buffers are used to service both the string and byte list operations. See SNAP Modules for the maximum size and quantity of the tiny, small, medium, and large pools.
As a concrete example, the following line of SNAPpy will use up one dynamic string buffer:
message = 'Hello, ' + nameStr
Note
The default value of stdinMode()
is line mode which reserves one string
buffer of the largest size available on the platform. To reclaim this string buffer for other use, set
stdinMode()
to character mode from within your SNAPpy script.