Mistake on this page?
Report an issue in GitHub or email us

Mail

Mail class hierarchy

Mail works like a queue, with the added benefit of providing a memory pool for allocating messages (not only pointers).

Mail class reference

Public Member Functions
 Mail ()=default
 Create and initialize Mail queue. More...
bool empty () const
 Check if the mail queue is empty. More...
bool full () const
 Check if the mail queue is full. More...
T * alloc (MBED_UNUSED uint32_t millisec=0)
 Allocate a memory block of type T, without blocking. More...
T * try_alloc ()
 Allocate a memory block of type T, without blocking. More...
T * try_alloc_for (Kernel::Clock::duration_u32 rel_time)
 Allocate a memory block of type T, optionally blocking. More...
T * alloc_for (uint32_t millisec)
 Allocate a memory block of type T, optionally blocking. More...
T * try_alloc_until (Kernel::Clock::time_point abs_time)
 Allocate a memory block of type T, blocking. More...
T * alloc_until (uint64_t millisec)
 Allocate a memory block of type T, blocking. More...
T * calloc (MBED_UNUSED uint32_t millisec=0)
 Allocate a memory block of type T, and set memory block to zero. More...
T * try_calloc ()
 Allocate a memory block of type T, and set memory block to zero. More...
T * try_calloc_for (Kernel::Clock::duration_u32 rel_time)
 Allocate a memory block of type T, optionally blocking, and set memory block to zero. More...
T * calloc_for (uint32_t millisec)
 Allocate a memory block of type T, optionally blocking, and set memory block to zero. More...
T * try_calloc_until (Kernel::Clock::time_point abs_time)
 Allocate a memory block of type T, blocking, and set memory block to zero. More...
T * calloc_until (uint64_t millisec)
 Allocate a memory block of type T, blocking, and set memory block to zero. More...
osStatus put (T *mptr)
 Put a mail in the queue. More...
osEvent get (uint32_t millisec=osWaitForever)
 Get a mail from the queue. More...
T * try_get ()
 Get a mail from the queue. More...
T * try_get_for (Kernel::Clock::duration_u32 rel_time)
 Get a mail from the queue. More...
osStatus free (T *mptr)
 Free a memory block from a mail. More...

Mail example

This code uses mail to manage measurement.

/*
 * Copyright (c) 2020 Arm Limited and affiliates.
 * SPDX-License-Identifier: Apache-2.0
 */
#include "mbed.h"

/* Mail */
typedef struct {
    float    voltage; /* AD result of measured voltage */
    float    current; /* AD result of measured current */
    uint32_t counter; /* A counter value               */
} mail_t;

Mail<mail_t, 16> mail_box;
Thread thread;

void send_thread(void)
{
    uint32_t i = 0;
    while (true) {
        i++; // fake data update
        mail_t *mail = mail_box.alloc();
        mail->voltage = (i * 0.1) * 33;
        mail->current = (i * 0.1) * 11;
        mail->counter = i;
        mail_box.put(mail);
        ThisThread::sleep_for(1000);
    }
}

int main(void)
{
    thread.start(callback(send_thread));

    while (true) {
        osEvent evt = mail_box.get();
        if (evt.status == osEventMail) {
            mail_t *mail = (mail_t *)evt.value.p;
            printf("\nVoltage: %.2f V\n\r", mail->voltage);
            printf("Current: %.2f A\n\r", mail->current);
            printf("Number of cycles: %lu\n\r", mail->counter);

            mail_box.free(mail);
        }
    }
}

Important Information for this Arm website

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling cookies, some features of the site will not work.