Elektor_Mag_-_January-February_2021

([email protected]) #1

62 January & February 2021 http://www.elektormagazine.com


Let’s start by examining a potential use case. A MIDI drum machine
may be required to make four simultaneous sounds based upon an
input command received by its serial channel. Ideally, all sound-gen-
erating tasks should start at the exact same time to avoid sounding
‘off ’ to the human ear. Coordination could be achieved by the use of
four separate semaphores and relying upon the speed of the CPU for
timely delivery. But that approach is clumsy and doesn’t scale well as
the number of receiving tasks increase. Event Groups are the preferred
implementation method in FreeRTOS for coordinating multiple tasks
from a single event source.


Event flags
FreeRTOS defines 24 event flags for each Event Group object created
(Figure 1). These flags are represented in the C data type EventBits_t,
a 32-bit-wide data type of which 24 bits are available. Bit 0 is the least
significant bit (LSB) of the available flags. The most significant 8 bits
are reserved for internal use by FreeRTOS.


How these 24 bits are assigned and used by the application is left up
to the programmer. In this demo, the loop() task generates an event
every second that results in two tasks synchronously starting differ-
ing blink patterns via their associated LEDs. Bit 0 of the Event Group
(value 0b0001/decimal value 1) notifies a task named blink2() that
blinks LED1 twice. Bit 1 of the Event Group (value 0b0010/decimal
value 2) is assigned to notify a task named blink3() that blinks
LED2 three times.


Demo program
Before we dive into the code, let’s review what the demo program
hopes to accomplish. Two LEDs are driven by GPIO pins 25 and 26
(lines 5 and 6) in the active high configuration (see the schematic in
Figure 2). These GPIOs are configured in the setup() function as
outputs (lines 62 to 65). Task blink2() controls LED1 by blinking it
twice before waiting for the next event (lines 19 to 25). Task blink3()


Practical


ESP32 Multitasking (6)


Event Groups


By Warren Gay (Canada)


Synchronisation between multiple tasks often arises as a requirement when developing


applications using FreeRTOS. In the previous instalments of this series, we examined


semaphore and task notifications. However, these are only capable of sending an event


from a task or interrupt service routine (ISR) to a single receiving task. When you need to


broadcast an event to several tasks, the Event Group capability is the solution you will be


looking for. In this final article of the series, we examine the capabilities this feature offers


embedded developers.


software


MOD1

ESP32

FSVN
IO25
IO26
IO32
IO33
IO27
IO14
IO12
IO13
IO35

TXD0

IO10

IO18

IO23

IO19

IO22

IO21

FSD2
FSVP

IO15

IO37

IO38

IO34

RXD0

FCLK

FSD0 FSD3

FSD1

BOOT

IO9

IO2

FCS

IO4
IO0
3V3
3V3

GND

IO5

GND
USB

EN
5V

R1 EN
220

R2
220
LED1 LED2

200274-001-94

31 ... 24 23 ... 0

Reserve d Event Flag Bits

Figure 2: The schematic for the demo program evtgrp.ino.

Figure 1: Event flags within the C data type EventBits_t.
Free download pdf