Skip to content

Segger Real time transfer

Segger RTT is a method to use the Segger J-Link to transfer a stream of data over a debugger session. It makes it possible to use printf and similar to output data without using any extra connection, except SWD

More information about Segger RTT is available from Segger

Enable RTT output

To enable RTT, add MIRA_IODEF_RTT(0) to the MIRA_IODEFS() table:

MIRA_IODEFS(
    MIRA_IODEF_NONE,
    MIRA_IODEF_RTT(0),
    MIRA_IODEF_NONE
)

In mira_setup() initialize RTT:

void mira_setup(void) {
    mira_rtt_init();
    /* ... */
}

Blocking mode

RTT is non-blocking by default. Data is dropped if the buffer is full. This may occur if no client is reading, or if the bandwidth is too low for the amount of data.

In some cases, avoiding the loss of data is more important than preserving system performance. Blocking mode is available for that purpose.

For more information, see mira_rtt_set_blocking()

Data input

It is possible to read data from RTT. To read from RTT, use active polling.

To read data, start a process that polls the interface:

PROCESS_THREAD(rtt_reader, ev, data) {
    uint8_t buffer[16];
    int len;

    PROCESS_BEGIN();
    PROCESS_PAUSE();
    for (;;) {
        /* Yield to give other processes access to the CPU */
        PROCESS_PAUSE();

        do {
            /*
             * Continously poll while data is available, to clear te buffer as
             * fast as possible
             */
            len = mira_rtt_read(-1, 0, buffer, sizeof(buffer));
            if (len > 0) {
                /*
                 * Handle buffer here...
                 */
            }
        } while (len > 0);
    }
    PROCESS_END()
}

Defines

MIRA_IODEF_RTT

#define MIRA_IODEF_RTT(_ID)

MIRA_IODEF handler for RTT.

To use RTT as output for mira iodefs, use MIRA_IODEF_RTT(0) as operation in MIRA_IODEFS().

Functions

mira_rtt_init

mira_status_t mira_rtt_init(void);

Initialize RTT interface.

mira_rtt_set_blocking

mira_status_t mira_rtt_set_blocking(uint8_t buf_idx, mira_bool_t blocking);

Set blocking mode.

In blocking mode, mira_rtt_write() will block until enough space is available in output buffer for output.

Parameters

Name Description
buf_idx Index of buffer. Only buf_idx=0 is supported.
blocking 0 for non-blocking, non-zero for blocking.

mira_rtt_read

int mira_rtt_read(int fd, uint8_t buf_idx, void *ptr, int len);

Read data from RTT.

Writes raw data to output buffer, given buf_idx.

Parameters

Name Description
fd Unused. Available to fit MIRA_IODEF.
buf_idx Index of buffer. Only buf_idx=0 is supported.
ptr Pointer to where to store input.
len Length of input buffer.

mira_rtt_write

int mira_rtt_write(int fd, uint8_t buf_idx, const void *ptr, int len);

Write data to RTT.

This method is intended to be used as a MIRA_IODEF output handler.

Writes raw data to output buffer, given buf_idx.

Parameters

Name Description
fd Unused. Available to fit MIRA_IODEF.
buf_idx Index of buffer. Only buf_idx=0 is supported.
ptr Pointer to where output is stored.
len Length of output buffer.