In this chapter, we covered many different aspects of synchronizing tasks and protecting shared data between tasks. We also covered semaphores, mutexes, and software timers. Then, we got our hands dirty by writing some code for each of these types and took a deep dive into analyzing the code's behavior using our Nucleo development board and SystemView.
Now, you have some tools at your disposal for solving synchronization problems, such as one task notifying another that an event has occurred (semaphores). This means you're able to safely share data between tasks by properly wrapping access in a mutex. You also know how to save a bit of RAM when performing simple operations, that is, by using software timers for small periodic operations, instead of dedicated tasks.
In the next chapter, we'll cover more crucial RTOS primitives that are used for inter-task...