Test the thread switching time by implementing semaphore ping-pong between two threads.

Measure thread switching time by implementing semaphore ping-pong between two threads

This mbed program starts two threads with realtime-priority. Each of them is waiting for the other to give its semaphore and gives the other thread's semaphore as a reaction. Once started, this algorithm results in fast thread switches, enforced by the semaphores.

To allow measurement, one thread sets a GPIO output, while to other one clears it.

Measurements are performed on a NUCLEO-F767ZI board https://os.mbed.com/platforms/ST-Nucleo-F767ZI/.

mbed-os-5.12.3

Measured gpio_out output frequency, whitch contains actually two thread switches:

  • 6.5 - 7.0 usec (154 kHz - 143 kHz)

/media/uploads/stefanwaldschmidt/2019-05-10-semaphore_ping_pong.gif

main.cpp

Committer:
stefanwaldschmidt
Date:
2019-05-11
Revision:
0:ea879e5f3ce5

File content as of revision 0:ea879e5f3ce5:

/*
   Test thread switching time using semaphore ping-pong

   Hardware: NUCLEO-F767ZI
   Libraries:
     mbed-os-5.12.3
   Measured gpio_out output frequency,
   which contains actually two thread switches:
   6.5 - 7.0 usec (154 kHz - 143 kHz)
*/

#include "mbed.h"

Semaphore semaphore_on(0);
Semaphore semaphore_off(0);

DigitalOut gpio_out(PC_8);

void run_on()
{
    while (true) {
        semaphore_on.wait();
        gpio_out = 1;
        semaphore_off.release();
    }
}

void run_off()
{
    while (true) {
        semaphore_off.wait();
        gpio_out = 0;
        semaphore_on.release();
    }
}

int main()
{
    Thread *thread_on  = new Thread(osPriorityRealtime);
    Thread *thread_off = new Thread(osPriorityRealtime);

    thread_on->start(run_on);
    thread_off->start(run_off);

    semaphore_on.release();

    while (true) {
        wait(0.1); // 100 ns
    }
}